当前位置: 首页 > news >正文

Linux——进程优先级

优先级概念

cpu资源分配的先后顺序,就是指进程的优先权(priority)。
优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大改善系统整体性能。
查看进程优先级用命令ps -l或者ps -al在这里插入图片描述其中PRI就是进程优先级,在Linux中初始值都是80,可以进行人为修改NI值来间接修改优先级。

PRI与NI

NI是nice值的缩写,PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为PRI(new)=PRI(old)+nice,nice的取值范围是-20到19,一共四十个级别。
为什么要有nice值呢?因为需要人为调控优先级的进程是通过nice值的,而为什么nice值要有范围呢?因为Linux操作系统是分时操作系统,优先级要变也必须在可控的范围内变,而且Linux本身的进程优先级也是有范围的,是60到99,也是四十个级别

竞争、独立、并行、并发

• 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
• 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
• 并行: 多个进程多个CPU下分别,同时进行运行,这称之为并行
• 并发: 多个进程一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
对于并发来说,由于是只有一个CPU,所以任意一个时刻都只有一个进程在运行,而之所以让人们有同时运行的错觉,是因为CPU的执行速度与切换速度很快,而如果进程变多了或者内存资源不足,会使得CPU执行速度与切换进程速度变慢,就会让人们感到卡顿。
而CPU进行切换,在物理硬件上,是认为只有一个CPU的,而在逻辑上是可以认为有多个CPU,只是每个CPU的效率要低一些。

进程切换

CPU内的寄存器只有一份,但是上下文数据可以有多份,分别对应不同的进程,而进程进行切换时,会将寄存器中的上下文数据取走保存到自己的PCB中,目的是为了下次回来继续执行时能够按照之前的逻辑继续向后运行。
由于当前系统都是分时系统,每一个进程都有属于自己的时间片。
时间片:当代计算机都是分时操作系统,没有进程都有它合适的时间片(其实就是一个计数器)。时间片到达,进程就被操作系统从CPU中剥离下来

Linux调度方式

在这里插入图片描述
每个CPU都有一个调度队列(runqueue),在runqueue中的数组queue[140]就是存储优先级的,
• 普通优先级:100~139(我们都是普通的优先级,与nice值的取值范围有关联)
• 实时优先级:0~99(在工业上就是实时操作系统,但一般不管)
实际上是把进程挂在queue数组里面,优先级为多少下标就是多少,那么我们就能够知道queue的类型是struct list_head
那么我们还需要进行遍历数组,判断某个下标是否有进程吗?这样太慢了。
于是有了bitmap[5]位图,类型是int,大小为5,是因为如果是4的话就只有324=128个bit位,而大小是5就有325=160个bit位,这样就可以一个bit位表示一个queue中的下标。就可以用位图操作来替换遍历数组的操作,可以提高效率
nr_active: 总共有多少个运行状态的进程。
nr_activequeue以及bitmap[5]都是属于活动队列的,而过期队列与活动队列的结构一模一样,只是时间片还没有结束的所有进程都按照优先级放在活动队列,而新增进程或者时间片结束的进程放在过期队列。
active指针永远指向活动队列
expired指针永远指向过期队列
可是活动队列上的进程会越来越少,过期队列上的进程会越来越多,因为进程时间片到期时一直都存在的。在合适的时候,只要能够交换active指针和expired指针的内容,就相当于有具有了一批新的活动进程!
而为什么需要有两个队列呢?是为了防止出现饥饿问题
假设只有一个队列。一个高优先级的交互式进程(如桌面UI)可能会频繁耗尽时间片,但因为它优先级高,又会被很快地重新调度。这样一来,低优先级的后台进程(如编译程序)可能永远得不到CPU时间,导致“饥饿”。
而使用两个队列。高优先级进程在用光时间片后,会被移到过期队列。这样,​活动队列里就只剩下还没用完时间片的进程。调度器会优先保证这些进程运行,直到活动队列完全变空。
Linux的调度算法为O(1)的时间复杂度,步骤如下:

  1. 第一步:查找最高优先级(O(1))​​
    调度器不需要遍历140个队列,它只需要对位图执行一条汇编指令:find-first-bit-set(或类似指令)。
    这条指令会从第0位开始,快速找到第一个被设置为1的位。这个位的编号就是当前系统中存在可运行进程的最高优先级。
    例如,位图显示优先级120和110的位是1,其中110是第一个为1的位(优先级数值越低,优先级越高),那么最高优先级就是110。
    ​这个操作是硬件相关的、固定时间的,与进程数量无关,所以是O(1)。​​
  2. ​第二步:取出进程(O(1))​​
    知道了最高优先级是110,调度器就直接访问优先级数组的第110个元素,这是一个队列。
    它从这个队列的头部取出第一个进程来运行。
    从数组的特定索引取一个元素,这也是O(1)。
  3. ​第三步:维护队列​
    该进程被移出队列。如果这个队列因此变空,调度器就会将位图中对应的位从1清为0。
    当该进程用完时间片后,它会被移动到过期数组的对应优先级队列中。如果过期数组中原先该优先级的队列为空,则同时设置过期数组位图的对应位为1。
  4. ​第四步:队列切换(O(1))​​
    当活动数组完全变空(其位图全为0)时,调度器只需要进行一次指针交换。
http://www.dtcms.com/a/479738.html

相关文章:

  • 宝塔面板建设二级域名网站访问不了网站建设需
  • wordpress 会被墙吗福田企业网站优化排名
  • ftp上传网站社群营销与运营
  • 吉林网站建设费用接推广是什么意思
  • 如何做营销型网站人工智能的关键词
  • 旅游网站的设计栏目动易网站系统怎么样
  • 上海网站制作建设多少钱.net 快速网站开发
  • 网站营销活动策划wordpress制作网页教程
  • 如何完整保存网站并做修改中企动力邮箱网页版
  • 网站模板下载破解版廊坊那家做网站排行榜
  • 深圳网站设计九曲个人小说网站怎么做
  • 沈阳网站建设024wwordpress 会员登录
  • 【开题答辩全过程】以 濒危动物保护管理系统为例,包含答辩的问题和答案
  • VS Code 智能提示(IntelliSense)完全配置指南(C++/Python/JavaScript)
  • wordpress 全站密码网站建设基础策划
  • 长沙 网站seo服务 网络服务wordpress实时预览载入中
  • 简述电子商务网站的建设流程图企业网站建设 西宁
  • 网页设计与网站建设 入门必练青海网站建设哪家好
  • 【HashMap全面知识点】— 快速理解HashMap
  • 【系统分析师】写作框架:面向对象设计方法及其应用
  • 图书网站建设实训总结人像摄影网站十大排名
  • 网站开发常问的技术性问题哈尔滨建站模板厂家
  • 国内信息图制作网站有哪些网站开发的技术支撑 经验能力
  • 上海缔客网站建设公司婚纱摄影网站
  • 湖北省建设厅官方网站网页传奇游戏哪个好
  • 河南省建设工程标准定额管理网站福建seo搜索引擎优化
  • 北京公司可以在上海建网站吗成都高端网页设计公司
  • 网站流行趋势怎么开发手机app
  • JavaScript学习笔记(三十):JS优雅降级与渐进增强实战指南
  • GESP等级认证C++三级16-位运算5-1