【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_SWAP
	unsigned 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_SWAP
	struct 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 进程管理方面的学习和实践提供一些启发。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

若依项目学习---【数据字典】

数据字典 若以内置的数据字典,用于维护系统中常见的静态数据。例如:性别、状态……如下: 简单描述:一个地方定义,多个地方使用。 只需要修改数据字典,而不需要修改每一个使用该数据的地方。 常见静态数据&…

【C++】创建TCP客户端

目录 一、实现发送字符串功能 二、实现接收字符串功能 三、客户端接收乱码问题 四、客户端发送乱码问题 五、客户端接收到数据时进行回调 六、子线程接收数据 七、发送Json格式数据 源码 一、实现发送字符串功能 头文件 #pragma once #include <iostream> #inc…

.net framework 3.5sp1插件怎么安装

以下是在不同操作系统电脑上安装.NET Framework 3.5 SP1 的几种常见方法&#xff1a; 一、Windows 10 及以上操作系统&#xff1a; 1.在线安装&#xff08;需要网络连接稳定&#xff09;&#xff1a; 按键盘上的 Windows 键&#xff0c;键入 “Windows 功能”&#xff0c;然…

15分钟学Go 第3天:编写第一个Go程序

第3天&#xff1a;编写第一个Go程序 1. 引言 在学习Go语言的过程中&#xff0c;第一个程序通常是“Hello, World!”。这个经典的程序不仅教会你如何编写代码&#xff0c;还引导你理解Go语言的基本语法和结构。本节将详细介绍如何编写、运行并理解第一个Go程序&#xff0c;通过…

建库建表练习

目录 根据以下需求完成图书管理系统数据库及表设计&#xff0c;并建库建表&#xff0c;并截图创建表的详细信息(desc 表名),不用添加数据 1. 用户表: 字段: 姓名&#xff0c;用户名&#xff0c;密码&#xff0c;电话&#xff0c;住址&#xff0c;专业及年级 2. 图书表: 字段: 图…

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

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

基于vue框架的的地铁站智慧管理系统的设计n09jb(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,上班打卡,下班打卡,人员管理,交接班,视频巡检,车辆巡检,车辆管理 开题报告内容 基于Vue框架的地铁站智慧管理系统的设计开题报告 一、研究背景与意义 随着城市化进程的加速&#xff0c;地铁站作为城市交通系统的重要组成部分&am…

PC端视频编辑解决方案,跨平台SDK,构建多端统一的创作生态

从短视频的兴起&#xff0c;到中长视频内容的蓬勃发展&#xff0c;视频创作领域正经历着一场深刻的变革。在这场变革中&#xff0c;美摄科技以其卓越的PC端视频编辑解决方案&#xff0c;不仅站在了技术创新的前沿&#xff0c;更以开放的姿态&#xff0c;为企业用户搭建起通往未…

Java项目-基于springboot框架的校园疫情防控系统系统项目实战(附源码+文档)

作者&#xff1a;计算机学长阿伟 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、ElementUI等&#xff0c;“文末源码”。 开发运行环境 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBoot、Vue、Mybaits Plus、ELementUI工具&#xff1a;IDEA/…

Springboot 使用POI导出Excel文件

Springboot 使用POI导出Excel文件 Excel导出系列目录&#xff1a;引入依赖逻辑处理controllerservice数据查询Excel文件内容处理样式封装 导出效果思考 Excel导出系列目录&#xff1a; 【Springboot 使用EasyExcel导出Excel文件】 【Springboot 使用POI导出Excel文件】 【Spri…

VScode远程开发之remote 远程开发(二)

VScode远程开发之remote 远程开发&#xff08;二&#xff09; 使用vscode进行远程开发很简单&#xff0c;在拓展里搜索 Remote Development&#xff0c;就可以搜索到微软提供的远程开发大礼包&#xff0c;里面包含了 通过 SSH 远程服务器 远程容器 远程 WSL&#xff08;Win…

演示:基于WPF的DrawingVisual开发的高刷新率示波器

一、目的&#xff1a;分享一个基于WPF的DrawingVisual开发的高刷新率示波器 二、效果演示 特此说明&#xff1a;由于Gif录制工具帧率不够&#xff0c;渲染60帧用了4.6秒&#xff0c;平均帧率在12Hz左右&#xff0c;所以展示效果不好&#xff0c;想要看好些的效果可以看文章下面…

安科瑞智慧能源管理系统EMS3.0在浙江某能源集团有限公司的应用

安科瑞戴婷 Acrel-Fanny 一、项目背景 浙江某能源集团有限公司位于浙江省宁波前湾新区&#xff0c;主营业务范围包括了储能技术服务&#xff0c;光伏风力发电技术服务&#xff0c;充电桩技术服务&#xff0c;新能源项目的施工以及为企业提供配电房运维服务。 随着新能源的兴…

[ComfyUI]Flux:爆火禅语小和尚素材!禅意人生,享受自在

在快节奏的现代生活中&#xff0c;人们越来越渴望一种宁静和放松的状态。而禅意小和尚素材正是这样一种能够带给我们内心宁静和智慧的存在。ComfyUI的Flux框架结合了禅意小和尚素材&#xff0c;为我们提供了一个探索禅意人生的独特方式。 禅意小和尚素材源于佛教文化&#xff…

DORA 机器人中间件学习教程(5)——3D激光雷达数据可视化

DORA中3D激光雷达数据可视化 1 总体思路2 DORA数据接收节点3 编写yml文件4 启动节点参考资料 截止目前 DORA还没有类似于ROS2中RVIZ这样的可视化工具&#xff0c;而在调试算法时我们又需要将数据进行可视化以验证代码的正确性。目前的解决方法是将DORA中的数据发送到ROS2中&…

ubuntu查看系统版本命令

查看系统版本指令 在 Ubuntu 操作系统中&#xff0c;您可以使用多个命令来查看系统版本。以下是一些常用的命令&#xff1a; lsb_release -a 这个命令会显示详细的 Ubuntu 版本信息&#xff0c;包括发行版名称、版本号、代号等。lsb_release -acat /etc/os-release 这个命令会显…

实用好助手

在现代职场中&#xff0c;拥有高效且适用的工具能够显著提升我们的工作效率与质量。除了常见的办公软件&#xff0c;还有许多小众但非常实用的工具可以大幅度优化工作流程。以下是另外五个推荐的工作软件&#xff0c;它们各自具备独特的功能与优势&#xff0c;值得一试。 1 …

MongoDB未授权访问

mongodb未授权访问漏洞 复现 MongoDB[//]: # (忙够DB)是一种流行的开源文档数据库管理系统&#xff08;DBMS&#xff09;&#xff0c;基于分布式文件存储的数据库属于NoSQL数据库的一种。 开启MongoDB服务时不添加任何参数时,默认是没有权限验证的 登录的用户可以通过默认端口…

双十一适合买什么东西?2024年双十一收藏榜单必买好物分享!

随着双十一的脚步日益临近&#xff0c;各大电商平台已经开始了激烈的促销竞争。作为每年最盛大的购物节&#xff0c;双十一不仅吸引了无数消费者的积极参与&#xff0c;也成为品牌和产品质量的一次大检阅。那么&#xff0c;在2024年的双十一&#xff0c;哪些商品是值得购买的呢…

智能手表核心芯片~手表心率监测芯片AFE4900浅析(附一篇智能手表专利推荐)

智能手表核心芯片~手表心率监测芯片AFE4900浅析(附一篇智能手表专利推荐) 本期是平台君和您分享的第89期内容 2024年8月,安徽华米信息技术及美国的智能手表品牌ZEPP公司在美国对深圳思佰特公司提起诉讼,涉及专利、商标和不正当竞争。 起诉书(来源:RPX网站) 看到这则新闻…