阻塞IO
我们知道在调用某个函数的时候无非就是两种情况,要么马上返回,然后根据返回值进行接下来的业务处理。当在使用阻塞IO的时候,应用程序会被无情的挂起,等待内核完成操作,因为此时的内核可能将CPU时间切换到了其他需要的进程中,在我们的应用程序看来感觉被卡主(阻塞)了。
非阻塞IO
当使用非阻塞函数的时候,和阻塞IO类比,内核会立即返回,返回后获得足够的CPU时间继续做其他的事情。
IO复用模型
当等待标准输入的时候,如果此时套接字有数据但不能读出。IO多路复用意味着可以将标准输入、套接字等都当做IO的一路,任何一路IO有事件发生,都将通知相应的应用程序去处理相应的IO事件,在我们看来就反复同时可以处理多个事情。这就是IO复用。
信号驱动IO
在信号驱动式 I/O 模型中,应用程序使用套接口进行信号驱动 I/O,并安装一个信号处理函数,进程继续运行并不阻塞。当数据准备好时,进程会收到一个 SIGIO 信号,可以在信号处理函数中调用 I/O 操作函数处理数据。
优点:
当有事件触发的时候, 由内核通过发送信号的方式主动通知进程
不需要由用户进程复制fd数组到内核
缺点:
只支持边缘触发
信号处理不好可能会导致进程出问题.
异步IO
用程序告知内核启动某个操作,并让内核在整个操作(包括将数据从内核拷贝到应用程序的缓冲区)完成后通知应用程序。
同步与异步
对于发生一次网络IO,可以分为两部分:
1、等待数据:
阻塞:线程挂起,等待内核完成操作。
非阻塞:马上返回,无论是否完成。
2、将数据从内核复制到用户空间:
同步:线程自己把数据从内核复制到用户空间,期间不能做其它事情,一直等待数据复制完毕。
异步:系统内核把数据从内核复制到用户空间,然后再通知相应线程进行数据处理。
总结:
阻塞/非阻塞:发生请求后,是否等待接收方处理好数据(是否等待数据处理好)。
同步/异步: 线程是否需要等待数据从内核复制到用户空间(是否等待数据复制)。