初识Linux · O(1)调度算法

news2024/12/26 13:55:58

目录

前言:

O(1)调度算法


前言:

在初识进程的那一块,我们已经知道了进程并不是一直占用cpu资源的,而是存在时间片的概念,即,每个进程都有一定的时间来执行该进程,时间一到,该进程就应该自动到后面进行排队,同时,进程的数据也应该被不同的寄存器记录下来,方便下一次执行该进程的时候,可以接着上次结果运行。

那么问题就来了,进程被调度的时候,是如何调度的,如果调度的过程中,有别的进程来排队,那么会不会导致随着进程数量的增多,导致进程排队的时间越来越多,最后甚至运行不了?

并且,优先级一共就那么几个优先级,实际运行的时候,进程可不止有那么多个,所以优先级并不能真正代替进程是否先运行,并且nice值也是影响进程的运行,这一切,构成了一个新的专题,即Linux中的O(1)调度算法。


O(1)调度算法

正式开始之前,我们不妨整理一下,有多少个问题:

1. 随着进程的增多,进程排队的时间是否会越来越多,甚至导致运行不了?

2. 优先级一定是越小就一定会先运行吗?

3. nice值影响优先级的区间为什么只有40个值

这么多问题的切入点只有一个,即Linux源码中的一个结构:runqueue

这是解决问题的关键。

我们的重点不在于负载因子上,我们今天着重介绍arrary[0],array[1]即可。

我们输入指令top可以看到对应的优先级:

顺便复习一下,进程的状态我们可以使用ps来查看:

while :; do ps -xaj | head -1 && ps -xaj | grep main | grep -v grep; sleep 1;done

优先级

我们通过指令ps -al可以看到,这里的优先级默认的都是80,修改的范围都是在[-20,19]里面,为什么只有40个数字呢?我们后面再谈。

根据上图,array[0]中有一个140个空间的queue,还有一个bitmap[5],因为这两个变量的存在,所以Linux的调度是分时操作的,保证了一定的公平性,还有一种操作是实时操作,实时操作的例子比如出租车,有人就立马就跑,不存在说排队之类的。

这个queue中都是PCB,也就是进程的控制块,OS在里面查找进程的时候,是不是需要一个一个的遍历?OS也不是神人,不可能就是说一下找到。那么这样的话,势必会导致效率的降低。

所以存在另一种变量,即bitmap,相信c++学习阶段有了解的人肯定知道这个数组就是位图

这里简单描述一下位图,即将字节层面的操作转到了bit层面,如果OS需要确定队列中是否有进程,它不需要一个一个的去遍历较大的数组,只需要遍历bitmap即可,因为每个位对应的就是每个数组中的空间.

因为默认优先级是80,修改之后的范围是60到99,在runqueue中的队列,有140个空间,前0 - 99个空间我们不考虑,我们考虑后面100 - 139,这里面其实和地址空间一样,存在某种映射关系:

存在的映射关系大概就是这样,100 -  139分别对应的就是60 - 99,这恰好就是我们能够修改的范围。

此时对于OS来说,插入进程和干掉进程只需要遍历bitmap,5个空间,几乎就是不需要时间了,代表的是32 * 5,160个空间,甚至还多出来了些。

那么为什么:

存在两个相同的队列呢?

一个是活跃进程,一个是过期进程,过期进程是好理解的,即时间片到了的进程,就会被安排在过期进程,活跃进程也就是时间片还没到,或是第一次都没有运行的进程。

同时,还存在两个指针,active和expired指针,active指针永远指向活跃进程,expired永远指向过期进程,对于不同的队列,活跃进程可以只出不进,过期进程只进不出,当某个队列中一个进程都没有了,比如active中没有进程了,那么active和expired交换队列,此时acitve指向的即活跃,即原来过期的进程变成了活跃进程,活跃的进程变成了过期的进程,这个过程,就被成为O(1)调度算法。

那么回归问题,优先级一样的问题?如果优先级是一样的,OS也是会根据不同的点在判断,但是优先级一样的,都会进到queue中的某个空间的后面,即用task_queue进行链接。所以优先级一样,如何调度也是OS的事,但是我们能确定的事,都会连接到task_queue的指针后面,以链表的形式存在。


感谢阅读!

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

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

相关文章

会议平台后端优化方案

会议平台后端优化方案 通过RTC的学习,我了解到了端对端技术,就想着做一个节省服务器资源的会议平台 之前做了这个项目,快手二面被问到卡着不知如何介绍,便有了这篇文章 分析当下机制 相对于传统视频平台(SFU&#xff…

windows 驱动实例分析系列-定时日志的COM驱动

本文章的前置文章为: windows 驱动编写原则 windows COM驱动 案例 windows COM驱动的I/O处理 在前面的设计中,主要是对windows提供的VirtualSerial源代码的讲解,但是那个驱动其实是一个空壳驱动,用于学习的,在I/O处理中,也讲述了serial I/O处理的本质,接下来会将这些…

PGMP-03战略一致性

1.概要 program strategy alignment:战略一致性 2.详细

css的背景background属性

CSS的background属性是一个简写属性,它允许你同时设置元素的多个背景相关的子属性。使用这个属性可以简化代码,使其更加清晰和易于维护。background属性可以设置不同的子属性。 background子属性 定义背景颜色 使用background-color属性 格式&#x…

经典文献阅读之--WiROS(用于机器人的WiFi感知工具箱)

0. 简介 近期的许多研究探索了使用基于WiFi的感知技术来改善SLAM(同时定位与地图构建)、机器人操控或探索。此外,WiFi的广泛可用性使其成为最具优势的射频信号。但WiFi传感器缺乏一个准确、易处理、多功能的工具箱,这限制了它们与…

MicoZone-Maven

一、理论 Maven 是 Apache 软件基金会组织维护的一款专门为 Java 项目提供项目构建和依赖管理支持的工具。 通过Maven管理依赖的优势: 1、通过在pom.xml中指定jar包坐标即可自动从仓库下载依赖 2、如果jar包存在子依赖会自动下载子依赖包 3、如果jar包之间存在冲突…

Web安全 - 服务端请求伪造SSRF(Server-Side Request Forgery)

文章目录 OWASP 2023 TOP 10SSRF 导图SSRF 概念SSRF的工作原理SSRF攻击场景SSRF防御策略1. 严格验证用户输入2. 禁用或限制对内部网络的访问3. 强制使用外部API代理4. 禁止直接访问敏感资源5. 输入内容长度限制6. 检测和监控7. 确保对HTTP请求的处理安全 SSRF防御实现方案1. 白…

【鸿蒙开发】05 登录Demo解析

文章目录 一、功能介绍 在鸿蒙开发中,一个完善的登录功能是许多应用程序的基础需求。本文将详细介绍一个鸿蒙 App 登录 Demo,包括其功能介绍、代码解析以及代码 demo 的下载地址。 本文初始代码从华为开发者网站下载,根据该Demo进行内容调整。…

【Fast-LIO系列】Fast-LIO、Fast-LIO2、Faster-LIO系列特点分析

【FAST-LIO】Fast-LIO系列特点分析 1. FAST-LIO核心贡献1.将IMU和Lidar特征点紧耦合在一起2.使用反向传播考虑到了运动补偿3. 基于IESKF中的 卡尔曼增益更新 K 2. FAST-LIO2核心贡献(2021年)1. 不用线,面特征点而使用全局点云2. 使用ikd-tree存储点云3. ikd-Tree 3.…

P3131 [USACO16JAN] Subsequences Summing to Sevens S Python题解

[USACO16JAN] Subsequences Summing to Sevens S 题目描述 Farmer John’s N N N cows are standing in a row, as they have a tendency to do from time to time. Each cow is labeled with a distinct integer ID number so FJ can tell them apart. FJ would like to ta…

C语言 | Leetcode C语言题解之第448题找到所有数组中消失的数字

题目&#xff1a; 题解&#xff1a; int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize) {for (int i 0; i < numsSize; i) {int x (nums[i] - 1) % numsSize;nums[x] numsSize;}int* ret malloc(sizeof(int) * numsSize);*returnSize 0;for (in…

特征工程——一门提高机器学习性能的艺术

当前围绕人工智能(AI)和机器学习(ML)展开的许多讨论以模型为中心&#xff0c;聚焦于 ML和深度学习(DL)的最新进展。这种模型优先的方法往往对用于训练这些模型的数据关注不足&#xff0c;甚至完全忽视。类似MLOps的领域正迅速发展&#xff0c;通过系统性地训练和利用ML模型&…

ZYNQ: GPIO 之 MIO 控制 LED 实验

GPIO 之 MIO 控制 LED 实验目的 使用 GPIO 通过两个 MIO 引脚控制 PS 端两个 LED 的亮灭&#xff0c;实现底板上 PS_LED0、PS_LED1 两个 LED 灯同亮同灭的效果。 简介 ZYNQ PS 中的外设&#xff08;如 USB 控制器、UART 控制器、I2C 控制器以及 GPIO 等等&#xff09;可以通…

亲测无限坐席在线客服系统源码/二开版/基于ThinkPHP+搭建教程

源码简介&#xff1a; 亲测了一款实用的无限坐席在线客服系统源码&#xff0c;这可是基于ThinkPHP框架开发的二开版哦&#xff01;里面还附带了一份超详细的搭建教程。 安装过程简直不能更简单&#xff0c;只需一键操作&#xff0c;启动两个端口就搞定了。而且&#xff0c;它…

动态库的加载全过程

区分一组概念&#xff1a;逻辑地址&#xff0c;虚拟地址&#xff0c;物理地址。 逻辑地址&#xff1a;是我们的代码在编译过程&#xff0c;编译器帮对每一条代码所生成的指令所编写的地址。 物理地址&#xff1a;当程序被放入到内存中时&#xff0c;内存与每一条指令所对应的…

回执单识别-银行回单识别API-文字识别OCR API

银行回单是一种由银行提供的交易凭证&#xff0c;记录了账户资金的交易明细。它通常包括存款、取款、转账、汇款、支付等各种类型的资金往来信息。银行回单可以是纸质的&#xff0c;也可以是电子版的&#xff0c;内容详尽记录了交易的相关信息&#xff0c;具有法律效力&#xf…

CSS 效果:实现动态展示双箭头

最近写了一段 CSS 样式&#xff0c;虽然不难&#xff0c;但实现过程比较繁琐。这个效果结合了两个箭头&#xff0c;一个突出&#xff0c;一个内缩&#xff0c;非常适合用于步骤导航或选项卡切换等场景。样式不仅仅是静态的&#xff0c;还可以通过点击 click 或者 hover 事件&am…

【机器学习(五)】分类和回归任务-AdaBoost算法

文章目录 一、算法概念一、算法原理&#xff08;一&#xff09;分类算法基本思路1、训练集和权重初始化2、弱分类器的加权误差3、弱分类器的权重4、Adaboost 分类损失函数5、样本权重更新6、AdaBoost 的强分类器 &#xff08;二&#xff09;回归算法基本思路1、最大误差的计算2…

JavaSE——面向对象2:方法的调用机制、传参机制、方法递归、方法重载、可变参数、作用域

目录 一、成员方法 (一)方法的快速入门 (二)方法的调用机制(重要) (三)方法的定义 (四)注意事项和使用细节 1.访问修饰符(作用是控制方法的使用范围) 2.返回的数据类型 3.方法名 4.形参列表 5.方法体 6.方法调用细节说明 (五)传参机制 1.基本数据类型的传参机制 …

C++模拟实现vector容器【万字模拟✨】

更多精彩内容..... &#x1f389;❤️播主の主页✨&#x1f618; Stark、-CSDN博客 本文所在专栏&#xff1a; 学习专栏C语言_Stark、的博客-CSDN博客 项目实战C系列_Stark、的博客-CSDN博客 数据结构与算法_Stark、的博客-CSDN博客 座右铭&#xff1a;梦想是一盏明灯&#xff…