进程优先级——Linux

目录

前言

查看系统进程

进程优先级的修改

Linux调度与切换

Cpu的进程切换

Linux实现调度的算法


前言

        进程访问系统资源要排队等待,而cpu资源分配和执行的先后顺序,就是指进程的优先级。进程的优先级,保证了必要进程的执行。进程访问某种资源,进程通过一定方式排队,确认享受资源先后顺序,相对来说是资源过少所造成的。

查看系统进程

        Linux中,ps -l 命令会把当前用户启动的所有进程全部显示出来。其中,对应的消息有下:

UID : 代表用户的ID,即启动这些进程的用户

PID : 进程的编号

PPID :父进程的编号

PRI :代表此进程可被执行的优先级,它对应的是一个整型数字,其值越小越早被执行

NI :代表这个进程的nice值

        这里重点说明一下PRI和NI。RPI指的是进程的优先级大小,Linux默认的优先级是80。这个数据可以被更改,但优先级的范围是[60,99],也就是说最大为99,最小为60,数字越小,优先级越高。但修改优先级不是修改pri是修改nice的值(nice值:NI)

        上面的NI是用来修改进程的优先级。进程的优先级不能直接修改,必须通过修改NI的数值来间接修改优先级,它表示进程可被执行的优先级的修正数值。

进程优先级的修改

        修改优先级的命令是top。在Linux中,top指令是一个常用的性能分析工具,可以实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器,提供了实时的对系统处理器的状态监视。

        使用修改优先级语句,总的来说,修改步骤为:进入top后按“r”–>输入进程PID–>输入NI值->按q退出

注意:Linux允许用户修改优先级,但这里的修改优先级的数值不是让我们直接修改的,而是通过修改NI的数值来修改。这里的NI不是优先级,而是进程优先级修正的数据,即优先级:PRI = PRI + NI(这里PRI + NI的PRI是系统默认的优先级数值,即80)。

 比如输入NI值=10,PRI =90(80+10)

        这里设置NI的数值可以为负数,如修改为-10,此时的PRI = 70,NI = -10,设为0时即将PRI值还原。也就是说当nice值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行。

注意:在 Linux 系统中,只有超级用户(root)或具有 CAP_SYS_NICE 权限的用户才能将进程的 Nice 值设置为负数。普通用户只能调整自己的进程的 Nice 值到正数(降低优先级)。

        这里如果在设置为负数时出现:Failed renice of PID 519342 to -10: Permission denied则说明权限不够,需要使用sudo top来修改优先级。

注意:每次修改优先级都是在PRI=80的情况下,即使在前面已经修改过NI值,下一次修改还是按照PRI=80来进行加减。

注意:这里修改优先级的数值不是随心所欲的修改,系统会自动根据优先级范围进行判断,若修改后的优先级数值小于60,那么系统赋予优先级的数值为60;若修改后的优先级数值大于99,那么系统赋予优先级的数值为99。因此,可知,NI的范围是[-20,19],一共40个级别。

注意:不要随意修改优先级。

        系统的这种设置完美地解决了个别进程优先级过高或过低,避免了进程饥饿的问题。

Linux调度与切换

         当进程放在CUP上运行时,并不是把进程代码跑完才结束此进程。这样做是为了防止进程代码凌乱而导致其它进程不能被及时执行。因此,现代操作系统,都是基于时间片进行轮转执行的。在时间片轮转调度中,每个进程被分配一个固定长度的时间片,用于执行其任务。

        进程的时间片是操作系统中用于实现时间片轮转调度的一个核心概念。当时间片用完时,操作系统会保存该进程的状态,然后切换到下一个进程,给予它一个时间片来执行。这个过程会不断循环,使得每个进程都有机会得到执行,从而实现并发执行的效果。

系统优先级之间的性质:(下图)

Cpu的进程切换

声明:CPU内的寄存器只有一套,适配这套寄存器的数据有很多,这些数据都是进程私有的一套适配寄存器的数据。相当于CPU的一套寄存器是各个进程都可以使用的公共工具,运行哪个进程,哪个进程的数据就可以使用这套工具来工作。所以寄存器不等于寄存器的内容

        CPU的寄存器是一套共享的硬件资源,各进程在运行时会利用这套寄存器保存和处理临时数据,但寄存器的内容(即这些数据)是进程私有的。运行某个进程时,CPU寄存器中的内容会加载该进程的上下文;当进程被剥离出CPU(如时间片到期或阻塞时),寄存器和其他CPU状态会作为硬件上下文被保存到进程的内存空间或操作系统管理的数据结构(如进程控制块,PCB)中。下次重新调度该进程时,硬件上下文会被恢复到CPU,确保进程能够从之前的状态继续运行。

进程在运行过程中,借助CPU来运行程序,运行中产生大量的临时数据,这些临时数据存放在CPU寄存器当中。

        CPU内部的所有临时数据,包括寄存器内容、程序计数器(PC)、堆栈指针、状态寄存器等,被称为硬件上下文。当进程的程序从CPU上被剥离时(可能由于时间片到期或阻塞),硬件上下文承担着保护当前进程运行状态的任务。硬件上下文会被保存到进程的内存空间或PCB中,以便在稍后重新加载到CPU中。

当CPU二次调度该进程时,曾经存放在进程内存或PCB中的硬件上下文会重新加载到CPU寄存器,恢复进程的程序运行进度,并继续向下运行。

        时间片到期属于主动调度,由调度器决定;而进程阻塞是由于进程等待资源(如I/O)或触发同步事件所导致的两种典型的上下文切换场景。无论是哪种情况,硬件上下文的保存与恢复保证了进程的运行状态不会丢失,从而实现多任务的可靠运行。

Linux实现调度的算法

        CPU任务调度通过优先级队列实现,每个任务根据其重要性和实时性被分配到特定的优先级队列。系统设置了140个优先级队列,由数组array[140]表示。实时队列(0-99)高优先级任务,通常用于时间敏感的系统任务或实时应用。普通队列(100-139):用于普通用户程序(也就是我们能用的),优先级较低。 

              由于依次查看优先级队列是否有任务很浪费时间,引入了位图加速查找。bitmap[5]包含5个32位整型变量,共160位,用于标记140个优先级队列的状态。比特位的位置表示是哪一个队列,每一位的内容表示一个优先级队列是否有任务。

              实时任务与普通任务的切换机制。只执行实时任务时,普通任务将被挂起。 时间片结束后,系统会从其他实时任务中选择下一个任务,确保公平性。 当没有实时任务时,普通任务才会被执行。 时间片结束后,普通任务可能被降级至更低优先级的队列,防止任务长期占用CPU资源。

              设置运行队列的双缓冲机制(struct q array[2]):array[0]。当前活动队列(active),存储正在运行的任务;array[1]:过期队列(expired),存储等待被激活的任务。当active队列中任务不断被处理,新来的进程全部加入到过期队列。当任务全部完成或时间片耗尽时,active和expired队列会进行交换。(互换操作是通过交换两个存放队列地址的指针的内容来高效实现的)过程如下图:

        该调度系统通过优先级队列、位图快速查询和双缓冲队列的设计,实现了任务调度的高效性与公平性,整体设计简洁而高效,兼顾了实时任务的响应需求与普通任务的执行公平性。

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

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

相关文章

11.18 Maven-SpringBootWeb入门

Maven 什么是maven? Maven是apache旗下的一个开源项目,是一款用于管理和构建java项目的工具。 Apache 软件基金会,成立于1999年7月,是目前世界上最大的最受欢迎的开源软件基金会,也是一个专门为支持开源项目而生的非盈利性组织…

selenium元素定位校验以及遇到的元素操作问题记录

页面元素定位方法及校验 使用比较多的是通过id、class和xpath来对元素进行定位。在定位前可以现在浏览器验证是否可以找到指定的元素。这样就不用每添加一个元素定位都运行代码来检查定位方式表达式是否正确。 使用XPATH定位 在浏览器F12,找到元素,在元…

【UGUI】Unity 背包系统实现02:道具信息提示与显示

在游戏开发中,背包系统是一个常见的功能模块,用于管理玩家拾取的物品。本文将详细介绍如何在 Unity 中实现一个简单的背包系统,包括道具信息的提示和显示功能。我们将通过代码和场景搭建来逐步实现这一功能。 1. 功能需求清单 在实现背包系…

服务器上部署并启动 Go 语言框架 **GoZero** 的项目

要在服务器上部署并启动 Go 语言框架 **GoZero** 的项目,下面是一步步的操作指南: ### 1. 安装 Go 语言环境 首先,确保你的服务器上已安装 Go 语言。如果还没有安装,可以通过以下步骤进行安装: #### 1.1 安装 Go 语…

Node.js | Yarn下载安装与环境配置

一、安装Node.js Yarn 是 Node.js 下的包管理工具,因此想要使用 Yarn 就必须先下载 Node.js。 推荐参考:Node.js | npm下载安装及环境配置教程 二、Yarn安装 打开cmd,输入以下命令: npm install -g yarn检查是否安装成功&…

【Linux实践2】实验四:存储管理

文章目录 一、存储管理的目的1.1 内存空间的分配与回收1.2 地址转换1.3 内存保护1.4 内存共享1.5 内存扩充 二、可变分区存储管理2.1 分区结构体定义2.2 初始化分区链表 三、内存分配算法实现3.1 首次适应算法(First Fit)3.1.1 算法实现 3.2 循环首次适应…

linux 中mysql查看慢日志

1、到mysql容器,先登录到数据库,查看是否开启 mysql -h 127.0.0.1 -uroot -p SHOW VARIABLES LIKE slow_query_log; 2、如果没有开启,需要先开启 set global slow_query_log ON; 3、查看慢日志文件 SHOW VARIABLES LIKE slow_query_log…

微服务day09

DSL查询 快速入门 GET /items/_search {"query": {"match_all": {}} } 叶子查询 GET /items/_search {"query": {"match_all": {}} }GET /items/_search {"query": {"multi_match": {"query": "脱…

vue中el-select 模糊查询下拉两种方式

第一种&#xff1a;先获取所有下拉数据再模糊查询&#xff0c;效果如下 1&#xff0c;页面代码&#xff1a;speciesList是种类列表List, speciesId 是speciesList里面对应的id&#xff0c;filterable是过滤查询标签 <el-form-item label"种类" prop"species…

django启动项目报错解决办法

在启动此项目报错&#xff1a; 类似于&#xff1a; django.core.exceptions.ImproperlyConfigured: Requested setting EMOJI_IMG_TAG, but settings are not c启动方式选择django方式启动&#xff0c;以普通python方式启动会报错 2. 这句话提供了对遇到的错误的一个重要线索…

【Redis】Redis实现的消息队列

一、用list实现【这是数据类型所以支持持久化】 消息基于redis存储不会因为受jvm内存上限的限制&#xff0c;支持消息的有序性&#xff0c;基于redis的持久化机制&#xff0c;只支持单一消费者订阅&#xff0c;无法避免消息丢失。 二、用PubSub【这不是数据类型&#xff0c;是…

【AI+教育】一些记录@2024.11.16

《万字长文&#xff0c;探讨关于ChatGPT的五个最核心问题》 万字长文&#xff0c;探讨关于ChatGPT的五个最核心问题关于 ChatGPT 铺天盖地的信息让人无所适从。本文则试图提炼出五个关键问题&#xff1a;如何理解这次范式突破&#xff0c;未来能达到的技术天花板&#xff0c;行…

【计算机网络】TCP协议

一、TCP协议格式 1.报头的含义 (1) 16位源端口号/16位目的端口号 自己的端口号 和 对方的端口号 (2) 4位首部长度 表示报头长度&#xff08;TCP报头总长度 4位首部长度 * 4字节&#xff09;最少有20字节 TCP报头总长度 -> 0000 ~ 1111 -> [0, 15] * 4 -> [0, 60…

http自动发送请求工具(自动化测试http请求)

点击下载《http自动发送请求工具(自动化测试http请求)》 前言 在现代软件开发过程中&#xff0c;HTTP 请求的自动化测试是确保应用程序稳定性和可靠性的关键环节。为了满足这一需求&#xff0c;我开发了一款功能强大且易于使用的自动化 HTTP 请求发送工具。该工具基于 C# 开发…

C++ —— 剑斩旧我 破茧成蝶—C++11

江河入海&#xff0c;知识涌动&#xff0c;这是我参与江海计划的第2篇。 目录 1. C11的发展历史 2. 列表初始化 2.1 C98传统的{} 2.2 C11中的{} 2.3 C11中的std::initializer_list 3. 右值引用和移动语义 3.1 左值和右值 3.2 左值引用和右值引用 3.3 引用延长生命周期…

Leetcode 有效的数独

这段代码解决的是 验证一个数独是否有效 的问题&#xff0c;其算法思想是基于 规则校验和状态记录。具体思想如下&#xff1a; 算法思想 核心目标&#xff1a; 检查每个数字在 同一行、同一列 和 同一个 3x3 子格 中是否重复。 状态记录&#xff1a; 使用 3 个布尔二维数组分别…

STM32设计学生宿舍监测控制系统-分享

目录 前言 一、本设计主要实现哪些很“开门”功能&#xff1f; 二、电路设计原理图 电路图采用Altium Designer进行设计&#xff1a; 三、实物设计图 四、程序源代码设计 五、获取资料内容 前言 本项目旨在利用STM32单片机为核心&#xff0c;结合传感器技术、无线通信技…

RabbitMQ消息可靠性保证机制4--消费端限流

7.7 消费端限流 在类似如秒杀活动中&#xff0c;一开始会有大量并发写请求到达服务端&#xff0c;城机对消息进行削峰处理&#xff0c;如何做&#xff1f; 当消息投递的速度远快于消费的速度时&#xff0c;随着时间积累就会出现“消息积压”。消息中间件本身是具备一定的缓冲…

爬虫开发工具与环境搭建——使用Postman和浏览器开发者工具

第三节&#xff1a;使用Postman和浏览器开发者工具 在网络爬虫开发过程中&#xff0c;我们经常需要对HTTP请求进行测试、分析和调试。Postman和浏览器开发者工具&#xff08;特别是Network面板和Console面板&#xff09;是两种最常用的工具&#xff0c;能够帮助开发者有效地捕…

单片机实验记录3

定时计数实验 【实验目的】 1)学习使用单片机定时/计数器 2)在程序中添加定时/计数功能&#xff0c;将相关程序部署在仿真环境中&#xff0c;观察运行的情况. 【实验内容】 必做&#xff1a;应用定时器中断和数码管&#xff0c;实现10秒倒计时功能 【实验代码】 必做&am…