在windows中有一个api叫readfile
bool readfile(
handle hfile, // handle to file
lpvoid lpbuffer, // data buffer
dword nnumberofbytestoread, // number of bytes to read
lpdword lpnumberofbytesread, // number of bytes read
lpoverlapped lpoverlapped // overlapped buffer
);
如果我们在createfile的时候没有使用file_flag_overlapped 标志,同时在调用readfile的时候把lpoverlapped lpoverlapped 这个参数设置的是null,那么readfile这个函数的调用一直要到读取完数据指定的数据后才会返回,如果没读取完,就会阻塞在这里。同样 ,writefile和readfile都是这样的。这样在读写大文件的时候,我们很多时间都浪费在等待readfile和writefile的返回上面。如果readfile和writefile是往管道里读写数据,那么有可能阻塞得更久,导致程序性能下降。为了解决这个问题,windows引进了重叠io的概念,同样是上面的readfile和writefile,如果在createfile的时候设置了file_flag_overlapped ,那么在调用readfile和writefile的时候就可以给他们最后一个参数传递一个overlapped结构。这样readfile或者writefile的调用马上就会返回,这时候你可以去做你要做的事,系统会自动替你完成readfile或者writefile,在你调用了readfile或者writefile后,你继续做你的事,系统同时也帮你完成readfile或writefile的操作,这就是所谓的重叠。使用重叠io还有一个好处,就是你可以同时发出几个readfile或者writefile的调用,然后用waitforsingleobject或者waitformultipleobjects来等待操作系统的操作完成通知,在得到通知信号后,就可以用getoverlappedresult来查询io调用的结果。
至于socket里的重叠io,和这个差不错,不同的是readfile writefile被wsarecv和wsasend所代替了。这其中牵涉到的东西很多,其实有关windows的异步io机制,是很高深的,所以开始我才推荐你去看《windows2000编程内幕》,也可以去看《inside windows2000》
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/metasearch/archive/2008/03//2148226.aspx
说到 重叠模型首先还是提一下异步IO比较好,因为从本质上讲,重叠模型也是一种异步IO模型。
我们知道,相对于计算机执行的其他操作而言,设备IO(文件、管道、套接字等)是比较慢的。于是在多线程结构中就考虑到采用异步的方式 进行设备读写操作,即我们告诉系统对设备的 读写数据,而同时应用程序的其他代码继续执行,直到 获取设备 操作完毕的 系统通知。
在进行异步IO时,我们先向系统发出IO请求,操作系统队列化各种IO请求,并在内部 完成操作,当系统在处理IO请求时,我们的线程可以返回 继续执行,当操作系统处理完IO请求之后,通知我们数据操作(发送、接收、出错)完毕。
Windows提供了四种异步IO技术,机制几乎时相同的,区别在于通知结果的方式不同:
1、使一个设备内核对象变为有信号
Windows将设备句柄看作可同步的对象,即它可以处于有信号或处于无信号状态,当创建设备句柄、以异步的方式发送IO请求时,该句柄处于无信号状态,当异步IO完成之后,该句柄受信,通过WaitForSingleobject或WatiForMultipleObjects函数可以判断设备操作合适完成。该技术只能用于一个设备只发送一个IO请求,否则,若一个设备对应多个操作,当句柄受信时无法判断是该设备的那个操作完成。
2、使一个事件内核对象变为有信号
针对每个I/O操作绑定一个内核事件对象,并将等待事件等待函数等待该事件的受信,当I/O操作完成后系统使得与该操作绑定的事件受信,从而判断那个操作完成。该技术解决了使一个设备内核对象变为有信号技术中一个设备只能对应一个操作的不足。
3、警告I/O
在该技术中,当发出设备IO请求时,同时要求我们传递一个被称为完成例程的回调函数,当IO请求完成时调用该回调函数完成我们需要处理的工作。该技术允许单个设备同时进行多个I/O请求。
4、完成端口
完成端口技术多用于处理 大规模的请求,通过内在的进程池技术可以达到很高的性能,此时暂不做 深入讨论,若预知 后事如何,请自己看,或等下回完成端口部分分解。
http://www.hudong.com/wiki/%E9%87%8D%E5%8F%A0IO%E6%A8%A1%E5%9E%8B
bool readfile(
handle hfile, // handle to file
lpvoid lpbuffer, // data buffer
dword nnumberofbytestoread, // number of bytes to read
lpdword lpnumberofbytesread, // number of bytes read
lpoverlapped lpoverlapped // overlapped buffer
);
如果我们在createfile的时候没有使用file_flag_overlapped 标志,同时在调用readfile的时候把lpoverlapped lpoverlapped 这个参数设置的是null,那么readfile这个函数的调用一直要到读取完数据指定的数据后才会返回,如果没读取完,就会阻塞在这里。同样 ,writefile和readfile都是这样的。这样在读写大文件的时候,我们很多时间都浪费在等待readfile和writefile的返回上面。如果readfile和writefile是往管道里读写数据,那么有可能阻塞得更久,导致程序性能下降。为了解决这个问题,windows引进了重叠io的概念,同样是上面的readfile和writefile,如果在createfile的时候设置了file_flag_overlapped ,那么在调用readfile和writefile的时候就可以给他们最后一个参数传递一个overlapped结构。这样readfile或者writefile的调用马上就会返回,这时候你可以去做你要做的事,系统会自动替你完成readfile或者writefile,在你调用了readfile或者writefile后,你继续做你的事,系统同时也帮你完成readfile或writefile的操作,这就是所谓的重叠。使用重叠io还有一个好处,就是你可以同时发出几个readfile或者writefile的调用,然后用waitforsingleobject或者waitformultipleobjects来等待操作系统的操作完成通知,在得到通知信号后,就可以用getoverlappedresult来查询io调用的结果。
至于socket里的重叠io,和这个差不错,不同的是readfile writefile被wsarecv和wsasend所代替了。这其中牵涉到的东西很多,其实有关windows的异步io机制,是很高深的,所以开始我才推荐你去看《windows2000编程内幕》,也可以去看《inside windows2000》
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/metasearch/archive/2008/03//2148226.aspx
说到 重叠模型首先还是提一下异步IO比较好,因为从本质上讲,重叠模型也是一种异步IO模型。
我们知道,相对于计算机执行的其他操作而言,设备IO(文件、管道、套接字等)是比较慢的。于是在多线程结构中就考虑到采用异步的方式 进行设备读写操作,即我们告诉系统对设备的 读写数据,而同时应用程序的其他代码继续执行,直到 获取设备 操作完毕的 系统通知。
在进行异步IO时,我们先向系统发出IO请求,操作系统队列化各种IO请求,并在内部 完成操作,当系统在处理IO请求时,我们的线程可以返回 继续执行,当操作系统处理完IO请求之后,通知我们数据操作(发送、接收、出错)完毕。
Windows提供了四种异步IO技术,机制几乎时相同的,区别在于通知结果的方式不同:
1、使一个设备内核对象变为有信号
Windows将设备句柄看作可同步的对象,即它可以处于有信号或处于无信号状态,当创建设备句柄、以异步的方式发送IO请求时,该句柄处于无信号状态,当异步IO完成之后,该句柄受信,通过WaitForSingleobject或WatiForMultipleObjects函数可以判断设备操作合适完成。该技术只能用于一个设备只发送一个IO请求,否则,若一个设备对应多个操作,当句柄受信时无法判断是该设备的那个操作完成。
2、使一个事件内核对象变为有信号
针对每个I/O操作绑定一个内核事件对象,并将等待事件等待函数等待该事件的受信,当I/O操作完成后系统使得与该操作绑定的事件受信,从而判断那个操作完成。该技术解决了使一个设备内核对象变为有信号技术中一个设备只能对应一个操作的不足。
3、警告I/O
在该技术中,当发出设备IO请求时,同时要求我们传递一个被称为完成例程的回调函数,当IO请求完成时调用该回调函数完成我们需要处理的工作。该技术允许单个设备同时进行多个I/O请求。
4、完成端口
完成端口技术多用于处理 大规模的请求,通过内在的进程池技术可以达到很高的性能,此时暂不做 深入讨论,若预知 后事如何,请自己看,或等下回完成端口部分分解。
http://www.hudong.com/wiki/%E9%87%8D%E5%8F%A0IO%E6%A8%A1%E5%9E%8B