C++ - Sleep()和cin如何工作?

qua*_*ano 17 c++ windows multithreading scheduler blocking

只是好奇.实际上Sleep()的工作原理是什么(在windows.h中声明)?也许不只是那个实现,而是任何人.我的意思是 - 它是如何实现的?如何使代码在特定时间内"停止"?同样好奇cin >>和那些实际工作.他们到底做了什么?

我知道如何"阻止"继续运行的唯一方法是使用while循环,但考虑到与调用stdin方法时发生的事情相比需要大量的处理能力(仅比较一段时间(真实)从stdin读取,我猜这不是他们所做的.

Sin*_*ion 29

操作系统使用一种称为调度程序的机制来保持它管理的所有线程或进程在一起运行良好.

每秒几次,计算机的硬件时钟会中断CPU,从而导致操作系统的调度程序被激活.然后,调度程序将查看正在尝试运行的所有进程,并决定在下一个时间片中运行哪个进程.

它用来决定的不同事物取决于每个流程状态,以及它之前有多少时间.因此,如果当前进程一直在大量使用CPU,阻止其他进程取得进展,它将使当前进程等待并在另一个进程中交换,以便它可以执行一些工作.

但更常见的是,大多数进程都处于等待状态.例如,如果进程正在等待来自控制台的输入,则操作系统可以查看进程信息并查看其等待的io端口.它可以检查这些端口以查看它们是否有任何数据供该进程使用.如果他们这样做,它可以再次启动该过程,但如果没有数据,那么该过程将跳过当前时间片.

至于sleep()任何进程都可以通知操作系统它想要等待一段时间.然后,即使在硬件中断之前,调度程序也会被激活(这也是当进程尝试从没有数据准备好被读取的流执行阻塞读取时发生的情况),并且操作系统会记录该进程是什么等待.对于睡眠,该过程正在等待警报响起,或者每次重新启动时它可能再次产生,直到定时器启动.

由于操作系统仅在某些事情导致其抢占正在运行的进程(例如我提到的进程产生或硬件计时器中断)之后才恢复进程,sleep()因此不太准确,具体取决于操作系统或硬件,但通常大约为一个或多个毫秒.

如果需要更高的精度或非常短的等待,唯一的选择是使用您提到的busy循环结构.