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