四种高性能服务器IO分析剖析.pdfVIP

  1. 1、本文档共32页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
异步IO、APC、IO 完成端口、线程池与高性能服务器之一 异步IO 背景:轮询 PIO DMA 中断 早期IO 设备的速度与CPU 相比,还不是太悬殊。CPU 定时轮询一遍IO 设备,看看有无处理要求,有则加以处理,完成后返回继续工作。至今,软盘驱 动器还保留着这种轮询工作方式。 随着CPU 性能的迅速提高,这种效率低下的工作方式浪费了大量的CPU 时间。因此,中断工作方式开始成为普遍采用的技术。这种技术使得IO 设备在 需要得到 服务时,能够产生一个硬件中断,迫使CPU 放弃目前的处理任务,进 入特定的中断服务过程,中断服务完成后,再继续原先的处理。这样一来,IO 设备和CPU 可以同时进行处理,从而避免了CPU 等待IO 完成。 早期数据的传输方式主要是PIO (程控IO)方式。通过对IO 地址编程 方式的方式来传 输数据。比如串行口,软件每次往串行口上写一个字节数据, 串口设备完成传输任务后,将会产生一个中断,然后软件再次重复直到全部数据 发送完成。性能更好的 硬件设备提供一个FIFO (先进先出缓冲部件),可以让 软件一次传输更多的字节。 显然,使用PIO 方式对于高速IO 设备来说,还是占用了 太多的CPU 时间(因为需要通过CPU 编程控制传输)。而DMA (直接内存访问)方式能够极 大地减少CPU 处理时间。CPU 仅需告诉DMA 控制器数据块的 起始地址和大小, 以后DMA 控制器就可以自行在内存和设备之间传输数据,其间CPU 可以处理其他 任务。数据传输完毕后将会产生一个中断。 同步文件IO 和异步文件IO 下面摘抄于MSDN 《synchronous file I/O and asynchronous file I/O》。 有两种类型的文件IO 同步:同步文件IO 和异步文件IO。异步文件IO 也就是重 叠IO。 在同步文件IO 中,线程启动一个IO 操作然后就立即进入等待状态,直到IO 操 作完成后才醒来继续执行。而异步文件IO 方式中,线程发送一个IO 请求到内核, 然后继续处理其他的事情,内核完成IO 请求后,将会通知线程IO 操作完成了。 如果IO 请求需要大量时间执行的话,异步文件IO 方式可以显著提高 效率,因为在线程等待的这段时间内,CPU 将会调度其他线程进行执行,如果没 有其他线程 需要执行的话,这段时间将会浪费掉(可能会调度操作系统的零页 线程)。如果IO 请求操作很快,用异步IO 方式反而还低效,还不如用同步IO 方式。 同步IO 在同一时刻只允许一个IO 操作,也就是说对于同一个文件句柄 的IO 操作是序列化的,即使使用两个线程也不能同时对同一个文件句柄同时发 出读写操作。重叠IO 允许一个或多个线程同时发出IO 请求。 异步IO 在请求完成时,通过将文件句柄设为有信号状态来通知应用程 序,或者应用程序通过GetOverlappedResult 察看IO 请求是否完成,也可以通 过一个事件对象来通知应用程序。 异步IO、APC、IO 完成端口、线程池与高性能服务器之二 APC Alertable IO(告警IO)提供了更有效的异步通知形式。ReadFileEx / WriteFileEx 在发出IO 请求的同时,提供一个回调函数(APC 过程),当IO 请 求完成后,一旦线程进入可告警状态,回调函数将会执行。 以下五个函数能够使线程进入告警状态: SleepEx WaitForSingleObjectEx WaitForMultipleObjectsEx SignalObjectAndWait MsgWaitForMultipleObjectsEx 线程进入告警状态时,内核将会检查线程的APC 队列,如果队列中有 APC,将会按FIFO 方式依次执行。如果队列为空,线程将会挂起等待事件对象。 以后的 某个时刻,一旦APC 进入队列,线程将会被唤醒执行APC,同时等待函 数返回WAIT_IO_COMPLETION。 QueueUserAPC 可以用来人为投递APC,只要目标线程处于告警状态时, APC 就能够得到执行。 使用告警IO 的主要缺点是发出IO 请求的线程也必须是处理结果的线 程,如果一个线程退出时还有未完成的IO 请求,那么应用程序将永远丢失IO 完成通

文档评论(0)

xiaofei2001129 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档