首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >操作系统轮询线程调度

操作系统轮询线程调度
EN

Stack Overflow用户
提问于 2022-07-30 09:13:43
回答 2查看 140关注 0票数 0

让我们假设您有一个操作系统,它试图在循环调度中运行线程。我知道有两个实例,操作系统将尝试在多个线程之间切换:(可能还有更多的.)

  1. (当当前线程实际自动生成CPU时);
  2. (当操作系统接收到计时器中断时)。问题是,假设操作系统的最大计算限制时间为5ms。(操作系统每5ms接收一个定时器中断)这个假设意味着每个线程可以拥有最多5ms的CPU核心。

,如果进程/线程早于5ms完成其时间片,会发生什么情况?会不会导致下一个线程的计算绑定时间小于5ms,因为下一个定时器中断将发生,而线程将别无选择,只能放弃CPU?

具体例子:

,如果一个进程/线程在5ms之前完成了它的时间切片(假设2ms),会发生什么情况呢?我知道另一个线程将被调度,但是该线程会有5ms的完整时间片吗?还是在下一个定时器中断发生之前,这个下一个线程只有3ms?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-30 12:18:53

这个问题可能取决于操作系统(未提供)。在主流OSs上,生成任务通常等待资源或给定的时间。除非准备就绪(已完成的IO操作、可用的锁、超时等),否则操作系统不会重新调度它。当一个新任务准备就绪时,操作系统调度程序可以自由地等待时间片的结束或重新安排以前的任务。通常需要重新安排任务,以提高多线程应用程序的响应能力(当代码试图持有已被接受的锁时等待几毫秒是不合理的)。也就是说,这种行为通常不是直接实现的。Windows利用优先级提升来实现这一点。在Linux上,CFS试图使日程公平,以便所有任务在所有可用资源上都有一个平衡的时间(例如。核)。目标任务的优先级也很重要。一些著名游戏控制台的操作系统默认使用循环调度器,并且只有在没有高优先级任务的情况下才会调度低优先级的任务。在这样的系统上,当高优先级的任务准备就绪时,当前的任务就会被直接中断(除了上下文交换机的开销外,没有延迟)。

简而言之,操作系统不需要等待计时器中断来进行上下文切换。而且,是的,时间片通常不会被空着,所以它们会被其他任务重用.调度任务是否可以在完整的时间片中调度取决于实际的OS调度程序。还请注意,线程不会“放弃CPU":用户-域线程对此没有真正的控制。在实践中,要么是在系统调用期间执行schedule-like内核调用(导致当前任务的上下文切换),要么是系统中断导致执行通常在时间片结束时执行此schedule-like内核调用的内核代码。

票数 1
EN

Stack Overflow用户

发布于 2022-07-30 13:08:38

线程可以产生很多方式,例如发送或等待信号量、输入、输出等。如果线程产生,或者它正在调度计时器超时(5ms),操作系统将仔细查看线程列表,看看还能运行什么。

这种搜索实际上包括遍历线程列表并查看它们的状态。

  • 某些线程可能被列为“抢占”(即它们没有产生,OS 5ms调度计时器超时,并且OS已经暂停它们以支持另一个线程),在这种情况下,其中一个线程可以简单地恢复(寄存器恢复,程序计数器集,从那个点起)。Round调度只是一个额外的信息,即“这个线程最后一次运行是什么时候?”,操作系统支持运行时间不超过所有其他线程的线程。
  • 其他人将被列为等待I/O (因此不能运行),还有更多的信息将被列为等待锁(比如信号量(因此也不能运行))。
  • 注意到,类似sem_post()之类的东西也是一种让步,给了操作系统一个机会去做这个搜索,也许可以找到一个被列为等待刚刚发布的信号量的线程。

如果操作系统确定在所有进程中根本没有可运行的线程(没有等待信号量,所有挂起的东西都在等待I/O),并且它自己没有什么可做的,那么接下来发生的事情取决于CPU。对于一些较旧的CPU,操作系统实际上必须进入一个无限循环,等待某个设备触发一些中断。更现代的CPU有一条指令,它将暂停执行,直到某些中断触发为止。

基本上,OS调度程序是一部分中断服务例程(响应计时器或设备中断),另一部分是“普通”代码,在线程自愿屈服时只管理线程列表。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73174311

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档