常用的服务器模型总结

本文深入探讨了服务器中的I/O模型,包括同步I/O(阻塞I/O、I/O复用、信号驱动I/O)和异步I/O。重点介绍了Reactor和Proactor事件处理模式,解释了它们的工作流程和适用场景。同时,讨论了模拟Proactor模式以及两种高效的并发模式——半同步和半异步模式。文章还提到了服务器性能优化策略,如使用池来减少资源分配的开销,以及避免不必要的数据复制和上下文切换。
摘要由CSDN通过智能技术生成

I/O模型

同步I/O
  • 阻塞I/O,I/O复用,和信号驱动I/O 都是同步I/O模型.
  • 这种I/O的读写操作,都是在I/O事件发生之后,由应用程序来完成.
  • 同步I/O模型要求用户代码自行执行I/O操作,将数据从内核缓冲区读入用户缓冲区,或将数据从用户缓冲区写入内核缓冲区.
异步I/O
  • 异步I/O机制则由内核来执行I/O操作,数据在内核缓冲区和用户缓冲区之间的移动是由内核在’后台完成的’
    *也就是说,同步I/O向应用程序通知的是I/O就绪事件,异步I/O向应用程序通知的是I/O的完成事件.

Reactor和Proactor事件处理模式

同步I/O模型常用于实现Reactor模式,异步I/O模型则用于实现Proactor模式.

Reactor模式
  • 它要求主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将事件通知工作线程(逻辑单元).
    实现Reactor模式的工作流程是,以(epoll_wait为例)
  • 主线程往epoll内核事件表中注册socket上的读就绪事件.
  • 主线程调用epoll_wait等待socket上有数据可读。
  • 当socket上有数据可读时,epoll_wait通知主线程,主线程则将socket可读事件放入请求队列。
  • 睡眠在请求队列上的某个工作线程被唤醒,它从socket上读取数据,并处理客户端的请求,然后往epoll内核事件中注册该socket上的写事件.
  • 主线程调用epoll_wait等待socket可写.
  • 当socket可写时,epoll_wai
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值