进程状态与优先级

news2024/11/18 8:20:36

目录

进程状态:

tracing stop:追踪暂停状态

Z:僵尸状态:

为什么要有僵尸进程呢?

 孤儿进程

 进程优先级:

 其他概念:

进程切换:

pc/eip

环境变量:

 PATH:全局的环境变量

echo +$:

 history显示最近使用的指令:

 env查看所有的环境变量


进程状态:

tracing stop:追踪暂停状态

我们使用Linux来理解tracing stop状态。

 我们首先创建一个源文件,我们再创建一个文件makefile,makefile是该源文件对应的项目方案,我们先对makefile进行vim编辑操作。

 -g 表示生成调试信息,表示该可执行程序是可以被调试的

 我们的依赖关系是myprocess依赖于源文件myprocess.c,$@对应的是左依赖列表,也就是myprocess,$^对应的是右依赖列表,对应的是myprocess.c

.PHONY表示我们的依赖关系是一个伪目标,我们不需要关心依赖关系,我们来看依赖方法:依赖方法是强制删除myprocess文件,并且.PHONY修饰的目标总是被执行。

接下来,我们对源文件进行文本编辑

我们的源文件只是打印几句话。

 输入make指令,再调用可执行程序:

接下来,我们使用gdb指令进行调试:

 

 

 我们在第八行打一个断点

接下来,我们使用r指令,表示把调试指针跳转到断点位置。

 接下来,我们复制ssh渠道,然后通过行过滤查看名字中文件名含有myprocess的进程。

 

 这时候,我们的进程状态是t,t状态就表示该进程正在被调试。

t是tracing的缩写,表示我们的进程正在被调试

Z:僵尸状态:

为什么要有僵尸进程呢?

 僵尸进程的定义:一个进程正常的退出,但是没有被回收(父进程或者操作系统),那么该进程就是僵尸进程

那么我们如何对僵尸进程进行实验呢?

答:我们创建一个子进程,然后对父进程不处理,让子进程正常退出。

我们进行实验:

我们的思路是调用fork函数:

 fork函数的作用是创建一个子进程,假如函数调用成功的时候,子进程的pid返回给父进程,并且把0返回给子进程,失败的话,-1返回给父进程,子进程不会被创建,并且设置对应的错误信息。

我们进行实验:

我们首先对没有process.c的文件进行文本编辑

 exit函数可以退出一个进程。

当id为0时,就表示该语句中的进程是子进程,如果id不为0,就表示该进程是父进程

当id为0时,我们打印子进程的pid和ppid,然后休眠五秒,退出该进程。

当id不为0时,我们让父进程执行死循环:打印父进程的pid和ppid,然后休眠。

这样,子进程就会退出,但是父进程会一直运行。

 接下来,我们调用可执行程序:

 随着进程的运行,我们发现,子进程已经退出,但是父进程一直在不停的运行。

 我们查看进程的详细信息:

 我们的该条指令进行讲解:while :;do表示死循环显示,ps axj表示显示进程,head -1表示显示进程的标题,grep myprocess表示行过滤myprocess,grep -v表示过滤掉grep指令对应的进程,sleep表示休眠一秒。

 这里的z就表示僵尸进程:

 

上面的进程是父进程,下面的进程是子进程,父进程继续运行,子进程已经退出,但是资源还没有被回收,这时候的子进程就是僵尸进程。

接下来,我们退出myprocess

 然后再看对应的进程信息

 这时候,什么都不显示了。

父进程对僵尸进程没有回收会导致内存泄漏

僵尸进程:进程退出并且父进程没有读取到子进程的返回代码时会产生僵尸进程。

僵尸进程会以终止状态保持在进程表,并且一直等父进程来回收返回代码。

只要子进程已经退出,父进程还在运行,但父进程没有读取到子进程的返回代码,该子进程就是僵尸进程。

 僵尸进程的危害

僵尸进程的退出状态会被维持下去,直到父进程回收子进程的返回代码,但是父进程一直没有回收,维护退出状态本身就是一个进程数据,所以我们也要维持PCB。

一个父进程创建了很多子进程,子进程退出但是父进程不回收,就会造成内存资源的浪费。

 孤儿进程

父进程先退出,剩下的子进程就是僵尸进程

我们进行实验:

我们对myprocess进行文本编辑:

 make之后,调用可执行程序:

 首先,我们可以先实验僵尸进程:

我们先找到子进程对应的pid

 我们使用kill指令杀掉该子进程:

这时候,这个子进程就变成了僵尸进程。

我们接下来,实验孤儿进程。

我们重新调用可执行程序

 

 我们杀掉父进程:

接下来,查看进程状态:

 我们这里有一个问题:无论是父进程,还是子进程,都有自己对应的父进程,那么我们杀掉我们的父进程,这个父进程依然有他自己的父进程,为什么没有出现僵尸进程呢?

答:我们杀掉的这个进程的父进程是bash,bash及时的把该进程的资源回收了,所以没有出现僵尸进程。

我们杀掉这个进程对应的父进程之后,这个进程的父进程的pid就变成了1,这里的1指的是操作系统,这里的1号进程就是操作系统,1号进程领养的这个子进程就叫做孤儿进程。

为什么操作系统要成为孤儿进程的父进程呢?

答:这是必须的,因为该子进程的父进程已经死亡,假如操作系统不干预的话,当该子进程结束的时候,因为没有父进程对资源进行回收,该子进程就变成了僵尸进程,所以我们的操作系统及时的接手了这个子进程,当子进程结束的时候,对其资源进行回收。

 我们发现,原来的子进程变成了孤儿进程,它的进程状态由原来的S+变成了S,表示当子进程变成孤儿进程时,该子进程会变成后台进程

后台进程的特点:

1:我们无法通过CTRL+c退出后台进程:

 2:进程在运行时,我们依旧可以运行指令:

 3:该进程只能被kill指令杀死。

总结:

孤儿进程:当子进程存在,父进程退出时,该子进程就变成了孤儿进程

孤儿进程的特点:

1:孤儿进程由操作系统领养,领养的原因是为了防止孤儿进程退出之后,由于没有对孤儿进程的资源回收导致该进程变成僵尸进程。

2:前台进程创建的子进程,假如该子进程变成了孤儿进程后,孤儿进程会变成后台进程。

 进程优先级:

问题1:什么叫做优先级?

答:我们进行思考:权限和优先级是什么关系:首先,权限限制了能做与不能做,例如:只读的文件就不能进行写。优先级则是先做和晚做的问题。

问题2:为什么存在优先级?

答:因为资源太少了,这里的资源指的是cpu,我们的cpu很少,所以我们要把重要的进程的优先级设置的高一些,不重要的进程的优先级设置的低一些。

我们来查看优先级:

 

PRI和NI一起决定进程的优先级。

 我们进行实验:

 我们写一个简单的死循环程序。

make之后,我们调用该可执行程序

 我们显示所有进程的详细信息。

我们发现,所有的进程的PRI和NI的值都一样。

我们要知道,PRI和NI的全拼英文,方便我们理解:

PRI是单词priority的缩写,这个单词的汉语是优先权

NI是单词nice的缩写,没什么具体的含义。

最终优先级=老的优先级+NICE

接下来,我们试着通过调整nice值来控制进程的优先级。

 make之后,我们调用可执行程序:

 我们输入top指令:

 这里显示的是所有进程的优先级,然后我们输入r,这里的r是renice的缩写,表示重新输入nice值

 这里的default的默认的意思,默认的pid是1450,我们输入我们调用程序的进程编号:

 表示我们输入进程3342的nice值,我们先输入-100进行尝试:

 但是我们发现该进程的NI值只有-20,因为NI的最小值是-20

我们重新设置NI,看看NI值的取值范围:

 我们设置NI的值为100

 所以NI的取值是[-20,19]

我们再把NI的值改成9试试:

所以PRI的初始值永远都是80。

最终优先级=原来的优先级(80)+NI值。

 其他概念:

1:竞争性:系统进程数目众多,而cpu只有很少甚至只有一个,所以进程之间是存在进程属性的,进而引入了优先级。

2:独立性:多进程运行,需要独享各种资源,多进程之间互不干扰

3:并行:多个进程在多个cpu下同时运行,叫做并行

4:并发:多个进程在一个cpu下采用进程切换的方法,在一段时间内,让多个进程都得以推进,这就叫做并发。

 我们提出一个问题:父子进程之间有独立性吗?

我们进行实验:

 我们对myprocess.c进行文本编辑:

对于子进程,我们把指针p设置为空指针,对空指针的解引用会造成野指针的问题,程序会崩溃,我们make之后,对程序进行运行。

我们发现,子进程已经崩溃了,但是父进程依旧正常运行,所以父子进程之间也具有独立性。

进程切换:

 这个大圆代表的是cpu,小方框代表的是寄存器,一个cpu中有一整套寄存器。

当一个进程要运行时,首先把进程的pcb的地址加载到寄存器上,pcb上存储的是进程的属性,pcb指向进程的代码和数据,所以我们可以通过pcb来访问进程的数据,把进程上的数据放到寄存器上,方便cpu进行计算。

pc/eip

pc/eip是cpu上寄存器的一种,它上面存储的是当前执行指令的下一个指令的地址,我们通过pc/eip来实现指令的切换。

cpu只会做三件事情:取指令(pc/eip),分析指令,执行指令。

当我们的进程在运行的时候,一定会产生非常多的临时数据,这些临时数据存储在寄存器上,但是这些临时数据并不属于寄存器还是属于该进程

进程切换的理解:

进程在运行的时候,占有cpu,并非进程结束的时候,cpu才被释放,每一个进程在运行时,都有自己的时间片,当时间片到时,前一个进程会被剥离出cpu,下一个进程开始执行。

但是假如我们的前一个进程并没有执行完毕,我们执行后一个进程,这时候,当前一个进程回来时怎么办,难道让前一个进程重新执行吗?

答:并不是:进程切换是这样的:进程A首先在cpu上被执行,进程A在执行期间会产生很多的临时数据,这些临时数据存储在寄存器上,当进程A的时间片结束时,我们把寄存器上属于进程A的数据和代码的执行情况放置到进程A的PCB上,轮到进程B执行,当再次轮到进程A时,进程A的pcb会把进程A的数据和代码的执行情况重新返回给寄存器,然后cpu根据进程A代码的执行情况延续之前的继续执行。

当进程在切换时,要进行上下文的保护

当进程在恢复运行时,要进行上下文的恢复。

上下文指的是寄存器上存储的进程的数据和代码的执行情况。

保护指的是把进程的数据和代码的执行情况放置到进程的pcb中

恢复指的是把pcb中的进程的代码和数据放回到cpu上的寄存器中。

环境变量:

我们对myprocess.c进行文本编辑

 我们写一个死循环代码:

make之后,我们调用该可执行程序

 我们发现一个问题:我们知道,这里的myprocess其实本质上也是指令,为什么myprocess的执行需要我们./,而普通的指令却不需要呢?

本质是这样的:要执行一个指令,首先要知晓指令所在的位置,./表示的是当前路径,表示我们myprocess指令的位置在当前路径,有了路径,我们就可以执行程序了。

 假如我们想要不加上./就可以执行该指令的话,我们可以这样做:

 表示把我们的指令拷贝到用户的指令集中,这样,相当于我们的指令的位置是可以被只晓得,我们直接输入指令就可以调用。

不建议这么干,因为我们的指令没有经过测试。

 PATH:全局的环境变量

假如我们想要看全局的环境变量时,我们可以这样写:

 这就是我们全局的环境变量。

假如我们不想用./调用进程的话,我们可以这样做

我们先显示当前位置的路径:

 我们可以这样写:

 这时候,我们不用./就可以调用myprocess

 但是我们输入其他的指令却提示我们指令找不到了

因为我们把当前路径赋值给了环境变量,我们可以这样写:

 

 表示把老的环境变量和当前位置赋值给新的环境变量,这样我们既可以调用myprocess,也可以使用普通指令了:

echo +$:

 history显示最近使用的指令:

 

 env查看所有的环境变量

 

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

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

相关文章

nestjs初始化项目

安装nestjs脚手架 npm i -g nestjs/cli初始化项目 nest new <project-name>说明初始化项目成功 结构说明 node_modules:项目所有的依赖src: 项目的主题test: 项目测试目录.eslintrc.js: eslint约束.gitignore: git上传忽略文件nest-cli.json: nest项目配置文件package…

《C++程序设计原理与实践》笔记 第12章 一个显示模型

本章介绍了一个显示模型(display model)&#xff08;GUI的输出部分&#xff09;&#xff0c;并给出了使用示例和基本概念&#xff0c;例如屏幕坐标、线和颜色等。 12.1 为什么需要图形&#xff1f; 我们为什么用四章的篇幅介绍图形以及一章介绍GUI&#xff1f; 图形很有用。…

通信原理笔记—基带信号的波形设计与编码

目录 引言&#xff1a; 基带传输系统的基本模型&#xff1a; 基带信号的波形设计与编码&#xff1a; 数字信号的波形设计原则&#xff1a; 基带信号的基本波形&#xff1a; 常用的二进制码型&#xff1a; 单极性不归零码&#xff1a; 双极性不归零码&#xff1a; ​编辑…

RTI Connext DDS代码生成器

0 简介RTI代码生成器Code Generator,创建用RTI ConnextDDS定义define和注册register用户数据类型所需的代码。在以下情况下&#xff0c;使用代码生成器是可选的&#xff1a;您正在使用动态类型&#xff08;请参阅RTI Connext DDS核心库用户手册[RTI ConnextDDS Core Libraries …

新来一个卷王,天天加班到12点,太让人崩溃......

在程序员职场上&#xff0c;什么样的人最让人反感呢&#xff1f; 是技术不好的人吗&#xff1f;并不是。技术不好的同事&#xff0c;我们可以帮他。 是技术太强的人吗&#xff1f;也不是。技术很强的同事&#xff0c;可遇不可求&#xff0c;向他学习还来不及呢。 真正让人反…

2023全网汇总PMP备考攻略(附答题技巧资料)

一&#xff0c;多复习和学习新版考纲 01《PMBOK》看三遍 这边建议看三遍《PMBOK》&#xff0c;更有利于我们巩固知识&#xff0c;查缺补漏。 第一遍 第一遍是老师带着我们去看。这个时候一定要非常专心&#xff0c;千万不要上课走神或者玩手机。因为这一遍老师会告诉我们&a…

结构型设计模式 Structural Patterns :适配器 Adapter(C++ 实现)

文章大纲 适配器简介对象适配器类适配器C++ 实现代码参考文献与学习路径Structural PatternsAdapterMatch interfaces of different classesBridgeSeparates an object’s interface from its implementationCompositeA tree structure of simple and composite objectsDecorat…

C#中的那些警告如何去除?完全去除C#警告

一般在c中没有使用的变量会有警告&#xff0c;C#中也有&#xff0c;在QT中我们利用Q_UNSED可以直接消除这些警告&#xff0c;那么我们在C#中该如何做才能消除这些不必要的警告呢&#xff1f;经过查询微软官方网站发现&#xff0c;有的找到了解决方法&#xff0c;有的仍然一筹莫…

学习bootstrap怎么样?

想必学习前端的都知道这个响应式框架&#xff0c;之前我接触这个框架的时候是在学习前段页面设计的进阶教程是接触的&#xff0c;那个时候要做那种登陆注册界面&#xff0c;里面的输入框很让人头疼有时候电脑的宽度不一样或者是写了一个精美的网页然后放到手机上的时候就变了模…

【C++】继承(基类和派生类的关系、菱形虚拟继承、继承和组合)

文章目录1、继承的概念和定义2、基类和派生类的赋值转换3、继承中的作用域4、派生类的默认成员函数5、继承与友元和静态成员6、复杂的菱形继承及菱形虚拟继承7、继承和组合1、继承的概念和定义 继承是面向对象程序设计上程序复用的重要手段&#xff0c;以往接触的复用都是函数复…

程序员的自律之路

世界的精彩不是单纯的美丽&#xff0c;毕竟丑恶也是美丽的食粮&#xff0c;黑暗也是光明的救世主 很久没有写博客了&#xff0c;最近半年不太稳定&#xff0c;也经历了一些自我成长的东西。 事后我进行深度反省&#xff0c;思考一个人或者说是一个程序员的失控原因到底是什么&a…

推荐几款好用的企业级文档管理软件

知识库&#xff0c;又称为智能数据库或人工智能数据库。知识库的概念来自两个不同的领域&#xff0c;一个是人工智能及其分支-知识工程领域&#xff0c;另一个是传统的数据库领域。由人工智能&#xff08;AI&#xff09;和数据库&#xff08;DB&#xff09;两项计算机技术的有机…

Java字符串查找(3种方法)

在给定的字符串中查找字符或字符串是比较常见的操作。字符串查找分为两种形式&#xff1a;一种是在字符串中获取匹配字符&#xff08;串&#xff09;的索引值&#xff0c;另一种是在字符串中获取指定索引位置的字符。根据字符查找String 类的 indexOf() 方法和 lastlndexOf() 方…

金融公司在 2022 年扩大了对下一代技术的投资

根据 Broadridge Financial Solutions, Inc. 的一份新报告&#xff0c;大多数金融服务公司现在认为数字化转型对其业务至关重要&#xff0c;并且已经在寻求下一波技术来帮助取得成功。 在对 500 名最高管理层高管及其在全球买方和卖方的直接下属进行的 2023 年数字化转型和下…

代码随想录算法训练营第五十七天_第九章_动态规划 | 1143.最长公共子序列、1035.不相交的线、53. 最大子数组和 动态规划

LeetCode 1143.最长公共子序列 视频讲解https://www.bilibili.com/video/BV1ye4y1L7CQ文章讲解https://programmercarl.com/1143.%E6%9C%80%E9%95%BF%E5%85%AC%E5%85%B1%E5%AD%90%E5%BA%8F%E5%88%97.html 思路&#xff1a;代码&#xff1a;LeetCode 1035.不相交的线 视频讲解h…

技术开发119

技术开发119 业务内容&#xff1a; 汽车零部件的制造产业用机械零部件的设计、制造、组装电机零部件的制造 公司简介&#xff1a; 董事长&#xff1a;管原胜安 资本金&#xff1a;3200万日元 员工数&#xff1a;36名 成立时间&#xff1a;1972年7月 资格认证&#xff1a…

【学习笔记】coursera | Computational Neuroscience | Week 1

Course Introduction 1.1 Course Introduction 三种模型 Descriptive models of the brain&#xff08;描述型, what&#xff09;&#xff1a;神经元如何对外部刺激做出反应&#xff1f;用神经元编码模型如何量化描述&#xff1f;如何从神经元中获取信息&#xff08;解码&am…

Linux 中 su 命令的使用

目录 &#x1f34d;①普通用户切换 root 用户 &#x1f349;②root 用户切换普通用户 su 命令的作用是在 Linux 中切换用户&#xff0c;是英文单词&#xff1a;Switch&#xff08;切换&#xff09; User&#xff08;用户&#xff09; 的缩写。 语法&#xff1a; su [-] 用户…

三维引擎大盘点

近年&#xff0c;智慧城市、数字孪生大热&#xff0c;三维引擎就成为了绕不过去的一个词&#xff0c;但是目前市场的的三维引擎多的让人头晕目眩&#xff0c;他们各自都有哪些优缺点呢&#xff0c;今天我们就来盘点下主流的三维引擎。 常见的三维引擎按平台可分为客户端三维引擎…

1613_PC汇编语言_位操作

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 这一次看一下位操作的章节。 如果是逻辑位操作其实不需要考虑大小端。 1. 移位操作在快速乘除法中经常用到。 2. 这里提到了一个算是移位&#xff0c;其实跟前面的…