【Linux进程】进程优先级 Linux 2.6内核进程的调度

前言

        进程是资源分配的基本单位, 在OS中存在这很多的进程, 那么就必然存在着资源竞争的问题, 操作系统是如何进行资源分配的? 对于多个进程同时运行, 操作系统又是如何调度达到并发呢? 本文将以Linux kernel 2.6为例 , 向大家介绍进程在操作系统中 (OS) 的调度原理;

在这里插入图片描述

1. 进程优先级

      进程优先级是操作系统中用来确定进程获取 CPU 资源的先后顺序的一种机制;

         为什么要排队? 本质是资源不足; 在一台电脑中可能只有一个CPU, 但是可能会同时启动多个进程, 那么进程在分配CPU资源时就需要排队(等待CPU资源);

         对于较为重要的进程, 可以设置高优先级,  高优先级进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

使用ps -l查看系统进程:

其中较为重要的信息:

  • UID : 代表执行者的身份
  • PID : 代表这个进程的代号
  • PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
  • PRI :代表这个进程可被执行的优先级,其值越小越早被执行
  • NI :代表这个进程的nice值(在进程PCB中)
     

Linux中进程优先级范围:  60 ~ 99;

Linux中创建进程,默认进程优先级是 80

 在Linux中支持优先级的动态调整,   动态调整的规则:

nice值最小是-20, 超过 -20就统一成 -20;

nice值最大为19, 超过19 统一成19;

 优先级(PRI) 的计算 :  PRI (new) = PRI (old) + nice ;

PRI+ nice值是基于默认值80计算的(不会累计),比如: 先把nice值设为10,那么PRI就会变成90,使用root账户将nice值设为-10,PRI就变成了70 ;

用top命令更改已存在进程的nice:

  • top
  • 进入top后按“r”–>输入进程PID–>输入nice值

 注意: OS只允许普通用户把优先级调低, 不允许把优先级调高, root账户无限制;

 为什么设置限制?

OS在调度时,为了让每一个进程较为均衡得到调度;  如果nice值可以随意乱改, 就会存在用户恶意的将自己的进程优先级调高,导致优先级低的进程长时间得不到CPU资源 ;

需要注意的点是,进程的nice值不是进程的优先级,PR I和 NI 他们不是一个概念,但是进程nice值会影响到进程的优先级变化。可以理解nice值是进程优先级的修正修正数据

 几个较为重要的概念:

  • 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
  • 独立性:  多进程运行,需要独享各种资源,多进程运行期间互不干扰
  • 并行:  多个进程在多个CPU下分别,同时进行运行,这称之为并行
  • 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

2. 并发

 本文的重点是并发 , 先来介绍一下什么是并发? 

        一个进程在被CPU调度时, 并不是一直占用CPU直至运行结束 ,   而是每隔一段时间(这个时间段也叫做时间片) ,它就会被从CPU上被剥离下来 ,  ​​​​​​​ 然后会重新放进运行队列等待被调度,如此反复,直到进程运行完毕; CPU每次调度进程时, 都会到运行队列中去取;

        Linux内核支持进程之间CPU资源的抢占,它是一种基于时间片轮转式抢占式内核,时间片非常的短,轮转速度非常快(一秒内进程可能被调度了100次),所以我们很难察觉;

新的问题: 进程在运行时会被从CPU上剥离下来, 那下次调度时, CPU是如何知道进程执行到哪里的呢?

 小方框表示寄存器;

        在CPU当中有很多各种各样的寄存器:eax、ebx、ecx、edx、ss、ds、cs、gs、fs、ebp、esp、eip..

 寄存器的功能有很多,比如记录程序/进程的运行状态(走到那一步);

比如: cpu内:eip:程序计数器;

        进程在运行时会使用这些寄存器,进程会产生各种各样的数据,在寄存器中临时保存 !

        如果有多个进程,各个进程在CPU内形成的临时数据,都是不一样的每个进程运行到哪里,产生的临时数据,叫做进程硬件上下文; 

        在进行轮转切换时会暂时将这个数据存储到进程PCB里;

注意:

        在以前老的Linux中是这样,现在的不是直接保存到PCB,原因是PCB内容太多,太大,但都与PCB有联系,这里只是可以理解为放在PCB当中;本质就是将CPU寄存器当中的数据保存到内存当中;

        CPU寄存器硬件只有一套,进程上下文数据有很多套,比如10个进程有10套上下文数据;

        寄存器 != 寄存器内容

3. Linux kernel 2.6 内核调度队列与调度原理

        有了前边的基础知识补充, 接下来我们介绍一下Linux kernel 2.6 内核调度队列以及基本调度原理;

一个CPU拥有一个runqueue(如果有多个CPU就要考虑进程个数的负载均衡问题)

 下图就是Linux2.6内核中进程队列的数据结构:

 优先级:

  •  普通优先级: 100~ 139
  •  实时优先级: 0~ 99(不关心)

100~139就是我们使用指令看到的40个优先级; 从第100号开始(PRI: 60), 优先级依次向下递减;

 如下图:

 CUP调度队列中的进程是如果直接遍历一遍队列, 然后依次调度进程, 遍历的过程也会造成资源的浪费; 所以在设计时加入了nr_active 和 bitmap[5];

        int整形占4个字节,32个bit位 5 x 32 也就是 160个 bit位 (足够表示140个优先级) ; 利用位图映射可以极大的提高效率; 

         nr_active判断队列是否有进程,bitmap位图映射快速找到进程位置,这样下来轮转一次的效率就会非常高,时间复杂度接近O(1) ;

在操作系统中会维护两个这样的队列 (活动对列 和 过期队列); 

        进程在活动队列并不一定就运行完了,可能是时间片结束了,被调度完之后就会加入到了过期队列;

同时还会维护两个指针:

  • void *active   活动队列
  • void *expired   过期队列

CPU只会执行active指针指向的队列​​​​​​​

         当进程优先级为99的进程正在被执行时,新插入一些优先级较高的进程,这些进程会被插入
到过期队列当中;  (如果直接插入到活动队列,那就会导致优先级较低的队列一直等待,进而引发进程饥饿问题)

        这样一来, 过期队列的进程不断增多, 由于不会插入新的进程,所以它的进程数量一定会越来越少;当active指针指向的活动队列执行完毕,就将两个指针指向的队列进行交换即可

        原本的活动队列执行空了,再来新的进程就插入到这个队列,这个队列会继续作为过期队列
如此循环,最终就完成了进程的调度;

        ​​​​​​​这样的设计方式不仅提高了效率,并且也解决了进程饥饿问题;


总结

         进程是资源分配的基本单位, 在OS中存在这很多的进程, 那么就必然存在着资源竞争的问题, 于是便有了进程优先级来确认进程调度的先后顺序;  但这也可能会伴随着进程饥饿的问题,  而在Linux2.6版本中的进程调度设计很好的解决这些问题; 具有很高的参考学习的价值;  好了以上便是本文的全部内容, 希望对你有所帮助 , 感谢阅读 !

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

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

相关文章

嵌入式linux面试1

1. linux 1.1. Window系统和Linux系统的区别 linux区分大小写windows在dos(磁盘操作系统)界面命令下不区分大小写; 1.2. 文件格式区分 windows用扩展名区分文件;如.exe代表执行文件,.txt代表文本文件,.…

.net 调用海康SDK的跨平台解决方案

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔序言 上2篇海康SDK使用以及常见的坑…

玩转Easysearch语法

Elasticsearch 是一个基于Apache Lucene的开源分布式搜索和分析引擎,广泛应用于全文搜索、结构化搜索、分析等多种场景。 Easysearch 作为Elasticsearch 的国产化替代方案,不仅保持了与原生Elasticsearch 的高度兼容性,还在功能、性能、稳定性…

Python基础小知识问答系列-高效遍历多个不同类型元素的迭代器

1. 问题: 当需要对多个迭代器进行相同遍历操作时,如何避免因为迭代器之间的类型或者迭代器元素 数量过大引发的问题? 2. 解决方法: 使用itertools模块中的chain函数。 示例: from itertools import chainlist_a [2,…

C语言之Const关键字与指针

目录 1 前言2 变量与指针的储存方式3 const int *var;int *const var;const int *const var;理解与区分4 总结 1 前言 实际开发过程中经常遇到const关键字作用于指针的情况,例如:const int *var;int *const var;const…

【前端】从零开始学习编写HTML

目录 一、什么是前端 二、什么是HTML 三、HTML文件的基本结构 四、HTML常见标签 4.1 注释标签 4.2 标题标签 4.3 段落标签 4.4 换行标签 4.5 格式化标签 4.6 图片标签 4.7 超链接标签 4.8 表格标签 4.9 列表标签 4.10 表单标签 (1)form标…

【vue动态组件】VUE使用component :is 实现在多个组件间来回切换

VUE使用component :is 实现在多个组件间来回切换 component :is 动态父子组件传值 相关代码实现&#xff1a; <component:is"vuecomponent"></component>import componentA from xxx; import componentB from xxx; import componentC from xxx;switch(…

电脑f盘的数据回收站清空了能恢复吗

随着信息技术的飞速发展&#xff0c;电脑已成为我们日常生活和工作中不可或缺的设备。然而&#xff0c;数据的丢失或误删往往会给人们带来极大的困扰。尤其是当F盘的数据在回收站被清空后&#xff0c;许多人会陷入绝望&#xff0c;认为这些数据已无法挽回。但事实真的如此吗&am…

windows server2016搭建AD域服务器

文章目录 一、背景二、搭建AD域服务器步骤三、生成可供java程序使用的keystore文件四、导出某用户的keytab文件五、主机配置hosts文件六、主机确认是否能ping通本人其他相关文章链接 一、背景 亲测可用,之前搜索了很多博客&#xff0c;啥样的都有&#xff0c;就是不介绍报错以…

STM32-I2C硬件外设

本博文建议与我上一篇I2C 通信协议​​​​​​共同理解 合成一套关于I2C软硬件体系 STM32内部集成了硬件I2C收发电路&#xff0c;可以由硬件自动执行时钟生成、起始终止条件生成、应答位收发、数据收发等功能&#xff0c;减轻CPU的负担 特点&#xff1a; 多主机功能&#x…

利用border绘制三角技巧

绘制三角形的效果如图 <html lang"zh-cn"> <head><meta charset"UTF-8"><title>demo</title><style>* {margin: 0;padding: 0;}.box {/* 盒子宽高改成零就变成三角形 &#xff0c;需要哪个方向的三角形就设置哪个方向…

猫狗图像分类-划分数据集

&#x1f4da;博客主页&#xff1a;knighthood2001 ✨公众号&#xff1a;认知up吧 &#xff08;目前正在带领大家一起提升认知&#xff0c;感兴趣可以来围观一下&#xff09; &#x1f383;知识星球&#xff1a;【认知up吧|成长|副业】介绍 ❤️如遇文章付费&#xff0c;可先看…

大学教师门诊预约小程序-计算机毕业设计源码73068

摘要 在当今数字化、信息化的浪潮中&#xff0c;大学校园的服务管理正朝着智能化、便捷化的方向迈进。为了优化大学教师的医疗体验&#xff0c;提升门诊预约的效率和便捷性&#xff0c;我们基于Spring Boot框架设计并实现了一款大学教师门诊预约小程序。该小程序不仅提供了传统…

【吊打面试官系列-MyBatis面试题】MyBatis 实现一对一有几种方式?具体怎么操作的?

大家好&#xff0c;我是锋哥。今天分享关于 【MyBatis 实现一对一有几种方式?具体怎么操作的&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; MyBatis 实现一对一有几种方式?具体怎么操作的&#xff1f; 有联合查询和嵌套查询,联合查询是几个表联合查询,只查询…

C# Application.DoEvents()的作用

文章目录 1、详解 Application.DoEvents()2、示例处理用户事件响应系统事件控制台输出游戏和多媒体应用与操作系统的交互 3、注意事项总结 Application.DoEvents() 是 .NET 框架中的一个方法&#xff0c;它主要用于处理消息队列中的事件。在 Windows 应用程序中&#xff0c;当一…

003-基于Sklearn的机器学习入门:回归分析(上)

本节及后续章节将介绍机器学习中的几种经典回归算法&#xff0c;所选方法都在Sklearn库中聚类模块有具体实现。本节为上篇&#xff0c;将介绍基础的线性回归方法&#xff0c;包括线性回归、逻辑回归、多项式回归和岭回归等。 2.1 回归分析概述 回归&#xff08;Regression&…

怀念旧的Windows声音?以下是如何在Windows 11中恢复它们

如果你渴望旧的Windows声音,希望能在Windows 11上再次听到,那你就很幸运了。我们将向你展示如何下载必要的声音包并创建复古的声音方案。 如何获取旧Windows声音的声音包 你需要做的第一件事是下载一个包含旧Windows版本声音的声音包。此外,请确保它包含的每个声音都是WAV…

停车场小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;车主管理&#xff0c;商家管理&#xff0c;停车场信息管理&#xff0c;预约停车管理&#xff0c;商场收费管理&#xff0c;留言板管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;停车场信息…

51单片机STC89C52RC——11.1 蜂鸣器播放音乐

目录 目的/效果 一&#xff0c;STC单片机模块 二&#xff0c;蜂鸣器 2.1 介绍 2.2 板子位置电路图 2.3 发声原理 2.4 音符和频率 三&#xff0c;创建Keil项目 四&#xff0c;代码 4.1 乐谱代码 4.1.1 《义勇军进行曲》 4.1.2 《天空之城》 4.1.3 《小美满》 4.1.…

BUU CODE REVIEW 11 代码审计之反序列化知识

打开靶场&#xff0c;得到的是一段代码。 通过分析上面代码可以构造下面代码&#xff0c;获取到序列化之后的obj。 <?php class BUU {public $correct "";public $input "";public function __destruct() {try {$this->correct base64_encode(u…