Linux:进程调度

Linux:进程调度

    • 进程优先级
      • 查看优先级
      • 调整优先级
    • Linux 2.6 内核进程调度队列


进程优先级

查看优先级

在Linux中,进程是有优先级的,我们可以通过指令ps -la来查看:

在这里插入图片描述

其中PRI表示priority优先级,在Linux中,优先级的范围是[60, 99]共40个级别

其中80是优先级的默认值,PRI的值越小,进程的优先级就越高

Linux之所以把优先级控制在40个,是为了防止有的进程把自己的优先级调的很高,导致一直占用CPU,其他进程得不到资源。这个问题叫做进程饥饿问题。

调整优先级

那么我们要如何调整一个进程的优先级呢?

在刚刚的图示中,在PRI后面还有一个项目,NI,其代表nice值。进程优先级PRINI满足以下公式:

P R I = 80 + N I PRI = 80 + NI PRI=80+NI

所以我们想要调整进程的优先级PRI,就是要调整nice值。

现在在test.exe可执行程序中执行以下代码:

#include <stdio.h>    
#include <unistd.h>    
#include <stdbool.h>    int main()    
{    printf("I am a process, pid = %d\n", getpid());    while(true)    {}    return 0;                                                                                               
}    

该进程输出自己的PID后,就处于一个死循环状态。

输出结果:

在这里插入图片描述

此时进程一直死循环,我们通过ps -la观察一下:

在这里插入图片描述

可以看到,现在多了一个PID=23432的进程,也就是我们执行的test.exe,其PRI值为默认值80,现在我们开始修改该进程的nice

  1. 执行top指令,进入资源管理器:

你会进入如下页面:

在这里插入图片描述

  1. 按下r键:

r代表你想要改变某个进程的nice,此时白色行上面会出现一个光标,提示你输入想要改变进程的PID

在这里插入图片描述
3. 输入PID

输入PID后,现在你就可以改变nice值了:

在这里插入图片描述

  1. 输入修改后的NI值:

此处我把nice值设为10,按下回车。

在这里插入图片描述

  1. 最后按下q退出管理器

现在我们通过ps -la观察一下:

在这里插入图片描述

test.exeNI变成了10,而PRI变成了80 + NI = 90了。


Linux 2.6 内核进程调度队列

现在我们再来看看,进程是如何被调度的,以及优先级是如何起作用的。

此处我以Linux 2.6内核的进程调度队列为例。

CPU中,存在大量的寄存器,比如以下常见的寄存器:

eax/ebx/ecx/edx:用于存储临时数据,比如函数返回值
eds/ecs/fg/gs:段寄存器,区分代码与数据
eip:也就是pc指针,指明当前代码执行到那个位置
浮点数寄存器:浮点数运算
ebp/esp:构建栈区

程序在运行的时候,会存储大量的数据,比如当前执行到哪一行代码,上一个语句运算的结果是什么,函数调用到第几层了,等等。这些数据都存储在CPU的寄存器中。CPU中存储的所有临时数据,叫做硬件上下文

当一个进程从CPU中离开,会把所有的硬件上下文都拷贝走,存储在PCB中,这个过程叫做保护上下文

而当一个进程被再次调度的时候,又会把自己的数据写入CPU中,覆盖原始的寄存器中的数据,这个过程叫做恢复上下文


那么我们再来看看运行队列是如何调度进程的

Linux的运行队列run_queue视图如下:

在这里插入图片描述

我们先看到蓝色区域:

在这里插入图片描述

其中nr_active表示当前run_queue总共含有几个进程

queue[140]就是运行队列的主体,我们将其划分为两个区间[0, 99]这段区间暂不讲解,[100, 139]这个区间用于放正在排队的进程的PCB.

这个区间刚好有40个元素,而我们的优先级也刚好有40个,也就是说一个优先级的进程对应一个下标。

其实这个数组本质是一个指针数组,类型是task_struct*,即指向PCB类型的指针,每个指针指向一个链表,链表内存储着所有该优先级的进程的PCB

比如优先级为80的进程,都存储在queue[120]指向的链表中

运行队列调度进程的时候,从下标100开始,也就是从高优先级开始调度,然后遍历这个链表,把高优先级的链表执行完,再去执行下一个优先级的链表的进程

bitmap是一个五个元素的int数组,其是一个位图,一个int有32字节,5×32=160,比140大一些。

其用一个位图来表示某个下标对应链表有没有进程,有就是1,没有就是0。此时就可以通过遍历位图,来快速判断一个queue的某个下标位置有没有进程,进而得出要不要去遍历该下标的链表。

那么现在有一个问题,那就是刚刚提到的进程饥饿问题:

假设现在CPU正在执行下标为110的链表的进程,也就是优先级为70的进程,此时刚好又有很多优先级为70的进程进来了,结果CPU一直在执行这个优先级的进程。最后70优先级以后的进程,一直拿不到CPU资源,导致进程饥饿问题。

为了解决该问题,其实run_queue中有两个运行队列,在上图中你会发现,红色区域和蓝色区域的是一模一样的:

在这里插入图片描述

这就是两个相同的队列,一个叫做活跃进程队列,一个叫做过期进程队列

active指针指向的队列就是活跃进程队列,expired的指针指向的队列就是过期进程队列

CPU只执行活跃进程队列中的进程,而新来的进程进入过期队列,此时新来的进程就不会影响正在执行的进程,解决了进程饥饿的问题。

当CPU把活跃进程队列的进程执行完后,此时expiredactive指针进行交换,那么活跃进程与过期进程就交换了,此时CPU就去执行新的活跃进程队列。

这样的两个队列轮流执行,一个负责执行,一个负责接受新进程的结构,就解决了进程的饥饿问题


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

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

相关文章

解决 vue install 引发的 failed Error: not found: python2 问题

发生 install 异常时&#xff0c;提示信息如下所示&#xff1a; npm ERR! code 1 npm ERR! path U:\cnblogs\fanfengping-dtops\fanfengping-dtops-front\node_modules\node-sass npm ERR! command failed npm ERR! command U:\Windows\system32\cmd.exe /d /s /c node scripts…

基于Matlab机器人工具箱对Dobot机械臂的研究

文章目录 文章目录 前言 一、Dobot Mangician 分析 二、Matlab 机器人工具箱 1. 建立模型 2. DoBot 正向运动学 3. Dobot 逆运动学 4. Dobot workpace 5. Dobot轨迹规划 三、Dobot studio 1. DoBot teaching 2. DoBot Python 程序 总结 前言 在本实验中&#xf…

智能边缘计算采集网关助您远程调试SINAMICS S200伺服-天拓四方

您还在为每次调试都要去现场而烦恼吗&#xff1f;智能边缘计算采集网关助您远程调试SINAMICS S200伺服&#xff0c;让您足不出户&#xff0c;就能“运筹帷幄之中&#xff0c;决胜千里之外”。 新品介绍 SINAMICS S200 PN是西门子推出的新一代伺服驱动系统&#xff0c;采用Mot…

upload-labs第十一十二关

第十一关 $is_upload false; $msg null; if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_ext substr($_FILES[upload_file][name],strrpos($_FILES[upload_file][name],".")1);if(in_array($file_ext,$ext_arr)){$temp_file $_FILES[upload_fil…

博客文章:AWS re:Invent 2023 新产品深度解析 - 第四部分

TOC &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你的陪伴与支持 ~ &#x1f680; 欢迎一起踏上探险之旅&#xff0c;挖掘无限可能&#xff0c;共同成长&#xff01; 写在最前面 去年发布文章的一部分&#xff0c;由于内…

【5】DongshanPI-Seven 应用开发_网络编程TCPUDP

目录 1、网络编程概念2、网络编程的API2.1 网络通信交互示意图2.2 主要API 3、编程测试3.1 TCP 测试3.1.1 server 程序3.1.2 Client 程序3.1.3 测试结果 3.2 UDP 测试3.2.1 udp server3.2.2 udp client3.2.3 测试结果 1、网络编程概念 1.数据传输三要素&#xff1a;源、目的、…

网络的坚实与灵活:工业与常规以太网交换机的差异解析

&#x1f310;&#x1f310;在当今互联网和物联网迅速发展的背景下&#xff0c;以太网交换机作为网络通信的核心设备&#xff0c;其性能和稳定性对于整个网络系统的运行至关重要。工业以太网交换机和常规以太网交换机乍一看似乎很相似&#xff0c;但两者之间存在着一些关键区别…

深入探索:Zookeeper+消息队列(kafka)集群

目录 前言 一、Zookeeper概述 1、Zookeeper概念 2、Zookeeper 特点 3、Zookeeper工作机制 4、Zookeeper 选举机制 4.1 第一次启动选举机制 4.2 非第一次启动选举机制 5、Zookeeper 数据结构 6、Zookeeper 应用场景 二、部署 Zookeeper 集群 1、环境部署 2、安装 z…

OpenHarmony音频和音乐编码格式—vorbis

简介 一种通用音频和音乐编码格式。 Vorbis编解码器规范属于公共领域。所有技术细节都已发布并记录&#xff0c;任何软件实体都可以充分利用该格式&#xff0c;而无需支付许可费、版税或专利问题。 下载安装 直接在OpenHarmony-SIG仓中搜索vorbis并下载。 使用说明 以OpenHa…

测试JAVA 测开

测试、java测开 1、测试用例要素&#xff08;4个重要要素&#xff09;2、测试用例的好处3、测试用例的设计方法3.1 基于需求设计测试用例3.2 等价类3.3 边界值3.4 判定表 1、测试用例要素&#xff08;4个重要要素&#xff09; 测试环境操作步骤测试数据预期结果 2、测试用例的…

企业数字化与数智化的区别是什么?

一、引言 随着信息技术的迅猛发展和应用普及&#xff0c;企业面临着数字化与数智化两大转型趋势。数字化主要关注数据的收集、整合和流程优化&#xff0c;而数智化则在此基础上进一步引入智能技术&#xff0c;实现业务的自动化、智能化和决策的科学化。探讨企业数字化与数智化…

初级C语言:6 结构体

6.1 结构体的声明 结构是一些值的集合&#xff0c;这些值称为成员变量。结构的每个成员可以是不同类型的变量。 内置类型&#xff1a;char&#xff1b;short&#xff1b;int&#xff1b;long&#xff1b;long long&#xff1b;float&#xff1b;double 复杂对象的描述就会使…

通过拖拽动态调整div的大小

最近遇到一个需求&#xff0c;页面展示两块内容&#xff0c;需要通过拖拽可以动态改变大小&#xff0c;如下图&#xff1a; 实现思路&#xff1a;其实就是改变div样式的width&#xff0c;本质上就是Dom操作。 完整代码&#xff1a;&#xff08;基于vue2项目实践&#xff09; …

第 7 章 导航实现(自学二刷笔记)

重要参考&#xff1a; 课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ 讲义链接:Introduction Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程 准备工作 请先安装相关的ROS功能包&#xff1a; 安装 gmapping 包(用于构建地图)&#xff1a; sudo apt inst…

爬虫机试题-爬取新闻网站

之前投简历时遇到了这样的一个笔试。本以为会是数据结构算法之类的没想到直接发了一个word直接提需求&#xff0c;感觉挺有意思就写了这篇文章&#xff0c;感兴趣的朋友可以看看。 拿到urllist 通过分析页面结构我们得以知道&#xff0c;这个页面本身没有新闻信息&#xff0c;是…

比特币叙事大转向

作者&#xff1a;David Lawant 编译&#xff1a;秦晋 要理比特币解减半动态&#xff0c;最关键的图表是下面这张&#xff0c;而不是价格图表。它显示了自 2012 年以来&#xff0c;矿业总收入与比特币现货交易量的比例&#xff0c;并标注了三个减半日期。 虽然矿工仍然是比特币生…

OpenHarmony图像解码库—stb-image [GN编译]

简介 stb_image主要是C/C实现的图像解码库。 下载安装 直接在OpenHarmony-SIG仓中搜索stb-image并下载。 使用说明 以OpenHarmony 3.1 Beta的rk3568版本为例 库代码存放路径&#xff1a;./third_party/stb-image 修改添加依赖的编译脚本&#xff0c;路径&#xff1a;/devel…

编程入门(五)【Visual Studio Code安装与C/C++语言运行】

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 前言VScode安装与环境配置编写第一个C语言程序总结 前言 经过了前面对计算机…

mars3d实现禁止地图移动,禁止地图左右平移,但是鼠标可以移动的效果。

new mars3d.layer.GeoJsonLayer({渲染后实现鼠标左键按住不释放拖动时&#xff0c;地图不跟着拖动效果 当前问题&#xff1a; 1.在map初始化&#xff0c;或者是加载效果的时候&#xff0c;整个地球的场景都是一样的。 如果鼠标左键按住不释放&#xff0c;在屏幕上拖动的时候…

还在 MySQL 中使用枚举?小心有坑~

为什么使用枚举 限定值的取值范围&#xff0c;比如性别&#xff08;男&#xff0c;女&#xff0c;未知&#xff09;等。 枚举类型使用陷阱 1.超级不推荐在mysql中设置某一字段类型为enum&#xff0c;但是存的值为数字&#xff0c;比如‘0’&#xff0c;‘1’&#xff0c;‘2…