在 AIX 上通过 pollset 接口实现高效的 I/O
2009-09-05 00:00:00 来源:WEB开发网当一个文件描述符上数据准备好时,它无法立即响应。
在多任务系统上尤其应该避免这种忙 - 等待 polling 方法。
为了解决这些问题,UNIX® System SVR3 上引入了一个 poll() API,它已经成为 POSIX 标准的一部分。简单地说,应用程序向内核提供一个文件描述符列表和一个超时值,它需要监视这些文件描述符的读 / 写 / 错误状态。内核向相关设备的选择函数注册这个进程 / 线程,并让这个进程 / 线程睡眠。当相关设备准备好或计时器过期时,内核唤醒注册的进程 / 线程。这种方法会显著降低 I/O 开销;它消除了内核和用户空间之间的大量系统调用和数据复制。另外,应用程序可以立即响应 I/O 事件。
Java NIO 库引入了一个 “选择器” 类,用于从 Java 应用程序支持这个 API。任何 Java 应用程序都可以通过 open() 调用打开一个选择器以获取相关联的数据结构,见 清单 2。
清单 2. 如何获取选择器对象
Selector selector = Selector.open();
然后,应用程序用 register () 调用向选择器注册通道(文件描述符)和感兴趣的操作。例如,如果应用程序希望知道某一通道什么时候准备好读取,可以向选择器注册这个文件描述符并指定读操作,见 清单 3。
清单 3. 向选择器注册通道
channel.register(selector, SelectionKey.OP_READ);
图 1. 传统的 poll() 方式
如 图 1 所示,选择器在内部保存这些详细信息,直到应用程序在选择器上调用 select() 方法,见 清单 4。然后,选择器把通道和感兴趣的操作复制到内核空间,让内核为这个应用程序执行实际的 poll。
更多精彩
赞助商链接