【webserver】第1节 Proactor模式

您所在的位置:网站首页 实现webserver 【webserver】第1节 Proactor模式

【webserver】第1节 Proactor模式

2024-07-13 21:49:35| 来源: 网络整理| 查看: 265

目录

1.1 服务器编程基本框架

1.1 什么是Proactor模式

1.2 Proctor模式与Reactor模式的区别

1.3 模拟Proactor模式

1.4 简述这个项目的基本思路

1.5 我对项目的一些小修改

这是整个项目的构建模式,因此放在最前面,但是与此同时它也介绍了所有项目会用到的知识,因此可以先从第2节开始看

代码开源:

        GitHub - PetterZhukov/webserver_HTTP: 使用了线程池,通过epoll实现的Proctor版本的web服务器。参考了游双老师的《Linux高性能服务器编程》以及牛客网的《Linux高并发服务器开发》课程。在自己复现的基础上进行模块的整合并添加一些小更改。所有代码拥有完备的注释。

介绍:

        webserver_HTTP         使用了线程池,通过epoll实现的Proactor版本的web服务器。参考了游双老师的《Linux高性能服务器编程》以及牛客网的《Linux高并发服务器开发》课程。在自己复现的基础上进行模块的整合并添加一些小更改。所有代码拥有完备的注释。

        访问的资源在 同级目录"resources"文件夹中。

1.1 服务器编程基本框架

        服务器基本元素有以下几个:      

模块功能 I/O 处理单元 处理客户连接,读写网络数据 逻辑单元 业务进程或线程网络存储单元(可选)数据库、文件或缓存请求队列各单元之间通信的方式

       

I/O 处理单元是服务器管理客户连接的模块。它通常要完成以下工作:等待并接受新的客户连接,接收 客户数据,将服务器响应数据返回给客户端。但是数据的收发不一定在 I/O 处理单元中执行,也可能在 逻辑单元中执行,具体在何处执行取决于事件处理模式。一个逻辑单元通常是一个进程或线程。它分析并处理客户数据,然后将结果传递给 I/O 处理单元或者直 接发送给客户端(具体使用哪种方式取决于事件处理模式)。服务器通常拥有多个逻辑单元,以实现对 多个客户任务的并发处理。网络存储单元可以是数据库、缓存和文件,但不是必须的。请求队列是各单元之间的通信方式的抽象。I/O 处理单元接收到客户请求时,需要以某种方式通知一个 逻辑单元来处理该请求。同样,多个逻辑单元同时访问一个存储单元时,也需要采用某种机制来协调处 理竞态条件。请求队列通常被实现为池的一部分。

        简单来说,对外通信通常是I/O处理单元,逻辑单元负责处理对应的任务,网络存储单元负责存储数据,在本次项目中没有体现,请求队列是模块之间通信的方式。

        由此也可以看出这个项目的几个模块:处理网络I/O、处理业务逻辑、处理调度信息

1.1 什么是Proactor模式

        概念介绍:Proactor模式将所有I/O操作交给主线程和内核处理,工作线程仅仅负责业务逻辑

        如下图是调用异步I/O模型进行的Proactor模式的工作流程

        即

主线程负责负责监听socket事件读写由内核完成然后交给工作线程进行业务处理

        具体的处理逻辑如下:

主线程调用 aio_read 函数向内核注册 socket 上的读完成事件,并告诉内核用户读缓冲区的位置, 以及读操作完成时如何通知应用程序(这里以信号为例)。  主线程继续处理其他逻辑。 当 socket 上的数据被读入用户缓冲区后,内核将向应用程序发送一个信号,以通知应用程序数据 已经可用。  应用程序预先定义好的信号处理函数选择一个工作线程来处理客户请求。工作线程处理完客户请求 后,调用 aio_write 函数向内核注册 socket 上的写完成事件,并告诉内核用户写缓冲区的位置,以 及写操作完成时如何通知应用程序。 主线程继续处理其他逻辑。  当用户缓冲区的数据被写入 socket 之后,内核将向应用程序发送一个信号,以通知应用程序数据 已经发送完毕。 应用程序预先定义好的信号处理函数选择一个工作线程来做善后处理,比如决定是否关闭 socket。

从中可以看出,线程和内核之间的接口主要是读写缓冲区的位置;子线程和主线程之间的接口是通过socket上的事件的操作。

1.2 Proctor模式与Reactor模式的区别

如图是Reactor模式流程图

         读写操作和业务逻辑都是由线程来实现的,经常采用同步I/O进行实现,主线程持续监听,然后将读就绪事件放入请求队列。

        工作线程完成读事件后,在epoll内核事件表中注册写就绪事件。

        主线程监听到写就绪事件后,又将写就绪事件放入请求队列,交给工作线程处理。

1.3 模拟Proactor模式

        因为异步操作不好调试,且操作比较复杂,所以这个项目采用了另一种模式:通过同步I/O模拟Proactor模式

        即:主线程不仅负责监听事件,同时也负责读写操作,而不是采用内核实现的异步I/O操作。

        从刚刚的总结可以看出,不管读写的是内核还是主线程,子线程只需给读写方提供读/写内存即可。同时子线程也是通过修改epoll内核事件表这个行为来影响主线程的下一步调度操作。

如下是具体的工作流程

主线程往 epoll 内核事件表中注册 socket 上的读就绪事件。 主线程调用 epoll_wait 等待 socket 上有数据可读。 当 socket 上有数据可读时,epoll_wait 通知主线程。主线程从 socket 循环读取数据,直到没有更 多数据可读,然后将读取到的数据封装成一个请求对象并插入请求队列。 睡眠在请求队列上的某个工作线程被唤醒,它获得请求对象并处理客户请求,然后往 epoll 内核事 件表中注册 socket 上的写就绪事件。 主线程调用 epoll_wait 等待 socket 可写。 当 socket 可写时,epoll_wait 通知主线程。主线程往 socket 上写入服务器处理客户请求的结果。

     

1.4 简述这个项目的基本思路

        核心模块: 网络通信(epoll),读写操作,线程池

        主线程循环监听socket,然后根据epoll事件表来进行读写操作

        读写完毕后,将数据送入请求队列

        请求队列唤醒子线程进行处理

        (PS:因为这个数据和对数据的操作耦合性非常大,因此请求数据包和对数据包的分析我并没有将其分开,而是保持了老师原来的写法,将其封装为一个类)



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭