一、阻非阻,同异步
参考链接:http://www.cnblogs.com/chaser24/p/6112071.html
首先强调一点,同步≠阻塞,异步≠非阻塞
这两组东西不是同一概念,同步是指用户进程在发起一个功能调用后,在没有等待到结果前该调用就不返回;异步是指当一个调用发起后不去管结果,去做别的事,等这个调用自己完成后通过状态,通知,回调等通知调用者。
而阻塞非阻塞是针对这个线程的,阻塞是调用结果返回前,线程会被挂起(阻塞线程,block),非阻塞就是会立刻返回。常用的就是用join函数阻塞主线程,等子线程跑完才准动。
网上有个比喻:
- 叫车之后,就一直在路口等着,车来了自己上去——同步、阻塞
- 叫车之后,一边等着一边看美女,车来了自己上去——同步,非阻塞
- 叫车之后,光顾着看美女,司机到了之后打电话给你——异步、非阻塞
以read为例的数据操作如下图:
二、五种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函数并阻塞,等待数据准备好后,从内核拷到用户空间,返回
2. 非阻塞是通过进程反复调用I/O(调用立即返回),不过数据在拷贝过程中是阻塞的
3. (这里是重点,tornado,gevent均会用到)多路复用是指对一个IO端口,两次调用,两次返回,比阻塞IO并没有什么优越性;关键是能实现同时对多个IO端口进行监听; I/O复用模型会用到select、poll、epoll函数,这几个函数也会使进程阻塞,但是和阻塞I/O所不同的的,这两个函数可以同时阻塞多个I/O操作。而且可以同时对多个读操作,多个写操作的I/O函数进行检测,直到有数据可读或可写时,才真正调用I/O操作函数。
4. 属于非阻塞模型,允许一个套接口通过信号驱动I/O,当数据备好时,进程会收到一个SiGIO信号,在信号处理函数中调用I/O函数处理
5. 以上的模型均是同步的,调用完成后通过回调通知调用者