【Linux】关于进程的理解、状态、优先级和进程切换

这篇具有很好参考价值的文章主要介绍了【Linux】关于进程的理解、状态、优先级和进程切换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【Linux】关于进程的理解、状态、优先级和进程切换

📝一、操作系统进程

进程不同的状态本质都是在满足不同的运行场景的

1.运行队列

  • 运行队列

进程如何在CPU上运行的:CPU在内核上维护了一个运行队列,进行进程的管理。让进程入队列,本质就是将该进程的task_struct 结构体对象放入运行队列之中。

2.运行状态

  • 运行状态

进程PCB在运行队列里就是运行状态,不是说这个进程正在运行,才是运行状态。

状态是进程内部的属性,所有的属性在PCB里

进程不只是意味着占用CPU资源,也有可能随时要外设资源

  • 阻塞状态

进程不在运行队列之中,进程不能直接被调度,而是在等待外设资源的状态。本质是对tack_struct对象放到不同的队列中!

综上,所谓的进程不同的状态,本质是进程在不同的队列之中,等待某种资源

  • 挂起状态

如果系统中存在许多进程,进程短期内不会被调度,代码和数据在短期内不会被执行,此时如果内存空间不足,操作系统就可以把代码和数据暂时保存到磁盘上,节省一部分空间,该进程暂时被挂起了,这就是挂起状态。

对于阻塞状态和挂起状态,阻塞不一定挂起,挂起一定是阻塞

这些都是概念性的,对于Linux下具体的又是什么样子的呢👇


📝二、Linux进程状态

为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在Linux内核里,进程有时候也叫做任务)。下面的状态在kernel源代码里定义

/*
* The task state array is a strange "bitmap" of
* reasons to sleep. Thus "running" is zero, and
* you can test for combinations of others with
* simple bit tests.
*/
static const char * const task_state_array[] = {
"R (running)", /* 0 */
"S (sleeping)", /* 1 */
"D (disk sleep)", /* 2 */
"T (stopped)", /* 4 */
"t (tracing stop)", /* 8 */
"X (dead)", /* 16 */
"Z (zombie)", /* 32 */
};

R运行状态(running)、S睡眠状态(sleeping) 、D磁盘休眠状态(Disk sleep) 、T停止状态(stopped) 、X死亡状态(dead)

我们来一起看看Linux下运行状态(R)的样子:

【Linux】关于进程的理解、状态、优先级和进程切换

创建myprocess.c:

【Linux】关于进程的理解、状态、优先级和进程切换

【Linux】关于进程的理解、状态、优先级和进程切换

修改一下:

【Linux】关于进程的理解、状态、优先级和进程切换

【Linux】关于进程的理解、状态、优先级和进程切换

这是因为printf需要去访问外设显示器,外设比较慢,需要等待花时间(相对于CPU而言)。

我们可以来看看T状态

【Linux】关于进程的理解、状态、优先级和进程切换

而对于S来说是浅度睡眠,可以被终止,D是深度睡眠,无法被OS杀掉,只能通过断电、自己醒来进行解决。这里简单了解一下即可。

t状态:

【Linux】关于进程的理解、状态、优先级和进程切换

这也是一种暂停状态,tracing stop表示该进程正在被追踪


📝三、两个特殊进程

进程退出的时候不能立即释放该进程对应的资源!保存一段时间,让对应的父进程/操作系统进行读取

1.僵尸进程

僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵死(尸)进程

下面,我们可以通过具体的例子来看一看僵尸进程,进程退出,但是没有被回收(父进程、OS)。我们可以通过创建一个子进程,让父进程不退出,让子进程正常退出(exit(1)):

【Linux】关于进程的理解、状态、优先级和进程切换

监控脚本命令:

while :; do ps axj | head -1 && ps axj | grep myprocess | grep -v grep; sleep 1; done

【Linux】关于进程的理解、状态、优先级和进程切换

右侧运行一段时间后出现Z状态:

【Linux】关于进程的理解、状态、优先级和进程切换

defunct的意思是失效的,也就是进程是已经死亡的,但是没有被回收。把左侧终止,在执行上面监视的命令,就不存在上面的进程了,这是因为把父子进程都终止的时候,操作系统自动回收了

【Linux】关于进程的理解、状态、优先级和进程切换

这就是僵尸进程。内存泄漏不仅仅只体现在malloc\new上,在系统中也会存在。

僵尸进程的危害

进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。父进程如果一直不读取,那子进程就一直处于Z状态
维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说, Z状态一直不退出, PCB一直都要维护
那一个父进程创建了很多子进程,就是不回收,就会造成内存资源的浪费,因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间

2.孤儿进程

父进程先退出,子进程就称之为“孤儿进程”

孤儿进程被1号init进程领养,由init进程回收。

话不多说,我们直接通过一小段代码来看一看:

【Linux】关于进程的理解、状态、优先级和进程切换

先来看一看z状态(杀掉子进程):

【Linux】关于进程的理解、状态、优先级和进程切换

现在重新启动进程(杀掉父进程):

【Linux】关于进程的理解、状态、优先级和进程切换

父进程结束掉没有看到它的僵尸状态:父进程也有父进程,都是bash的子进程,所以bash这个进程把父进程的资源回收了

【Linux】关于进程的理解、状态、优先级和进程切换

此时的30418变成1了:1就是对应的操作系统。子进程被1号领养的就是孤儿进程。

父进程先退出的现象是一定存在的,子进程会被操作系统领养(1号进程),这是为了回收子进程退出的时候对应的僵尸,管理子进程

被领养的进程就是孤儿进程。

【Linux】关于进程的理解、状态、优先级和进程切换

同时,子进程以前的状态是S+,现在变成了S,如果前台进程创建的子进程,如果变成孤儿会自动变成后台(此时用ctrl+C杀不掉,只能用kill解决)

【Linux】关于进程的理解、状态、优先级和进程切换


📝四、进程优先级

1.优先级概念

  • 优先级

对于优先级的理解,决定的是对于获取资源的先后顺序的能力。优先级高的先获得,优先级低的反之

存在的原因:资源太少,需要进行分配

cpu资源分配的先后顺序,就是指进程的优先权(priority)。

优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。

  • Linux优先级

优先级本质就是pcb里面的一个/几个整数数字

2.查看系统进程

在linux或者unix系统中,用ps –la命令则会类似输出以下几个内容 :

【Linux】关于进程的理解、状态、优先级和进程切换

UID : 代表执行者的身份
PID : 代表这个进程的代号
PPID :代表这个进程是由哪个进程发展衍生而来的,即父进程的代号
PRI :代表这个进程可被执行的优先级,其值越小越早被执行(就像成绩排名一样,越小越好)
NI :代表这个进程的nice值

3.PRI和NI

在Linux中由两个整数确定优先级:PRI(priority)和NI(nice)

在Linux下可以认为最终的优先级= 老的优先级+NI

注意:Linux下老的优先级默认值为80!而NI也就是nice值也有取值范围。取值范围是[-20,19],也就意味着优先级是有取值范围的[80-21,80+19]对于nice值的取值范围我们后面会做演示

在Linux下支持进程在运行中进行优先级调整的,调整的策略就是更改nice完成的,也就是说会受到nice值影响(但是一般情况下不修改)

但是大部分情况下,nice值是默认的也就是0:

【Linux】关于进程的理解、状态、优先级和进程切换

【Linux】关于进程的理解、状态、优先级和进程切换

这里的PRI优先级是80,下面我们可以对其进行更改

4.top命令更改nice

步骤1:sudo top

步骤2:进入top后输入r然后在输入进程的pid(进入进程)输入要修改nice的值

【Linux】关于进程的理解、状态、优先级和进程切换

【Linux】关于进程的理解、状态、优先级和进程切换

这里还是80,下面开始用top对其进行更改(输入sudo top然后在输入r):

【Linux】关于进程的理解、状态、优先级和进程切换

【Linux】关于进程的理解、状态、优先级和进程切换

  • 开始修改值

在输入要修改的值,这里以-100为例子,出现以下情况(最终变成-20):

【Linux】关于进程的理解、状态、优先级和进程切换

这里在修改成100,出现以下情况(最终变成19):

【Linux】关于进程的理解、状态、优先级和进程切换

注意:调优先级并不意味着你可以随便调,这是操作系统不允许的,会导致调度失衡。所以有着一定的取值范围

nice的取值范围是[-20,19],一共40个数字

如上就是Linux优先级的内容,这里简单了解一下。

5.特性

竞争性:系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级
独立性:多进程运行,需要独享各种资源,多进程运行期间互不干扰
并行:多个进程在多个CPU下分别,同时进行运行,这称之为并行
并发:多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发

这里的独立性对于父进程和子进程是否还是存在?yes

int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        while(1)
        {
            printf("this is child process,pid: %d,ppid:%d\n",getpid(),getppid());
            sleep(1);
            int *p = NULL;
            *p = 100;//野指针                                                           
         }
     }
    else
    {
        while(1)
          {
              printf("this is parent process,pid:%d,ppid:%d\n",getpid(),getppid());
              sleep(1);
          }
    }
}

【Linux】关于进程的理解、状态、优先级和进程切换

【Linux】关于进程的理解、状态、优先级和进程切换

子进程崩溃并没有影响父进程


📝五、进程切换

1.并发

多进程在同一CPU下通过采用进程不断切换的方式让一个单CPU计算机在一个时间段内同时让多个进程代码同时推进的现象称为并发

采用进程切换的方式在一个时间段内不同的进程都可以把代码跑起来,同时推进

2.进程如何切换

一个CPU里面存在一套硬件寄存器,宏观上寄存器分为用户可见,用户不可见

计算机调度某个进程时,CPU会把这个进程的PCB地址加载到某个寄存器,也就是说,CPU内有寄存器可以只找到进程的PCB地址

CPU里有一个eip寄存器(PC指针),指向当前执行指令的下一条指令的地址。

而进程运行的时候一定会产生很多的临时数据,但这些临时数据只属于当前进程,虽然CPU内部只有一套寄存器硬件,但是寄存器保存的数据只属于当前进程,也就是说,寄存器硬件不是寄存器内的数据,这是两码事,寄存器被所有进程共享,但是寄存器里的数据时每个进程各自私有的。

📄时间片引出

进程在运行的时候占有CPU,但是却不是一直占有到进程结束,进程都有自己的时间片!因为时间片的存在,进程会出现没有被执行完就被拿下去的情况,这时候问题来了:这个进程下一次如何在次回到CPU继续运行:

进程切换的时候,需要先进行上下文保护,这里的上下文指的是CPU里的寄存器的数据,而不是寄存器,这里简单理解为临时数据保存至PCB里,而当进程恢复运行的时候,要进行上下文的恢复,该进程在次回到CPU继续运行时,重新加载恢复这些数据。文章来源地址https://www.toymoban.com/news/detail-441547.html

到了这里,关于【Linux】关于进程的理解、状态、优先级和进程切换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】进程优先级 && 进程切换 && 环境变量

    目录 一、进程优先级  1、优先级概念  2、优先级特点  3、修改Linux下的优先级 二、进程切换  1、进程特性  2、进程切换 三、环境变量  1、基本概念  2、常见环境变量  3、查看环境变量方法  4、PATH环境变量  5、和环境变量相关的命令  6、环境变量的组织方式  7、通过

    2024年02月11日
    浏览(17)
  • 【Linux】详谈进程优先级&&进程调度与切换

             进程要访问某种资源,进程通过一定的方式排队,确认享受资源的优先顺序。计算机中资源过少,所以进程访问某种资源时需要排队。          进程的优先级其实就是PCB中的一个整形变量(int PRI)。Linux中进程的默认优先级是80,这个默认优先级是可以被修改

    2024年03月22日
    浏览(16)
  • Linux—进程状态、僵尸进程、孤独进程、优先级

    📘北尘_ :个人主页 🌎个人专栏 :《Linux操作系统》《经典算法试题 》《C++》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 为了弄明白正在运行的进程是什么意思,我们需要知道进程的不同状态。一个进程可以有几个状态(在 Linux内核里,进程有时候也叫做任务)

    2024年02月05日
    浏览(17)
  • Linux--进程状态与优先级

    进程指的是程序在执行过程中的活动。进程是操作系统进行资源分配和调度的基本单位 。 进程可以看作是程序的一次执行实体,它包含了程序代码、数据以及相关的执行上下文信息。操作系统通过创建、调度和管理多个进程来实现对计算机系统资源的有效利用。 每个进程都

    2024年02月01日
    浏览(17)
  • Linux进程状态及优先级

    本文已收录至《Linux知识与编程》专栏! 作者:ARMCSKGT 演示环境:CentOS 7 操作系统想管理好进程并不简单,对于Linux系统将进程分为不同的状态进行管理;例如运行,阻塞,休眠状态等等,每一种状态都有不同的效果,这样才能发挥他的全部功效,且进程之间也有优先级,本

    2024年02月03日
    浏览(15)
  • Linux_进程的优先级&&环境变量&&上下文切换&&优先级队列

    什么是优先级? 指定一个进程获取某种资源的先后顺序 本质是进程获取cpu资源的优先顺序 为什么要有优先级 进程访问的资源(CPU)是有限的 操作系统关于调度和优先级的原则:分时操作系统,基本的公平,如果进程因为长时间不被调整,就造成了饥饿问题 Linux的优先级特

    2024年04月09日
    浏览(18)
  • [Linux 进程(三)] 进程优先级,进程间切换,main函数参数,环境变量

    排队的本质就是确认优先级。 优先级是什么?它也是PCB中的一个整型字段 , 数值越小,优先级越高 。是得到某种资源的先后顺序。 Linux进程的优先级数值范围:60~99。 Linux中默认进程的优先级都是80。 为什么要有优先级 ?本质是资源不足。 谈到优先级,就不得不说我们以

    2024年01月21日
    浏览(11)
  • 【看表情包学Linux】进程优先级 | 查看系统进程 | 优先级修改 | 进程的切换 | 竞争性与独立性 | 并行并发的概念 | 环境变量

       🤣  爆笑 教程  👉 《看表情包学Linux》👈   猛戳订阅     🔥 ​ 💭 写在前面: 我们先讲解进程的优先级,探讨为什么会存在优先级,以及如何查看系统进程、进程优先级的修改。然后讲解进程的切换,首次介绍进程的竞争性、独立性,以及并行和并发的概念,在通

    2024年01月19日
    浏览(13)
  • 【从浅学到熟知Linux】进程状态与进程优先级(含进程R/S/T/t/D/X/Z状态介绍、僵尸进程、孤儿进程、使用top及renice调整进程优先级)

    🏠关于专栏:Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程等内容。 🎯每天努力一点点,技术变化看得见 操作系统进程状态概览(理论版),实际的一款操作系统进程状态与理论状态会有一定区别。↓↓↓ 新建状态 :字面意思,当进程刚创建时,就是新建状态。

    2024年04月18日
    浏览(20)
  • 【进程相关概念】面试常见问题,进程状态,进程优先级,并行与并发,进程通信等

    前言: 大家好,我是 良辰丫 ,今天我们来认识一下 进程 的相关概念,当接触到进程,也就意味着我们进入了javaEE的学习阶段,这篇文章主要带大家去学习一些面试题,帮助大家更好的去学习并熟悉进程,跟着我的步伐一起进入学习吧!!!💞💞💞 🧑个人主页:良辰针不戳 📖所属专栏

    2023年04月08日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包