抢占式调度是如何发生的

2023-10-28 23:52
文章标签 发生 抢占 式调度

本文主要是介绍抢占式调度是如何发生的,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最常见的现象就是一个进程执行时间太长了,是时候切换到另一个进程了。那怎么衡量一个进程的运行时间呢?在计算机里面有一个时钟,会过一段时间触发一次时钟中断,通知操作系统,时间又过去一个时钟周期,这是个很好的方式,可以查看是否是需要抢占的时间点。

check_preempt_tick 先是调用 sched_slice 函数计算出的 ideal_runtime。ideal_runtime 是一个调度周期中,该进程运行的实际时间。

sum_exec_runtime 指进程总共执行的实际时间,prev_sum_exec_runtime 指上次该进程被调度时已经占用的实际时间。每次在调度一个新的进程时都会把它的 se->prev_sum_exec_runtime = se->sum_exec_runtime,所以 sum_exec_runtime-prev_sum_exec_runtime 就是这次调度占用实际时间。如果这个时间大于 ideal_runtime,则应该被抢占了。

除了这个条件之外,还会通过 __pick_first_entity 取出红黑树中最小的进程。如果当前进程的 vruntime 大于红黑树中最小的进程的 vruntime,且差值大于 ideal_runtime,也应该被抢占了。

标记一个进程应该被抢占,都是调用 resched_curr,它会调用 set_tsk_need_resched,标记进程应该被抢占,但是此时此刻,并不真的抢占,而是打上一个标签 TIF_NEED_RESCHED。

当一个进程在等待一个 I/O 的时候,会主动放弃 CPU。但是当 I/O 到来的时候,进程往往会被唤醒。这个时候是一个时机。当被唤醒的进程优先级高于 CPU 上的当前进程,就会触发抢占。try_to_wake_up() 调用 ttwu_queue 将这个唤醒的任务添加到队列当中。ttwu_queue 再调用 ttwu_do_activate 激活这个任务。ttwu_do_activate 调用 ttwu_do_wakeup。这里面调用了 check_preempt_curr 检查是否应该发生抢占。如果应该发生抢占,也不是直接踢走当前进程,而是将当前进程标记为应该被抢占。

对内核态的执行中,被抢占的时机一般发生在 preempt_enable() 中。

在内核态的执行中,有的操作是不能被中断的,所以在进行这些操作之前,总是先调用 preempt_disable() 关闭抢占,当再次打开的时候,就是一次内核态代码被抢占的机会。

就像下面代码中展示的一样,preempt_enable() 会调用 preempt_count_dec_and_test(),判断 preempt_count 和 TIF_NEED_RESCHED 是否可以被抢占。如果可以,就调用 preempt_schedule->preempt_schedule_common->__schedule 进行调度。还是满足进程调度第一定律的。

在内核态也会遇到中断的情况,当中断返回的时候,返回的仍然是内核态。这个时候也是一个执行抢占的时机,现在我们再来上面中断返回的代码中返回内核的那部分代码,调用的是 preempt_schedule_irq。

此文章为10月Day28学习笔记,内容来源于极客时间《趣谈Linux操作系统》,推荐该课程。

这篇关于抢占式调度是如何发生的的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/296829

相关文章

当你输入一个网址后都发生什么

原文:http://igoro.com/archive/what-really-happens-when-you-navigate-to-a-url/  作为一个软件开发者,你一定会对网络应用如何工作有一个完整的层次化的认知,同样这里也包括这些应用所用到的技术:像浏览器,HTTP,HTML,网络服务器,需求处理等等。 本文将更深入的研究当你输入一个网址的时候,后台到底发生了一件件什么样的事~

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个 嫌疑犯的一个。以下为4个嫌疑犯的供词。

日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个 嫌疑犯的一个。以下为4个嫌疑犯的供词。 A说:不是我。 B说:是C。 C说:是D。 D说:C在胡说 已知3个人说了真话,1个人说的是假话。 现在请根据这些信息,写一个程序来确定到底谁是凶手。  static void Main()         {             int killer = 0;             fo

一个瑞典游戏工作室决定离开索尼,之前和之后都发生了什么?

我们在前两篇中探究了国家政策、硬件基础与黑客文化如何让瑞典成为了游戏热土,而它充满地域特色的开发者社区与教育体系的构建,又是如何聚拢了游戏人才,让体系持续生长扩张。 除了大学、科技园和开发者之家外,我们此行从斯德哥尔摩到舍夫德到马尔默,还采访了三家知名工作室的创始人。它们一家产出如今罕见的双人合作游戏,还有一位特立独行的作者型开发者屡屡占据头条;一家贡献了现象级网红作品,当前在朝“正经向”大

关于Qt在子线程中使用通讯时发生无法接收数据的情况

在多线程应用中,串口通讯或TCP通讯的场景常常涉及到持续的读写操作,如果子线程处理不当,可能会导致信号阻塞问题。本文将通过串口通讯或TCP通讯为例,详细解释如何在多线程环境中避免信号阻塞,并提供代码示例。 1. 问题背景 假设我们在一个应用程序中使用多线程处理串口或TCP通讯,通常会在子线程中实现持续的数据读取。为了确保实时处理数据,常见的做法是在子线程的 run() 方法中使用 while

C++ 的死锁问题的发生和避免

C/C++程序中产生死锁的原因很多,本文大致归纳了下面几类,分别做分析。 1.单线程/进程多次加锁导致死锁 单线程导致死锁的情况一般是由于调用了引起阻塞的函数,比如(copy_from_user()、copy_to_ser()、和kmalloc()),阻塞后进行系统调度,调度的过程中有可能又调用了之前获取锁的函数,这样必然导致死锁。 还有一种就是自旋锁函数在没有释放锁马上又进行申请同一个自旋

【音视频】播放音视频时发生了什么? 视频的编解码 H264是什么? MP4是什么?

目录 ✨播放一个视频的流程✨为什么要编码(压缩)视频数据?✨如何编码(压缩)数据🎄简单的例子🎄音视频编码方式🎄视频编码格式H264编码是什么?发展历程?H.264基本单元H.264的I帧,P帧,B帧 🎄音频编码格式 ✨视频文件封装格式✨解封装格式✨视频解码✨H264分层结构🎄网络上传输H264视频数据的流程VCL的结构关系 🎄NAL单元 ✨ 参考文章 ✨播放一个视频的流

redis slaveof自己会发生什么

向2.8版本redis发送slaveof,将自己变成自己的slave(简称slaveof self)是会返回+OK的,因为响应slaveof命令时,只是设置下master,接下来的同步都是异步进行的。 127.0.0.1:6379> set key valueOK127.0.0.1:6379> slaveof 127.0.0.1 6379OK127.0.0.1:6379> get ke

解决:axios 请求头url传参数组时发生400错误

一、前言 axios封装的网络请求,url传参时,数组作为参数传递,发生400错误请求时数组参数转url会保留 [] 二、原因 RFC3986:除了 数字 + 字母 + -_.~ 不会被转义,其他字符都会被以百分号(%)后跟两位十六进制数 %{hex} 的方式进行转义 url 编码标准 RFC3986 是保留方括号的可能 axios 非最新版本也是一个原因,当前使用的"axios

癌症发生的时候,有什么状态预警吗?

周五啦,又是划水的一天 本来开开心心的刷知乎热搜,刷到这一条。 本来生活不易,要是来个这,那还不得急死,但是这也是可以防范的。 为了更多的了解这方面的知识,还特地开通的知乎盐选的盐选会员∠( ᐛ 」∠)_ 个人觉得有必要让各位小伙伴知道的也会在博客贴出 珍爱生命! [scode type="red"]纯属推广知识,望各位小伙伴悉知。[/scode] 早期发现,早点治疗! 最后附上一张:十

15年期权停交易的时候究竟发生了什么?期权零门槛开户怎么做?

今天带你了解15年期权停交易的时候究竟发生了什么事情?!加入50ETF期权市场的投资者们,都应该听过15年8月50ETF期权停交易事件,那么这一天究竟是怎么了呢?发生了什么呢? 15年8月50ETF期权停交易 8月7日上午,上证50ETF期权合约交易因技术原因出现涨跌停价格异常。上交所再上午9:56暂时停止了上证50ETF期权合约的交易。随后,上交所进行了紧急处置,排除了异常因素,下午14:0