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

目录

前言:

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.rhkb.cn/news/436319.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++:类中的特殊关键字,运算重载符

1.My_string类中重载以下的运算符&#xff1a; 、[] 、>、<、、>、<、&#xff01;、、输入输出(>>、<<) 主函数&#xff1a; #include <iostream> #include "my_string.h"using namespace std;int main() {My_string s1("cat…

centos72009源码编译R语言

./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Pconnect -Psparkr -Phive -Phive-thriftserver -Pmesos -Pyarn -Dhadoop.version3.4.0 -Pkubernetes spark3.5.3 源码版本 ./dev/make-distribution.sh --name custom-spark --pip --r --tgz -Pconnect -P…

[Python学习日记-31] Python 中的函数

[Python学习日记-31] Python 中的函数 简介 语法定义 函数的参数 简介 引子&#xff1a; 你是某公司的一个高级程序员&#xff0c;现在老板让你写一个监控程序&#xff0c;需要24小时全年无休的监控公司网站服务器的系统状况&#xff0c;当 CPU、Memory、Disk 等指标的使用…

计算机毕业设计 基于Python高校岗位招聘和分析平台的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

【C++掌中宝】类和对象(二):隐藏的this指针

文章目录 引言1. 定义与用法1.1 隐式存在的 this 指针1.2 this 指针的用途与示例 2. 本质3. 特点4. this 指针的作用机制5. 成员函数中的 this 指针6. 空指针与 this 指针的特殊情况7. 注意事项8. 总结结语 引言 在 C 编程中&#xff0c;类是面向对象编程的核心&#xff0c;而…

【代码实现】opencv 高斯模糊和pytorch 高斯模糊

wiki百科 Gaussian Blur&#xff0c;也叫高斯平滑&#xff0c;是在Adobe Photoshop、GIMP以及Paint.NET等图像处理软件中广泛使用的处理效果&#xff0c;通常用它来减少图像噪声以及降低细节层次。 opencv实现 opencv实现高斯滤波有两种方式&#xff0c; 1、是使用自带的cv2…

在MacOS上安装MongoDB数据库

一、安装方法 1.1 安装包安装 首先&#xff0c;打开MongoDB 官网下载安装包&#xff0c;下载链接&#xff1a;https://www.mongodb.com/try/download/community。 根据自己的系统环境自行选择下载的版本。将下载好的 MongoDB 安装包解压缩&#xff0c;并将文件夹名改为 mon…

机器学习基本上就是特征工程——《特征工程训练营》

作为机器学习流程的一部分&#xff0c;特征工程是对数据进行转化以提高机器学习性能的艺术。 当前有关机器学习的讨论主要以模型为中心。更应该关注以数据为中心的机器学习方法。 本书旨在介绍流行的特征工程技术&#xff0c;讨论何时以及如何运用这些技术的框架。我发现&…

yolov8实例分割重要图片

训练分割要准备好数据集和分割预训练权重文件 下面这张图是数据集的格式 下面这张图配置数据集&#xff0c;下面names 要和labelme转txt里配置的一样 下面这张图进行训练&#xff0c;配置一些全局参数 &#xff0c;初始的yolov8s-seg.pt文件需要到github上yolov8开源项目里下 l…

ERROR [internal] load metadata for docker.io/library/openjdk:8

ERROR: failed to solve: DeadlineExceeded: DeadlineExceeded: DeadlineExceeded: openjdk:8: failed to do request: Head “https://registry-1.docker.io/v2/library/openjdk/manifests/8”: dial tcp 202.160.129.6:443: i/o timeout 在构建docker镜像时从docker.io/libr…

论文笔记(四十七)Diffusion Policy: Visuomotor Policy

Diffusion Policy: Visuomotor Policy 文章概括摘要1. 介绍2. 扩散策略的公式化2.1 去噪扩散概率模型2.2 DDPM 训练2.3 用于视觉运动策略学习的扩散模型 3 关键设计决策3.1 网络架构选项3.2 视觉编码器3.3 噪声计划3.4 加速实时控制的推理 4. 扩散策略的四个引人入胜的特性4.1 …

【Python报错已解决】error: subprocess-exited-with-error

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

004集—— txt格式坐标写入cad(CAD—C#二次开发入门)

如图所示原始坐标格式&#xff0c;xy按空格分开&#xff0c;将坐标按顺序在cad中画成多段线&#xff1a; 坐标xy分开并按行重新输入txt&#xff0c;效果如下&#xff1a; 代码如下 &#xff1a; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.Runtime; us…

一文详解WebRTC、RTSP、RTMP、SRT

背景 好多开发者&#xff0c;希望对WebRTC、RTSP、RTMP、SRT有个初步的了解&#xff0c;知道什么场景该做怎样的方案选择&#xff0c;本文就四者区别做个大概的介绍。 WebRTC 提到WebRTC&#xff0c;相信好多开发者第一件事想到的就是低延迟&#xff0c;WebRTC&#xff08;W…

HarmonyOS Next应用开发——瀑布流WaterFlow

瀑布流WaterFlow 瀑布流容器&#xff0c;由“行”和“列”分割的单元格所组成&#xff0c;通过容器自身的排列规则&#xff0c;将不同大小的“项目”自上而下&#xff0c;如瀑布般紧密布局。 瀑布流容器的子组件只能是FlowItem&#xff0c;可以配合ForEach、LazyForEach进行循…

聚星文社——绘唐科技有什么区别!

聚星文社和绘唐科技是两个不同的公司&#xff0c;有一些区别。下面是它们的一些区别&#xff1a; 绘唐科技——聚星文社https://iimenvrieak.feishu.cn/docx/ZhRNdEWT6oGdCwxdhOPcdds7nof 行业领域&#xff1a;聚星文社主要从事文化娱乐行业&#xff0c;包括出版、影视制作等&…

Redis: 主从复制原理

主从复制原理剖析 1 &#xff09;配置 通过下面的从节点的配置项可以开启主从之间的复制功能slaveof 192.16.10.101 6379这里的复制包含全量复制和增量复制 2 &#xff09;主节点的主从配置信息解析 查看主从之间的信息&#xff0c;在主节点上 $ info replication 打印出来的…

【Power Query】M函数-List.Sum

M函数-List 列表求和 &#xff08;List.Sum&#xff09;&#xff1a;1&#xff09;横向求和2&#xff09;列求和★思路★</font>★实操★</font> 3&#xff09;求总和4&#xff09;求部分占总体的比重★横向★</font>★竖向★</font> 列表求和 &#x…

如何在算家云搭建MVSEP-MDX23(音频分离)

一、MVSEP-MDX23简介 模型GitHub网址&#xff1a;MVSEP-MDX23-music-separation-model/README.md 在 main ZFTurbo/MVSEP-MDX23-音乐分离模型 GitHub 上 在音视频领域&#xff0c;把已经发布的混音歌曲或者音频文件逆向分离一直是世界性的课题。音波混合的物理特性导致在没有…

OPENCV判断图像中目标物位置及多目标物聚类

文章目录 在最近的项目中&#xff0c;又碰到一个有意思的问题需要通过图像算法来解决。就是显微拍摄的到的医疗图像中&#xff0c;有时候目标物比较偏&#xff0c;也就是在图像的比较偏的位置&#xff0c;需要通过移动样本&#xff0c;将目标物置于视野正中央&#xff0c;然后再…