在 AIX 上通过 pollset 接口实现高效的 I/O
2009-09-05 00:00:00 来源:WEB开发网在监视大量文件描述符时,如果在循环中调用 poll(),poll 所涉及的这些高成本的系统调用会严重影响总体性能。
为了让 poll() 能够处理大量文件描述符,AIX pollset 接口提供了两个优化措施。第一个措施减少每个 poll 操作在内核和用户空间之间传输的信息量,见 图 2。pollset 接口在本机(内核)pollset 层中创建并维护一个文件描述符集和感兴趣的事件。应用程序直接向本机 pollset 层注册文件描述符和感兴趣的事件。与 poll() 不同,pollset 接口并不要求选择器在每次调用 select() 时复制整个文件描述符集。相反,它只复制在前一次 select() 调用之后新注册的事件。
图 2. Pollset() 方法
第二个优化措施是在内核中使用 poll 缓存机制。它跨系统调用在请求的文件描述符集上维护文件描述符状态。在每个 poll 操作的开头,通过 poll 繁忙的文件描述符跟踪状态。空闲文件描述符的状态是已知的,因为在状态改变时会通知 poll 缓存服务。
图 3. poll 缓存内部结构
图 3 显示 poll 缓存中的组件及其关系。poll 缓存管理一个可能很大的文件描述符集。其中的每个文件描述符由一个 poll 缓存控制块(pccb)表示。每个 pccb 根据文件描述符散列值放在 poll 缓存中。维护一个未处理列表,它标识最近有状态转换的 pccb。支持选择和 poll 的每个子系统都向 poll 缓存注册。当文件描述符的状态发生变化时,子系统通知 poll 缓存,这会在 poll 缓存中触发状态转换。传统的 poll()/select() 需要检查选择的所有文件描述符,为了解决由此产生的可伸缩性问题,poll 缓存通过状态转换只把 ‘繁忙的’ pccb 转移到事件列表中。这样,poll 操作就不需要访问 pollset 中的所有 pccb。只为已经添加到事件列表中的控制块提供服务。如果繁忙的文件描述符数量接近选择的文件描述符总数,而且文件描述符数量非常大,就会出现最糟糕的情况。在这种情况下,pollset 方法与传统的选择 /poll 方法相比并不能显著提高性能。
更多精彩
赞助商链接