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

标签 c++ windows multithreading blocking scheduler

只是好奇。 Sleep() 函数实际上是如何工作的(在 windows.h 中声明)?也许不仅仅是那个实现,而是任何人。我的意思是-它是如何实现的?它如何使代码在特定时间“停止”?也很好奇 cin >> 和那些实际工作。他们具体是做什么的?

我知道如何“阻止”某些内容继续运行的唯一方法是使用 while 循环,但考虑到与调用从标准输入读取的方法时发生的情况相比,这需要大量的处理能力(只需将一段时间(真实)与从标准输入中读取进行比较),我猜这不是他们所做的。

最佳答案

操作系统使用一种称为调度程序的机制来保持其管理的所有线程或进程良好地协同工作。

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

它用来决定的不同事物取决于每个进程的状态,以及它之前有多少时间。所以如果当前进程一直在大量使用CPU,阻止其他进程继续进行,它会让当前进程等待并换入另一个进程,以便它可以做一些工作。

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

对于sleep(),任何进程都可以通知操作系统它想等待一段时间。调度程序甚至会在硬件中断之前被激活(当一个进程试图从一个没有数据可供读取的流中进行阻塞读取时也会发生这种情况),并且操作系统会记下该进程是什么等待。对于 sleep ,进程正在等待警报响起,或者它可能会在每次重新启动时再次屈服,直到计时器结束。

由于操作系统只在某些事情导致它抢占正在运行的进程之后才恢复进程,例如我提到的进程让步或硬件定时器中断,所以 sleep() 不是很准确,准确度取决于在操作系统或硬件上,但通常是一毫秒或多毫秒。

如果需要更高的准确性,或者等待时间很短,唯一的选择是使用您提到的繁忙循环结构。

关于C++ - Sleep() 和 cin 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1080805/

相关文章:

c++ - 从函数重新调整对象时,C++ 如何知道要复制多少字节?

c++ - Qt。将项目从 Linux 移动到 Windows。为什么 Qt creator 返回错误 c1083 can't open directory or file?

windows - 将分号放在 Windows PATH 环境变量中

c++ - CRT 内存泄漏检测未检测到内存泄漏

c# - ThreadPool 中线程的名称 - C#

c++ - 错误 : expression must have a class type

c++ - 将 std::function 与 lambda 和可变参数模板一起使用

c++ - c++ 中的 vector 这么慢吗?

c - 如何获得某些 Visual Basic 6 控件的 IUnknown* 指针(如果有)?

c# - 线程池 + 轮询 C# .Net 3.5