【Linux】:Linux 2.6内核 调度队列和调度原理

2024-05-24 05:12

本文主要是介绍【Linux】:Linux 2.6内核 调度队列和调度原理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

朋友们、伙计们,我们又见面了,本期来给大家解读一下有关Linux 2.6内核 调度队列和调度原理,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成!

C 语 言 专 栏:C语言:从入门到精通

数据结构专栏:数据结构

个  人  主  页 :stackY、

C + + 专 栏   :C++

Linux 专 栏  :Linux

目录

1. 调度队列

2. 调度原理

2.1 优先级

2.3 active指针和expired指针

2.4 活动队列和过期队列 

2.5 bitmap(位图)

2.6 总结


1. 调度队列

一个CPU拥有一个runqueue

但是如果有多个CPU就要考虑进程个数的负载均衡问题(先不考虑这个)

2. 调度原理

2.1 优先级

先看runqueue,可以看到里面有一个queue[140],其实它完整的是

task_struct * queue[140]

是一个PCB指针数组,里面的每个位置都可以指向一个进程PCB!

实时优先级:0 ~ 99 (先不关心这个)

普通优先级:100 ~ 139(我们都是普通优先级)

那么普通优先级为什么是100 ~ 139呢?我们可以根据在进程优先级中每个进程的nice值结合在一起看;

Linux进程的默认优先级是80,nice值的取值范围在-20 ~ 19,所以我们Linux进程的优先级范围在60 ~ 99,一共是40个优先级,100 ~ 139也是40个优先级,所以在queue这个指针数组中的后40个位置就是我们Linux进程PCB优先级排队链接的地方!(数组下标就是优先级)

2.3 active指针和expired指针

如果我们细心观察可以发现:在runqueue中存在两个queue[140]数组,这是为什么呢?

进程是根据优先级进行调度的,如果在一个queue中,有一个优先级为60的PCB,还有一个80的PCB在排队,所以CPU在调度的时候,首先肯定会调度优先级为60的PCB,此时如果我们不断的添加更多的优先级为60的进程,就会一直调度60的PCB,那么优先级为80的PCB就会陷入进程饥饿,那么此时的CPU调度进程的公平性如何体现?

  • 所以在runqueue中维护了两个queue[140],然后让active指针指向一个queue[140],再让expired指针指向一个queue[140];
  • OS在调度的时候会优先调度active指针指向的queue,此时如果有新的进程创建,并不会直接插入到active指向的queue中,而是插入到expired指向的queue中进行优先级的排队;
  • 当active指向的queue中的PCB调度完了,此时就将active和expired指向的内容进行交换,然后继续调度active指向的queue,此时就不会出现上面的进程饥饿问题。

2.4 活动队列和过期队列 

  • nr_active:总共有多少个被调度的进程PCB;
  • active指针指向的queue[140]就叫做活动队列;
  • expired指针指向的queue[140]就叫做活动队列。

2.5 bitmap(位图)

当我们在活动队列调度PCB的时候,是需要遍历找还是否存在可以调度的PCB的,粗暴一点的方法就是从前往后遍历的找,这种方式是比较费时间的,每次调度都要寻找,太麻烦了,所以就引入了一个新的结构:int bitmap[5]

根据比特位与字节的换算,bitmap中一共可以标志160个位置,我们都知道位图的查找时间复杂度是O(1),但是需要的就是消耗了一点空间,一种空间换时间的算法,主要的是保证了CPU调度PCB的效率。

2.6 总结

在系统当中查找一个最合适调度的进程的时间复杂度是一个常数,不随着进程增多而导致时间成本增加,我们称之为进程调度O(1)算法!

 

朋友们、伙计们,美好的时光总是短暂的,我们本期的的分享就到此结束,欲知后事如何,请听下回分解~,最后看完别忘了留下你们弥足珍贵的三连喔,感谢大家的支持!   

这篇关于【Linux】:Linux 2.6内核 调度队列和调度原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

详解Linux中常见环境变量的特点与设置

《详解Linux中常见环境变量的特点与设置》环境变量是操作系统和用户设置的一些动态键值对,为运行的程序提供配置信息,理解环境变量对于系统管理、软件开发都很重要,下面小编就为大家详细介绍一下吧... 目录前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

Linux使用scp进行远程目录文件复制的详细步骤和示例

《Linux使用scp进行远程目录文件复制的详细步骤和示例》在Linux系统中,scp(安全复制协议)是一个使用SSH(安全外壳协议)进行文件和目录安全传输的命令,它允许在远程主机之间复制文件和目录,... 目录1. 什么是scp?2. 语法3. 示例示例 1: 复制本地目录到远程主机示例 2: 复制远程主

Mysql的主从同步/复制的原理分析

《Mysql的主从同步/复制的原理分析》:本文主要介绍Mysql的主从同步/复制的原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录为什么要主从同步?mysql主从同步架构有哪些?Mysql主从复制的原理/整体流程级联复制架构为什么好?Mysql主从复制注意