> 文章列表 > Linux高并发服务器(webserver)

Linux高并发服务器(webserver)

Linux高并发服务器(webserver)

一.有限状态机

它的转移函数表示系统从一个状态转移到另一个状态的条件

二.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空闲导 致资源浪费。