只是好奇。如何实际功能睡眠()工作(在WINDOWS.H申报)?也许不只是执行,但任何人。随着我的意思是 - 它是如何实现的?它是如何使代码“停止”的具体时间?还包括如何CIN >>和那些好奇的实际的工作的。他们做什么呢?

我所知道的唯一的方式如何“块”的东西持续运行是一个while循环,但考虑到这需要相比,当你调用方法从标准输入读取发生了什么巨大的处理能力的量(只比较了一段时间(真)从标准输入读取),我猜,是不是他们做什么。

有帮助吗?

解决方案

在OS使用的机制被称为调度器保持所有的线程或处理它的管理行为很好地在一起。

每秒

几次,计算机的硬件时钟中断CPU,这使得OS的调度程序被激活。然后,调度器将考虑所有那些试图运行,并决定哪一个到达下一个时间片运行的进程。

使用它来决定不同的事情都取决于每个过程的状态,它多少时间过的。因此,如果当前进程已使用的CPU沉重,防止其它进程取得进展了,它会使当前的进程等待和掉期在另一个进程,以便它可以做一些工作。

更多的时候,虽然,大多数过程将要在一个等待状态。举例来说,如果一个进程从控制台等待输入,操作系统可以看看进程的信息,看看哪些IO端口的等待。它可以检查这些端口,看看他们是否有任何数据的处理上下工夫。如果他们这样做,就可以重新开始的过程,但如果没有数据,则该过程被跳过当前时间片。

作为sleep(),任何过程可以通知它希望等待一段时间的OS。调度会那么即使一个硬件中断之前被激活(这也是当一个进程试图做从没有数据就绪流中读取阻塞被读取,会发生什么)和OS使得音符的过程是什么等待。对于睡眠,该过程等待一个报警熄灭,或者它可能只是再次产生每个它的重新启动时间,直到计时器已到。

由于OS仅恢复过程的东西使其后抢占正在运行的进程,如过程产生或硬件计时器中断我所提到的,sleep()不是很准确,如何准确取决于OS或硬件上,但它通常是在一个或多个毫秒量级。

如果需要更高的精确度,或非常短等待,唯一的选择是使用繁忙的循环构造你提到。

其他提示

在操作系统的时间表如何处理运行(这过程是符合运行条件,在什么样的顺序,...)。 Sleep()可能发出一个系统调用,它告诉内核“不要让我用处理器的 X 的毫秒。”

在短,睡眠()告诉操作系统忽略了一会儿进程/线程。

“CIN”使用一吨重载操作符的。的“>>”,这通常是右位移,过载在C ++几乎每一个类型右边的操作数的。一个单独的功能被提供为每一个,其从控制台读取并转换成取变量的类型是否给定了输入。例如:

std::cin::operator>> (int &rhs);

这不是真正的C ++ - 我还没有和流工作,并在一段时间超载,所以我不记得的返回类型或参数的确切顺序。然而,当运行CIN >>整数变量调用此函数。

的确切底层实现取决于操作系统上。

答案取决于操作系统,但总体来讲,操作系统要么安排一些其他的代码在另一个线程的其他地方运行,如果它确实没有任何关系,它得到的CPU要等到硬件事件发生,这将导致CPU跳到称为中断处理程序的一些代码,然后可以决定运行哪些代码。

如果您正在寻找在多线程程序阻塞线程/进程的更可控的方式,看看信号量,互斥,CriticalSections和活动。这些是用于阻断进程或线程的所有技术(不经由while结构加载CPU)。

它们基本上停止的地方被阻塞的线程正在等待一等待/信号成语的工作,而另一进程的信号它告诉它重新开始。这些(至少在视窗)也可以有超时,从而提供了类似的功能的Sleep()。

在低的水平,该系统具有一个被称为“调度器”,从所有正在运行的程序的CPU(一个或多个),这实际上运行它们分派指令例程。系统调用等“睡眠”和“usleep”匹配来告诉调度器忽略的时间固定量的线程或进程的指令。

对于C ++的溪流,“CIN”隐藏实际的文件句柄(stdin和stdout实际上是这样的把手)你所访问,而“>>”操作符它隐藏了底层调用来读取和写入。由于其的接口的实现可以是OS特定的,但是在概念上它仍然是做在引擎盖下的东西如printf和scanf。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top