1. 我理解的不同
阻塞与非阻塞 是指请求者发起请求后,能否自由地执行其它任务。
阻塞情况,请求者必须卡在获取执行结果处,不能有其他操作。
非阻塞情况,请求者提出请求后,可以【自由地】执行其他任务。
同步与异步 是指请求发起后,请求结果的告知方式。
同步情况,请求结果必须由请求者【主动地】查询,获取结果。
异步情况,请求结果准备好后,会发出signal或者执行回调函数,通知请求者结果,请求者【被动地】得到结果。(所以异步一定有回调)
我理解,后台服务器中常讨论的服务“异步化”,其实是服务的”非阻塞化“。将服务的耗时逻辑(如I/O)放到线程池执行,当前线程可以并行做其他工作。但是,最后当前线程还是从future中【主动地】get执行结果,所以还是一种同步的操作。
2. 转载的5种IO的概述
对linux系统中的五种IO模型想做一个简单概述。
第一种阻塞式IO,顾名思义应用读取IO时,需要阻塞式的等待IO返回
第二种非阻塞IO,需要读取的IO如果还未正真准备好,接口会直接返回失败。不阻塞
第三种IO多路复用,最大的好处就在于单个process就可以同时处理多个网络连接的IO,
它的基本原理就是轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程,
基本的实现由select,poll,epoll着三种
简单对比的话
select是通过fdset来去实现,单个队列有1024的
select(fdset)和poll(pollfd)都需要在数据返回后,通过遍历文件描述符来获取已经就绪的socket。
epoll是在2.6内核中提出的,是之前的select和poll的增强版本。相对于select和poll来说,epoll更加灵活,没有描述符限制。
在效率方面,epoll采用mmap内存(zero copy)模型,并且支持LT和ET两种工作模式来达到高效率的处理IO时间。
第四种是信号驱动IO:实际中并不常用在这里不做描述。
第五种:Linux下的asynchronous IO其实用得很少,从kernel的角度,当它受到一个asynchronous read之后,首先它会立刻返回,所以不会对用户进程产生任何block。然后,kernel会等待数据准备完成,然后将数据拷贝到用户内存,当这一切都完成之后,kernel会给用户进程发送一个signal,告诉它read操作完成了。
目前并不成熟。glibc 的 aio 有 bug , kernel 的 aio 只能以 O_DIRECT 方式做直接 IO , libeio 也是 beta 阶段。epoll 是成熟的,但是 epoll 本身是同步的。Linux 上目前没有像 IOCP 这样的成熟异步 IO 实现。