IO-同步,异步,阻塞,非阻塞

IO-同步,异步,阻塞,非阻塞
1.什么是IO
数据在系统内核(kernel)和用户进程之间的传递,称为IO。web

2.IO操做步骤
以read为例,涉及两个系统对象,调用IO的process(or thread),即用户进程;另外一个为系统内核(kernel)。
当用户进程调用recvfrom操做时,会经历两个阶段
1)等待数据准备
2)将数据从内核拷贝至进程中网络

3.IO模型
根据用户进程在IO操做时的状态,能够分为5中IO类型:
blocking IO:阻塞IO
non-blocking IO:非阻塞IO
IO multiplexing:多Socket链接IO
signal driven IO:信号驱动IO
asynchronous IO:异步IO异步

signal driven IO实际中不多使用,在此不作介绍。socket

2.blocking IO:阻塞IO
当用户进程调用recvfrom时,首先开始IO第一阶段:kernel准备数据。
用户进程会被阻塞。当kernel数据准备好之后,会将数据从kernel拷贝到用户内存,而后kernel返回结果,用户进程才会解除block的状态,从新运行起来。
blocking IO在IO执行的两个阶段都被block了。async

3.non-blocking IO:非阻塞IO
能够设置socket使其变为non-blocking。
当对一个non-blocking socket执行recvfrom操做时,流程以下:
用户进程调用recvfrom,若是kernel数据尚未准备好,此时用户进程不会被block。而是马上返回一个error,从用户进程角度看,它并无等待,而是马上获得了一个结果。
用户进程判断是一个error时,它就知道数据尚未准备好,因而再次发送read操做。
一旦kernel中的数据准备好,而且再次收到了用户进程的system call,那么它立刻将数据拷贝到用户内存,而后kernel返回结果。
non-blocking IO在数据准备阶段,没有被block,而是不断的轮询kernel数据是否准备好;在数据拷贝阶段,用户进程被block,直到kernel拷贝结束,返回结果,用户进程才会解除block的状态。函数

4.IO multiplexing:多Socket链接IO
IO multiplexing的特色是单个用户进程能够同时处理多个网络链接IO,它的原理是select/epoll这个function会不断的轮询所负责的全部socket,当某个socket有数据到达了,就通知用户进程。
当用户进程调用select时,整个进程会被block,当任何一个socket中的数据准备好了,select就会返回。这时用户进程再调用read操做,将数据从kernel拷贝到用户进程。咱们能够看出,IO multiplexing和blocking IO的流程相似,不一样的是,IO multiplexing须要两个system call(select和recvfrom),而blocking IO只调用了一个system call(recvfrom)。select的优点在于它能够同时处理多个socket链接。因此若是链接数不高的话,使用select/epoll的web server不必定比multi-threading+blocking IO的web server性能更好,select/epoll的优点在于可以处理更多的链接。
IO multiplexing中,每个socket通常设置为non-blocking的,可是用户进程一直是被select函数block的。性能

5.asynchronous IO
用户进程发起read操做后,马上返回能够去作其余的事情了。
此时,从kernel角度看,当它收到一个asynchronous read后,首先他马上返回,因此不会对用户进程产生任何block,而后,kernel等待数据准备完成,而后将数据拷贝到用户内存,当这一切完成以后,kernel会给用户进程发送一个signal告诉用户进程read操做完成了。server

6.四种IO模型的区别
blocking和non-blocking,synchronous IO和asynchronous IO的区别。
blocking和non-blocking的区别很明显,blocking会一致阻塞,non-blocking在数据没准备彻底时会马上返回。
synchronous同步IO指的是在IO操做时会阻塞用户进程;asynchronous含义相反。
能够看出blocking,non-blocking,IO multiplexing都是synchronous IO;而asynchronous不会对用户进程产生任何阻塞。对象

7.网上有一个比较形象的例子来讲明这四种IO Model
有A,B,C,D四我的在钓鱼:
A用的是最老式的鱼竿,因此呢,得一直守着,等到鱼上钩了再拉杆;
B的鱼竿有个功能,可以显示是否有鱼上钩,因此呢,B就和旁边的MM聊天,隔会再看看有没有鱼上钩,有的话就迅速拉杆;
C用的鱼竿和B差很少,但他想了一个好办法,就是同时放好几根鱼竿,而后守在旁边,一旦有显示说鱼上钩了,它就将对应的鱼竿拉起来;
D是个有钱人,干脆雇了一我的帮他钓鱼,一旦那我的把鱼钓上来了,就给D发个短信。进程

相关文章
相关标签/搜索