Linux2.6内核进程调度队列

简介: 本篇文章是Linux进程系列中的最后一篇文章,本来是想放在上一篇文章的结尾的,但是想了想还是单独写一篇文章吧,虽然说这部分内容是比较难的,所有一般来说是简单的提及带过的,但是为了让大家对进程有更深的理解与认识,还是看了一些别人的文章,然后学习了学习,然后对此做了总结,尽可能详细的介绍明白。最后推荐一篇文章Linux的进程优先级 NI 和 PR - 简书。


目录

前言
本篇文章是Linux进程系列中的最后一篇文章,本来是想放在上一篇文章的结尾的,但是想了想还是单独写一篇文章吧,虽然说这部分内容是比较难的,所有一般来说是简单的提及带过的,但是为了让大家对进程有更深的理解与认识,还是看了一些别人的文章,然后学习了学习,然后对此做了总结,尽可能详细的介绍明白。

运行队列runqueue
首先先简单的介绍一下runqueue

runqueue 代表了一个 CPU 的就绪队列,其中包含了多个进程的 task_struct(即进程控制块)。在 Linux 等操作系统中,每个 CPU 都会有一个独立的 runqueue,用来管理该 CPU 上的所有就绪进程。每个 task_struct 存储了该进程的状态、调度信息等。

当有多个 CPU 时,进程的负载均衡问题确实是一个重要的考虑因素。操作系统通常会通过负载均衡策略将进程分配到不同的 CPU 上,以避免某些 CPU 过载而其他 CPU 处于空闲状态。
Linux 等现代操作系统会定期通过进程迁移等手段实现负载均衡,确保各个 CPU 的负载较为均衡,从而提高系统的整体效率。

你说的“分时操作系统,调度时强调的是公平性”是正确的。在分时系统中,调度的核心目标之一是公平性,即尽量保证每个进程能够在合理的时间内获得 CPU 时间片。调度算法(比如轮转法、优先级调度等)都是为了保证这种公平性,避免某些进程长时间得不到执行。
这种公平性通常意味着“每个进程的执行时间应该大致相等”,即使是用户进程,也会得到相对平等的 CPU 时间,而不是长期被某个进程或线程独占。

当你提到“实时操作系统,调度时强调的是实时性”,这个说法是准确的。实时操作系统(RTOS)与分时操作系统的不同之处在于,它的调度目标是保证任务在规定的时间内完成,而不仅仅是公平性。
实时性调度更侧重于时间约束,确保任务按照严格的时间要求进行执行,这对于一些实时应用(如智能驾驶、自动化控制等)至关重要。实时操作系统有不同的调度算法,如抢占式优先级调度、周期性调度等,来确保任务的实时性。

活跃队列&过期队列
PU调度时,需要把进程拿走的同时,把正在执行的进程剥离下来(被放入运行队列)
运行队列中存在两套相同的结构体类型。
拿走的队列:活跃队列。放入队列:过期队列。
活跃队列表示当前CPU正在执行的运行队列,而正在执行的运行队列(也就是活跃队列)是不可以增加新的进程的 。
与此同时,操作系统设置了一个 和活跃队列相同属性的过期队列,当活跃队列正在执行时如果有进程需要添加进运行队列,那么就会添加至过期队列当中,也就是说 活跃队列的进程一直在减少,而过期队列中的进程一直在增多!
活跃队列是只出不进
过期队列是只进不出
两个队列是被存放在结构体数组中的,结构体数组存放在运行队列中
且运行队列中存在active指针和expired指针分别指向活跃队列和过期队列。

时间片还没有结束的所有进程都按照优先级放在该队列
nr_active: 总共有多少个运行状态的进程
queue[140]: 一个元素就是一个进程队列,相同优先级的进程按照FIFO规则进行排队调度,所以,数组下标就是优先级!
从该结构中,选择一个最合适的进程,过程是怎么的呢?
从0下表开始遍历queue[140]
找到第一个非空队列,该队列必定为优先级最高的队列
拿到选中队列的第一个进程,开始运行,调度完成!
遍历queue[140]时间复杂度是常数!但还是太低效了!
bitmap[5]:一共140个优先级,一共140个进程队列,为了提高查找非空队列的效率,就可以用5*32个比特位表示队列是否为空,这样,便可以大大提高查找效率!

过期队列和活动队列结构一模一样
过期队列上放置的进程,都是时间片耗尽的进程
当活动队列上的进程都被处理完毕之后,对过期队列的进程进行时间片重新计算

bitmap[5]&O(1)调度算法

long bitmap[5],因为long为4字节,所有5个一共有845=160个bite位.
但是我们一个队列只有140个,所以使用位图bitmap绰绰有余,所以我们就使用位图的思想,来表示这个位置的队列有无进程PCB。
0表示无,1表示有。
所以,CPU不需要遍历140的队列数组,只需要遍历bitmap的5个位置,遍历一次就查找了32个bite位,大大提高了效率!
时间复杂度位O(1),所以O(1)调度算法!
nr_active

调度:nr_active 影响调度器选择哪个进程执行。
负载均衡:如果某个 CPU 核心的 nr_active 很高,调度器会把一些进程迁移到负载较低的核心上。

nr_active 是 Linux 用来管理进程负载和调度的工具。
在 Windows 中,多核调度和任务迁移的机制类似,也有负载均衡的功能。
active指针和expired指针

active指针通常指向当前活跃的任务或进程。活跃任务是指那些已经准备好运行但尚未被调度器选中的进程。这些进程通常位于CPU的运行队列中,等待调度器的调度。active指针帮助内核快速定位并调度这些活跃进程。

expired指针则用于管理那些已经超过其运行时间限制或因为其他原因而被标记为“过期”的进程。这些进程不再处于活跃状态,但仍然需要被适当地处理,例如可能需要被唤醒或重新调度。expired指针帮助内核跟踪这些过期的进程,以便在需要时进行处理。

active指针永远指向活动队列
expired指针永远指向过期队列

CPU正在执行访问的队列是active指向的A活跃队列(只出不进)
另外一个被expired指向的结构相同的过期队列B(只进不出)
新创建的进程的PCB只链接到过期队列B
CPU调度的活跃队列A中的进程PCB被CPU调度时间片到了之后,也链接到过期队列B
最后A队列中的进程被CPU全部调度完/处理完,B队列也满满的
接着将两个active指针和expired指针交换swap(active,expired),交换的是指针内容
重复上诉过程
最后总结
如果上面的介绍有帮助的话,还请点赞,如果有不明白的还请谅解。

最后推荐一篇文章Linux的进程优先级 NI 和 PR - 简书

目录
相关文章
|
6天前
|
监控 Linux 开发者
理解Linux操作系统内核中物理设备驱动(phy driver)的功能。
综合来看,物理设备驱动在Linux系统中的作用是至关重要的,它通过与硬件设备的紧密配合,为上层应用提供稳定可靠的通信基础设施。开发一款优秀的物理设备驱动需要开发者具备深厚的硬件知识、熟练的编程技能以及对Linux内核架构的深入理解,以确保驱动程序能在不同的硬件平台和网络条件下都能提供最优的性能。
38 0
|
3月前
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
193 67
|
3月前
|
存储 Linux
Linux内核中的current机制解析
总的来说,current机制是Linux内核中进程管理的基础,它通过获取当前进程的task_struct结构的地址,可以方便地获取和修改进程的信息。这个机制在内核中的使用非常广泛,对于理解Linux内核的工作原理有着重要的意义。
146 11
|
Linux API 调度
Linux中的阻塞机制及等待队列
[原文有一些录入造成的错字,转载时做了修改] 阻塞与非阻塞是设备访问的两种方式。驱动程序需要提供阻塞(等待队列,中断)和非阻塞方式(轮询,异步通知)访问设备。在写阻塞与非阻塞的驱动程序时,经常用到等待队列。
316 0
Linux中的阻塞机制及等待队列
|
Linux 调度 API
linux中的阻塞机制及等待队列【转】
转自:http://www.cnblogs.com/gdk-0078/p/5172941.html 阻塞与非阻塞是设备访问的两种方式。驱动程序需要提供阻塞(等待队列,中断)和非阻塞方式(轮询,异步通知)访问设备。
1257 0
|
1月前
|
JSON 自然语言处理 Linux
linux命令—tree
tree是一款强大的Linux命令行工具,用于以树状结构递归展示目录和文件,直观呈现层级关系。支持多种功能,如过滤、排序、权限显示及格式化输出等。安装方法因系统而异常用场景包括:基础用法(显示当前或指定目录结构)、核心参数应用(如层级控制-L、隐藏文件显示-a、完整路径输出-f)以及进阶操作(如磁盘空间分析--du、结合grep过滤内容、生成JSON格式列表-J等)。此外,还可生成网站目录结构图并导出为HTML文件。注意事项:使用Tab键补全路径避免错误;超大目录建议限制遍历层数;脚本中推荐禁用统计信息以优化性能。更多详情可查阅手册mantree。
linux命令—tree
|
1月前
|
Unix Linux
linux命令—cd
`cd` 命令是 Linux/Unix 系统中用于切换工作目录的基础命令。支持相对路径与绝对路径,常用选项如 `-L` 和 `-P` 分别处理符号链接的逻辑与物理路径。实际操作中,可通过 `cd ..` 返回上级目录、`cd ~` 回到家目录,或利用 `cd -` 在最近两个目录间快速切换。结合 Tab 补全和 `pwd` 查看当前路径,能显著提升效率。此外,需注意特殊字符路径的正确引用及脚本中绝对路径的优先使用。
|
26天前
|
Linux
Linux命令拓展:为cp和mv添加进度显示
好了,就这样,让你的Linux复制体验充满乐趣吧!记住,每一个冷冰冰的命令背后,都有方法让它变得热情起来。
87 8
|
1月前
|
安全 Linux 定位技术
Linux环境下必备的基础命令概览
以上就是Linux系统中的基本命令和工具,掌握它们就能帮你在Linux世界里游刃有余。这其实就像是学习驾驭一辆新车,熟悉了仪表盘,调整好了座椅,之后的旅程就只需要享受风驰电掣的乐趣了。
48 4
|
2月前
|
Ubuntu 搜索推荐 Linux
详解Ubuntu的strings与grep命令:Linux开发的实用工具。
这就是Ubuntu中的strings和grep命令,透明且强大。我希望你喜欢这个神奇的世界,并能在你的Linux开发旅程上,通过它们找到你的方向。记住,你的电脑是你的舞台,在上面你可以做任何你想做的事,只要你敢于尝试。
158 32