Linux:进程调度的O(1)算法

news2024/11/20 13:16:37

文章目录

  • 并发的理解
    • 程序运行时的数据
    • 进程切换的过程
  • 内核的调度队列和调度原理

并发的理解

前面总结到了,关于并发的概念,并发针对的是单核的CPU上同时运行很多情况,并不是某个程序在CPU上运行就一直运行,而是根据一定的时间片和调度算法来进行合理的调度,因而引出了优先级的概念,造成的最终目的就是可以让每一个进程都享受到CPU上的资源,否则会导致进程饥饿

那么本篇来解决的两个问题:

  1. 操作系统是如何进行调度的?
  2. 在进行进程切换的过程中会发生什么事?

程序运行时的数据

从学C语言开始,就有各种各样的函数,有些函数是有返回值的,可以被函数外的变量进行接收,但是由函数的栈帧我们知道,函数在创建后,执行到最后函数栈帧是会被销毁的,但函数的数据呢?外面的程序要进行接收的数据从哪里进行获取?

实际上,在函数的栈帧中其实已经知道了,函数栈帧的传值是通过CPU中的寄存器进行的传值,其实在程序运行的过程中,产生的各种各样的临时数据都被存储在寄存器中,而在CPU要进行进程切换的时候,就会把现在当前正在运行的程序的一些临时数据都存储到一个地方,在老版本的内核中,这个存储的位置就是进程的PCB,在现在的版本中并不是直接放在进程的PCB中,但也是和进程的PCB相关的存储位置,也就是说程序运行时的数据是直接或间接的存储在PCB中,这样在未来,当这个进程重新被调回来的时候,寄存器可以从进程的PCB中获取到当时运行的位置时产生的数据,再在此基础上进行接着运行,这样就可以实现进程的切换,但是程序运行时产生的数据不会被丢失的情况

进程切换的过程

有了上面的铺垫,进程的切换过程是通俗易懂的,用下图来表示:

在这里插入图片描述

要注意的是,在进行进程切换的过程中,程序B的临时数据是直接在A程序的寄存器上运行的,直接进行的是数据的覆盖,而不是先清空寄存器的数据再进行使用

内核的调度队列和调度原理

下面来解决的是,Linux内核中是如何进行调度队列的呢?调度原理又是什么?

在这里插入图片描述
上面这张图展示的就是Linux内核中的调度队列示意图,那么具体是如何进行队列调度的呢?

首先,图中有两个queue[140],这个就是所谓的队列结构,其中有一个就是所谓的运行队列,也就是直接向CPU上进行调度的结构,那么140就意味着这当中有140个格子,每个格子对应的是一个优先级,对于0-99号格子是普通优先级,目前不考虑它的作用,而对于100-139号格子,对应的是优先级为60-99,每当有一个优先级为这个区间内的进程来临的时候,就将它放到对应格子的队列中,这样CPU就可以在调度的时候,根据优先级的大小来进行调度了

其次,为什么这里有两个queue?假设下面的场景,有一个优先级为99的进程,它的优先级是最低的,从理论上来说应该是被最后进行调度的进程,但是在前面进程运行的过程中,一直有优先级为80的进程不断的插入队列,不停的插入,那么就意味着这个优先级为99的进程始终不能被放到CPU上运行,CPU的资源无法供应到这个进程,就会造成进程饥饿现象,对于这种情况,调度队列的设计就采用了两个队列来进行解决这个问题,对于一个进程想要进入待调度的队列中,会把它放在另外一个队列中,CPU会优先调度CPU目前维护的队列,当这个队列中的程序全部都运行结束后,再调度另外一个队列中的进程,那么CPU如何知道自己现在要调度哪一个队列?这就用到了另外两个参数,分别是*active*expired,这两个参数表示的就是目前CPU正在调度的队列和CPU以后会调度的队列,当active队列中的进程全部调度结束后,就和expired队列进行交换,再接着进行运行,新插入的进程始终都是插入到expired队列中的

最后,是关于CPU如何知道队列中的调度状态的问题,通常来说是通过遍历就可以知道调度情况,但是Linux内核是采用的位图的思想,在蓝红框所框选的内容中,还有一个是bitmap,里面存储了五个数据,这五个数据本质上都是int类型的数据,而一个int32bit位,而五个就是160bit位,正好可以存储下对应的140个队列中的状态值,如果某个位置有等待运行的进程,就将这个进程对应的优先级找到在位图中的位置,再将它标记位1即可,这样就完成了标记

用了如此大的篇幅,讲清楚了内核中的调度队列和调度原理,整个算法流程的时间复杂度是O(1),因此它的名字就叫做进程调度的O(1)算法

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

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

相关文章

Linux C/C++ 嗅探数据包并显示流量统计信息

嗅探数据包并显示流量统计信息是网络分析中的一种重要技术,常用于网络故障诊断、网络安全监控等方面。具体来说,嗅探器是一种可以捕获网络上传输的数据包,并将其展示给分析人员的软件工具。在嗅探器中,使用pcap库是一种常见的方法…

怎么启动MySQL服务

你可能也遇到这样的问题,打开navicat,但是点击数据库连接不上,这就有可能是数据库服务没有启。报错如下图所示 解决方法一win11为例,右键此电脑,找到管理。 找到服务和应用吃程序,点击服务。 往下找到MySQL…

ti am335 RT-LINUX测试

RT-Linux是一个基于Linux内核的实时操作系统,它在满足Linux操作系统的通用性的同时兼顾 实时性能,它的核心是Linux内核的一个实时扩展,它为实时任务提供了必要的调度机制和时间管理。通过采用抢占式调度策略,高优先级的实时任务可…

肉眼无法读懂是二进制独有的浪漫——一篇博客学懂文件操作(C语言)

目录 一、为什么使用文件 二、什么是文件 2.1程序文件 2.2数据文件 2.3文本文件和二进制文件 2.4文件名 三、文件的打开和关闭 3.1 文件指针 3.2 文件的打开和关闭 3.3文件的顺序读写函数 3.3.1流的概念 3.3.2输入输出的概念 3.3.3函数操作 3.4文件的随机读写函…

miniblink学习

1.基本使用 main.cpp #include "webwidget.h" #include <QApplication> #include "wke.h" //工作目录是指当前目录&#xff0c;运行目录是指exe所在路径。 int main(int argc, char *argv[]) {QApplication a(argc, argv);//设置miniblink的全路径文…

C# GFPGAN 图像修复

效果 项目 代码 using Microsoft.ML.OnnxRuntime; using Microsoft.ML.OnnxRuntime.Tensors; using OpenCvSharp; using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; using System.Windows.Forms;namespace 图像修复 {pu…

leetcode-62.不同路径

1. 题目 2. 解答 dp[i][j]表示机器人位于第i&#xff0c;j位置的时候&#xff0c;有多少路径 如果i 0&#xff0c;dp[i][j] 1;如果j 0&#xff0c;dp[i][j] 1;其他情况dp[i][j] dp[i-1][j] dp[i][j - 1] #include <stdio.h>int solve(int m, int n) {int dp[m][…

一场直播脚本的策划及话术怎么写?

一场直播脚本的策划及话术参考 直播流程安排示范:120 分钟直播流程设计(过款型) 标准化直播话术单元(单款产品话术模板) I 直播 120 分钟标准化流程 I 分解为 4 个 30 分钟直播单元 I 30 分钟前期介绍 2-3 个款作为起步 每款持续时长 10 分钟,10 分钟的时间里 ①卖点引出 2 …

找不到msvcp100.dll无法继续执行此代码怎么解决,快速修复dll问题的5个方法

电脑已经成为我们生活和工作中不可或缺的一部分&#xff0c;在我们使用电脑的时候&#xff0c;总会遇到一些技术问题&#xff0c;其中之一就是“找不到msvcp100.dll”。msvcp100.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C 2010 Redistributable Package的一部…

G.711语音编解码器详解

语音编解码利用人听觉上的冗余对语音信息进行压缩从而达到节省带宽的目的。值得注意的是,本文说的是语音编解码器,也就Speech codec,而常用的还有另一种编解码器称作音频编解码器,英文是Audio codec,它们的区别如下。 以前在学校的时候研究了很多VoIP的编解码器从G.723到A…

java.sql.SQLFeatureNotSupportedException解决方法

使用MyBatis访问数据库查询数据时报错&#xff1a; Caused by: java.sql.SQLFeatureNotSupportedExceptionat com.alibaba.druid.pool.DruidPooledResultSet.getObject(DruidPooledResultSet.java:1771)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at sun…

在node中操作mysql数据库

目录 前言 在node中安装mysql模块 引入绑定数据库 验证mysql模块能否正常工作 增 便捷方式 改 便捷方式 删 查 前言 本文介绍在node中对数据库使用sql语句进行增删改查 在node中安装mysql模块 npm i mysql 引入绑定数据库 导入mysql模块 const mysql require(m…

2、Windows下安装

目录 一.安装 1、双击下载的程序&#xff1a; 2、加载完成后&#xff0c;会进入如下界面&#xff08;选第一个Developer Default&#xff09; 3、然后点击Next 点击Execute 然后Next 4.继续next注意端口为3306 5.继续next&#xff0c;输入账户密码&#xff08;要有大小写…

C# 图解教程 第5版 —— 第4章 类型、存储和变量

文章目录 4.1 C# 程序是一组类型声明4.2 类型是一种模板&#xff08;*&#xff09;4.3 实例化类型4.4 数据成员和函数成员4.5 预定义类型4.6 用户定义类型4.7 堆和栈&#xff08;*&#xff09;4.8 值类型和引用类型4.9 变量4.9.1 变量声明4.9.2 多变量声明&#xff08;*&#x…

“视频剪辑:如何分割与转换视频格式,一探究竟!

如今&#xff0c;视频已成为我们生活中不可或缺的一部分。无论是记录生活点滴、分享兴趣爱好&#xff0c;还是传递信息&#xff0c;视频都已经成为一种非常有效的表达方式。而在视频制作过程中&#xff0c;剪辑是至关重要的一环。通过剪辑&#xff0c;我们可以去掉不需要的内容…

[23] T^3Bench: Benchmarking Current Progress in Text-to-3D Generation

3D生成蓬勃发展&#xff0c;主流方法通过事例比较和用户调查来评价方法好坏&#xff0c;缺少客观比较指标&#xff1b;本文提出Bench&#xff0c;首次综合比较了不同生成方法&#xff1b;具体来说&#xff0c;本文设计了质量评估&#xff08;Quality Assessment&#xff09;和对…

nginx优化和防盗链

nginx优化 1.nginx隐藏版本号 因为是一个高性能&#xff0c;轻量级的工具吗&#xff0c;更新版本速度很快&#xff0c;功能很强大但是BUG很多&#xff0c;很容易被攻破&#xff0c;所以需要隐藏版本号来减少服务器被攻击的威胁。 隐藏版本号的第一步就是如何查看版本号 curl …

蓝桥杯每日一题2023.10.15

数列求值 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 我们发现如果一项一项相加会造成结果过大从而答案错误&#xff0c;所以我们每次只需要取后四位经行计算即可 #include<bits/stdc.h> using namespace std; int a[20190329]; int main() {a[1] 1, a[2] 1, a[3]…

Flutter 剪裁(Clip)

&#x1f525; ClipOval &#x1f525; 子组件为正方形时剪裁成内贴圆形&#xff1b;为矩形时&#xff0c;剪裁成内贴椭圆 裁剪纯色背景 ClipOval(child: Container(width: 300.w,height: 300.w,decoration: const BoxDecoration(color: Colors.red),),), 裁剪背景图片 裁剪前…

17.SpringBoot前后端分离项目之简要配置二

如何配置前端请求和后端响应&#xff08;2&#xff09; 登录接口 前端&#xff1a; 后端控制器&#xff1a; 在My3Controller RequestMapping("/login") public ResponseBody RestObject login(RequestBody UserUI userUI){System.out.println("login方法&…