【Linux】进程状态和进程优先级

🌈个人主页: 秦jh__https://blog.csdn.net/qinjh_?spm=1010.2135.3001.5343
🔥 系列专栏: https://blog.csdn.net/qinjh_/category_12625432.html

目录

进程状态

R状态和S状态

T/t状态

D状态

Z(zombie)-僵尸进程

僵尸进程危害

孤儿进程

进程的阻塞、挂起、运行

阻塞态

挂起态

进程切换话题

进程优先级

基本概念

查看系统进程

[PRI and NI](#PRI and NI)

查看进程优先级的命令

用top命令更改已存在进程的nice:

其他概念


前言

💬 hello! 各位铁子们大家好哇。

今日更新了Linux进程状态、优先级的内容

🎉 欢迎大家关注🔍点赞👍收藏⭐️留言📝

进程状态

  • R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列 里。
  • S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠 (interruptible sleep))。
  • D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的 进程通常会等待IO的结束。
  • T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可 以通过发送 SIGCONT 信号让进程继续运行。
  • X死亡状态(dead):这个状态只是一个返回状态,你不会在任务列表里看到这个状态。

R状态和S状态

我们把进程跑起来后,发现进程的状态一直是休眠状态。如果我们把打印一行代码注释掉,重新跑起来,结果如下图:

此时进程的状态一直是运行状态。这是因为打印时,需要显示器显示,也就是需要外设,而cpu的速度非常快,所以大部分时间,cpu都是在等待设备资源是否就绪。而不打印时,只使用cpu资源,此时就都是R状态。

当我们在后面加上&时,这个进程就默认在后台运行了。此时S后面就没有+号了,有+号就是在前台运行。此时不能直接ctrl+c终止进程,得用kill才可以。


T/t状态

kill -l指令,我们可以查看所有的信号,这里我们需要19号信号。

kill -19指令,我们可以让进程暂停,就是T状态。如果想让它继续跑起来,就是需要指令

kill -18,让它恢复,如下图:

注意:如果一个进程如果曾经是暂停状态,它会自动变成后台,所以S后面的+号不见了。

我们取调试一个进程,我们在中间打了一个断点。开始运行时,是S状态,到了断点处,就是变成t状态,我们再continue,让他继续跑,进程状态又变成了S,跑完后,又变成t。

T和t可以认为是一样的,只是t表示的是进程因为追踪而暂停了。


D状态

D状态是Linux系统比较特有的一种进程状态!

Linux操作系统有权杀掉进程来释放空间。

通过一个例子认识D状态:

开机时,操作系统就会先加载到内存中。假设现在有一个进程,需要向磁盘存入大量数据,需要一段时间来完成。由于内存中的进程越来越多,操作系统就把刚刚那个进程给杀掉了。此时磁盘还没把这个任务完成,又因为又有别的进程需要用到磁盘工作,磁盘就只好把最开始那个进程给的任务给丢了。如果该进程非常重要,后果就不堪设想。

所以就有D状态,使操作系统无法杀掉该状态的进程。

想消除这个状态,有两种情况:

1.该进程的任务完成了,就能自己醒来。

2.重启,不过可能会卡死,此时就只能断电了。

Z(zombie)-僵尸进程

  • 僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程(使用wait()系统调用,后面讲) 没有读取到子进程退出的返回代码时就会产生僵死(尸)进程
  • 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。
  • 所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态

上图可看到,子进程停止后,子进程就变成了Z状态。该进程就是僵尸进程。

僵尸进程:已经运行完毕,但是需要维持自己的退出信息,在自己的进程task_struct会记录自己的退出信息,未来让父进程来读取,如果没有父进程读取,僵尸进程会一直存在!

僵尸进程会保留内核数据结构task_struct,但进程的代码和数据就不存在了。

僵尸进程不能kill掉,因为僵尸进程已经死掉了。

僵尸进程危害

  • 进程的退出状态必须被维持下去,父进程如果一直不读取,那子进程就一直处于Z状态。
  • 维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中。
  • 如果一直不回收,就会造成内存泄漏。

孤儿进程

  • 父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?
  • 父进程先退出,子进程就称之为"孤儿进程"
  • 孤儿进程被1号进程(OS)本身领养,从而保证子进程被正常回收。

运行后,父进程先退出,进程就只剩一个子进程,也就是孤儿进程。

为什么我们平常启动的进程不会有僵尸进程问题呢?

答:因为直接在命令行中启动的进程,它的父进程都是bash,bash会自动回收新进程的Z

进程的阻塞、挂起、运行

上图的操作系统的进程状态图,也就是一张图纸。Linux的各种进程状态就是具体实现。

  • task_struct会被放进运行队列中。在Linux中,被放进运行队列,对应的就是R状态。但OS会具体区分就绪状态和运行状态。 在运行队列中,就说明可以随时被调度了。
  • 一个进程持有cpu,不会一直运行到该进程结束。而是基于时间片进行轮转调度。如果时间结束了,进程也结束了,就没啥事。如果时间到了,但进程还没结束,就会把该进程放到尾部,接着下一个进程进行轮换。
  • 这样多个进程以切换的方式进行调度,在一个时间段内同时得以推进代码,就叫并发。
  • 如果有两个cpu,在任何时刻,都有多个进程在真的同时跑,就叫做并行。

注意:Linux不是这么调度的。这只是操作系统教材调度算法的一种。

阻塞态

当我们不输入数字时,进程是阻塞的。在Linux当中,相当于S状态。

当我们运行后,没输入数字时,如下图:

系统会等待键盘资源是否就绪。每种设备都有自己的wait_queue等待队列,上方进程的键盘资源还没就绪,就会把对应的task_struct放到对应设备的等待队列中(即键盘),此时就是阻塞进程了,不会被调度。直到键盘资源就绪后,又回到cpu的运行队列中,从scanf开始执行后面的代码。

  • 阻塞和运行的状态变化,往往伴随着pcb被连入不同的队列中。
  • 入队列的不是进程的代码和数据,而是进程的task_struct。

挂起态

磁盘中有一个swap分区,大小大概是内存的1到2倍。 当我们的OS内存严重不足的时候,如果有进程处于阻塞态,OS就会把该进程的数据和代码唤出到磁盘的swap分区,从而释放空间,但该进程的task_struct还是保留的。唤出后的状态叫阻塞挂起态。等到调度时,才会把该进程重新唤入内存中。

进程切换话题

假设有上方代码是进程1,当进程1时间片到了,但是进程还没结束时。cpu寄存器就会把此时的临时数据存到task_struct中。然后进行进程2,如果进程2曾经也没跑完,就会把进程2的task_struct里面的上下文数据恢复到cpu中,然后从历史的进度继续执行。这就叫进程的切换。

cpu内部的所有寄存器中的临时数据,叫做进程的上下文。

进程在切换时,最重要的事是:上下文数据的保护和恢复。

cpu寄存器本身是硬件,具有数据的存储能力。cpu的寄存器硬件只有一套。

cpu的内部数据可以有多套,有几个进程,就有几套和该进程对应的上下文数据。

进程优先级

基本概念

  • cpu资源分配的先后顺序,就是指进程的优先权(priority)。
  • 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。
  • 还可以把进程运行到指定的CPU上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整 体性能。
  • 操作系统关于调度和优先级的原则:分时操作系统,维持基本的公平。

查看系统进程

在linux或者unix系统中,用ps --l命令(只会显示当前终端的进程)则会类似输出以下几个内容:(这里使用ps -al) :

PRI and NI

  • PRI :进程优先级。其值越小,优先级越高。
  • NI :进程优先级的修正数据,nice值,新的优先级=旧的优先级+nice,
  • 调整进程优先级,在Linux下,就是调整进程nice值
  • nice其取值范围是-20至19,一共40个级别。

查看进程优先级的命令

用top命令更改已存在进程的nice:

  • top
  • 进入top后按"r"-->输入进程PID-->输入nice值

我们把nice值改为100。结果如下图:

NI只是变成19,说明NI值是有范围的。

当我们第二次想修改nice值时,提示不能修改。这是因为nice值不能被频繁修改,此时我们需要切换到root用户才能修改。

刚刚我们的PRI是99,为什么现在nice值是-10,但新的PRI变成70了?

因为每次调整优先级,都是从80开始的。

其他概念

  • 竞争性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高 效完成任务,更合理竞争相关资源,便具有了优先级
  • 独立性: 多进程运行,需要独享各种资源,多进程运行期间互不干扰
  • 并行: 多个进程在多个CPU下分别,同时进行运行,这称之为并行
  • 并发: 多个进程在一个CPU下采用进程切换的方式,在一段时间之内,让多个进程都得以推进,称之为并发
相关推荐
真真-真真4 分钟前
WebXR
linux·运维·服务器
轩辰~26 分钟前
网络协议入门
linux·服务器·开发语言·网络·arm开发·c++·网络协议
wanhengidc1 小时前
短视频运营行业该如何选择服务器?
运维·服务器
雨中rain1 小时前
Linux -- 从抢票逻辑理解线程互斥
linux·运维·c++
-KamMinG2 小时前
Centos7.9安装openldap+phpldapadmin+grafana配置LDAP登录最详细步骤 亲测100%能行
运维·grafana
Bessssss2 小时前
centos日志管理,xiao整理
linux·运维·centos
s_yellowfish2 小时前
Linux服务器pm2 运行chatgpt-on-wechat,搭建微信群ai机器人
linux·服务器·chatgpt
豆是浪个2 小时前
Linux(Centos 7.6)yum源配置
linux·运维·centos
vvw&2 小时前
如何在 Ubuntu 22.04 上安装 Ansible 教程
linux·运维·服务器·ubuntu·开源·ansible·devops
我一定会有钱2 小时前
【linux】NFS实验
linux·服务器