一.有限状态机
它的转移函数表示系统从一个状态转移到另一个状态的条件
二.EPOLL
在内核中创建一个数据,这个数据有两个比较重要的数据,一个是需要检测的文件描述符的信息(红黑树),一个双向链表,存放检测到数据发生改变的文件描述符信息
大致流程
1.创建epoll实例 epoll_create
2.将监听的文件描述符相关的检测信息添加到epoll实例中 epoll_ctl
3.检测epoll实例中变化了的个数 epoll_wait
4.接受客户端的连接 accept
5.通信
详细(313条消息) 服务器(epoll模式)_未央吖的博客-CSDN博客
三.EPOLL水平触发(LT模式下)
假设委托内核检测读事件 -> 检测fd的读缓冲区
读缓冲区有数据 -> epoll检测到了会给用户通知
1.用户不读数据,数据一直在缓冲区,epoll会一直通知
2.用户只读了一部分数据,epoll会通知
3.缓冲区数据读完了,不通知了
四.工作原理
HTPP请求/响应的步骤
1.客户端连接到Web服务器
一个HTTP客户端,与Web服务器的HTTP端口建立TCP套接字连接,例如http://www.baidu.com
2.发送HTTP请求
通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行,请求头部,空行和请求数据4部分组成
3.服务器接受请求并返回HTTP响应
HTTP响应由客户端读取,一个响应应由状态行,响应头部,空行,响应数据组成
4.释放连接TCP连接
若connection为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection为keepalive,则该连接会保持一段时间,该时间可以继续接收请求
5.客户端浏览器解析HTML内容
例如:
1.浏览器向 DNS 服务器请求解析该 URL 中的域名所对应的 IP 地址;
2. 解析出 IP 地址后,根据该 IP 地址和默认端口 80,和服务器建立 TCP 连接;
3. 浏览器发出读取文件( URL 中域名后面部分对应的文件)的 HTTP 请求,该请求报文作为 TCP 三 次握手的第三个报文的数据发送给服务器;
4. 服务器对浏览器请求作出响应,并把对应的 HTML 文本发送给浏览器;
5. 释放 TCP 连接;
6. 浏览器将该 HTML 文本并显示内容。
五.Proactor模式
1.主线程往epolll内核事件表中注册socket上的读就绪事件
2.主线程调用epoll_wait等待socket上有数据可读
3.当socket上有数据可读时,epoll_wait通知主线程,主线程从socket循环读取数据,直到没有更多数据可读,然后将读取到的数据封装成一个请求对象插入请求队列。
4.睡眠在请求队列上的某个工作线程被唤醒,它获得请求对象并处理客户请求,然后往epoll内核事件表中注册socket上的写就绪事件
5.主线程调用epoll_wait等待socket可写
6.当socket可写时,epoll_wai通知主线程。主线程往socket上写入服务器处理客户请求的结果
六.线程池
现称此中线程的数量应该和CPU数量差不多,当有新任务到来时,主线程通过某种方式选择线程池的子线程为之服务
线程池中的线程数量最直接的限制因素是中央处理器(CPU)的处理器(processors/cores)的数量 N :如果你的CPU是4-cores的,对于CPU密集型的任务(如视频剪辑等消耗CPU计算资源的任务)来 说,那线程池中的线程数量最好也设置为4(或者+1防止其他因素造成的线程阻塞);对于IO密集 型的任务,一般要多于CPU的核数,因为线程间竞争的不是CPU的计算资源而是IO,IO的处理一 般较慢,多于cores数的线程将为CPU争取更多的任务,不至在线程处理IO的过程造成CPU空闲导 致资源浪费。