IO:阻塞、非阻塞、同步、异步

Network I/O:阻塞(blocking)、非阻塞(nonblocking)、同步(synchronous)、异步(asynchronous)
I/O涉及到两个系统对象:(1)调用I/O的process(thread),(2)系统内核(kernel)。
I/O操作发生时经历两个阶段:(1)等待数据ready,(2)将数据从内核拷贝到进程中。
# 阻塞IO
当用户进程调用了recvfrom这个系统调用,kernel就开始了IO的第一个阶段:
(1)准备数据。 很多时候数据在一开始还没有到达(比如,还没有收到一个完整的UDP包),这时kernel就要等待足够的数据到来。 在用户进程这边,整个进程会被阻塞。
(2)当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存,然后kernel返回结果, 用户进程才解除阻塞状态,重新运行起来。
阻塞IO的特点是在IO执行的两个阶段都被block了。

# 非阻塞IO
当用户进程调用了recvfrom这个系统调用,如果kernel中的数据还没有准备好,它并不会block用户进程, 而是立刻返回error(EWOULDBLOCK)。用户进程判断结果是一个error时,它就知道数据还没有准备好,于是它可以再次发生recvfrom操作。
一旦kernel中的数据准备好了,并且又再次收到了用户进程的system call,那么它马上将数据拷贝到了用户内存,然后返回。
用户进程其实是在不断的主动询问kernel数据好了没有

# IO复用(I/O Multiplexing):select, poll
select/poll的好处在于单个用户process可以处理多个网络连接的IO。
它的基本原理是:select/poll函数会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。
当用户进程调用了select,整个进程就会被block。同时kernel会监视所有select负责的socket,当任何一个socket中的数据 准备好了,select就会返回。
这时用户进程再调用read操作,将数据从kernel拷贝到用户进程。
实际中,在IO Multiplexing模型中,对于每一个socket,一般都设置为non-blocking。
但是整个用户进程其实一直是被 block的,只不过是被select函数block,而不是被socket IO给block。

# 异步IO
当用户进程调用read操作后,就立刻开始去做其他事情。
从kernel的角度看,当它收到一个异步read之后,首先会立刻返回,所以不会对用户进程产生任何block。
然后kernel会等待数据准备完成,然后将数据拷贝到用户内存。当这一切都完成之后,kernel会给用户进程 发送一个signal,告诉它read操作完成了。

# 同步IO和异步IO
A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes.
An asynchronous I/O operation does not cause the requesting process to be blocked.
两者的区别是synchronous I/O在做"I/O operation"的时候会将process阻塞。
阻塞IO、非阻塞IO、IO复用都属于同步IO。
定义中的"I/O operation"是指真实的IO操作,也就是例子中的recvfrom这个system call。
非阻塞IO在执行recvfrom这个system call时,如果kernel的数据没有准备好,这个时候不会block进程。
当kernel中数据准备好的时候,recvfrom会将数据从kernel拷贝到用户内存中,这个时候进程是被block的。
异步IO则不一样,当进程发起IO操作之后,就直接返回再也不理睬了,直到kernel发生一个信号,告诉进程IO完成。
在整个过程中,进程完全没有被block。





参考:




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值