【Linux】进程概念(下)

news2024/9/23 1:23:02

​🌠 作者:@阿亮joy.
🎆专栏:《学会Linux》
🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根
在这里插入图片描述

目录

    • 👉进程状态👈
      • 进程状态的普遍理解
      • Linux 系统的进程状态
        • 1.观察运行状态 R
        • 2.观察休眠状态 S
        • 3.查看暂停状态 T
        • 4.深度睡眠状态 D
        • 5.正在被追踪状态 t
        • 6.死亡状态 X
        • 7.僵尸状态 Z
    • 👉孤儿进程👈
    • 👉进程优先级👈
      • 基本概念
      • 查看进程优先级
      • PRI 和 NI
      • 修改 nice 值
    • 👉其他概念👈
    • 👉进程切换👈
    • 👉总结👈

👉进程状态👈

进程状态的普遍理解

操作系统的书籍一般都会给我们罗列出很多进程状态,比如:运行、新建、就绪、挂起、阻塞、等待和死亡等等。如此之多的概念,总会让我们学起来比较费劲。那操作系统会有如此之多的进程状态呢?其实是为了满足不同的运行场景。

对于人来说,对一件事的认识是不太可能建立在想象之上的。所以,我们先来了解一下操作系统的空间概念,看看普遍的操作系统层面是如何理解上面罗列的进程状态的。

运行、阻塞和挂起状态的讲解

在这里插入图片描述

Linux 系统的进程状态

以上是操作系统书籍对进程状态概念的定义,那么接下来我们就学习一下操作系统中具体的进程状态!

进程状态的描述

在这里插入图片描述

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

在这里插入图片描述

1.观察运行状态 R

在这里插入图片描述

在这里插入图片描述
上图的 R 就是运行状态,后面的 + 号以后会提及。

2.观察休眠状态 S

在这里插入图片描述

在这里插入图片描述

在我们看来,我们的程序是一致在运行的,那为什么进程状态是休眠状态呢?其实是因为 printf 函数是将字符串打印到显示器(外设)上的,而显示器的速度是比较慢的,需要等待显示器就行要花比较长的时间(对 CPU 而言)。所以 99 % 的时间都是等 IO 就绪,1% 的时间在执行打印代码,所以我们查到的进程状态绝大多数是休眠状态。

注:需要访问外设的进程,其状态绝大多数时间是休眠状态 S,也是阻塞状态的一种。

3.查看暂停状态 T

在这里插入图片描述

kill - 19 PID #使处于运行状态的进程改为暂停状态

在这里插入图片描述

注:暂停状态也是阻塞状态的一种,处于暂停状态的进程不知道是否被挂起,由操作系统决定。

kill - 18 PID #使处于暂停状态的进程改为运行状态

在这里插入图片描述

可以看到,此时的运行状态和最开始的运行状态相比,少了一个 + 号。能通过 Ctrl + c 键杀死的进程是前台进程,不能通过 Ctrl + c 键杀死的进程是后台进程。前台进程的状态比后台进程的状态多了一个 + 号。只能通过kill -9 PID来杀死后台进程。

注:在 Linux 系统中是看不到挂起状态的。因为用户只需要关心自己的进程是运行状态、休眠状态还是暂停状态,并不需要关心挂起状态。挂起状态是操作系统做内存管理将进程的代码和数据保存到磁盘上,我们并不需要知道,所以我们在 Linux 系统下是看不到挂起状态的。

4.深度睡眠状态 D

上面提到的休眠状态 S 是浅度睡眠状态,该状态是可以被终止的!而深度睡眠状态是很少见的,常见于高 IO、高并发的场景。在该状态下的进程,无法被操作系统杀死,只能通过断点或者进程自己醒来来解决。深度睡眠的状态只见于高 IO 的情况,大家可以通过dd指令浅浅地逝一下。

在这里插入图片描述

5.正在被追踪状态 t

在这里插入图片描述

注:T(tracing stop) 是暂停状态的一种,该状态 t 表示该进程正在被追踪(调试)。

Makefile 新语法

在这里插入图片描述

6.死亡状态 X

操作系统的书籍上都会给我们介绍进程的死亡状态,而在 Linux 系统中,我们无法验证一个进程是否死亡。当进程死亡时,操作系统会立即或延迟进程占用的资源。

7.僵尸状态 Z

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

进程被创建出来,就为了帮助操作系统或者用户完成某些任务。那对于操作系统和用户来说,肯定会关心该进程把任务完成的如何。那么进程退出的时候,就不能立即释放该进程对应的资源,而应该保存一段时间,让父进程或者操作系统来读取进程退出结果。如果父进程不读取子进程的退出结果,就会造成僵尸进程。

如何创建处于僵尸状态的进程?只要子进程退出,父进程还在运行,但父进程没有读取子进程的状态,子进程就会进入僵尸状态 Z。

在这里插入图片描述

while :; do ps ajx | head -1 && ps ajx | grep myprocess | grep -v grep; sleep 1; done #自动化监控脚本
#-v选项 grep搜索时过滤掉指定关键词

在这里插入图片描述

注:僵尸进程是有很大危害的,这个问题到进程控制模块会讲解!

僵尸进程的危害

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

👉孤儿进程👈

  • 父进程如果提前退出,那么子进程后退出,进入 Z之后,那该如何处理呢?
  • 父进程先退出,子进程就称之为 “孤儿进程”。
  • 孤儿进程被1号 init 进程领养,当然要有 init 进程回收喽。
  • 如果是前台进程创建的子进程变成了孤儿进程,那么该孤儿进程会自动变成后台进程。

在这里插入图片描述

在这里插入图片描述
输入 kill -9 父进程PID 杀死父进程后,子进程就会被1号进程领养。那为什么看不到父进程变成僵尸进程呢?因为父进程也有父进程,其父进程是 bash,将其资源回收了,所以我们就看不到父进程的僵尸状态了。

1号进程就是操作系统!

在这里插入图片描述

👉进程优先级👈

基本概念

  • CPU 资源分配的先后顺序,就是指进程的优先级(priority)。
  • 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的 Linux 很有用,可以改善系统性能。
  • 还可以把进程运行到指定的 CPU 上,这样一来,把不重要的进程安排到某个CPU,可以大大改善系统整体性能。

优先级和权限的区别:权限是能不能的问题,而优先级是谁先谁后的问题。为什么要存在优先级?因为资源太少了。优先级本质是 PCB 中的一个或者几个整数数字。

查看进程优先级

在这里插入图片描述

ps -la #查看进程的优先级

在这里插入图片描述

  • UID : 代表执行者的身份
  • PID : 代表这个进程的代号
  • PPID :代表这个进程是由哪个进程发展衍生而来的,亦即父进程的代号
  • PRI :代表这个进程可被执行的优先级,其值越小越早被执行
  • NI :代表这个进程的 nice 值

PRI 和 NI

  • PRI也还是比较好理解的,即进程的优先级,或者通俗点说就是程序被CPU执行的先后顺序,此值越小进程的优先级别越高。
  • 那 NI 呢?就是我们所要说的 nice 值了,其表示进程可被执行的优先级的修正数值。
  • 进程的 PRI 值越小就越快被执行,那么加入 nice 值后,将会使得 PRI 变为:PRI(new)=PRI(old)+nice
  • 这样,当 nice 值为负值的时候,那么该程序将会优先级值将变小,即其优先级会变高,则其越快被执行。
  • 所以在 Linux 系统下,调整进程优先级就是调整进程的 nice 值。
  • nice 值的取值范围是 -20 至 19,一共 40 个级别。
  • 需要强调一点的是,进程的 nice 值不是进程的优先级。他们不是一个概念,但是进程的 nice 值会影响到进程的优先级变化,可以理解 nice 值是进程优先级的修正值。
  • 默认情况下,进程的 nice 值为 0,PRI(old) 为 80。

修改 nice 值

  • sudo top
  • 进入 top 后按 “r” –> 输入进程 PID –> 输入 nice 值

在这里插入图片描述

在这里插入图片描述
注:nice 值的设置范围是 -20 到 19,设置太大或太小都不会超过该范围。因为 nice 值太大或太小都会影响 CPU 调用进程的公平性。每次修改 nice 值,都是在 PRI = 80 的基础上修改的。

👉其他概念👈

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

注:CPU 调度进程的方式,并不是将该进程执行完再去执行另一个进程,而是采取时间片轮转的方式来调度进程的。也就是将时间段切分为很多的小时间片,这个时间片来调度这个进程,这个时间片过后,该进程执行完毕或者重新到运行队列中排队。到了下一个时间片,就会去调度另外一个进程。这样,在一段时间内,多个进程都能够得以推进,这也就是并发。

👉进程切换👈

  • CPU 内部只有一套寄存器硬件,CPU 中的寄存器 eip (pc 指针) 可以保存当前正在执行指令的下一条指令的地址,寄存器里面保存的数据是属于当前进程的。寄存器硬件不等于寄存器内的数据!
  • CPU 调度进程需要做的三件事:取指令、分析指令和执行指令。
  • 进程在运行的时候需要占用 CPU,但进程并不是一直要占用 CPU 到进程结束的! 进程在运行的时候都会有自己的时间片, 进程运行时一定会产生非常多的临时数据,也称为上下文,这些数据属于当前进程!当进程的时间片跑完了,该进程产生的临时数据需要保存到操作系统的段描述符中,这也称为上下文保护。当该进程再次运行起来时,需要将临时数据恢复,从上一次执行的地方开始运行起来,这也称为上下文恢复。
  • 进程在切换的时候,要进行进程的上下文保护;当进程恢复运行的时候,要进行上下文的恢复!
  • 寄存器内的数据只属于当前运行的进程。寄存器被所有进程共享,寄存器内的数据是每个进程各自私有的上下文数据。

👉总结👈

本篇博客主要讲解了进程状态的普遍理解、Linux 系统的进程状态、僵尸进程、孤儿进程、进程优先级、并行和并发以及进程切换等。那么以上就是本篇博客的全部内容了,如果大家觉得有收获的话,可以点个三连支持一下!谢谢大家!💖💝❣️

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

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

相关文章

手把手教你用Python和OpenCV搭建一个半自动标注工具(详细步骤 + 源码)

导 读 本文将手把手教你用Python和OpenCV搭建一个半自动标注工具(包含详细步骤 源码)。 背景介绍 样本标注是深度学习项目中最关键的部分,甚至在模型学习效果上起决定性作用。但是,标注工作往往非常繁琐且耗时。一种解决方案是…

【苹果家庭群发推】创作AppleScript脚本来控制MacOS附有的iMessage客户端停止考据,近似于组iMessage

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

ENVI_IDL:如何对文件名的日期进行格式化输出?

目录 00 前言 01 第一步,使用file_basename()函数路径中的获取文件名 02 第二步,使用strmid()函数获取文件名的日期 03 第三步,将获取的日期进行类型转换 04 第四步,将日期进行整理 05 第五步,进行格式化输出 …

BiSeNetv2:语义分割经典方法BiSeNet的升级版本

分享IJCV2021上发表的一篇文章BiSeNetv2,这是BiSeNet的升级版本。开源代码地址:https://github.com/open-mmlab/mmsegmentation/tree/master/configs/bisenetv2 1.动机 语义分割是指为每个像素分配一个标签,它广泛用于场景理解、自动驾驶、人…

uniapp中app真机模拟以及小程序编译后css样式异常失效问题原因及解决方案

前言 最近写使用uniapp写app,开发的时候写样式都是使用浏览器h5进行调试一切正常,但是最后进行手机真机调试的时候css样式出现了异常,本文归纳常见的问题 比如在h5页面显示正常: 但是在真机调试app的实现则显示: H5正…

【PyTorch深度学习实践】02_梯度下降

文章目录梯度下降1.梯度下降算法实现代码2.随机梯度下降实现代码3.小批量随机梯度下降梯度下降 1.梯度下降算法 之前可以使用穷举的方法逐个测试找使损失函数最小的点,但当数据过多时,维度过高,会使穷举变得非常困难,因此需要优…

K8s 数据管理

目录前言一、Volume1.1 emptyDir1.1.1 基本概念1.1.2 应用案例1.2 hostPath1.2.1 基本概念1.2.2 应用案例1.3 外部 Storage Provider二、Persistent Volume2.1 基本概念2.1.1 PersistentVolume2.1.2 PersistentVolumeClaim2.2 NFS PersistentVolume前言 与 Docker 类似&#x…

QML教程(一)基础语法

目录 一、导入 二、对象声明 三、对象属性 1.声明对象属性 2.信号属性 3.方法属性 4.附加属性略 5.枚举属性 6.对象属性赋值 四、自定义对象 一、导入 模块导入 语法&#xff1a; import <ModuleIdentifier> [<Version.Number>] [as <Qualifier>…

面向对象设计原则概述

面向对象设计原则概述 软件的可维护性和可复用性 软件工程和建模大师Peter coad认为&#xff0c;一个好的系统设计与应该具备如下三个性质 可扩展性 灵活性 可插入性 软件的可维护性和可复用性 软件的复用和重用拥有众多优点&#xff0c;如可以提高软件的开发效率&#xf…

Educational Codeforces Round 92 (Rated for Div. 2) B. Array Walk

翻译&#xff1a; 给定一个数组&#x1d44e;1&#xff0c;&#x1d44e;2&#xff0c;…&#xff0c;&#x1d44e;&#x1d45b;&#xff0c;由&#x1d45b;个正整数组成。 最初&#xff0c;您位于索引1&#xff0c;分数等于&#x1d44e;1。你可以执行两种动作: 向右移动…

CDN

CDN——Content Delivery Network&#xff0c;内容分发网络。 具体来说&#xff0c;CDN就是采用更多的缓存服务器&#xff08;CDN边缘节点&#xff09;&#xff0c;布放在用户访问相对集中的地区或网络中。当用户访问网站时&#xff0c;利用全局负载技术&#xff0c;将用户的访…

【CSP】邻域均值

邻域均值 邻域均值 题意比较好理解&#xff0c;就是算一些数字。如果采用暴力方法的话&#xff0c;就是用一个边长为 2∗r12*r12∗r1 的正方形框框住大矩阵&#xff0c;然后遍历这个框&#xff0c;求出其平均值&#xff0c;然后移动正方形框&#xff0c;直到大矩阵内所有像…

【免费开放源码】审批类小程序项目实战(预约审批端)

第一节&#xff1a;什么构成了微信小程序、创建一个自己的小程序 第二节&#xff1a;微信开发者工具使用教程 第三节&#xff1a;深入了解并掌握小程序核心组件 第四节&#xff1a;初始化云函数和数据库 第五节&#xff1a;云数据库的增删改查 第六节&#xff1a;项目大纲以及制…

6.5 特殊用途语言特性

文章目录默认实参使用默认实参调用函数默认实参声明默认实参初始值内联函数和constexpr函数内联函数constexpr 函数把内联函数和constexpr函数声明在头文件内调试帮助assert预处理宏NDEBUG预处理变量默认实参 某些函数有这样一种形参,在函数的很多次调用中它们都被赋予一个相同…

电子游戏销售之缺失值检测与处理

电子游戏销售之缺失值检测与处理 文章目录电子游戏销售之缺失值检测与处理0、写在前面1、数据缺失值预处理1.1 表的形状1.2 原始数据每个特征缺失和非缺失的数目1.3 每个特征缺失的率1.4 处理后各特征缺失值的数目1.5 删除缺失值后的数据展示2、替换法处理缺失值2.1 替换法2.2 …

1.Springboot配置细节

一、参考资料 13-SpringBoot配置-项目外部配置加载顺序_哔哩哔哩_bilibili 二、配置 2.1 配置文件 注意变量后面是:&#xff0c;而不是等号 2.2 读取配置文件 2.2.1 Value 比如配置文件application.properities中定义了一个name&#xff0c;其值为abc。 代码里面只需按照如…

一、软件安装与配置

一、PyTorch环境软件安装与配置 1.安装anaconda参考 anaconda老版本下载方法&#xff08;如何查看anaconda与python版本对应关系&#xff09;及安装教程_breadth_的博客-CSDN博客_anaconda旧版本下载 2.在anconda下安装和激活pytorch环境 此步并没有下载pytorch 3.下载pyto…

云计算运营—03 KVM虚拟化技术方案介绍

KVM虚拟化技术方案介绍 1.背景介绍 KVM&#xff08;Kernel-based Virtual Machine&#xff09; 开源全虚拟化方案 支持体系结构 x86(32位,64位)、IA64、PowerPC、S390 依赖x86硬件支持&#xff1a;Intel VT-x/ AMD-V内核模块&#xff0c;使得linux内核成为hypervisor XEN架构 …

《B-树》

tips&#xff1a;B-树读成b树&#xff0c;并不是b减树 【一】基本搜索结构 种类数据格式时间复杂度顺序查找无要求O(N)二分查找有序O(log2N)二叉搜索树无要求O(N)二叉平衡树&#xff08;AVL和红黑树&#xff09;无要求&#xff0c;最后随机O(log2N)哈希无要求O(1)位图无要求O…

linux系统中SPI驱动框架的基本原理与实现

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用linux系统中SPI驱动ICM-20608六轴传感器的操作。 目录 第一&#xff1a;linux系统下SPI驱动框架简介 第二&#xff1a;SPI设备驱动编写 第三&#xff1a;SPI设备和驱动匹配过程 第一&#xff1a;linux系统下SPI驱…