好久没写博客了。
Iocp,这次写文件监控,应该是第一次自己写,以前应该只是看吧,单单写注意点吧。
1、CreateIocompletionPort函数,有创建完成端口和关联完成端口两个功能。最后一个参数 NumberOfConcurrentThreads如果是0,那么I/o端口会使用默认值,也就是允许并发执行的线程数量为主机的cpu数量。
2、当使用CreateIocompletionPort函数将句柄与完成端口关联时,系统将这些信息关联到完成端口的设备列表(hDevice, dwComletionKey)中。
3、当一个设备的一个异步I/O完成时,系统会检查设备是否与完成端口相关联,如果设备与一个完成端口相关联,那么系统将该项已完成的I/O请求追加到I/O完成端口的I/O完成队列(dwBytesTransferred,dwConpleteKey, pOverlapped, dwError)的末尾,这个队列是先入先出的
4、唤醒调用了GetQueuedCompletionStatus函数的线程是以后入先出的形式进行的,这样子通过后入先出的算法,系统可以将未调度的线程的内存资源换出磁盘,这意味着让许多线程等待一个完成端口不是什么坏事。
5、当线程调用了sleep等函数导致线程变为不可运行的状态时,I/O完成端口会唤醒另外一个线程。完成端口的目标是使CPU保持在满负荷状态下工作。如果此时不可运行的线程变为可运行了,可运行的线程数量超过cpu的数量。Iocp体系接口允许线程数量短时间超过最大的线程数量。