关于Windows I/O完成端口可运行线程的数量
在阅读《Windows核心编程(第五版)》中的同步设备I/O与异步设备I/O一章时,其中提到了线程池中的线程数量应该大于在完成端口中设置的并发线程数量。
假设我们在一台有两个CPU的机器上运行。我们创建了最多只允许两个线程被唤醒的完成端口,还创建了4个线程来等待已完成的I/O请求。如果3个已完成的I/O请求被添加到端口的队列中,只有2个线程会被唤醒来对请求进行处理,这降低了可运行线程的数量,并节省了上下文切换的时间。现在,如果一个可运行的线程调用了Sleep、WaitForSingleObject等导致线程变成不可运行的状态的函数,I/O完成端口会检测到这一情况并立即唤醒第三个线程。
现在,假设刚才变成不可运行的线程再次变成可运行的,
可运行的线程数量将超过系统中CPU数量。那这个时候系统中线程的运行情况是怎么样的呢?