❲Linux环境开发❳:同异步阻塞的IO模型相关的问题
Posted VanillaOpenResty开发
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了❲Linux环境开发❳:同异步阻塞的IO模型相关的问题相关的知识,希望对你有一定的参考价值。
来源:Nicol TAO
原文地址:http://taozj.org/2016/04/Linux%E7%8E%AF%E5%A2%83%E5%BC%80%E5%8F%91%EF%BC%88%E4%B8%80%EF%BC%89%EF%BC%9A%E5%90%8C%E5%BC%82%E6%AD%A5%E3%80%81%E9%98%BB%E5%A1%9E%E7%9A%84IO%E6%A8%A1%E5%9E%8B%E7%9B%B8%E5%85%B3%E7%9A%84%E9%97%AE%E9%A2%98/
在开始晨读前,给大家带来一个好消息,我们周六将迎来OpenResty社区北京第三期MeetUp,欢迎点击最下方的“阅读原文”或者直接访问:http://www.huodongxing.com/event/8334891914800 了解更多内容,下面我们正式开始今天的晨读:
其实这几个概念可能在实际的开发中并没有什么需要注意的,因为你调用什么函数就知道接下来需要怎么做了,但是如果要确实分清这几个概念的区别和联系,还是需要动动脑筋的。下面这幅图十分的好:
总结来说,区分的关键点在于:
同步-异步:IO资源可用与否是自己去检测,还是依赖于状态、信号、回调等其它机制来通知;
阻塞-非阻塞:IO调用的函数在资源不可用时候是否立即返回,还是被挂起状态直到资源可用;
算是最简单最容易理解的模型了,且Linux默认的IO模型就是这样的,比如你用open打开文件或者socket创建套接字而没有显式使用O_NONBLOCK/SOCK_NONBLOCK参数的时候,那么后续使用read/write/recv/send等函数的时候,当资源不可用,应用程序将阻塞在这些调用上面,直到这些调用成功后返回,程序才会继续执行下去。
这时候的阻塞,内核会将程序进程切换到睡眠的状态,当内核完成IO将数据返回到用户态可用的时候,程序会被切换继续运行下去。
通常在open和socket调用时候添加了O_NONBLOCK/SOCK_NONBLOCK标志,或者采用ioctl等机制后续设置了这个标志的时候,当调用上面的IO操作函数时候,如果此时资源不可用,调用会立即返回(通常返回EAGAIN/EWOULDBLOCK错误)。
这个时候应用程序通常的做法是sleep一会儿,或者干点别的事情,然后再次进行IO调用看资源是否可用了。总体来说该方法是比较低效率的,如果忙等待会浪费很多计算资源;且如果休眠时间长或者干别的事情长,那么总体IO响应将会变得很不及时。
这其实是一个带阻塞通知的非阻塞IO,是select/poll/epoll函数族的典型情况。从使用上来说,虽然将fd/socket设置为了非阻塞形式,但是select/poll/epoll的调用却是阻塞的,所以这里实际上将阻塞从原先的IO操作转嫁挪动到的资源通知上面了。
最复杂的情况了,在linux中有aio_xxxx()对应的函数族,其最大的特点是程序的执行和IO操作可以重叠执行:程序调用aio_xxxx()后立即返回,然后程序就执行其它的代码了,而内核完成IO操作之后,会通过状态、信号、回调函数等机制完成IO操作之后对应要处理的内容。
Windows的完成端口就是典型的异步非阻塞IO模型。而在Linux环境下,感觉异步非阻塞IO不太遭怎么待见,网站基本的构架都是基于epoll这类异步阻塞IO设计的。我想,这可能是因为异步非阻塞IO的优势不是特别的明显,而异步阻塞IO比较符合一般人的思维编程习惯吧。
本文完!
聊聊同步、异步、阻塞与非阻塞(http://blog.jobbole.com/99765/)
Boost application performance using asynchronous I/O(http://www.ibm.com/developerworks/library/l-async/)
使用异步 I/O 大大提高应用程序的性能(http://www.ibm.com/developerworks/cn/linux/l-async/)
聊聊IO多路复用之select、poll、epoll详解(http://blog.jobbole.com/99912/)
Vanilla社区发起⦗晨读计划⦘,每天坚持积累一点,今天的努力至少让我们比昨天更进一步。
⦗晨读计划⦘ 期待你的加入... ...
晨读计划
2016/05/16
以上是关于❲Linux环境开发❳:同异步阻塞的IO模型相关的问题的主要内容,如果未能解决你的问题,请参考以下文章