深入了解Linux系统—— 进程优先级

前言

我们现在了解了进程是什么,进程状态表示什么 ,我们现在继续来了解进程的属性 —— 进程优先级

进程执行者

在了解进程优先级之前,先来思考一个问题:在我们进行文件访问操作时,操作系统是如何直到我们是谁(拥有者所属者或者other)的?

我们知道指令它其实就是进程,所以我们进行文件访问操作,本质上就是进程进行访问,那操作系统是如何知道进程它是谁呢?

在进程的task_struct中,存在一个UID,它表示user id就是用户的id

我们可以使用ps -l命令来查看:

在这里插入图片描述

通过上图我们可以发现进程属性UIDPIDPPIDPRINI

PID是进程的idPPID是进程的父进程的id

UID:表示user id,执行者的id

PRINI:和进程的优先级相关,本篇文章后面详细讲解。

我们使用ls -l时,它会显示出来文件的拥有者、所属组,但都是以用户名的形式显示出来的;

我们可以通过ls -ln,查看文件时将用户名以数字形式显示出来;

在这里插入图片描述

进程优先级

首先,优先级是什么?

  • CPU资源分配的先后顺序,就指进程的优先权
  • 优先权高的进程具有优先执行的权利

简单来说,进程优先级就是进程等到CPU资源的先后顺序。

这里我们要理解一下优先级和权限

优先级:是决定得到某种资源的先后顺序。

权限:是决定是否能够得到某种资源。

为什么要存在优先级呢?

简单来说就是,目标资源短缺,我们要通过优先级来确定先后顺序。

那在Linux中,我们如何查看进程的优先级呢?

查看进程优先级

在上述中提到了ps -l,我们可以通过ps -l指令来查看进程的优先级:

在这里插入图片描述

但是,在Linux中优先级是如何表示的呢?

PRINI

这里感觉怪怪的,进程优先级为什么要使用两个值来表示呢?

  • PRI:表示进程的优先级,默认是80
  • NI:表示进程优先级的修正数值;也称为进程的nice值。

我们进程实际的优先级 = PRI(默认) + NI

PRI

PRI表示进程当前的优先级,它的默认值是80

这个非常好理解,就不过多描述了。

NI

  • NI:nice值表示进程可被执行的优先级的修正数值。

nice值为负数时,该进程的优先级值就会变小,优先级就变高,更快的被执行

Linux下,我们调整优先级就是调整nice值。

nice的取值范围是[-20 , 19]

这里进程的PRINI都不是进程真实的优先级,进程真实的优先级P = PRI + NI

这里我们可以通过修改NI值进而影响进程的优先级。

修改进程优先级

我们修改进程优先级,并不是直接修改进程的优先级值,而是通过修改nice值来改变进程的优先级

我们可以通过top来修改已经存在进程的优先级:

在这里插入图片描述

这里,我们修改过一次进程的NI值之后,再次修改会发现,无法进行修改了;

这是因为操作系统为了防止恶意修改进程优先级,只允许普通用户对进程修改一次优先级;

root可以多次修改进程优先级。

这里我们还需要注意:

我们每次修改NI值之后,进程优先级都是等于 PRI的默认值(也就是80)加上NI值。

在这里插入图片描述

nicerenice

除了使用top来修改进程的NI值之外,我们还可以使用nicerenice来修改

nice

nice指令,在程序启动时,修改程序进程的NI值。

nice -n 10 ./code

这个指令就是在./code程序运行时,将nice修改为10

在这里插入图片描述

renice

nice指令是在程序启动时(创建进程时),就给定NI值;而renice指令则是修改已有进程的NI值,从而修改进程优先级。

在这里插入图片描述

这里我们除了通过topnicerenice指令来查看和修改进程优先级之外,我们还可以通过系统调用,在代码中查看和修改进程的优先级

getpriority:获取当前进程的优先级;

setpriority:修改当前进程的优先级。

在这里插入图片描述

可以看到这两个函数都是系统调用,这里就不过多描述了;

在后续内容中遇到了再详细讲解。

这里,普通用户只能修改一次进程的优先级!!!

进程优先级的范围

我们可以修改Ni,从而影响进程的优先级,但是我们不能把NI修改的非常大或者非常小吧;

NI值的取值范围: [-20,19](一共40个数据)
进程优先级的范围:[60 , 99](一共40个优先级)

在这里插入图片描述
可以看到进程NI值的范围的确是[-20 , 19];进程优先级的范围的确是[60 , 99]

理解竞争、独立、并发、并行

进程具有竞争性、独立性、并行、并发;

  • 竞争性:系统中的进程非常多,而CPU资源只有很少的一部分,所以进程之间是具有竞争属性的;为了使效率更高,更好的完成认为,更合理的竞争资源,就有了优先级这一概念。
  • 独立性:多进行运行,需要独自享有各种资源,多进程运行之间互不影响。
  • 并行:多个进程在多个CPU下分别,同时运行,称为并行
  • 并发:多个进程在一个CPU下采用进程切换的方式,在这一段时间内,多个进程都得以推进,称为进程的并发。

到这里,本篇文章的内容就结束了
简单总结:

  • 了解了进程的优先级
  • 进程PRINI
  • 查看和修改进程的优先级(NI值)
  • 进程的特性(竞争性、独立性、并行、并发)

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

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

相关文章

Expected SARSA算法详解:python 从零实现

🧠 向所有学习者致敬! “学习不是装满一桶水,而是点燃一把火。” —— 叶芝 我的博客主页: https://lizheng.blog.csdn.net 🌐 欢迎点击加入AI人工智能社区! 🚀 让我们一起努力,共创…

1penl配置

好的,根据您提供的 1pctl 命令输出信息,我们来重新依次回答您的所有问题: 第一:1Panel 怎么设置 IP 地址? 根据您提供的 user-info 输出: 面板地址: http://$LOCAL_IP:34523/93d8d2d705 这里的 $LOCAL_I…

链表的回文结构题解

首先阅读题目: 1.要保证是回文结构 2.他的时间复杂度为O(n)、空间复杂度为O(1) 给出思路: 1.首先利用一个函数找到中间节点 2.利用一个函数逆置中间节点往后的所有节点 3.现在有两个链表,第一个链表取头节点一直到中间节点、第二个链表取头结点到尾…

【LLaMA-Factory实战】1.3命令行深度操作:YAML配置与多GPU训练全解析

一、引言 在大模型微调场景中,命令行操作是实现自动化、规模化训练的核心手段。LLaMA-Factory通过YAML配置文件和多GPU分布式训练技术,支持开发者高效管理复杂训练参数,突破单机算力限制。本文将结合结构图、实战代码和生产级部署经验&#…

C++负载均衡远程调用学习之 Dns-Route关系构建

目录 1.LARS-DNS-MYSQL环境搭建 2.LARSDNS-系统整体模块的简单说明 3.Lars-Dns-功能说明 4.Lars-Dns-数据表的创建 5.Lars-Dns-整体功能说明 6.Lars-DnsV0.1-Route类的单例实现 7.Lars-DnsV0.1-Route类的链接数据库方法实现 8.Lars-DnsV0.1-定义存放RouteData关系的map数…

fastapi+vue中的用户权限管理设计

数据库设计:RBAC数据模型 这是一个典型的基于SQLAlchemy的RBAC权限系统数据模型实现,各模型分工明确,共同构成完整的权限管理系统。 图解说明: 实体关系: 用户(USER)和角色(ROLE)通过 USER_ROLE 中间表实现多对多关系…

【Python实战】飞机大战

开发一个飞机大战游戏是Python学习的经典实战项目,尤其适合结合面向对象编程和游戏框架(如Pygame)进行实践。以下是游戏设计的核心考虑因素和模块划分建议: 一、游戏设计核心考虑因素 性能优化 Python游戏需注意帧率控制&#xff…

Flowable7.x学习笔记(十八)拾取我的待办

前言 本文从解读源码到实现功能,完整的学习Flowable的【TaskService】-【claim】方法实现的任务拾取功能。 一、概述 当调用 TaskService.claim(taskId, userId) 时,Flowable 会先加载并校验任务实体,再判断该任务是否已被认领;若…

SQL经典实例

第1章 检索记录 1.1 检索所有行和列 知识点:使用SELECT *快速检索表中所有列;显式列出列名(如SELECT col1, col2)提高可读性和可控性,尤其在编程场景中更清晰。 1.2 筛选行 知识点:通过WHERE子句过滤符合条…

HTTPcookie与session实现

1.HTTP Cookie 定义 HTTP Cookie (也称为 Web Cookie 、浏览器 Cookie 或简称 Cookie )是服务器发送到 用户浏览器并保存在浏览器上的一小块数据,它会在浏览器之后向同一服务器再次发 起请求时被携带并发送到服务器上。通常&#xff0…

【算法基础】冒泡排序算法 - JAVA

一、算法基础 1.1 什么是冒泡排序 冒泡排序是一种简单直观的比较排序算法。它重复地走访待排序的数列,依次比较相邻两个元素,如果顺序错误就交换它们,直到没有元素需要交换为止。 1.2 基本思想 比较相邻元素:从头开始&#xf…

0902Redux_状态管理-react-仿低代码平台项目

文章目录 1 Redux 概述1.1 核心概念1.2 基本组成1.3 工作流程1.4 中间件(Middleware)1.5 适用场景1.6 优缺点1.7 Redux Toolkit(现代推荐)1.8 与其他工具的对比1.9 总结 2 todoList 待办事项案例3 Redux开发者工具3.1 核心功能3.2…

《ATPL地面培训教材13:飞行原理》——第6章:阻力

翻译:Leweslyh;工具:Cursor & Claude 3.7;过程稿 第6章:阻力 目录 引言寄生阻力诱导阻力减少诱导阻力的方法升力对寄生阻力的影响飞机总阻力飞机总重量对总阻力的影响高度对总阻力的影响构型对总阻力的影响速度稳…

C++总结01-类型相关

一、数据存储 1.程序数据段 • 静态(全局)数据区:全局变量、静态变量 • 堆内存:程序员手动分配、手动释放 • 栈内存:编译器自动分配、自动释放 • 常量区:编译时大小、值确定不可修改 2.程序代码段 •…

【Hot 100】94. 二叉树的中序遍历

目录 引言二叉树的中序遍历我的解题代码优化更清晰的表述建议: 🙋‍♂️ 作者:海码007📜 专栏:算法专栏💥 标题:【Hot 100】94. 二叉树的中序遍历❣️ 寄语:书到用时方恨少&#xff…

大语言模型(LLMs)微调技术总结

文章目录 全面总结当前大语言模型(LLM)微调技术1. 引言2. 为什么需要微调?3. 微调技术分类概览4. 各种微调技术详细介绍4.1 基础微调方法4.1.1 有监督微调(Supervised Fine-Tuning, SFT)4.1.2 全参数微调(F…

解决Maven项目中报错“java不支持版本6即更高的版本 7”

错误背景 当Maven项目编译或运行时出现错误提示 Java不支持版本6即更高的版本7,通常是由于项目配置的JDK版本与当前环境或编译器设置不一致导致的。例如: 项目配置的Java版本为6或7,但实际使用的是JDK 17。Maven或IDE的编译器未正确指定目标…

C++笔记-多态(包含虚函数,纯虚函数和虚函数表等)

1.多态的概念 多态(polymorphism)的概念:通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运行时多态(动态多态),这里我们重点讲运行时多态,编译时多态(静态多态)和运行时多态(动态多态)。编译时多态(静态多态)主要就是我们前面讲的函…

【Unity】MVP框架的使用例子

在提到MVP之前,可以先看看这篇MVC的帖子: 【Unity】MVC的简单分享以及一个在UI中使用的例子 MVC的不足之处: 在MVC的使用中,会发现View层直接调用了Model层的引用,即这两个层之间存在着一定的耦合性,而MV…

前端js学算法-实践

1、两数之和 const twoSum (nums, target) > {const obj {}for (let m 0; m < nums.length; m) {const cur nums[m]const diff target - curif(obj.hasOwnProperty(diff)){ // 查询对象中是否存在目标值-当前值键值对console.log([obj[diff], m]) // 存在则直接获取…