Linux:进程理解1(查看进程,创造进程,进程状态)

news2025/4/15 22:35:57

进程理解

  • (一)查看进程
    • 通过系统调用获取进程标示*
  • (二)创造进程(fork)
    • 1. 创造的子进程的PCB+代码数据怎么来?
    • 2.一个函数为什么有两个返回值?
    • 3. 为什么这里会有 两个 id值?
    • 4.一个变量为什么又两个返回值??
  • (三) 进程状态
    • 1.运行状态-R(running)
    • 2.浅度睡眠-S(sleeping)
    • 3.深度睡眠-D(disk sleep)
    • 4.暂停状态-T(stoped)
    • 5.死亡进程-X
    • 6.僵尸进程-Z
      • 僵尸进程危害
    • 7.孤儿进程

(一)查看进程

  • 进程的信息可以通过 /proc 系统文件夹查看
    在这里插入图片描述
  • 大多数进程信息同样可以使用top和ps这些用户级工具来获取
    在这里插入图片描述

通过系统调用获取进程标示*

  • 进程id(PID)
  • 父进程id(PPID)

看到下面代码:
在这里插入图片描述

运行上面的代码,我们通过如下命令可以看到进程的id:
ps ajx | head -1 && ps ajx | grep proc | grep -v grep在这里插入图片描述

那么这里的父进程2436又是什么呢??
在这里插入图片描述
可以看到父进程是一个-bash,而为什么是bash??

因为在操作命令行的时候,父进程永远是bash外壳,其原理:shell外壳通过创建子进程的方式,以bash的子进程去执行。也就是说当我们输入命令行去执行某项任务时,是bash创造子进程去执行。

(二)创造进程(fork)

  • getpid() — 当前进程id
  • getppid() — 父进程id

看到下面代码:
在这里插入图片描述

运行结果如下:
在这里插入图片描述

1. 创造的子进程的PCB+代码数据怎么来?

  • 子进程内核的数据结构task_struct,也会以父进程的为模板初始化自身。
  • 父子进程都会指向同样的代码数据。

那么是不是意味着一个子进程要对数据修改,那么父进程的数据也会同步修改呢??
答案并不是。
因为修改时会发生写时拷贝来维护数据的独立性。(进程是独立的)

在这里插入图片描述

2.一个函数为什么有两个返回值?

因为fork函数创造了子进程,相当于父子进程都执行了fork函数,一个进程返回一个值。因此一个函数有两个返回值

3. 为什么这里会有 两个 id值?

  • 因为fork创造了一个子进程,而原有的进程和子进程都会返回一个值。
  • 子进程的返回值是0,父进程的返回值是大于0。

因此我们可以通过判断id的值,分别在子进程和原本进程添加代码。
子进程先运行还是父进程先运行,是由操作系统的调度器决定的。
这里的判断id值,仅仅是为了分流。

4.一个变量为什么又两个返回值??

进程在运行的时候,具有独立性。父子进程指向共同的代码数据,当fork函数返回不同的值时,变量id会进行写实拷贝,变量id的虚拟地址相同,但真实的物理地址却是不同的。
这里涉及进程地址空间的问题,后面的博客会进行理解

(三) 进程状态

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

下面的状态在kernel源代码里定义:

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

ps aux / ps axj 命令 查看进程状态
在这里插入图片描述

1.运行状态-R(running)

  • 当一个进程正处于运行状态的时候,并不意味着进程一定处于运行当中,进程可能在运行队列中等或者正在被执行,就叫做运行态,随时可以被CPU调度。
  • 一个CPU只有一个运行队列,要被运行的进程会被加载到运行队列当中,每个处于R状态的进程会在运行队列中排队等待运行。
    在这里插入图片描述
    实例:
    在这里插入图片描述

2.浅度睡眠-S(sleeping)

进程正在等待某件事情的完成,处于浅度睡眠状态的进程随时可以被唤醒(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))。
运行队列满的时候,进程也会是S状态,等待运行队列空出位置。
在这里插入图片描述
S状态的进程会被放在等待队列中,等待某种命令结束(也可以scanf函数等)然后再放到运行队列中运行。

  • 处于S状态的进程,可以通过kill命令来杀死进程,如下:
    在这里插入图片描述

3.深度睡眠-D(disk sleep)

有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的进程通常会等待IO的结束。一个进程处于深度睡眠的状态下,表示该进程不会被杀掉,也就是kill命令都没用,只有等该进程自动唤醒才可以恢复。

什么情况会出现D状态的进程??举个例子:
在这里插入图片描述

4.暂停状态-T(stoped)

可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可以通过发送 SIGCONT 信号让进程继续运行。

  • kill -19 – 暂停
  • kill -18 – 再次运行
  • kill -9 – 杀死程序

在这里插入图片描述

  • 某种状态后面带个+(例如S+)
    指的是前台进程
  • 状态后面没有+
    指的是后台进程

对于前台/后台进程的了解,可以看看这篇博客

kill -l命令查看kill相关指令

5.死亡进程-X

杀掉进程,这个状态只是一个返回状态,你不会在任务列表里看到这个状态。杀掉进程是一个瞬时过程,难以查看。

6.僵尸进程-Z

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

进程退出的时候,如果父进程没有主动回收子进程信息,子进程会一直让自己处于Z状态,进程的相关资源尤其是task_struct结构体不能被释放。

在这里插入图片描述

命令行脚本:
在这里插入图片描述

僵尸进程危害

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

7.孤儿进程

  • 父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?
  • 父进程先退出,子进程就称之为“孤儿进程”
  • 孤儿进程被1号init进程领养,当然要有init进程回收。
    在这里插入图片描述

为什么要被领养??因为孤儿进程未来也需要被释放。

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

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

相关文章

异形遮罩之QML中的 `OpacityMask` 实战

文章目录 🌧️ 传统实现的问题👉 效果图 🌈 使用 OpacityMask 的理想方案👉代码如下🎯 最终效果: ✨ 延伸应用🧠 总结 在 UI 设计中,经常希望实现一些“异形区域”拥有统一透明度或颜…

如何为您的设计应用选择高速连接器

电气应用的设计过程需要考虑诸多因素,尤其是在设计高速网络时。许多连接器用户可能没有意识到,除了在两个互连之间组装导电线路之外,还需要考虑各种工艺。在建立高速连接并确保适当的信号完整性时,必须考虑蚀刻、公差、屏蔽等因素…

【论文阅读】UniAD: Planning-oriented Autonomous Driving

一、Introduction 传统的无人驾驶采用了区分子模块的设计,即将无人驾驶拆分为感知规划控制三个模块,这虽然能够让无人驾驶以一个很清晰的结构实现,但是感知的结果在传达到规划部分的时候,会导致部分信息丢失,这势必会…

upload-labs二次打

1(前端js绕过) 弹窗,先看看有没有js有,禁用js 禁用后就可以上传php文件了,然后我们就去访问文件,成功 2(MIME绕过) 先上传一个php文件试试,不行,.htaccess不行, 试试MIME类型&am…

提权实战!

就是提升权限,当我们拿到一个shell权限较低,当满足MySQL提权的要求时,就可以进行这个提权。 MySQL数据库提权(Privilege Escalation)是指攻击者通过技术手段,从低权限的数据库用户提升到更高权限&#xff…

ChromeOS 135 版本更新

ChromeOS 135 版本更新 一、ChromeOS 135 更新内容 1. ChromeOS 电池寿命优化策略 为了延长 Chromebook 的使用寿命,ChromeOS 135 引入了一项全新的电池充电限制策略 —— DevicePowerBatteryChargingOptimization,可提供更多充电优化选项&#xff0c…

javaSE.Lambda表达式

如果一个接口中有且只有一个待实现的抽象方法,那么我们可以将匿名内部类简写为Lambda表达式。 简写规则 标准格式: (【参数类型 参数名称,】...) -> {代码语句, 包括返回值} 只有一行花括号{}可以省略。…

【随身wifi】青龙面板保姆级教程

0.操作前必看 本教程基于Debian系统,从Docker环境。面板安装,到最后拉取脚本的使用。 可以拉库跑狗东京豆,elm红包等等,也可以跑写自己写的脚本,自行探索 重要的号别搞,容易黑号,黑号自己负责…

Android 之美国关税问题导致 GitHub 403 无法正常访问,责任在谁?

这几天各国关税问题导致世界动荡不安,如今GitHub又无法正常访问,是不是Google到时候也无法正常使用了。

4月13日星期日早报简报微语报早读

4月13日星期日,农历三月十六,早报#微语早读。 1、北京处置倒伏树木843棵,已全部处置完毕; 2、山西大同“订婚强奸案”本月16日二审宣判,一审男方被判3年刑; 3、今年我国快递业务量已突破500亿件&#xf…

动态路由, RIP路由协议,RIPv1,RIPv2

动态路由 1、回顾 路由:从源主机到目标主机的过程 源主机发送数据给目标主机,源主机会查看自身的路由信息 如果目标主机是自己同网段,源主机查看的是直连路由 如果目标主机和自己不同网段,源主机查看的是静态路由、动态路由、默…

【已更新完毕】2025泰迪杯数据挖掘竞赛B题数学建模思路代码文章教学:基于穿戴装备的身体活动监测

基于穿戴装备的身体活动监测 摘要 本研究基于加速度计采集的活动数据,旨在分析和统计100名志愿者在不同身体活动类别下的时长分布。通过对加速度数据的处理,活动被划分为睡眠、静态活动、低强度、中等强度和高强度五类,进而计算每个志愿者在…

212、【图论】字符串接龙(Python)

题目描述 题目链接:110. 字符串接龙 代码实现 import collectionsn int(input()) beginStr, endStr input().split() strList [input() for _ in range(n)]deque collections.deque() # 使用队列遍历结点 deque.append([beginStr, 1]) # 存储当前字符串和遍…

【UE5】RTS游戏的框选功能+行军线效果实现

目录 效果 步骤 一、项目准备 二、框选NPC并移动到指定地点 三、框选效果 四、行军线效果 效果 步骤 一、项目准备 1. 新建一个俯视角游戏工程 2. 新建一个pawn、玩家控制器和游戏模式,这里分别命名为“MyPawn”、“MyController”和“MyGameMode” 3. 打开“MyGam…

设计模式 四、行为设计模式(2)

五、状态模式 1、概述 状态设计模式是一种行为型设计模式,它允许对象在其内部状态发生时改变其行为,这种模式可以消除大量的条件语句,并将每个状态的行为封装到单独的类中。 状态模式的主要组成部分如下: 1)上…

FEA 仿真助力高速连接器设计中的信号完整性

各行各业高速信号软件和硬件的快速发展,带来了更高的频率和带宽。因此,对连接器组件的整体性能要求也更加严格。同时,器件和封装形式、互连以及系统内其他设备的小型化也带来了额外的设计挑战。所有这些都对信号传输完整性产生重大影响。 高速…

yum的基本操作和vim指令

在我们的手机端或者Windows上下载软件,可以在相应的应用商店或者官网进行下载,这样对于用户来说十分的方便和便捷。而在Linux上,也有类似的安装方式,我们来一一了解一下。 Linux安装软件的3种方法 源代码安装 在Linux下安装软件…

Qt触摸屏隐藏鼠标指针

Qt触摸屏隐藏鼠标指针 Chapter1 Qt触摸屏隐藏鼠标指针 Chapter1 Qt触摸屏隐藏鼠标指针 使用Qt开发的屏幕软件HMI不需要显示鼠标,qt设置,可以在只启动HMI的时候隐藏光标,退出时再显示。 1.如果只希望在某个 widget 中不显示鼠标指针&#xf…

LangGraph——Agent AI的持久化状态

LangGraph 内置了一个持久化层,通过检查点(checkpointer)机制实现。当你使用检查点器编译图时,它会在每个超级步骤(super-step)自动保存图状态的检查点。这些检查点被存储在一个线程(thread)中,可在图执行后随时访问。由于线程允许在执行后访…

【双指针】专题:LeetCode 1089题解——复写零

复写零 一、题目链接二、题目三、算法原理1、先找到最后一个要复写的数——双指针算法1.5、处理一下边界情况2、“从后向前”完成复写操作 四、编写代码五、时间复杂度和空间复杂度 一、题目链接 复写零 二、题目 三、算法原理 解法:双指针算法 先根据“异地”操…