阻塞I/O:
调用之后一定要等到系统内核层面完成所有的操作,调用才会结束。
eg: 读取文件----
内核在完成磁道寻盘、读取数据、复制数据到内存之后,调用才算结束。
非阻塞I/O:
调用之后立即返回。
① 操作系统将所有的输入输出设备抽象为文件。
② 进行文件操作时,通过文件描述符进行管理,文件描述符类似于应用程序与系统内核之间的凭证。
③ 过程:
A:I/O调用----打开文件描述符
B:文件描述符实现文件的数据读写
非阻塞: 不带数据直接返回,通过文件描述符才能再次读取数据
阻塞: 完成整个获取数据过程。
C:非阻塞返回之后,CPU时间片继续完成其他事务。
返回当前调用的状态。
(非阻塞)
D: 通过轮询重复调用I/O操作确认完成获取完整数据
ps:轮询
read
select (1024长度)
poll (链表存储,避免数组长度的限制)
epoll (linux I/O通知效率最高机制)
轮询没有检查到事件,进入休眠
事件发生唤醒休眠
kqueue FreeBSD系统下存在
我之前一直觉得非阻塞和异步是一样的,但是书上说不一样。但是也没有给我准确的解释,看完了这一章,我有点明白了,但是还是有些说不清楚。所以我又去百度了一下同步和异步。
异步Asynchronous: 无需等待调用函数方法/对象的返回值就返回继续执行其他事务
调用之后一定要等到系统内核层面完成所有的操作,调用才会结束。
eg: 读取文件----
内核在完成磁道寻盘、读取数据、复制数据到内存之后,调用才算结束。
非阻塞I/O:
调用之后立即返回。
① 操作系统将所有的输入输出设备抽象为文件。
② 进行文件操作时,通过文件描述符进行管理,文件描述符类似于应用程序与系统内核之间的凭证。
③ 过程:
A:I/O调用----打开文件描述符
B:文件描述符实现文件的数据读写
非阻塞: 不带数据直接返回,通过文件描述符才能再次读取数据
阻塞: 完成整个获取数据过程。
C:非阻塞返回之后,CPU时间片继续完成其他事务。
返回当前调用的状态。
(非阻塞)
D: 通过轮询重复调用I/O操作确认完成获取完整数据
ps:轮询
read
select (1024长度)
poll (链表存储,避免数组长度的限制)
epoll (linux I/O通知效率最高机制)
轮询没有检查到事件,进入休眠
事件发生唤醒休眠
kqueue FreeBSD系统下存在
我之前一直觉得非阻塞和异步是一样的,但是书上说不一样。但是也没有给我准确的解释,看完了这一章,我有点明白了,但是还是有些说不清楚。所以我又去百度了一下同步和异步。
异步Asynchronous: 无需等待调用函数方法/对象的返回值就返回继续执行其他事务
同步Synchronous : 与异步相反
想了想,我觉得异步比较宏观,对于系统来说,调用了这个方法,但是直接就可以返回算是异步,比较像一个概括者说需要异步
非阻塞就比较细节,对于系统内核来说,如果一次性将I/O文件读取完毕就用到了阻塞,比如上面提到的那样。
有想法请和我交流~ 谢谢。