【Linux】进程的优先级

进程的优先级

    • 一.概念
    • 二.修改优先级的方法
    • 三.进程切换的大致原理:
    • 四.上下文数据的保存位置:

一.概念

  1. cpu资源分配的先后顺序,就是指进程的优先权(priority)。
    优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
    还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。俗话说就是,谁的优先级高谁就先被CPU调度(运行)

  2. 存在优先级的原因:因为资源太少了!像是我们的CPU一般只有一个或者几个!但是进程却一般有几十个或者几百个,所以就得确认优先级。

  3. linux下优先级的特点:计算机里面的优先级的本质就是pcb里面的一个整数。linux里面的优先级是用两个整数来代替的,一个是PRI(priority) 一个是NI(nice)
    在这里插入图片描述

  4. 最终优先级 (PRI)= 初始优先级+NI(nice),linux支持进程运行中,优先级调整的!调整策略就是通过更改nice值完成的!
    不过我们一般都是不改的 图中PR就是PRI,NI就是NI。

二.修改优先级的方法

输入top后就会进入下图中的页面!——使用top修改可能需要用到root权限!

在这里插入图片描述

输入r就会跳出一个renice 后面显示的pid就是当前进程的pid,我们可以输入想要的进程pid用来修改nice值!

在这里插入图片描述

通过上图可以发现linux下nice值的范围是 从 [-20,19]

为什么要给一个范围呢?这是因为为了防止调优先级导致某个进程过度占用CPU资源!导致调度失衡!

总结:

  1. PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小 进程的优先级别越高
  2. 那NI呢?就是我们所要说的nice值了,其表示进程可被执行的优先级的修正数值
  3. PRI值越小越快被执行,那么加入nice值后,将会使得PRI变为:PRI(new)=PRI(old)+nice
  4. 这样,当nice值为负值的时候,那么该进程的优先级值将变小,即该进程的优先级会变高,它就越快被执行
  5. 所以,调整进程优先级,在Linux下,就是调整进程nice值
  6. nice其取值范围是-20至19,一共40个级别。
  7. 需要强调一点的是,进程的nice值不是进程的优先级,他们不是一个概念,但是进程nice值会影响到进 程的优先级变化。
  8. 可以理解nice值是进程优先级的修正数据

三.进程切换的大致原理:

  • 首先我们要知道CPU一直在执行三件事——1.取指令 2.分析指令 3.执行指令
    CPU里面存在很多寄存器——这些寄存器都是同一套的,当CPU要执行某个进程的时候!首先会将进程的PCB放到寄存器里面!然后通过PCB来找到该进程的代码。

  • 寄存器的功能有很多
    例如pc(eip)寄存器它的作用就是:存放当前执行指令的下一条指令的地址——也就是说CPU里面存在的一个寄存器专门用来标记下一次要从当前这个进程的哪一行指令开始执行,例如保存return值的寄存器:我们以前函数执行的时候进行return,但是明明函数过来作用域已经被释放了,主函数是怎么得到的return的值呢,答案也是通过寄存器来实现的。
    当我运行进程的时候 一定会产生十分多的临时数据

  • 例如我们进行一个加法运算函数那么CPU就要将这些a,b,c变量导入寄存器里面!然后用里面的寄存单元进行计算,然后将结果保存在另一个寄存单元里面,最后计算完毕再拷回去,所以一定会存在很多的临时数据,这些临时数据是属于当前进程的。

  • 要明确一点寄存器硬件 不等于 寄存器内的数据,虽然这些数据是保存在寄存器里面的,且进程在运行的时候是占用着CPU的,但是进程不能一直占用CPU到进程结束。就像是我们写个死循环,我们仍然可以使用其他程序,进程在运行的时候都有自己的时间片,存在进程在执行过程未完成时就被拿下去的情况。所以就必须考虑下一次进程回来的时候执行到哪里,对于那些属于进程的临时数据,也必须处理,否则下一次进程再次回到CPU就必须重新开始了。

  • 对于进程离开CPU保留临时数据的过程我们称为上下文保护,当进程再次被CPU调度后,恢复临时数据的过程就称为上下文恢复。要区分寄存器和寄存器里面的临时数据!——上下文保护是保存寄存器里面的临时数据!(寄存器只有一套,但是里面的数据可以不断的换)

  • 上下文恢复就是将这些临时数据重新写入到寄存器里面,所以进程再次被CPU调度的时候,要首先进行上下文恢复!离开时也不是立刻离开,要进行上下文保护!寄存器被所有进程共享,但是寄存器里面的数据都是属于当前的进程的,一般可以简单的认为是保存在PCB里面

四.上下文数据的保存位置:

  1. 内核栈
  • 存储进程切换时的寄存器现场
  • 保存各种中断和系统调用时的现场信息
  • 属于每个进程私有的栈空间
  1. PCB (进程控制块)
  • 包含进程的状态、程序计数器
  • 保存进程调度相关的重要信息
  • 操作系统内核中为每个进程维护的数据结构
  1. 硬件寄存器
  • 通用寄存器
  • 程序计数器(PC)
  • 栈指针寄存器
  • 状态寄存器
  1. 页表和MMU
  • 保存进程的虚拟内存映射
  • 存储进程的内存空间信息

想要了解上下文知识可以观看该篇博客:上下文恢复

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

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

相关文章

【软件工程】一篇入门UML建模图(类图)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀软件开发必练内功_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前…

AWTK-WIDGET-WEB-VIEW 实现笔记 (3) - MacOS

MacOS 上实现 AWTK-WIDGET-WEB-VIEW 有点麻烦,主要原因是没有一个简单的办法将一个 WebView 嵌入到一个窗口中。所以,我们只能通过创建一个独立的窗口来实现。 1. 创建窗口 我对 Object-C 不熟悉,也不熟悉 Cocoa 框架,在 ChatGPT…

QT仿QQ聊天项目,第三节,实现聊天界面

一,界面控件示意图 界面主要由按钮QPushButton,标签QLabel,列表QListWidget 要注意的是QListWidget既是实现好友列表的控件,也是实现聊天气泡的控件 二,控件样式 QPushButton#btn_name {border:none;}QPushButton#btn_close {border:1px;bac…

微信小程序自定义顶部导航栏(适配各种机型)

效果图 1.pages.js,需要自定义导航栏的页面设置"navigationStyle": "custom" 2.App.vue,获取设备高度及胶囊位置 onLaunch: function () {// 系统信息const systemInfo uni.getSystemInfoSync()// 胶囊按钮位置信息const menuButtonInfo uni.…

Android Studio开发学习(五)———LinearLayout(线性布局)

一、布局 认识了解一下Android中的布局,分别是: LinearLayout(线性布局),RelativeLayout(相对布局),TableLayout(表格布局), FrameLayout(帧布局),AbsoluteLayout(绝对布局),GridLayout(网格布局) 等。 二、…

C++:哈希拓展-位图

目录 一.问题导入 二.什么是位图? 2.1如何确定目标数在哪个比特位? 2.2如何存放高低位 2.3位图模拟代码实现 2.3.1如何标记一个数 2.3.2如何重置标记 2.3.3如何检查一个数是否被标记 整体代码实现 标准库的Bitset 库中的bitset的缺陷 简单应用 一.问题导入 这道…

实用教程:如何无损修改MP4视频时长

如何在UltraEdit中搜索MP4文件中的“mvhd”关键字 引言 在视频编辑和分析领域,有时我们需要深入到视频文件的底层结构中去。UltraEdit(UE)和UEStudio作为强大的文本编辑器,允许我们以十六进制模式打开和搜索MP4文件。本文将指导…

Spring Boot 接口防重复提交解决方案

文章目录 前言使用Token机制实现步骤1.生成Token2.传递Token3.验证Token 使用Redis实现步骤1.引入Redis依赖2.生成Token3.传递Token4.验证Token 使用Spring AOP实现步骤1.定义注解2.创建切面3.使用注解 总结 前言 在Web开发中,防止用户重复提交表单是一个常见的需求…

Linux性能优化之火焰图简介

Linux 火焰图(Flame Graph)是一种可视化工具,用于分析程序性能问题,尤其是 CPU 使用情况。它展示了程序中函数调用的层次结构和各个调用栈占用的时间比例。 以下是详细介绍,包括火焰图的工作原理、生成步骤和实际使用中…

笔记|M芯片MAC (arm64) docker上使用 export / import / commit 构建amd64镜像

很简单的起因,我的东西最终需要跑在amd64上,但是因为mac的架构师arm64,所以直接构建好的代码是没办法跨平台运行的。直接在arm64上pull下来的docker镜像也都是arm64架构。 检查镜像架构: docker inspect 8135f475e221 | grep Arc…

【JavaWeb】JavaWeb入门之XML详解

目录 1.XML介绍 1.1.XML概述 1.1.1.什么是XML 1.1.2.XML的作用 1.1.3.XML与HTML的比较 1.1.4.XML和properties(属性文件)比较 1.1.5.W3C组织 1.2.XML语法概述 1.2.1.XML文档展示 1.2.2.XML文档的组成部分 1.3.XML文档声明 1.3.1.什么是XML文…

spring源码02-spring容器启动(容器初始化+bean实例化)源码解读【常见面试题】

文章目录 【README】【1】spring容器初始化及bean实例化步骤列表【2】spring容器初始化源码【2.1】容器初始化主要步骤总结:【2.2】容器初始化详细步骤源码分析 【3】bean实例化源码【3.1】bean实例化主要步骤总结(非常重要)【3.1.1】 bean生…

Python中的正则表达式教程

一、 正则表达式基础 1。1。概念介绍 正则表达式是用于处理字符串的强大工具,它并不是Python的一部分。 其他编程语言中也有正则表达式的概念,区别只在于不同的编程语言实现支持的语法数量不同。 它拥有自己独特的语法以及一个独立的处理引擎,在提供了正则表达式…

【Python库安装】Python环境安装景观模式分析常用库PyLandStats

【Python库安装】Python环境安装景观模式分析常用库PyLandStats PyLandStats 简介景观分割景观指标 PyLandStats 安装参考 PyLandStats 简介 PyLandStats 是一个用于景观模式分析的 Python 库。它允许用户计算景观格局的各种统计量和指标,广泛应用于生态学、地理信…

Visual Studio 2022 安装

下载链接 https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?skuCommunity&channelRelease&versionVS2022&sourceVSLandingPage&cid2030&passivefalse 安装 以c为例,列出需要勾选的项目,有3个&a…

Spark 共享变量:广播变量与累加器解析

Spark 的介绍与搭建:从理论到实践_spark环境搭建-CSDN博客 Spark 的Standalone集群环境安装与测试-CSDN博客 PySpark 本地开发环境搭建与实践-CSDN博客 Spark 程序开发与提交:本地与集群模式全解析-CSDN博客 Spark on YARN:Spark集群模式…

Golang | Leetcode Golang题解之第565题数组嵌套

题目&#xff1a; 题解&#xff1a; func arrayNesting(nums []int) (ans int) {n : len(nums)for i : range nums {cnt : 0for nums[i] < n {i, nums[i] nums[i], ncnt}if cnt > ans {ans cnt}}return }

Git 搭建远程仓库、在 IDEA 工具中的配置和使用

Git的概念、安装、操作与分支管理和图形化界面TortoiseGit&#xff08;小乌龟 &#xff09;的安装与使用-CSDN博客 目录 一、远程仓库 1&#xff09;在github上创建仓库 2&#xff09;在gitee上创建项目 3&#xff09;如何将远程的项目clone 到本地 4&#xff09;公司自己…

无人机检测车辆——多目标检测

目录 YOLOv3&#xff08;You Only Look Once version 3&#xff09;简介 YOLOv3 的主要特点 YOLOv3 的结构 1. 特征提取网络&#xff08;Backbone&#xff09; 2. 检测头&#xff08;Head&#xff09; 3. 输出层 YOLOv3 损失函数 YOLOv3 的优势 YOLOv3 的应用 YOLOv3…

Java | Leetcode Java题解之第564题寻找最近的回文数

题目&#xff1a; 题解&#xff1a; class Solution {public String nearestPalindromic(String n) {long selfNumber Long.parseLong(n), ans -1;List<Long> candidates getCandidates(n);for (long candidate : candidates) {if (candidate ! selfNumber) {if (ans…