让我们假设您有一个操作系统,它试图在循环调度中运行线程。我知道有两个实例,操作系统将尝试在多个线程之间切换:(可能还有更多的.)
,如果进程/线程早于5ms完成其时间片,会发生什么情况?会不会导致下一个线程的计算绑定时间小于5ms,因为下一个定时器中断将发生,而线程将别无选择,只能放弃CPU?
具体例子:
,如果一个进程/线程在5ms之前完成了它的时间切片(假设2ms),会发生什么情况呢?我知道另一个线程将被调度,但是该线程会有5ms的完整时间片吗?还是在下一个定时器中断发生之前,这个下一个线程只有3ms?
发布于 2022-07-30 12:18:53
这个问题可能取决于操作系统(未提供)。在主流OSs上,生成任务通常等待资源或给定的时间。除非准备就绪(已完成的IO操作、可用的锁、超时等),否则操作系统不会重新调度它。当一个新任务准备就绪时,操作系统调度程序可以自由地等待时间片的结束或重新安排以前的任务。通常需要重新安排任务,以提高多线程应用程序的响应能力(当代码试图持有已被接受的锁时等待几毫秒是不合理的)。也就是说,这种行为通常不是直接实现的。Windows利用优先级提升来实现这一点。在Linux上,CFS试图使日程公平,以便所有任务在所有可用资源上都有一个平衡的时间(例如。核)。目标任务的优先级也很重要。一些著名游戏控制台的操作系统默认使用循环调度器,并且只有在没有高优先级任务的情况下才会调度低优先级的任务。在这样的系统上,当高优先级的任务准备就绪时,当前的任务就会被直接中断(除了上下文交换机的开销外,没有延迟)。
简而言之,操作系统不需要等待计时器中断来进行上下文切换。而且,是的,时间片通常不会被空着,所以它们会被其他任务重用.调度任务是否可以在完整的时间片中调度取决于实际的OS调度程序。还请注意,线程不会“放弃CPU":用户-域线程对此没有真正的控制。在实践中,要么是在系统调用期间执行schedule-like内核调用(导致当前任务的上下文切换),要么是系统中断导致执行通常在时间片结束时执行此schedule-like内核调用的内核代码。
发布于 2022-07-30 13:08:38
线程可以产生很多方式,例如发送或等待信号量、输入、输出等。如果线程产生,或者它正在调度计时器超时(5ms),操作系统将仔细查看线程列表,看看还能运行什么。
这种搜索实际上包括遍历线程列表并查看它们的状态。
如果操作系统确定在所有进程中根本没有可运行的线程(没有等待信号量,所有挂起的东西都在等待I/O),并且它自己没有什么可做的,那么接下来发生的事情取决于CPU。对于一些较旧的CPU,操作系统实际上必须进入一个无限循环,等待某个设备触发一些中断。更现代的CPU有一条指令,它将暂停执行,直到某些中断触发为止。
基本上,OS调度程序是一部分中断服务例程(响应计时器或设备中断),另一部分是“普通”代码,在线程自愿屈服时只管理线程列表。
https://stackoverflow.com/questions/73174311
复制相似问题