40

我最近开始学习CPU和操作系统是如何工作的,我对使用提供多任务操作系统的单CPU机器的操作感到困惑。因此,假设我的机器只有一个CPU,这意味着在任何给定的时间,只有一个进程可以运行。操作系统调度程序如何重新获得CPU的控制权?

现在,我只能假设操作系统用来控制访问贵重CPU时间的调度程序也是一个过程。

因此,在此机器中,用户进程或调度系统进程在任何给定时间点运行,但不是两者都运行。

所以这里有一个问题:

一旦调度给出了CPU到另一个过程的控制,怎么可以恢复CPU时间再次运行本身做它的调度工作?我的意思是,如果当前运行的任何给定进程没有放弃(产生)CPU,那么调度器本身如何再次运行并确保正确的多任务处理?到目前为止,我一直在想,如果用户进程通过系统调用请求I/O操作,那么在系统调用中,我们可以确保调度器再次分配一些CPU时间。但我甚至不确定这是否以这种方式工作。另一方面,如果有问题的用户进程固有地受到CPU限制,那么从这个角度来看,它可以永远运行,永远不会让其他进程,甚至是调度器再次运行。

假设时间片调度,我不知道如何调度程序可以切割执行另一个进程的时间,甚至没有运行?

我真的很感谢您在这方面提供的任何见解或参考。

+3

我希望我能够足够努力地解决这个问题。我开始学习和你一样的概念,并面对同样的问题。这些东西应该与我们的书籍和文章中的cpu和os设计的基础一起。感谢您发布这个! – 2017-10-01 07:28:24

回答

36

OS设置一个硬件定时器(Programmable interval timer或PIT),每N毫秒产生一次中断。该中断被传递给内核并且用户代码被中断。

它可以像任何其他硬件中断一样工作。例如,您的磁盘在完成IO时会强制切换到内核。

+8

这是正确的答案。但是,例如,在较旧系统中为Windows 98编程时,程序员不得不显式调用'yield()'命令。否则,没有其他进程可能再次夺回对CPU的控制权,最终会导致系统崩溃。 – MatijaSh 2012-07-13 15:46:41

+0

如果您首先提到了所有重要的IO中断,那么我会再添加一点。 – 2012-07-14 09:58:46

+3

@MatijaSh Windows 98当然不需要。 – jalf 2013-07-25 07:02:56

4

为了补充@ USR的答案,从Understanding the Linux Kernel报价:

时间表()函数

时间表()实现调度。其目标是在runqueue列表中找到 进程,然后将CPU分配给它。通过几个内核例程直接或以一种懒惰的方式调用 。 [...]

懒惰调用

调度也可以在一个懒惰的方式通过电流[过程]的 need_resched字段设置为1调用。由于在继续执行用户模式 进程(参见 第4章中的“从中断和例外返回”一节)之前总是会检查此 字段的值,因此schedule()将在某个关闭时调用未来的时间。

+1

+1仅供参考。我刚刚在你引用的书中找到了[usr](http://stackoverflow.com/users/122718/usr)在其他答案中给出的解释:“当然,单个处理器在任何给定的时刻只能运行一个进程。[...]时间共享依赖于定时器中断,因此对进程是透明的。程序中不需要插入额外的代码,以确保CPU时间共享“ – 2012-07-13 16:48:42

8

Google'中断'。中断是多线程,抢占式内核(如Linux/Windows)的核心。没有中断,操作系统将永远不会做任何事情。

在调查/学习过程中,尽量忽略提及第一段中的'定时器中断','循环法'和'时间片','量子'的任何解释 - 如果不是实际上错误。

中断,在OS方面,有两种形式:

硬件中断 - 那些由从外围设备的实际硬件信号启动。这些可以在任何时候(几乎)发生,并且可以从任何可能运行的线程切换到驱动程序中的代码。

软件中断 - 由当前正在运行的线程的OS调用启动的那些中断。

这两个中断都可能请求调度程序使正在等待就绪/正在运行的线程或导致正在等待/正在运行的线程被抢占。

最重要的中断是来自外设驱动程序的硬件中断 - 那些使得线程准备好从磁盘,NIC卡,鼠标,键盘,USB等等等待IO等等。使用抢先式内核的首要原因,以及所有锁定,同步,信号等问题都是这样的系统具有很好的IO性能,因为硬件外设可以快速地使线程准备好/运行,以便硬件等待数据从硬件中等待,没有任何延迟导致线程不会产生或等待周期性定时器RESCHEDULE。

导致周期性调度运行的硬件定时器中断非常重要,因为很多系统调用都会超时,例如,来自外设的响应比预期的要长。

在多核系统上,操作系统具有可导致其他内核发生硬件中断的处理器间驱动程序,因此允许操作系统在多个内核上中断/调度/调度线程。

对于严重超载的盒子或运行CPU密集型应用程序(少数)的操作系统,操作系统可以使用周期性定时器中断以及生成的调度来循环一组比较大的就绪线程可用内核的数量并因此允许每个可用CPU资源的份额。在大多数系统中,这种情况很少发生,而且很重要。

我对喊抱歉,但我每次看到“量子”的时候,“放弃自己的时间片的剩余部分”,“循环”和类似的,我只是畏缩..

相关问题