您的位置:首页 > 其它

I/O多路复用模式与线程并发模式

2018-03-19 16:27 197 查看
        一个高性能的服务器,必定要解决IO多路复用和多线程服务的问题,本文在学习《面向模式的软件架构--并发和联网对象模式》后的一点体会。1.I/O多路复用模式:         在常规的I/O多路复用中采用select或poll或epoll系统级别的函数来实现,基于这些函数形成的多路复用模式为reactor和proactor模式。该模式的实现机制是将事件注册到reactor中,当事件所需要的资源准备就绪时reactor就会去回调该事件当初注册到reactor的函数,无需轮询所有的事件源或者无限期阻塞任一单个事件源,就能处理来自多个事件源的多个同步事件。通过reactor的实现机制我们能看到reactor解决的问题是多用户大并发访问后端服务时进行分发,分发到后端的各个服务线程。2.多线程服务模式:       上面提到IO的多路复用,即多用户高并发访问服务端时的分发模式,当客户端的请求分发到后端服务线程对其处理时,多线程的服务模式主要有:半同步半异步模式、领导者/跟随者模式。这两种模式主要解决的是多线程各自运行的机制。3.多并发服务模型的三种技术演进第一种,基本的socket编程是阻塞/同步的(accept、read和write等api默认情况下都是阻塞的),每个操作除非已经完成或者出错才会返回,这样对于每一个请求,要使用一个线程或者单独的进程去处理,系统资源没法支撑大量的请求。第二种,设置socket的api为异步的,采用阻塞的系统函数select或poll来同时检测句柄fd是否可读/写,但是因为其采用了轮询的方式来判断某个fd是否变成active,效率不高o(n)。第三种,基于异步/callback的系统调用,例如linux的epoll,BSD的kqueue,windows的IOCP。由于在内核层面做了支持,所以可以再o(1)的效率查找到active的fd。 
4.摘自孙卫琴主编《Java网络编程精解》第4.1章节的内容:


可参考:1.Socket编程模式理解与对比2.http://www.yeolar.com/note/2012/12/15/high-performance-io-design-patterns/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: