什么都不做
,不停的去检查这个函数有没有返回
,应用程序必须等这个函数返回才能进行下一步的动作。 挂起
,直到等待的时间发生为止,才可以继续执行下一步的操作。非阻塞I/O执行系统调用总是立即返回,不管事件是否已经发生
,若事件没有发生,则返回-1,此时可以根据errno区分这两种情况,对于accept、recv和send、事件未发生时,errno通常被设置成EAGAIN
。非阻塞I/O通常要和其它I/O通知机制一起使用
,比如I/O多路复用和SIGIO信号。I/O多路复用是最常用的I/O通知机制
。应用程序通过I/O复用函数向内核注册一组事件,内核通过I/O复用函数把其中就绪的事件通知给应用程序
。可以同时监听多个I/O事件
。在该信号处理函数中对目标文件描述符执行非阻塞I/O操作
。异步
,在第二个阶段是同步
;信号驱动I/O与非阻塞I/O的区别在于它提供了消息通知机制
,不需要用户进程不断的轮询检查,减少了系统调用的次数,提高了效率。同步是执行或调用一个方法时,每次都需要拿到对应的结果才会继续往后执行;异步与同步相反,它会在执行或调用一个方法后就继续往后执行,不会等待获取执行结果。二者的区别就是处理请求发出后,是否需要等待请求结果,再去继续执行其他操作。
——来源线程与同步异步同步I/O
模型,因为在这三种I/O模型中,I/O的读写操作,都是在I/O事件发生之后,由应用程序来完成的。直接对I/O执行读写操作
,这些操作告诉内核用户读写缓冲区的位置,以及I/O操作完成之后内核通知应用程序的方式。(POSIX规范) 真正的读写操作已由内核接管
。用户代码自行执行I/O操作
(将数据从用户缓冲区拷贝到内核缓冲区,从内核缓冲区拷贝到用户缓冲区)。内核来执行I/O操作
(即数据在用户缓冲区域内核缓冲区的移动是由内核在"后台"完成的)。就绪事件
。完成事件
。