池化技术:指提前准备一些资源,在需要时可以重复使用这些预先准备的资源。有两个特点:提前创建和重复利用。(如线程池、连接池、内存池)
线程池:类似于操作系统中的缓冲区的概念,流程:先启动若干数量的线程,并让这些线程处于睡眠状态,
2、detach和join有什么区别
(1)当调用join(),主线程等待子线程执行完之后,主线程才可以继续执行,此时主线程会释放掉执行完后的子线程资源。主线程等待子线程执行完,可能会造成性能损失。
(2)当调用detach(),主线程与子线程分离,他们成为了两个 独立的线程 遵循cpu的时间片调度分配策略。子线程执行完成后会自己释放掉资源。分离后的线程,主线程将对它没有控制权。
3、线程池中有多少个线程,线程池数量如何设定
默认8个
调整线程池中的线程数量的最主要的目的是为了充分并合理地使用 CPU 和内存等资源,从而最大限度地提高程序的性能。
Ncpu 表示 CPU的数量。
如果是CPU密集型任务,就需要尽量压榨CPU,参考值可以设为 Ncpu+1
如果是IO密集型任务,参考值可以设置为 2 *Ncpu。因为线程间竞争的不是CPU的计算资源而是IO,IO的处理一般较慢,多于cores数的线程将为CPU争取更多的任务,不至在线程处理IO的过程造成CPU空闲导致资源浪费
最佳线程数量 = ((线程等待时间+线程CPU时间)/ 线程CPU时间)* CPU个数。
由公式可得,线程等待时间所占比例越高,需要越多的线程,线程CPU时间所占比例越高,所需的线程数越少。
4、listen 函数第二个参数 backlog 参数作用
int listen(int sockfd, int backlog);
backlog是accept阻塞队列的长度,即等待 accept的socket的最大数量。
5、listen底层用的是什么队列
a.半连接队列(Incomplete connection queue),又称 SYN 队列。……
b.全连接队列(Completed connection queue),又称 Accept 队列。……
6.服务器基本框架
此项目是基于Linux的轻量级多线程Web服务器,应用层实现了一个简单的HTTP服务器,利用多路IO复用,可以同时监听多个请求,使用线程池处理请求,使用模拟proactor模式,主线程负责监听,监听有事件之后,从socket中循环读取数据,然后将读取到的数据封装成一个请求对象放入队列。睡眠在请求队列上的工作线程被唤醒进行处理,使用状态机解析HTTP请求报文,实现同步/异步日志系统,记录服务器运行状态,并对系统进行了压力测试。