服务器编程基本框架和两种高效的事件处理方式

服务器编程基本框架和两种高效的事件处理方式

服务器基本模块

I/O处理单元:处理客户连接,读写网络数据。
服务器管理客户连接的模块。接受客户端连接,接受客户端数据,返回服务器端数据。

逻辑单元:业务进程或者线程。分析处理数据并传递结果。

网络存储单元:数据库、文件或缓存。

请求队列:各个单元之间的通信方式。通常被实现为池的一部分(进程池,线程池)。

两种高效的事件处理模式

处理三类事件:IO事件、信号以及定时事件。

Reactor模式

一般是同步IO模型

要求主线程只负责监听文件描述符上是否有事件发生,有的话通知到工作线程,将socket可读可写事件放入请求队列,交给工作线程处理(读写数据,接受新的连接,处理客户的请求)。

步骤:

  1. 主线程在epoll内核事件表中注册socket上的读就绪事件(epoll_ctl)。
  2. 主线程调用epoll_wait顶戴socket上有数据可读。
  3. 当socket上有数据可读时,epoll_wait通知主线程。主线程则将socket可读事件放入请求队列
  4. 唤醒工作线程,从socket上处理请求,并注册可写事件。
  5. 主线程调用epoll_wait等待socket可写。
  6. 当socket可写时,epoll_wait通知主线程。主线程将socket可写事件放入请求队列。
  7. 工作线程被唤醒,写入处理结果。
Proactor模式

一般是异步IO模型

将所有的IO操作交给主线程和内核。工作线程只负责逻辑。

  1. 主线程调用aio_read函数向内核注册读完成事件,并告诉内核用户读缓冲区的位置,以及操作完成是如何通知应用程序。
  2. 主线程继续处理其他逻辑。
  3. 当socket上的数据被读入用户缓冲区后,内核将向应用程序发送一个信号,以通知应用程序数据已经可用。
  4. 应用程序预先定义好的信号处理函数选择一个工作线程来处理客户请求。工作线程处理完客户请求后,调用aio_write函数向内核注册socket上的写完成事件,并告诉内核用户写缓冲区的位置,以及写操作完成时如何通知应用程序。
  5. 主线程继续处理其他逻辑。
  6. 当用户缓冲区的数据被写入socket之后,内核将向应用程序发送一个信号,已通知应用程序数据已经发送完毕。
  7. 应用程序预先定义好的信号处理函数选择一个工作线程来做善后处理,比如决定是否关闭socket。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值