Linux2.6内核进程调度队列详细讲解

news2024/12/22 16:47:25

上图是 Linux2.6 内核中进程队列的数据结构,之间关系也已经给大家画出来,方便大家理解。
一个 CPU 拥有一个 runqueue。
Linux真正的调度方式是通过runqueue进行调度的,我们知道进程的优先级范围是根据nice值确定的,而nice值的范围为[-20,19],所以进程的优先级分40个级别。
如上图,runqueue中有一个数组array,这其实是一个结构体数组,其结构体成员为nr_active,bitmap[5],queue[140]三个,我们先从成员queue[140]开始介绍,其140个空间分别对应的是140个优先级,而0~99为实时优先级,这些一般是用在少数注重实时性操作系统上才会频繁使用的优先级,一般我们所用的操作系统都注重进程间调用的平衡,所以这里对于前0~99的优先级我们先暂且不淡,而100~139这40位优先级我们称为普通优先级,对应我们nice值的取值范围,所以在调用我们的进程可以根据其优先级60~99分别对应100~139进行排列调用,相同优先级的进程链接在同一优先级进程的后面

而我们在调用进程时并不是对queue队列进行遍历,而是通过bitmap[5]位图,一个long类型的大小为32比特,5个为160比特,足够进行对queue[140]的标注,我们可以在有进程的位置将二进制对应设置为1,那么在遍历时直接通过bitmap[0~4]进行每次32位的查找,若为0则表示该32位置比特没有进程调用,若不为0则再对32个比特中查找,那么这样我们就可以对位图进行操作,来确定队列中那个优先级存在进程,这样遍历调度队列时间复杂度基本为O(1)

从上图中我们可以看到结构体数组array其成员是开辟了两个的,其分别为活动队列和过期队列,活动队列保证进程只出不进(根据优先级调用排队等待执行的进程),而过期队列保证进程只进不出(调用过的进程或是新来的进程都进入过期队列进行排队等候),在CUP调用进程时始终调用的是活动队列,但CUP并不是直接去调用活动队列的,而是在runqueue队列中,通过两个指针*active,*expired,进行调度,*active指向活动队列,而*expired指向过期队列,当活动队列中的进程被调度完之后将指针*active和*expired进行交换,那么原先的过期队列就变成了活动队列,原先的活动队列就变成了过期队列,CUP通过指针*active再进行调度,通过指针active和expired的交换我们实现了时间复杂度为O(1)的进程调度。

活动队列
● 时间片还没有结束的所有进程都按照优先级放在该队列
● nr_active: 总共有多少个运行状态的进程
● queue[140]: 一个元素就是一个进程队列,相同优先级的进程按照 FIFO 规则进行排队调度 ,    所以,数组下 标就是优先级
● 从该结构中,选择一个最合适的进程,过程是怎么的呢?
        1. 从 0 下表开始遍历 queue[140]
        2. 找到第一个非空队列,该队列必定为优先级最高的队列
        3. 拿到选中队列的第一个进程,开始运行,调度完成
        4. 遍历 queue[140] 时间复杂度是常数!但还是太低效了
● bitmap[5]: 一共 140 个优先级,一共 140 个进程队列,为了提高查找非空队列的效率,就可以用 5*32 比特位表示队列是否为空,这样,便可以大大提高查找效率
过期队列
● 过期队列和活动队列结构一模一样
● 过期队列上放置的进程,都是时间片耗尽的进程
● 当活动队列上的进程都被处理完毕之后,对过期队列的进程进行时间片重新计算
active 指针和 expired 指针
● active 指针永远指向活动队列
● expired 指针永远指向过期队列
● 可是活动队列上的进程会越来越少,过期队列上的进程会越来越多,因为进程时间片到期时一直都存在 的。
● 没关系,在合适的时候,只要能够交换 active 指针和 expired 指针的内容,就相当于有具有了一批新的活 动进程
在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增加,我们称之为进程调度 O(1) 算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2036728.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

怎么配置Datagrip中字体的大小,修改注释的颜色呢

新手刚安装Datagrip时,都会遇到怎么调字体大小的问题,接下来解决一下吧 具体步骤: 1.进入Datagrip的操作窗口后,点击左上方的菜单栏中file(文件)。 2.在文件中点击设置setting。 3.在设置窗口点击Editor,再点击Font。 4.在Fo…

.[[Hoeosi@airmail.cc]].rntc勒索病毒数据怎么处理|数据解密恢复

导言: 近年来,勒索病毒(也称为勒索软件)已成为网络安全领域的一大威胁。其中,.[[Hoeosiairmail.cc]].rntc勒索病毒作为一种新型恶意软件,通过加密用户的重要文件并要求支付赎金来解锁,给个人和…

深度学习 —— 个人学习笔记20(转置卷积、全卷积网络)

声明 本文章为个人学习使用,版面观感若有不适请谅解,文中知识仅代表个人观点,若出现错误,欢迎各位批评指正。 三十九、转置卷积 import torch from torch import nndef trans_conv(X, K):h, w K.shapeY torch.zeros((X.shape[…

Datawhale AI夏令营第四期魔搭- AIGC文生图方向 task02笔记

1 前言 本次是学习内容是Datawhale AI夏令营第四期-AIGC文生图方向的学习笔记。 2 AIGC简介 AIGC(Artificial Intelligence Generated Content)即人工智能生成内容,即人工智能通过学习大量的数据,来实现自动生成各种内容&#xf…

仿RabbitMQ实现消息队列

前言:本项目是仿照RabbitMQ并基于SpringBoot Mybatis SQLite3实现的消息队列,该项目实现了MQ的核心功能:生产者、消费者、中间人、发布、订阅等。 源码链接:仿Rabbit MQ实现消息队列 目录 前言:本项目是仿照Rabbi…

JVM运行时数据区之虚拟机栈

【1】概述 Java虚拟机栈(Java Virtual Machine Stack),早期也叫Java栈。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的Java方法调用。 栈是运行…

World of Warcraft [CLASSIC] 80 WLK [Gundrak] BUG

World of Warcraft [CLASSIC] 80 WLK [Gundrak] BUG 魔兽世界怀旧版,80级,5人副本古达克,科技队伍(BUG队伍) 副本有两个门口 这样看,是不是觉得很怪。是的,和图1刚好相反的。 因此应该翻转180…

24电赛H题总结

一、题目 题目链接:自动行驶小车(H题) 我们截取一些重要信息 1. 小车行驶场地示意图 2.要求 二、赛题分析 技术挑战与准备 MCU熟悉度:尽管TI MSPM0系列MCU在使用上类似于STM32CUBEIDEKeil,但其开发环境也需要熟悉。因…

数据结构入门——04栈

1.栈 栈是限制在一端进行插入操作和删除操作的线性表(俗称堆栈) 允许进行操作的一端称为“栈顶”,另一固定端称为“栈底”,当栈中没有元素时称为“空栈”。 栈的特点 :后进先出LIFO(Last In First Out&a…

支持I2C接口、抗干扰性强、14通道触摸按键的电容式触摸芯片-GTX314L

电容式触摸芯片 - GTX314L是具有多通道触发传感器的14位触摸传感器系列,它是通过持续模式提供中断功能和唤醒功能,广泛适用于各种控制面板应用,可直接兼容原机械式轻触按键的处理信号。 GTX314L芯片内部采用特殊的集成电路,具有高…

C++进阶-智能指针

1. 为什么需要智能指针? 下面我们先分析一下下面这段程序有没有什么内存方面的问题?提示一下:注意分析MergeSort函数中的问题。 int div() {int a, b;cin >> a >> b;if (b 0)throw invalid_argument("除0错误");retur…

【C语言】内存管理

C语言-内存管理 一、C进程内存布局二、栈内存1、存储在栈内存中的参数有哪些?2、栈内存的特点? 三、静态数据四、数据段与代码段五、堆内存 一、C进程内存布局 \qquad 任何一个程序,正常运行都需要内存资源,用来存放诸如变量、常量…

第九届“创客中国”武汉区域赛正式启幕 灵途科技勇夺前三,晋级决赛!

8月8日,第九届“创客中国”武汉区域赛正式启幕,首场聚焦先进制造领域。灵途科技勇夺先进制造领域专场企业组前三名,成功晋级决赛。 “创客中国”大赛是工业和信息化部组织开展的双创赛事活动,以构建产业链协同发展为出发点&#…

Win10 VisualStudio 2022编译ollvm 13.x

VisualStudio配置 1,正常配置C桌面环境 2,在单个组件中选择用于Windows得C Cmake工具 下载OLLVM13.x https://github.com/heroims/obfuscator/tree/llvm-13.x 解压后进入文件夹,命令行输入 cmake -G “Visual Studio 17 2022” -DLLVM_EN…

Java面试--设计模式

设计模式 目录 设计模式1.单例模式?2.代理模式?3.策略模式?4.工厂模式? 1.单例模式? 单例模式是Java的一种设计思想,用此模式下,某个对象在jvm只允许有一个实例,防止这个对象多次引…

依赖倒置原则:构建灵活软件架构的基石 - 通过代码实例深入解析

1.引言 1.1为什么要学习依赖倒置原则 在软件开发过程中,我们经常需要对代码进行修改和扩展。如果代码之间的耦合度过高,那么在进行修改或扩展时,可能会对其他部分的代码产生影响,甚至引发错误。这就要求我们在编写代码时&#xf…

【VS Code】 vue项目使用scss显示语法错误、build编译正常

开发vue项目,使用scss老是报这个错误 解决方式: 1.安装vetur 2.在vs code的设置中添加 "files.associations": { "*.vue": "vue" }解决:

线性规划约束一个矩形在Polygon内部

最近在用线性规划,有一个比较有趣的问题,记录一下思路。 如何用线性规划约束一个矩形在Polygon内部? 问题:有如下图蓝色矩形,用线性规划表示出绿色矩形被约束在polygon内部,矩形的中心坐标是(x, y),宽和高…

计算机组成原理---关于乘法电路与除法运算电路的理解

目录 一.乘法电路 1.无符号数乘法运算的硬件实现逻辑: 2.补码1位乘法运算的硬件实现逻辑: 3.无符号阵列乘法器 4.补码阵列乘法器 二.除法电路 1.原码除法运算 2.补码除法运算(不恢复余数法) 本篇是看湖科大与王道视频总结…

35_WebShell管理工具、中国蚁剑AntSword的安装及使用、御剑的使用、后台目录扫描

WebShell管理工具 WebShell 以asp、php、jsp或cgi等网页形式存在的一种代码执行环境主要用于网站和服务器管理由于其便利性和功能强大,被特别修改后的WebShell也被部分人当作网站后门工具使用国内常用的WebShell有海阳ASP木马,Phpspy,c99sh…