在 AIX 上通过 pollset 接口实现高效的 I/O
2009-09-05 00:00:00 来源:WEB开发网IBM® JDK 从 6.0 Service Refresh 5 开始支持 pollset 接口。应用程序不需要为了启用 pollset 接口进行修改。如果操作系统支持 pollset 接口,Java.nio.SelectorProvider 方法在默认情况下会打开 pollset 选择器。NIO 的 pollset 选择器使用下面的本机 pollset API(见 清单 6)提高应用程序性能。
清单 6. NIO 库使用的本机 pollset 接口
pollset_t ps = pollset_create(int maxfd);
int rc = pollset_destroy(pollset_t ps);
int rc = pollset_ctl(pollset_t ps, struct poll_ctl *pollctl_array, int array_length);
int nfound = pollset_poll(pollset_t ps, struct pollfd *polldata_array,
int array_length, int timeout);
正如前面提到的,当应用程序打开 poll 选择器时,poll 选择器会创建一个本机 pollset 结构。当应用程序注册通道时,选择器在本机 pollset 结构中注册文件描述符和感兴趣的事件。这意味着,对于每个注册,选择器调用必须执行两个模式切换。第一个切换是从 Java API 层到 Java native Interface (JNI) 层。第二个切换是从 JNI 层到内核空间。如果应用程序注册大量通道,这些切换会影响性能。
图 4. Pollset() - 批量更新
为了避免过多的模式切换,选择器方法在内部维护一个数据结构(见 图 4),在其中临时存储注册的文件描述符,直到它们的数量达到 java.nio.pollset.RegistrationPerCall(默认值为 50)。注意,当应用程序在选择器上调用 select() 时,即使注册数量没有达到 java.nio.pollset.RegistrationPerCall,选择器也会在本机 pollset 层中注册所有文件描述符。应用程序可以在启动时通过设置正整数值调整 registrationPerCall 数量,见 清单 7。
更多精彩
赞助商链接