分类
IO的分类,从两个角度可以分为:阻塞/非阻塞 & 同步/异步。如果进行细分,可以衍生出4种组合:同步阻塞、异步非阻塞….通常很少有人会去细究,阻塞和同步也是混着叫。本次总结基本就是要扣细节。
要想分得清,得明白这两种分类是对什么分的类,分类依据是什么。
分类 | 分类对象 | 分类依据 |
---|---|---|
阻塞/非阻塞 | IO接口 | 是否需要等待底层数据接收完毕 |
同步/异步 | 用户程序工作模型 | 是否等待数据读写完毕 |
说明
按照上述分类,逐层分析。
1. IO接口
accept,阻塞;
recv/send,阻塞;
select,非阻塞。利用select我们就可以大大提高并发度,将连接处理线程和数据处理线程分开,实现并发。
epoll,非阻塞,相比于select,更加便捷的接口,同时可以将建立好的连接加入epoll中进行侦听,工作线程无需无限循环读取数据;
2. 用户程序模型
为了充分利用系统资源,提高并发度。我们通常采用上面提到的编程模型,尽量将连接事件处理、数据接收发送、数据处理这几个部分划分到不同的线程中去。不同处理不用等待下一步完成就可以继续执行。这就是异步。
3. 四种组合
通过上面的总结,继续将4种组合掰扯清楚:
类型 | 说明 |
---|---|
同步阻塞 | 采用类似accept的接口阻塞等待连接事件后,顺序进行数据接收和数据处理,然后response |
同步非阻塞 | 采用类似select等非阻塞接口处理连接事件,顺序进行数据接收和数据处理后response,可以实现并发,但是有很大改善空间 |
异步阻塞 | 采用类似accept的接口阻塞等待连接事件后,在工作线程处理数据接收和逻辑处理,再response |
异步非阻塞 | 采用类似select等非阻塞接口处理连接事件,在工作线程处理数据接收和逻辑处理,再response |
通常,我们会采用epoll+ 线程池,让工作线程不用死等数据,有数据了才去找个线程处理数据。这样的异步非阻塞模型,更加的高效。