产生重叠IO的原因:
对于阻塞IO的读写操作都是需要阻塞等待IO完成的,大大的浪费用户的进程的时间片,降低了程序的性能。所以系统开个后门,悄悄地给你开个后门,开个线程去帮你请求IO,等到IO操作完成之后再通知你,你就可一再接着处理就好了,那么在IO完成之前你就可以放心的做其他的了。
重叠IO的重要数据结构:
typedef struct _WSAOVERLAPPED {
DWORD Internal;
DWORD InternalHigh;
DWORD Offset;
DWORD OffsetHigh;
WSAEVENT hEvent;
} WSAOVERLAPPED, *LPWSAOVERLAPPED;
WSAEVENT hEvent是连接完成事件和用户程序的桥梁,我们可以通过可爱的waitformultipleobjects和waitforsingleobject来接受通知,进而处理完成事件。
那么,IOCP又是怎么一肥事呢?
需要知道,重叠IO解放劳动力的同时,也是有代价的,如果1000个请求同时发生就需要系统内部开启1000个线程去处理IO,那么负载实在太大了,所以需要池化,为用户进程开线程池去优化IO请求咯。
注意:
使用重叠IO或者IOCP之前IO句柄或者Socket创建的时候需要置位WSA_FLAG_OVERLAPPED标志。
socket默认置位WSA_FLAG_OVERLAPPED。
重叠IO应该默认使用WSA前缀函数族。
来源:CSDN
作者:纵使微芒如烟
链接:https://blog.csdn.net/dong1528313271/article/details/103849083