Linux网络I/O模型及阻塞非阻塞,同异步

本文详细解释了计算机系统中常见的五种I/O模型:阻塞I/O、非阻塞I/O、I/O复用、信号驱动I/O及异步I/O,并通过生动的例子帮助理解同步与异步、阻塞与非阻塞的区别。

一、阻非阻,同异步

参考链接:http://www.cnblogs.com/chaser24/p/6112071.html

首先强调一点,同步≠阻塞,异步≠非阻塞

这两组东西不是同一概念,同步是指用户进程在发起一个功能调用后,在没有等待到结果前该调用就不返回;异步是指当一个调用发起后不去管结果,去做别的事,等这个调用自己完成后通过状态,通知,回调等通知调用者。

而阻塞非阻塞是针对这个线程的,阻塞是调用结果返回前,线程会被挂起(阻塞线程,block),非阻塞就是会立刻返回。常用的就是用join函数阻塞主线程,等子线程跑完才准动。

网上有个比喻:

  • 叫车之后,就一直在路口等着,车来了自己上去——同步、阻塞
  • 叫车之后,一边等着一边看美女,车来了自己上去——同步,非阻塞
  • 叫车之后,光顾着看美女,司机到了之后打电话给你——异步、非阻塞

以read为例的数据操作如下图:

112259_YVNt_2247638.png

二、五种I/O模型

1)阻塞I/O(blocking I/O)
2)非阻塞I/O (nonblocking I/O)
3) I/O复用(select 和poll) (I/O multiplexing)
4)信号驱动I/O (signal driven I/O (SIGIO))
5)异步I/O (asynchronous I/O (the POSIX aio_functions))

 

1.    阻塞I/O即调用一个I/O函数并阻塞,等待数据准备好后,从内核拷到用户空间,返回

112437_WDOg_2247638.png

 

2.    非阻塞是通过进程反复调用I/O(调用立即返回),不过数据在拷贝过程中是阻塞的

112607_ogUU_2247638.png

 

3.    (这里是重点,tornado,gevent均会用到)多路复用是指对一个IO端口,两次调用,两次返回,比阻塞IO并没有什么优越性;关键是能实现同时对多个IO端口进行监听; I/O复用模型会用到select、poll、epoll函数,这几个函数也会使进程阻塞,但是和阻塞I/O所不同的的,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。

113135_WhTT_2247638.png

4.    属于非阻塞模型,允许一个套接口通过信号驱动I/O,当数据备好时,进程会收到一个SiGIO信号,在信号处理函数中调用I/O函数处理

113844_Tg67_2247638.png

5.    以上的模型均是同步的,调用完成后通过回调通知调用者

113940_YQHi_2247638.png

 

 

转载于:https://my.oschina.net/u/2247638/blog/880953

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值