我最近开始学习CPU和操作系统是如何工作的,我对使用提供多任务处理的操作系统的单CPU机器的操作感到困惑。
因此,假设我的机器只有一个CPU,这意味着,在任何给定时间,只有一个进程可以运行。
现在,我只能假设操作系统用来控制对宝贵CPU时间的访问的调度程序也是一个过程。
因此,在这台机器中,用户进程或调度系统进程在任何给定的时间点运行,但不是两者都运行。
所以这是一个问题:
一旦调度程序将CPU的控制权交给另一个进程,它如何重新获得CPU时间再次运行以进行其调度工作?我的意思是,如果当前运行的任何给定进程没有放弃(产生)CPU,那么调度程序本身如何再次运行并确保正确的多任务处理?
到目前为止,我一直在想,如果用户进程通过系统调用请求I / O操作,那么在系统调用中我们可以确保为调度程序再次分配一些CPU时间。但我甚至不确定这是否有效。
另一方面,如果有问题的用户进程本质上是CPU绑定的,那么从这个角度来看,它可以永远运行,永远不会让其他进程,甚至调度程序再次运行。
假设时间分片调度,我不知道调度程序如何在执行另一个进程时切片时间,甚至不运行?
我非常感谢您在此方面提供的任何见解或参考。
答案 0 :(得分:42)
操作系统设置硬件计时器(Programmable interval timer或PIT),每N毫秒产生一次中断。该中断被传递给内核,用户代码被中断。
它像任何其他硬件中断一样工作。例如,磁盘在完成IO后将强制切换到内核。
答案 1 :(得分:10)
在调查/学习时,尽量忽略在第一段中提及“定时器中断”,“循环”和“时间片”或“量子”的任何解释 - 如果不是实际上错误的话,它们会产生危险的误导
在操作系统方面,中断有两种形式:
硬件中断 - 由来自外围设备的实际硬件信号启动的中断。这些可以在(几乎)任何时候发生,并从执行的任何线程切换执行到驱动程序中的代码。
软件中断 - 由当前正在运行的线程的OS调用启动的。
任何一个中断都可以请求调度程序生成等待准备/正在运行的线程,或者导致正在等待/运行的线程被抢占。
最重要的中断是来自外设驱动程序的那些硬件中断 - 那些使线程准备好等待来自磁盘,NIC卡,鼠标,键盘,USB等的IO的中断。使用的最重要原因抢占式内核,以及锁定,同步,信令等所有问题,这些系统具有非常好的IO性能,因为硬件外设可以快速使线程准备/运行等待来自该硬件的数据,没有任何延迟是由于没有产生的线程或等待定期计时器重新安排的结果。
导致定期调度运行的硬件定时器中断非常重要,因为许多系统调用都有超时,例如,来自外设的响应需要的时间超过应有的时间。
在多核系统上,操作系统有一个处理器间驱动程序,可以在其他内核上引起硬件中断,允许操作系统中断/调度/分配线程到多个内核。
在严重超载的盒子或运行CPU密集型应用程序(少数人)的操作系统上,操作系统可以使用周期性计时器中断以及由此产生的调度来循环通过一组大于数量的就绪线程。可用内核,并允许每个可用的CPU资源共享。在大多数系统中,这种情况很少发生,并且不太重要。
每当我看到“量子”,“放弃剩下的时间片”,“循环”等等,我就会畏缩......
答案 2 :(得分:4)
补充@ usr的答案,引自Understanding the Linux Kernel:
schedule()函数
schedule()实现调度程序。它的目标是找到一个 在runqueue列表中处理,然后将CPU分配给它。它是 由几个内核例程直接或以懒惰方式调用。 [...]
懒惰调用
也可以通过设置调度程序以惰性方式调用 need_resched当前[process]的字段为1.由于检查了这个值 在恢复执行用户模式之前总是进行字段 过程(参见“中断和例外回归”一节) 第4章),schedule()肯定会在某个结束时被调用 未来的时间。