操作系统调度程序如何重新获得CPU的控制权?
我最近开始了解CPU和操作系统是如何工作的,我对使用提供多任务操作系统的单CPU机器的操作有点困惑。
因此,假设我的机器只有一个CPU,这意味着在任何时候只有一个进程可以运行。
现在,我只能假设操作系统使用的调度程序来控制访问贵重的CPU时间也是一个过程。
因此,在此机器中,用户进程或调度系统进程在任何给定时间点运行,但不是两者都运行。
所以这里有一个问题:
一旦调度程序放弃了对其他进程的CPU控制,它如何重新获得CPU时间以再次运行以执行其调度工作? 我的意思是,如果当前运行的任何给定进程没有放弃(产生)CPU,那么调度器本身如何再次运行并确保正确的多任务处理?
到目前为止,我一直在想,如果用户进程通过系统调用请求I / O操作,那么在系统调用中,我们可以确保调度器再次分配一些CPU时间。 但我甚至不确定这是否以这种方式工作。
另一方面,如果有问题的用户进程固有地受到CPU限制,那么从这个角度来看,它可以永远运行,不会让其他进程,甚至是调度器再次运行。
假设一个时间片调度,我不知道调度器如何在执行另一个进程时分割执行时间,甚至没有运行它?
我非常感谢您在这方面提供的任何见解或参考资料。
操作系统设置一个硬件定时器(可编程间隔定时器或PIT),每N毫秒产生一次中断。 该中断被传递给内核并且用户代码被中断。
它和其他硬件中断一样工作。 例如,您的磁盘在完成IO时会强制切换到内核。
Google'中断'。 中断是多线程,抢占式内核(如Linux / Windows)的核心。 没有中断,操作系统将永远不会做任何事情。
在调查/学习过程中,尽量忽略任何提及第一段中的'定时器中断','循环法'和'时间片','量子'的解释 - 如果实际上不是错误的,那么这些解释是危险的误导。
OS中的中断有两种形式:
硬件中断 - 由来自外围设备的实际硬件信号启动的中断。 这些可以在任何时候(几乎)发生,并且可以从任何可能运行的线程切换到驱动程序中的代码。
软件中断 - 由当前正在运行的线程的OS调用启动的那些中断。
任何一个中断都可能请求调度程序创建正在等待就绪/正在运行的线程,或者导致正在等待/正在运行的线程被抢占。
最重要的中断是来自外设驱动程序的硬件中断 - 那些使得线程准备好等待来自磁盘,NIC卡,鼠标,键盘,USB等的IO的线程。使用抢占式内核的首要原因以及所有的问题锁定,同步,信号等等,因为这些系统具有非常好的IO性能,因为硬件外设可以快速地使线程准备好/运行,以便从该硬件中等待数据的数据,而没有任何延迟导致不会产生或等待一个周期的线程TIMER RESCHEDULE。
引起周期性计划运行的硬件计时器中断非常重要,因为很多系统调用都会有超时情况,例如,来自外设的响应比预期的要长。
在多核系统上,操作系统具有可导致其他内核发生硬件中断的处理器间驱动程序,因此允许操作系统中断/调度/分配多个内核上的线程。
在严重超载的设备或运行CPU密集型应用程序的设备(少数应用程序)中,操作系统可以使用周期性定时器中断以及所产生的调度来循环一系列就绪线程,这些线程比可用内核数量因此允许每个可用CPU资源的份额。 在大多数系统中,这种情况很少发生,而且很重要。
我很抱歉大喊大叫,但每当我看到“量子”,“放弃其余的时间片”,“循环”等类似的东西,我就会畏缩。
为补充@ usr的答案,引用了解了解Linux内核:
schedule()函数
schedule()实现调度程序。 它的目标是在runqueue列表中找到一个进程,然后将CPU分配给它。 它被几个内核例程直接或以一种懒惰的方式调用。 [...]
懒惰的调用
通过将当前[process]的need_resched字段设置为1,也可以以惰性方式调用调度程序。由于在继续执行用户模式过程之前始终检查此字段的值(请参见“返回来自第4章中的中断和例外),schedule()将会在将来的某个时刻被调用。
链接地址: http://www.djcxy.com/p/43613.html