【Linux】进程优先级进程切换

在这里插入图片描述

文章目录

  • 进程优先级
    • 查看进程优先级
    • 进程优先级的修改
  • 进程切换
    • 进程切换的概念
  • 总结

进程优先级

进程优先级是操作系统中用于决定进程调度顺序的重要属性。它表示一个进程在系统资源分配和 CPU 调度中的相对重要性。优先级越高的进程通常会获得更多的 CPU 时间和资源,从而更快地完成其任务。

查看进程优先级

ps -l

在这里插入图片描述

通常ps -l查询不到我们启动的进程的信息,所以我们一般都是用ps -al查询进程信息。
在这里插入图片描述
可以看到我们启动的myprocess。
这里有两个信息来觉得我们的优先级。
在这里插入图片描述
一个是PRI,一个事NI值,这两个决定了进程的优先级。
最终优先级的计算公式: P R I (最终) = P R I (默认) + N I PRI(最终)=PRI(默认)+NI PRI(最终)=PRI(默认)+NI
NI值也称为nice值,是优先级的修正数据。
这里还有一个比较重要的信息:UID
UID是操作系统中用于唯一标识用户的数字。在Linux中,每个用户都有一个唯一的 UID,用于控制访问权限和资源管理。
这里可以看到myprocess这个进程是由UID是1000的用户启动的。
UID的作用:我们知道Linux中有权限的概念,那么权限是如何实现的呢?其实每个文件也是有UID的。
在这里插入图片描述
当我们用某个指令的时候,比如说touch,mkdir等等指令,操作系统是如何判断是否有权限的呢,因为使用指令实际本质上也是启动一个进程,这个进程势必也是有UID的,所以操作系统可以对比这个文件的UID和这个操作的UID,看这个操作的UID对应的文件是否有这个权限,最后决定是否能进行这个操作。

进程优先级的修改

进程优先级的修改本质上是修改nice值,修改的是优先级修正数据,进而最终影响我们的最终优先级
进程优先级的修改主要有两种:

  1. 指令
  2. 代码

指令修改:
利用top指令修改进程优先级:
在这里插入图片描述
打开top,输入r进入到优先级修改的模式,通过PID来对优先级进行修改,输入我们对应的PID,然后对进程的nice值进行修改。
在这里插入图片描述
可以看见我们的NI值由默认的0修改为了1,最终优先级也是由默认的80,变为了81,这里我们可以知道:
P R I (最终) = P R I (默认 80 ) + N I PRI(最终)=PRI(默认80)+NI PRI(最终)=PRI(默认80+NI

我们可以通过修改进程优先级来确定最终优先级的上限和下限,这里我们不知道最大的NI值是多少,先姑且修改为100.
在这里插入图片描述
可以看见实际的nice值没有修改为100,而是修改为了19,说明nice值的上限是19,最终进程优先级的上限是99,我们继续来确定下限,这里我们也同样用-100,来表示最小nice值。
在这里插入图片描述

可以看见实际的nice也没有被修改为-100,而是被修改为了-20,说明nice值的下限是-20,PRI的下限是60,这里我们就可以确定nice值是[-20,19],40个数,而最终优先级的范围是[60,99]

进程切换

进程切换的概念

进程切换是指操作系统在多个进程之间切换 CPU 的执行权的过程。由于在一个操作系统中,CPU 资源是有限的,而通常会有多个进程需要同时执行,因此操作系统会通过进程切换来实现多任务处理。
当一个进程执行完一个时间片之后,就会执行进程切换,切换到下一个进程,这样循环往复就形成了进程间的轮转调度。
那么进程的切换是如何进行的呢?我们来画一个简图:
我们知道CPU中有很多寄存器,比如:eax,ebx,ecx,edx,eflag,ecs,eds,efs,eip(pc),ir等等。

对于上面这么多寄存器我们只需要知道:
eip(pc):存储当前正在执行的指令的下一条指令的地址的寄存器
ir:指令寄存器,是CPU内部一个专门用于存储当前正在执行的指令的寄存器。它在CPU执行周期中起着关键作用,负责暂时保存从内存中取出的指令,以便CPU解码和执行。

在这里插入图片描述

当程序已经加载到内存当中时,pc开始读取指令,然后ir读取pc存储的地址对应的指令。ir存储完指令之后,会进行解码,然后取操作数等等操作,最后会得到这句代码的结果,但是在ir存储完了之后,pc会根据ir中代码的长度,然后跳到下一个代码首的地址,存储下一个代码首的地址,当CPU执行完了之后就会执行下一句代码。
在这里插入图片描述
起初pc是指向这里的,但是ir读取完了之后,pc会更新。
在这里插入图片描述

p c (下一个) = p c (当前) + i r (对应的代码的长度) pc(下一个)=pc(当前)+ir(对应的代码的长度) pc(下一个)=pc(当前)+ir(对应的代码的长度)
就可以找到下一个代码的首个位置,然后进行循环处理,这时单个时间片处理进程的情况,这下我们加上多个进程处理的情况。
在这里插入图片描述
寄存器中的数据通常被视为临时数据。寄存器用于快速存储和访问CPU在执行指令时所需的操作数、地址、计算结果等信息。由于寄存器的访问速度远快于内存,它们是CPU内部用于临时存储和处理数据的关键部分。
首先我们考虑的是不保护临时数据的情况:
如果我们不保护临时数据,假如当我们执行到code3的时候,一个时间片已经执行完了,所以应该切换到下一个进程的时间片进行执行,执行下一个进程的时间片时,在这里插入图片描述
这时,上一个进程的临时数据已经被第二个进程的数据覆盖掉了,当我们执行到code5的时候,一个时间片已经结束,所以回到第一个进程继续执行下一个时间片,但是上一个进程的临时数据已经被覆盖掉了,这时我们就不知道从哪句代码运行了,所以如果不保护临时数据是不可能形成进程切换,所以肯定有临时数据的保护,当我们一个时间片结束之后,在某个地方保存着这些临时变量,当执行完第一个进程之后保存临时数据,然后执行下一个时间片,执行完一系列时间片之后回到这个这个进程时,将保存起来的临时数据加载到CPU当中重新执行,上个时间片接着的进度。
**进程切换:**当一个进程的时间片结束之后切走到下一个进程,一系列进程完成之后切回到这个进程继续完成。
切走:将相关寄存器内容,保护起来
切回:将历史保存的寄存器数据,恢复到寄存器当中每次切换时。

这些临时数据到底是放在哪里的呢?

	unsigned short uid,euid,suid;unsigned short gid,egid,sgid;unsigned long timeout;unsigned long it_real_value, it_prof_value, it_virt_value;unsigned long it_real_incr, it_prof_incr, it_virt_incr;long utime,stime,cutime,cstime,start_time;unsigned long min_flt, maj_flt;unsigned long cmin_flt, cmaj_flt;struct rlimit rlim[RLIM_NLIMITS]; unsigned short used_math;unsigned short rss;	/* number of resident pages */char comm[16];struct vm86_struct * vm86_info;unsigned long screen_bitmap;
/* file system info */int link_count;int tty;		/* -1 if no tty, so it must be signed */unsigned short umask;struct inode * pwd;struct inode * root;struct inode * executable;struct vm_area_struct * mmap;struct shm_desc *shm;struct sem_undo *semun;struct file * filp[NR_OPEN];fd_set close_on_exec;
/* ldt for this task - used by Wine.  If NULL, default_ldt is used */struct desc_struct *ldt;
/* tss for this task */struct tss_struct tss;
#ifdef NEW_SWAPunsigned long old_maj_flt;	/* old value of maj_flt */unsigned long dec_flt;		/* page fault count of the last time */unsigned long swap_cnt;		/* number of pages to swap on next pass */short swap_table;		/* current page table */short swap_page;		/* current page */
#endif NEW_SWAPstruct vm_area_struct *stk_vma;

上面是PCB原码,内部有一个结构体是tss,我们来看看tss结构体:

struct tss_struct {unsigned short	back_link,__blh;unsigned long	esp0;unsigned short	ss0,__ss0h;unsigned long	esp1;unsigned short	ss1,__ss1h;unsigned long	esp2;unsigned short	ss2,__ss2h;unsigned long	cr3;unsigned long	eip;unsigned long	eflags;unsigned long	eax,ecx,edx,ebx;unsigned long	esp;unsigned long	ebp;unsigned long	esi;unsigned long	edi;unsigned short	es, __esh;unsigned short	cs, __csh;unsigned short	ss, __ssh;unsigned short	ds, __dsh;unsigned short	fs, __fsh;unsigned short	gs, __gsh;unsigned short	ldt, __ldth;unsigned short	trace, bitmap;unsigned long	io_bitmap[IO_BITMAP_SIZE+1];unsigned long	tr;unsigned long	cr2, trap_no, error_code;union i387_union i387;
};

可以看见当中有很多寄存器信息,寄存器当中的临时信息就是存储在PCB当中的tss结构体当中的。
TSS是 x86 架构中的一个重要数据结构,用于管理任务切换。它包含关于当前任务的信息,比如任务的状态、CPU 寄存器、堆栈指针等。

总结

在 Linux 操作系统中,进程优先级和进程切换是确保系统高效运行的核心机制。通过合理设置进程优先级,系统能够根据任务的重要性和紧急性,合理分配 CPU 资源。这不仅提升了系统的响应速度,还能有效避免资源的浪费。

同时,进程切换的实现方式保证了多任务环境下的平稳运行。尽管频繁的进程切换可能会带来一定的性能开销,但通过调度算法的优化,Linux 仍能在保持高效性的同时,确保各个进程得到公平的执行机会。

了解这些概念不仅有助于深入掌握 Linux 系统的工作原理,还能为优化应用程序性能提供指导。希望本文能为你在 Linux 进程管理方面的学习和实践提供一些启发。

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

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

相关文章

【网页设计】CSS 盒子模型

目标 能够准确阐述盒子模型的 4 个组成部分能够利用边框复合写法给元素添加边框能够计算盒子的实际大小能够利用盒子模型布局模块案例能够给盒子设置圆角边框能够给盒子添加阴影能够给文字添加阴影 1. 盒子模型 页面布局要学习三大核心, 盒子模型, 浮动 和 定位. 学习好盒子模…

Spring6梳理15——Bean的作用域

目录 15.1 引入 15.1.1 Orders类 15.1.2 bean-scope.xml 15.1.3 OrdersTest类 15.1.4 运行截图 15.1 引入 在Spring中可以通过配置bean标签的scope属性来指定bean的作用域范围,各取值含义参加下表: 取值含义创建对象的时机singleton&#x…

拥抱趋势,洞察智慧!创客匠人「创始人IP创新增长班」圆满收官!

拥抱未来趋势,打造创始人IP,建立长期品牌价值。10月15日-17日,由创客匠人主办、创客匠人创始人&CEO老蒋担任主讲人的「创始人IP创新增长班」线下大课在成都生物城凯悦嘉轩酒店圆满收官。 本次大课,强大的势能吸引了来自全国各…

你知道吗?这个岗位只招2人,但HR那边却收到了1w份简历

引言 在当前经济环境下,求职者面临的挑战越来越大。互联网行业尤其如此,许多人挤破头都想进入大厂,但竞争异常激烈。如今的就业市场确实变得异常艰难。然而,随着AI大模型技术的兴起,对于那些掌握了相关技能的专业人才…

作业车间调度优化算法

作业车间调度优化算法 题目来源代码实现输出结果 题目来源 题目来源于葛英飞《智能制造技术基础》书中175页的题目,基余分配率的作业车间调度优化算法。书中这部分有程序流程图,但是没有代码,课后闲暇之余通过Python对其进行了简单的实现&am…

西南交通大学计算机软件专业上岸难度分析

C哥专业提供——计软考研院校选择分析专业课备考指南规划 西南交通大学计算机科学与技术2024届考研难度整体呈现"稳中有升"的态势。学硕实际录取33人,复试分数线362分,复试录取率71.74%;专硕(计算机技术)实际…

“2+1拼团:电商新风尚,驱动增长革新“

在当前经济环境下,商品供应过剩与同质化问题日益凸显,传统电商模式正面临严峻考验,难以有效应对消费者不断升级的需求。为此,一种新颖的21拼团购物模式应运而生,借助其别具一格的运营理念和吸引人的激励机制&#xff0…

企业文件怎么管控?这几个软件你一定要知道!

企业文件管控是确保数据安全、提高工作效率和满足合规要求的关键措施。它有助于保护敏感信息,防止数据泄露,同时提高文件的查找效率,减少重复工作,促进团队协作,支持决策制定,并维护企业的知识产权 。通过实…

[枚举坤坤]二进制枚举基础

我们都知道数据是以二进制形式存储在计算机中的。当我们使用十进制数进行编程时(如a10)实际上计算机要先进行一步转码,将其化为二进制的形式进行计算。如果在编程的过程中我们可以直接越过转码这一步去操纵二进制形式进行运算,程序…

政安晨【零基础玩转各类开源AI项目】基于本地Ubuntu (Linux ) 系统应用Gradio-Lite:无服务器 Gradio 完全在浏览器中运行

目录 简介 什么是@gradio/lite? 入门 1.导入 JS 和 CSS 2. 创建标签 3. 在标签内编写你的 Gradio 应用程序 更多示例:添加其他文件和要求 多个文件 其他要求 SharedWorker 模式 代码和演示playground 1.无服务器部署 2.低延迟 3. 隐私和安全 限制 尝试一下!…

深度学习面试笔试之循环神经网络(RNN)、门控循环单元(GRU)、长短期记忆(LSTM)

深度学习面试笔试之循环神经网络RNN、门控循环单元GRU、长短期记忆LSTM 循环神经网络(RNN)1. 什么是RNN1.1 RNN的应用1.2 为什么有了CNN,还要RNN?1.3 RNN的网络结构1.4 双向RNN1.5 BPTT算法 2. 其它类型的RNN3. CNN与RNN的区别4. 为什么RNN 训练的时候Loss波动很大…

CLion和Qt 联合开发环境配置教程(Windows和Linux版)

需要安装的工具CLion 和Qt CLion下载链接 :https://www.jetbrains.com.cn/clion/ 这个软件属于直接默认安装就行,很简单,不多做介绍了 Qt:https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/online_installers/ window 直接点exe Linux 先c…

Python | Leetcode Python题解之第491题非递减子序列

题目: 题解: class Solution:def findSubsequences(self, nums: List[int]) -> List[List[int]]:def dfs(i, tmp):if i len(nums):if len(tmp) > 2:res.append(tmp[:]) # 拷贝,tmp[:]而非tmpreturn# 选 nums[i]if not tmp or nu…

我们可以用微服务创建状态机吗?

大家好,我是锋哥。今天分享关于【我们可以用微服务创建状态机吗?】面试题?希望对大家有帮助; 我们可以用微服务创建状态机吗? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 是的,微服务架构可…

Java | Leetcode Java题解之第496题下一个更大元素I

题目&#xff1a; 题解&#xff1a; class Solution {public int[] nextGreaterElement(int[] nums1, int[] nums2) {Map<Integer, Integer> map new HashMap<Integer, Integer>();Deque<Integer> stack new ArrayDeque<Integer>();for (int i num…

19.面试算法-树的深度优先遍历(一)

1. 深入理解前中后序遍历 深度优先遍历有前中后三种情况&#xff0c;大部分人看过之后就能写出来&#xff0c;很遗憾大部分只是背下来的&#xff0c;稍微变换一下就废了。 我们再从二叉树的角度看递归&#xff0c;每次遇到递归&#xff0c;都按照前面说的四步来写&#xff0c…

STM32_实验3_控制RGB灯

HAL_Delay 是 STM32 HAL 库中的一个函数&#xff0c;用于在程序中产生一个指定时间的延迟。这个函数是基于系统滴答定时器&#xff08;SysTick&#xff09;来实现的&#xff0c;因此可以实现毫秒级的延迟。 void HAL_Delay(uint32_t Delay); 配置引脚&#xff1a; 点击 1 到 IO…

wordpress 子比主题美化 四宫格 多宫格 布局插件

wordpress 主题美化 四宫格 多宫格 布局插件&#xff08;只在子比主题上测试过&#xff0c;其它主题没测试&#xff09; A5资源网四宫格布局插件是一个功能丰富的WordPress插件,专为创建自适应的四宫格布局而设计。这个插件具有以下主要特点: 灵活的布局: 支持1到8个宫格的自定…

Apache Paimon Catalog

Paimon Catalog可以持久化元数据,当前支持两种类型的metastore: 文件系统(默认):将元数据和表文件存储在文件系统中。hive:在 hive metastore中存储元数据。用户可以直接从 Hive 访问表。2.2.1 文件系统 CREATE CATALOG fs_catalog WITH ( type = paimon, warehouse = h…

Yolo目标检测:实时性与准确性的完美结合

在目标检测领域&#xff0c;Yolo&#xff08;You Only Look Once&#xff09;算法无疑是一颗璀璨的明星。自2016年由Joseph Redmon等人提出以来&#xff0c;Yolo凭借其出色的实时性和准确性&#xff0c;迅速在多个应用场景中崭露头角。本文将详细介绍Yolo目标检测的基本原理、优…