010-Linux内核进程调度队列(了解)

Linux内核进程调度队列

Linux系统中,每个CPU中都有一个运行队列。

上图就是Linux中的运行队列。

其中在蓝色框中:

  • nr_active:队列中有多少进程。

  • queue[140]:是一个有140个队列的数组,其中只会使用queue[140]中100~139下标的队列,也就是40个队列,而上面我们说过,Linux中的优先级只有40个级别,范围是[60,99],而这些优先级从前到后分别对应的就是queue[140]中的[100,139]的下标的队列,当进程入队列时,不同优先级的进程将会被放在不同的队列下。

  • bitmap[5]:这个数组是一个long数据类型的数组,long数据类型的大小是32bit,那么这个数组的大小就是32*5=160bit,而这160bit的空间只使用140bit,作为位图,用来标记queue[140]中,哪一个队列中有元素,有了这个位图,CPU在调度进程的时候就不用将queue[140]全部遍历一遍,只需要在bitmap中就可以迅速找到哪个队列不为空,迅速找到需要调度的进程。

而这种调度算法的时间复杂度为O(1),所以也被称为大O(1)调度算法。

那么这里还有一个问题,在上面的结构图中,为什么还有一个红色框中的内容和蓝色框的内容一模一样的?

因为如果只有一个,会存在一种情况,在我们的运行队列中,不断有进程被调走执行,也不断有进程进入等待执行,那么如果当前队列中有源源不断的80优先级的进程进入队列,而队列中还有一批优先级大于80的进程在等待被调度,那么80优先级的进程一直执行不完,大于80优先级的进程不就一直无法执行了吗?

Linux设计了两套运行队列就是为了解决这个问题,这两套队列每个是一个结构体,在上面的结构图中有两个指针active和expired,它们默认指向第一个运行队列和第二个运行队列,其中active指向的队列只出不进,expired指向的队列只进不出,CPU调度时将会按顺序调度active指向的运行队列,而如果有新的进程进队列,将会被放在expired指向的运行队列中,当active队列中的进程被处理完了,active和expired将会交换指向,active指向第二个运行队列,expired指向第一个运行队列,然后继续循环上面的操作。

相关推荐
一路往蓝-Anbo2 小时前
第 1 章:M33 领航——STM32MP257F-DK 硬件解密与启动逻辑重构
linux·stm32·嵌入式硬件·重构
暴力求解2 小时前
Linux--进程(四) 进程优先级与进程切换
linux·运维·服务器
Re_Virtual3 小时前
OpenEuler 20.03构建zabbix7.0 rpm包
linux·zabbix·openeuler
落羽的落羽4 小时前
【Linux系统】磁盘ext文件系统与软硬链接
linux·运维·服务器·数据库·c++·人工智能·机器学习
Codefengfeng4 小时前
Kali-linux中安装与使用Stegsolve
linux·运维·服务器
何中应6 小时前
如何在 Linux 系统中设置系统时间
linux·运维·服务器
予枫的编程笔记6 小时前
【Docker高级篇】吃透Linux底层:Namespace做隔离,Cgroups控资源,UnionFS搭存储
linux·人工智能·namespace·cgroups·unionfs·linux底层原理·容器核心技术
济6176 小时前
ARM Linux 驱动开发篇---Linux 设备树简介-- Ubuntu20.04
linux·arm开发·嵌入式linux驱动开发
leblancAndSherry6 小时前
阿里云轻量/ECS 实战:K3s + Helm + cert-manager + 云效 Codeup 全链路 CI/CD 落地(记录自用)
linux·运维·阿里云·ci/cd·kubernetes·云计算