Linux---进程(4)---进程优先级调度切换

news2024/12/27 13:58:48

目录

进程优先级

进程切换

前期知识补充

进程切换

进程调度


进程优先级

权限是为了解决能不能享受资源的问题,优先级则是为了解决享受资源的顺序的问题。

进程要访问某种资源,就需要用排队的方式,确定享受资源的先后顺序。因为资源是少数,进程是多数。要想和谐的将这些进程都有序的运行,就必须通过排队的方式。

在Linux中,进程优先级字段是进程信息中的PRI字段。

ps -al #查看当前进程
ps -l  #查看当前进程

Linux中进程的优先级本质就是一个整型变量,默认优先级是80。

进程优先级是可以被修改的,Linux进程优先级的范围是[60,99]。

Linux进程优先级本质就是数字,数字越小,优先级越高。

Linux修改进程优先级是通过NI值间接修改的。

修改进程优先级方法:

1、打开任务管理器

top #打开任务管理器

2、输入r和进程pid

3、设置NI值

最终优先级=初始优先级(始终值80)+NI值

用户只能通过修改NI值间接修改进程优先级。

每次输入的NI值都是被覆盖的。

初始优先级始终是80。

NI值不属于优先级数据,是进程优先级的修正数据。

NI值的大小范围为[-20,19]

如果设置新的NI值超过了系统规定范围,就按照极值来确定。比如NI值输入-100,就被系统默认为-20。

Linux为什么要规定NI值的范围从而使用户间接修改进程优先级呢?

原因是为了限制多人使用资源,从而导致的CPU调度不平衡,优先级高的会先得到资源,导致常规进程很难得到资源所引发进程饥饿问题

所以,任何分时(实时操作系统)的操作系统,在调度上都较为公平的调度。就是为了解决进程饥饿问题。

进程切换

前期知识补充

现代操作系统大致分为

1.分时操作系统:基于时间片轮转处理进程(由调度器完成,调度器基于时间片、优先级轮转执行),CPU公平调度,进程优先级差距不明显。

2.实时操作系统当前进程执行完成之后再执行下一个,所有的进程都按照顺序排队执行,允许进程修改优先级插队执行。

我们日常计算机操作系统一般都采用分时操作系统。

竞争性:进程之间通过优先级竞争资源享用顺序。

独立性:多个进程运行时进程之间相互独立,互不干扰。

并行性多个进程在多个CPU上同时运行,这多个进程之间的关系即为并行。

并发性多个进程在同一个CPU上运行,由于受时间片、进程优先级发生进程轮转,加上CPU处理很快,所以,我们感知多个进程是同时推进执行的,这多个进程之间的关系称为并发。

注意:并行中的多个CPU不是多核CPU,多核CPU还是一个CPU,只是好几个运算器+一个控制器,可以同时处理不同分支的代码和数据。

CPU周围有很多寄存器,这些寄存器各司其职完成CPU执行这个进程时数据的保存工作。

来帮助CPU更好的执行接下来的工作。

进程切换

CPU调度执行进程时,操作系统会为其维护一个运行队列,当一个进程被CPU调度执行时,会将这个进程对应的代码和数据执行处理,处理的一些临时变量等数据保存在对应的寄存器中,eip寄存器中保存下一次执行的代码的地址(也就是PC指针)。放到寄存器中的处理数据都属于通用数据信息,属于进程特有的数据被CPU处理之后会保存在自己进程的PCB中(因为进程具有独立性)。当这个进程的时间片到了之后,CPU就会将处理这个进程所产生的数据信息拷贝到该进程的PCB中,等到下次再次执行到这个进程时,这个进程先将上次的数据信息在CPU寄存器中拷贝回来,这个过程叫做恢复,继续接着上次执行的位置继续执行(这个是eip寄存器保证的)。

进程在运行的过程中,要产生大量的数据,放在CPU寄存器中。

CPU内部的所有临时数据,我们叫做进程的硬件上下文数据

硬件上下文数据让我们的进程PCB进行拷贝称为保护上下文数据

当进程被调度的时候,进程被放到CPU上开始运行,将曾经保存的硬件上下文数据进行恢复。

所有的保存都是为了最终的恢复

所有的恢复,都是为了继续上次的运行位置继续运行

CPU内的寄存器只有一套,每个进程在切换之前就必须将自己在调度过程中CPU处理的上下文数据保存至自己的PCB中,等到再次调度这个进程时恢复,接着上次处理位置继续处理。

虽然寄存器数据放在了一个共享的CPU设备里面,但是所有的数据,其实都是被进程私有的,也就是说,只有进程自己才可以访问这些数据。

所以,寄存器内部保存的数据,可以有多套。

进程调度

进程调度算法要考虑优先级、进程饥饿、效率问题

操作系统在运行队列中维护了一个array结构体数组。通过array结构体数组完成对进程的调度工作,并且设置了两个指针,active指向array[0],expired指针指向array[1],CPU要调度进程只从active中拿数据,通过active指针访问array[0]的调度任务数据。当执行完成active指针指向的调度数据时,交换指针active、expired指针内容,此时,CPU就可以继续调度执行另一个调度数据了。

在CPU处理active指针指向的调度数据时,此时由时间片轮转的进程和新创建的进程进入expired指针所指向的数组中,由此,就可以将先一段时间创建的进程率先执行,后一段时间的进程延后执行。并且同一时间段的进程按照优先级先后顺序执行。

下面研究一下array数组如何管理进程调度

array数组中每个元素都是一个结构体,nr_active表示当前活跃进程个数,bitmap作为后续检测,这个之后再谈,queue数组每个元素位置记录tast_struct指针。

queue数组为进程指针数组,里面的[100,139]元素记录着对应进程地址。根据进程优先级[60,99]映射到queue数组中。比如,进程优先级为60的就映射到queue数组元素下标为100处链接。

bitmap数组通过哈希映射,每个bit位都映射queue数组中PCB指针是否为NULL,0表示该位置指针为NULL,1表示该位置指针为非NULL,可以调度执行,能够更加便捷的寻找出当前还有那个优先级的进程没有被执行。如果没有bitmap数组,就要去遍历queue数组,会降低效率。

下面是整体的过程。

CPU只通过active指针访问调度数据,当前active指向的进程指针数组称为活跃进程,另一个称为过期进程,活跃进程由于进程时间片轮转、进程切换会被链接到过期进程的queue数组中去,活跃进程执行完成之后,会将active指针和expired指针的内容进行交换,CPU再执行下一批进程,由此往复执行进程。

以上就是Linux早期版本的进程调度大致做法。

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

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

相关文章

谷粒商城实战笔记-105~107-全文检索-ElasticSearch-入门

文章目录 一,105-全文检索-ElasticSearch-入门-_cat二,106-全文检索-ElasticSearch-入门-put&post新增数据三,107-全文检索-ElasticSearch-入门-get查询数据&乐观锁字段1,过时的乐观锁-version2,Elasticsearch…

深入源码P3C-PMD:启动源码(2)

下面我们开始从启动探寻 PMD 的源码设计。 pmd 的启动类为 PmdCli,作为命令行的启动器, 其依赖 picocli 作为控制台命令框架。 picocli 官网:https://picocli.info/ Command(name "checksum", mixinStandardHelpOptions true, v…

Golang | Leetcode Golang题解之第316题去除重复字母

题目&#xff1a; 题解&#xff1a; func removeDuplicateLetters(s string) string {left : [26]int{}for _, ch : range s {left[ch-a]}stack : []byte{}inStack : [26]bool{}for i : range s {ch : s[i]if !inStack[ch-a] {for len(stack) > 0 && ch < stack…

谷歌外链的重要性及获取方法!

对于做谷歌seo的人来说&#xff0c;谷歌外链的重要性不言而喻&#xff0c;这是谷歌评估一个网站的重要指标&#xff0c;它们像是网络上的推荐信&#xff0c;可以显著提高你网站的可见度和信誉&#xff0c;这样有利于关键词获取到更好的排名&#xff0c;有作用的外链能显著提升网…

CDO学习

1.备份instie.mdb文件 2.

MySQL:数据类型表的基础操作

目录 1、数据类型 1.1 数值类型 1.2 字符串类型 1.3 日期类型 2、表的基础操作 2.1 选择数据库 2.2 建表 2.3 查看库中所有表 2.4 查看某一表结构 2.5 删表 3、可视化编辑工具 3.1 运行 1、数据类型 1.1 数值类型 bit类型可指定长度&#xff08;如果不写&#xff0c;…

pytorch学习笔记4 tensor变换

View/reshape viewreshape, 新版本 要保证数据总量不变&#xff0c;否则报错Squeeze/unsqueeze 减少维度和增加维度 unsqueeze(n): 如果n是正&#xff0c;在第n位前面插1维&#xff08;size1&#xff09;&#xff0c; 如果n是负&#xff0c;在倒数第|n|位后面插入1维&#xf…

MySQL数据的增删改查 where 条件查询 基础知识 【3】推荐

操作数据是数据库很重要的一部分&#xff0c;今天整理了下关于MySQL数据库数据的增删改查&#xff0c;包括基础查询、where条件查询、排序、分页、聚合、分组、having以及多表查询&#xff0c;多表查询的直接查询、内连接、外连接以及子查询。方便自己以后查看&#xff0c;也欢…

基于stm32的RTC实时时钟 (HAL)

一&#xff1a;stm32的RTC功能概述 &#xff08;基于stm32f10x&#xff09; 1&#xff1a;绪论 实时时钟是一个独立的计时器&#xff0c;RTC提供一套持续运行的计数器&#xff0c;这些计数器可以配合适合的软件用来提供一个时钟日历功能。计数器的值可以被写入以设置系统当前时…

Linux中栈的大小的修改

目录 1. 使用ulimit命令 2. 修改系统级别的资源限制 3. 修改编译器选项 4. 修改内核参数&#xff08;不常用&#xff09; 5. 修改Makefile文件 检查当前栈大小 在Linux系统中&#xff0c;可以通过几种不同的方法来修改栈的大小。下面是几种常用的方法&#xff1a; 1. 使…

『 Linux 』POSIX 信号量与基于环形队列的生产者消费者模型

文章目录 信号量概念POSIX 信号量基于环形队列的生产者消费者模型基于环形队列的生产者消费者模型编码实现基于环形队列的生产者消费者模型发送任务测试 信号量概念 信号量是一种用于多线程或多进程间同步的机制; 其定义是一个整形变量,本质上信号量可以看成是一个计数器,用来描…

记录一次服务器被(crontab)木马入侵事件

背景&#xff1a;发现平时正常登录的服务器突然进不去&#xff0c;也没明显的错误&#xff0c;重启也登录不了&#xff01; 可能的原因&#xff0c;内存/CPU满了 重启通过用户模式进入&#xff0c;查看进程发现有个定时任务一直在自动创建并执行&#xff08;进程ID一直在变化&a…

机械学习—零基础学习日志(高数19——函数极限理解深化)

零基础为了学人工智能&#xff0c;真的开始复习高数 本次学习笔记&#xff0c;主要讲解函数极限的计算问题。 极限四则运算规则 这里有几个需要注意的地方。函数极限的四则运算&#xff0c;需要知道极限存在才能大胆放心的使用。而且使用超实数的概念会更好帮助我们理解&…

Python 操作PPT幻灯片- 添加、删除、或隐藏幻灯片

PowerPoint文档是商务、教育、创意等各领域常见的用于展示、教育和传达信息的格式。在制作PPT演示文稿时&#xff0c;灵活地操作幻灯片是提高演示效果、优化内容组织的关键步骤。下面将介绍如何使用国产Spire.Presentation for Python库实现添加、删除或隐藏PPT幻灯片。 目录 …

浅谈Java线程池的概念

目录 说明 1.线程池特点 2.线程池的简单示例 2.1 定义一个线程池类&#xff0c;通过创建一个全局的阻塞队列接收任务&#xff0c;线程池类构造方法拿阻塞队列的线程&#xff0c;完成线程的执行。 3. main方法中调用该类&#xff0c;实现线程池的调用 4.效果如下 说明 线程…

MySql Linux 安装

下载 下载后的文件为&#xff1a;mysql-8.4.2-linux-glibc2.28-x86_64.tar.xz 创建用户和用户组 $> groupadd mysql $> useradd -r -g mysql -s /bin/false mysql由于用户仅用于所有权目的&#xff0c;而不是登录目的&#xff0c;因此useradd命令使用 -r和-s /bin/false…

C++笔记之编译过程和面向对象

回顾&#xff1a; “abcd”//数据类型 字符串常量 const char *p"abc"; new STU const char *//8 指针的内存空间 int float 指针的内存空间 p 指针指向的内存空间 "abc" 取决于字符串长度 指针变量的内容一级指针 指针变量的地址二级指针 …

深度学习------权重衰退

目录 使用均方范数作为硬性限制使用均方范数作为柔性限制演示最优解的影响参数更新法则总结高纬线性回归多项式的权重衰退从零开始实现初始化模型参数定义L2范数惩罚定义训练代码实现忽略正则化直接训练使用权重衰减从零开始代码实现 多项式的权重衰退的简洁实现简洁函数代码简…

案例分享|Alluxio在自动驾驶数据闭环中的应用

分享嘉宾&#xff1a; 孙涛 - 中汽创智智驾工具链数据平台开发专家 关于中汽创智&#xff1a; 中汽创智科技有限公司&#xff08;以下简称“中汽创智”&#xff09;由中国一汽、东风公司、南方工业集团、长安汽车和南京江宁经开科技共同出资设立。聚焦智能底盘、新能动力、智…

学习硬件测试04:触摸按键+PWM 驱动蜂鸣器+数码管(P62~P67、P71、P72)

一、触摸按键 1.1理论讲解 1.1.1实验现象 触摸按键 1 单击与长按&#xff0c;控制 LED1&#xff1b;触摸按键 2 单击与长按&#xff0c;控制 LED2;触摸按键 3 单击与长按&#xff0c;控制 LED3;触摸按键 4 单击与长按&#xff0c;控制继电器; 1.1.2硬件电路 是原理图上触摸…