想系统了解一下windows下面的几种IO模式,现在从重叠IO开始。
先说事件通知的重叠IO,时间通知的重叠IO的好处就是写程序的时候可以先一股脑投递n个IO的请求,然后将每个OVERLAPPED结构与一个event对象相关联,再交给操作系统让它自己慢慢处理去。然后投递完所有的请求之后等待WaitForMultipleObjects返回(WaitForMultipleObjects返回了代表所有的IO操作都已经完成了),然后依次调用GetOverlappedResult来获得IO操作的信息(其实GetOverlappedResult也会等待IO操作完成,不过到这里已经完成了)。当然GetOverlappedResult之前在等待IO操作完成的时候程序还可以做些其他的事情。
而重叠IO的另外一种模式就是异步过程调用,异步过程调用有点类似于创建线程函数createthread的做法,在读写操作的时候指定一个回调函数,读取完毕之后程序自动从回调函数入口点来执行(支持重叠IO的读写操作函数如readfile、WSARecv等都会有个参数指定回调函数入口点),这样把更多的操作放到重叠IO的处理函数中,主函数就可以腾出更多的时间干正事。
不论是哪种模式,其实原理都是一样的,就是先把要读写的请求全部投递了,然后主程序可以一边做该做的事情一边来等待IO的完成,IO完成以后(WaitForMultipleObjects返回之后)再处理数据。
套用一段《Win32多线程程序设计》里的话结尾:重叠IO可以让你要求操作系统为你传送数据,并且再传送完毕时通知你,它使你的程序在IO进行过程中仍然能够继续处理事务。事实上操作系统内部正是以线程来完成重叠IO。你可以获得线程的所有利益,而不需付出什么痛苦代价。