免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: SybaseLU
打印 上一主题 下一主题

同步I/O(阻塞I/O),异步I/O(非阻塞) [复制链接]

论坛徽章:
0
1 [报告]
发表于 2012-02-29 17:00 |显示全部楼层
本帖最后由 251316192 于 2012-02-29 17:11 编辑

这个东西其实在应用层不太好说明。那么我就把驱动端的实现简要描述下。

阻塞 I/O
一个驱动当它无法立刻满足请求应当如何响应? 一个对 read 的调用可能当没
有数据时到来, 而以后会期待更多的数据. 或者一个进程可能试图写, 但是你的设备没有
准备好接受数据, 因为你的输出缓冲满了. 调用进程往往不关心这种问题; 程序员只希望
调用 read 或 write 并且使调用返回, 在必要的工作已完成后. 这样, 在这样的情形中,
你的驱动应当(缺省地)阻塞进程, 使它进入睡眠直到请求可继续.

poll 和 select
使用非阻塞 I/O 的应用程序常常使用 poll, select, 和 epoll 系统调用. poll,
select 和 epoll 本质上有相同的功能: 每个允许一个进程来决定它是否可读或者写一个
或多个文件而不阻塞. 这些调用也可阻塞进程直到任何一个给定集合的文件描述符可用来
读或写. 因此, 它们常常用在必须使用多输入输出流的应用程序, 而不必粘连在它们任何
一个上. 相同的功能常常由多个函数提供, 因为 2 个是由不同的团队在几乎相同时间完
成的: select 在 BSD Unix 中引入, 而 poll 是 System V 的解决方案. epoll 调用[23]23
添加在 2.5.45, 作为使查询函数扩展到几千个文件描述符的方法.

异步 I/O
增加到 2.6 内核的一个新的特性是异步 I/O 能力. 异步 I/O 允许用户空间来初始化操
作而不必等待它们的完成; 因此, 一个应用程序可以在它的 I/O 在进行中时做其他的处
理. 一个复杂的, 高性能的应用程序还可使用异步 I/O 来使多个操作在同一个时间进行.
异步 I/O 的实现是可选的, 并且很少几个驱动作者关心; 大部分设备不会从这个能力中
受益. 如同我们将在接下来的章节中见到的, 块和网络驱动在整个时间是完全异步的, 因
此只有字符驱动对于明确的异步 I/O 支持是候选的. 一个字符设备能够从这个支持中受
益, 如果有好的理由来使多个 I/O 操作在任一给定时间同时进行. 一个好例子是流化磁
带驱动, 这里这个驱动可停止并且明显慢下来如果 I/O 操作没有尽快到达. 一个应用程
序试图从一个流驱动中获得最好的性能, 可以使用异步 I/O 来使多个操作在任何时间准
备好进行.

异步通知
尽管阻塞和非阻塞操作和 select 方法的结合对于查询设备在大部分时间是足够的, 一些
情况还不能被我们迄今所见到的技术来有效地解决.
让我们想象一个进程, 在低优先级上执行一个长计算循环, 但是需要尽可能快的处理输入
数据. 如果这个进程在响应新的来自某些数据获取外设的报告, 它应当立刻知道当新数据
可用时. 这个应用程序可能被编写来调用 poll 有规律地检查数据, 但是, 对许多情况,
有更好的方法. 通过使能异步通知, 这个应用程序可能接受一个信号无论何时数据可用并
且不需要让自己去查询.
用户程序必须执行 2 个步骤来使能来自输入文件的异步通知. 首先, 它们指定一个进程
作为文件的拥有者. 当一个进程使用 fcntl 系统调用发出 F_SETOWN 命令, 这个拥有者
进程的 ID 被保存在 filp->f_owner 给以后使用. 这一步对内核知道通知谁是必要的.
为了真正使能异步通知, 用户程序必须设置 FASYNC 标志在设备中, 通过 F_SETFL fcntl
命令.

总的说来阻塞非阻塞是内核是否有做进程调度,同步是你能知道时序的,异步只是通知或者说配置,什么时候执行读写操作,是未知的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP