进程优先级、切换、调度

news2024/11/20 8:23:48
进程的特性是动态,并发,独立,异步,我们今天来浅显的从并发入手介绍各种知识
系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。
为了高效完成任务,更合理竞争相关资源,便具有了优先级

文章目录

  • 1.并发与并行
  • 2.进程优先级
  • 2.进程的切换
  • 3.简单介绍进程的调度

1.并发与并行

与并发相对的还有一个名词是并行。
并发就是多个进程在一个时间段内都被cpu运行过一次,每个进程不是一直占有cpu直到把它的任务完成,而是每隔一段时间就会从cpu上剥离下来。
而并行就是多个cpu同时运行多个进程。
一般市面上的电脑现在都是一颗cpu,不考虑其他,他的进程的运行方式肯定是并发。既然是并发的方式,那在一时刻,运行的进程肯定只有一个。有人会说那我的电脑为什么可以同时听着歌打着游戏还能看看视频呢,我的电脑是多cpu吗?其实大概率不是多cpu,而是进程的运行方式还是并发,只是每个进程在cpu上的运行时间太短,进程切换的太快,以至于用户反应不过来。我们介绍进程状态的时候说处于运行状态的进程都在运行队列中,处于运行队列中的进程也都排好队处于随时被调度的状态。为什么要排队呢?说到底还不是cpu太少了,同一时刻无法运行多个进程。所以排队的本质还是资源的不足。而进程的调度,又跟优先级有关。

2.进程优先级

我们先看一下什么是优先级:

在这里插入图片描述

我们使用ps命令的-al选项后可以看到有一参数是PRI,这个就是一个进程的优先级,对于用户来说进程的优先级在60~99,总共四十个等级。Linux中进程默认的优先级都是八十,而优先级也只不过是pcb结构体中的一个int类型的字段而已。

优先级数值越小,对应进程的优先级就越大。
而Linux中优先级是可以被修改的,但是它的的修改不是直接修改,而是通过上图中NI值来间接修改。
调整规则:pri = 旧的pri值 + NI值
在这里插入图片描述
上图是通过修改NI值来修改优先级的,有root权限下具体操作是在命令行输入top指令->输入r->输入想要修改的进程id->输入要调整的NI值。还有很多种修改NI值的方法,有兴趣可以自行去探索。
在调整NI值的时候我们发现当NI值调整到一定限度之后例如小于-20或者大于19后进程的优先级都是60和99,前面说过Linux中进程优先级是有范围的,用户所启动的的进程优先级是不能越过这个范围的。
为什么要把优先级限制在一定范围内呢?目的就是为了每个进程都能够被合理的以较为公平的方式调度运行。而出现优先级较低的进程,长时间无法得到cpu资源,这种进程叫做饥饿进程

2.进程的切换

我们说了,并发是指在一个时间段内运行多个进程。每个进程运行一段时间后不管你的任务完成与否,都要从cpu上剥离下来,而上面说的一段时间是由时钟芯片每个一个特定时间发送电子脉冲给cpu实现的。这个时钟芯片以纳秒为单位,他可能每隔1微秒(具体不清楚)就发射一个电子脉冲。还有一个现象就是我们的电脑长时间关机后比如二十多天,打开后他的时间仍然是对的,但是以年为单位,再次打开我们的电脑,时间就不对了。这也是时钟芯片没电了。
那么进程是如何切换的呢?
我们知道cpu中有各种各样的寄存器,它们有的寄存器用来建立栈帧,初始化栈桢,ebp、esp等等,我们今天还要认识一个寄存器eip,它是存储cpu将要执行的下一句代码的地址。
进程在被调度运行的时候会产生各种临时数据那这些临时数据肯定是要被保存的,它们就被保存在寄存器中,每个进程在cpu寄存器中形成的临时数据叫做硬件的上下文。而每个进程的硬件上下文应该是不一样的,而一颗cpu只有一套寄存器,而它要记录多个进程的临时数据,显然是不可能的,所以寄存器 != 寄存器内容寄存器的内容应该是在pcb中,而pcb是在内存中的。所以进程切走时这些临时数据暂且理解为存储在pcb中。下一个被调度到的进程,就会把它的临时数据放到寄存器上。本质是cpu寄存器中的内容存到内存中。

3.简单介绍进程的调度

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

上面是Linux2.6.10的源码。
接下来我以我的认知大概讲解一下用户的一个进程它在运行队列里是如何被调度的:首先这种调度方式的效率可以达到O(1)。

在这里插入图片描述
  运行队列结构体中有两个相同类型的指针它们分别指向两个结构体prio_array,prio_array结构体里有一个位图,还有一个是struct list_head类型的结构体数组queue。struct list_head这个结构体里就是链接进程pcb的指针。
  可以看到queue数组的大小是140,而Linux操作系统中实时优先级的范围是0 ~ 99,还有四十个优先级是非实时进程的优先级,这个我们不讨论。我们主要探讨的是用户的60 ~ 99的优先级。我们在命令行启动一个进程的默认优先级是80。
  当需要运行的进程被链入到运行队列中的active指向的queue后,会先根据优先级依次调度优先级从大到小的次序调度进程(而对于同等优先级的进程调度次序会有着更加细致的调度方式)。那此时假如还有优先级80的进程要加入运行队列中,而此时queue中的进程有优先级66,80,90的进程,那么它会不会直接加入这个队列中,因为如果这样的规则允许的话,优先级90的进程永远不会被调度到了,所以是不合理的。而是这个进程会被链入到另一个指针expired所指向的结构体中的queue中,等到active中的进程全部被调度完成后,类似于交换两个指针的内容swap(active, expired),从而再次调度曾经链入expired中的进程。
  而操作系统是如何知道queue中是否有进程呢?数组就那么大,遍历也可以,但是还是费时间,所以采用了位图的方法来判断queue中有无进程。只需要判断01即可。
  所以当一个进程在cpu上运行一段时间后,它会被剥离下来,然后cpu上会上新的被调度的进程实现进程的切换,然后再被链入到expired指向的queue中,继续准备被调度。这种调度的方式就可以形成一个循环。
  而因这种调度方式有:Linux支持进程之间进行cpu资源抢占的基于时间片的轮转式抢占式内核
  而其中抢占式的理解可以是当一个进程B进入到running stage的时候(还未被调度),调度器会去检查进程B的优先级,如果进程B的优先级比目前正在执行的进程A的优先级高的话,linux便会抢占(preemptive)进程A,进程A便被打断执行,此时进程B会得到执行。(最后这个对抢占的理解源于链接: linux 内核抢占那些事)。
以上要是有讲述不对的地方,望请指正。

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

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

相关文章

利用Excel支持JUnit参数化测试

在JUnit里面,可以使用CsvFileSource读取csv文件进行参数化测试,可是CSV文件不支持格式,编辑颇为麻烦,尤其是多次编辑,因此自然想到是否可以使用Excel文件,可以有各种格式,支持各类数据。 最新开…

mysql/java/springboot/javaweb请假系统,分为学生/辅导员/超级管理员

源码下载地址 支持:远程部署/安装/调试、讲解、二次开发/修改/定制 系统分为 学生/辅导员/超级管理员 学生 辅导员 超级管理员

gulp自动化构建

什么是Gulp? Gulp是一种前端开发过程中广泛使用的自动化构建工具,它是基于Node.js构建的,能够极大地提高开发效率和代码质量。Gulp的主要功能包括文件的压缩、合并、重命名等,同时它也支持文件监听和浏览器自动刷新等功能。使用Gulp&#x…

hdlbits系列verilog解答(模块)-20

文章目录 一、问题描述二、verilog源码三、仿真结果 一、问题描述 到目前为止,您已经熟悉了 module模块 ,这是一种通过输入和输出端口与其外部交互的电路。更大、更复杂的电路是通过将较小的模块和其他连接在一起的部分(例如赋值语句和alway…

基于web的音乐网站播放器,类似网易云

源码下载地址 支持:远程部署/安装/调试、讲解、二次开发/修改/定制 随着互联网技术的不断发展,音乐流媒体服务得到了广泛的普及。用户可以通过在线音乐网站、音乐APP等渠道随时随地收听和分享自己喜欢的音乐。因此,开发一个高效、稳定、易用…

高等数学教材重难点题型总结(五)定积分

总的来说,只要不定积分掌握得好,基础的定积分肯定没问题;对于考研的话,在定积分定义、牛莱公式、反常积分、审敛法的理解要求更高一些(数一还会涉及到伽马函数~) 1.利用定义计算定积分 2.定积分的近似计算 …

CentOS 编译安装 nginx

CentOS 编译安装 nginx 修改 yum 源地址为 阿里云 curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repoyum makecache升级内核和软件 yum -y update安装常用软件和依赖 yum -y install gcc gcc-c make cmake zlib zlib-devel openss…

C++之#pragma once实例总结(二百四十七)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

uniapp-微信授权登录

对于制作这个demo的时候是可以使用的,如果不能使用勿喷,如有问题评论区讨论,谢谢大家! 目录 ​编辑 前言 完整代码以及注释、使用方法 用法 解析 前言 在移动应用开发中,提供第三方登录是一种常见的用户认证方式…

Android Studio Logcat日志VIVO手机显示*号问题

咨询VIVO客服 1、拨盘输入 *#06# 获取串码,发送给客服 2、拨号盘输入*#*#112#*#*-右上角菜单-更多-一键授权 注意不要刷机,恢复出厂设置,手动取消授权哦

【数据结构】数组和字符串(五):特殊矩阵的压缩存储:稀疏矩阵——压缩稀疏行(CSR)

文章目录 4.2.1 矩阵的数组表示4.2.2 特殊矩阵的压缩存储a. 对角矩阵的压缩存储b~c. 三角、对称矩阵的压缩存储d. 稀疏矩阵的压缩存储——三元组表e. 压缩稀疏行(Compressed Sparse Row,CSR)矩阵结构体创建CSR矩阵元素设置初始化打印矩阵销毁…

位图算法经典剖析(未完)

第一题 只出现一次的数字|| 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 class Solution { publ…

35二叉树-树的最小深度

目录 LeetCode之路——111. 二叉树的最小深度 分析 解法一:广度优先查询 解法二:深度优先查询 LeetCode之路——111. 二叉树的最小深度 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说…

基于STM32与ESP8266的太空人WiFi天气时钟(代码开源)

前言:本文为手把手教学ESP8266著名开源项目——太空人WiFi天气时钟,不同的是本次项目采用的是STM32作为MCU。两者开发过程中有因为各自芯片的特点(时钟频率,内存大小等),导致开发程序大不相同,很…

Redis 持久化配置,RDB和AOF方式配置说明

文章目录 一、概述二、RDB 持久化方式配置三、AOF 持久化方式配置 如果您对Redis的了解不够深入请关注本栏目,本栏目包括Redis安装,Redis配置文件说明,Redis命令和数据类型说明。 一、概述 Redis 持久化是指将 Redis 数据存储到磁盘上&#x…

KVM实验之动态迁移

前言 一台NFS(192.168.184.132) 一台KVM-a(192.168.184.133) 一台KVM-b(192.168.184.134) NFS配置: [rootlocalhost ~]# setenforce 0 //关闭selinux [rootlocalhost ~]# service iptables st…

python re 匹配所有字段名称相同的值

import retext {"code": 200,"message": "success","traceId": "da0b668c-4d67-44bf-907f-c072fc63839a","data": {"list": [{"articleId": 121862102,"title": "python 目录…

k8s 金丝雀发布与声明式管理

Deployment控制器支持自定义控制更新过程中的滚动节奏,如“暂停(pause)”或“继续(resume)”更新操作。比如等待第一批新的Pod资源创建完成后立即暂停更新过程,此时,仅存在一部分新版本的应用,主体部分还是旧的版本。然后&#xf…

用图说话——流程图进阶

目录 一、基本流程图 二、时序流程图 一、基本流程图 经常阅读歪果仁绘制的流程图,感觉比较规范,自己在工作中也尝试用他们思维来绘图,这是一个小栗子: 二、时序流程图 在进行Detail设计过程中,一般的绘图软件显得…

微信小程序笔记功能(富文本editor功能)开发

一、效果图展示 模拟器及pc 端效果图 手机端就不贴了 二、把官方示例copy到自己的项目传送门 三、改一改上传图片功能 insertImage() {const that thiswx.chooseImage({// count:1 一次选择图片的个数success: function (response) {// 多张图片上传response.tempFilePaths…