《Microsoft Windows 2000 服务器端编程》 -- 第二章 设备I/O和线程间通信

[翻译:马夫]

[上一页] [下一页]


第二章


2.1 设备I/O和线程间通信

    无论我怎样强调本章的重要性都不足为过,它涵盖了实现高性能的、可伸缩的程序时的两个根本话题:设备I/O和线程间通信。一个具有伸缩性的程序在处理大批量并发操作时应该与处理小批量并发操作时一样地有效率。对于一个服务程序来说,这些操作最典型的就是处理在不定时刻到达且需要不等量处理能力的各种客户端请求。这些请求通常来自I/O设备(如网络适配器),处理它们常常需要另外的I/O设备(如磁盘文件)。
    在Microsoft Windows程序里,线程是最便利取用的并能帮你分时任务。一个线程可分配给一个处理器,这就使多处理器机器可以并发执行多重操作,增加吞吐量。当线程发出一个设备I/O请求时,线程会被暂时挂起直到设备完成I/O请求。这种挂起有损于性能,因为这时线程不能去做有用的工作,比如开始处理另一个客户端请求。因此,简而言之,你要让线程在所有时间里一直做有效的工作。
    为了助于保持线程繁忙,你必须让线程相互“通话”,交流它们要执行的操作。Microsoft花费了几年时间于这个领域进行研究和测试,并开发出一种微妙调谐的机制来创建这种通信。这种有助于你创建高性能高伸缩性的程序的机制称为“I/O完成端口”。通过使用“I/O完成端口”,你的程序能在读写设备时无需等待设备响应,从而使程序完成非凡的吞吐量。
    I/O完成端口最初是设计用于处理设备I/O的,但是经过这几年,Microsoft已经构造了越来越多的与I/O完成端口无缝结合的操作系统部件。一个例子是Microsoft Windows 2000里新引入的核心对象——作业:作业对象(job object)在监控一个进程时,它发送事件通知一个I/O完成端口。示例程序JobLab,可在《Programming Applications for Microsoft Windows, Fourth Edition》(Jeffrey Richter, Microsoft Press, 1999)一书中找到,它演示了I/O完成端口和作业对象时如何一起工作的。
    作为一个Windows开发人员,经过这么多年,我发现了I/O完成端口越来越多的用处,我认为每个Windows开发人员都必须完全理解I/O完成端口是如何工作的。本书中的很多示例程序使用了I/O完成端口。尽管我在本章介绍的I/O完成端口与设备I/O有关,但要明白它并不是非得用于设备I/O——姑且把设备I/O置于一边,I/O完成端口就是一种有着无数用途的卓越的线程间通信机制。
    从这些推崇中,你大概推断出我是一个I/O完成端口的发烧迷。我的愿望是你在读到本章的末尾后,也跟我一样。但我不会立即转入I/O完成端口的细节,而是先解释Windows原先提供给开发人员的用于线程间通信和设备I/O的方法。这会使你对I/O完成端口更多一些欣赏。在接近本章的末尾,“I/O Completion Ports”一节中,我将讲叙I/O完成端口。
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值