当前位置: 首页 > article >正文

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

进程理解

  • (一)查看进程
    • 通过系统调用获取进程标示*
  • (二)创造进程(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进程回收。
    在这里插入图片描述

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

相关文章:

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

进程理解 (一)查看进程通过系统调用获取进程标示* (二)创造进程(fork)1. 创造的子进程的PCB代码数据怎么来?2.一个函数为什么有两个返回值?3. 为什么这里会有 两个 id值?…...

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

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

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

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

mongodb 4.0+多文档事务的实现原理

1. 副本集事务实现(4.0)‌ ‌非严格依赖二阶段提交‌ MongoDB 4.0 在副本集环境中通过 ‌全局逻辑时钟(Logical Clock)‌ 和 ‌快照隔离(Snapshot Isolation)‌ 实现多文档事务,事务提交时通过…...

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

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

upload-labs二次打

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

Flutter命令行打包打不出ipa报错

Flutter打包ipa报错解决方案 在Flutter开发中,打包iOS应用时可能会遇到以下错误: error: exportArchive: The data couldn’t be read because it isn’ in the correct format. 或者 Encountered error while creating the IPA: error: exportArchive…...

网页制作中的MVC和MVT

MVC(模型-视图-控制器)和MVT(模型-模板-视图)是两种常见的软件架构模式,通常用于Web应用程序的设计。它们之间的主要区别在于各自的组件职责和工作方式。 MVC(模型-视图-控制器): 模…...

C. Good Subarrays

time limit per test 2 seconds memory limit per test 256 megabytes You are given an array a1,a2,…,ana1,a2,…,an consisting of integers from 00 to 99. A subarray al,al1,al2,…,ar−1,aral,al1,al2,…,ar−1,ar is good if the sum of elements of this subarra…...

聊天室项目day4(redis实现验证码期限,实现redis连接池)

1.redis连接池操作和之前所学过的io_context连接池原理一样这里不多赘述,也是创建多个连接,使用时按顺序取出来。 2.知识补充redisConnect()函数建立与 Redis 服务器的非阻塞网络连接,成功返回 redisContext*(连接上下文指针&…...

提交至git

通过 Pull Request 提交代码 如果你无法直接推送到 master 分支(例如,因为分支保护或权限限制),通常的做法是将代码推送到一个新分支,并通过 Pull Request(或 Merge Request)提交代码&#xff1…...

0x06.Redis 中常见的数据类型有哪些?

回答重点 Redis 常见的数据结构主要有五种,这五种类型分别为:String(字符串)、List(列表)、Hash、Set(集合)、Zset(有序集合,也叫sorted set)。 String 字符串是Redis中最基本的数据类型,可以存储任何类型的数据,包括文本、数字和二进制数据。它的最大长度为512MB。 使…...

如何查看自己 Android App 的私有数据?从 `adb backup` 到数据提取全过程

🛠️ 如何查看自己 Android App 的私有数据?从 adb backup 到数据提取全过程 📌 前言:作为一名 Android 开发者,我常常想知道自己写的 App 在用户设备上的数据存储结构是怎样的,比如有没有数据写入成功、有…...

提权实战!

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

Vue使用el-table给每一行数据上面增加一行自定义合并行

// template <template><el-table:data"flattenedData":span-method"objectSpanMethod"borderclass"custom-header-table"style"width: 100%"ref"myTable":height"60vh"><!-- 订单详情列 -->&l…...

ChromeOS 135 版本更新

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

国内协作机器手焊接领域领军人物分析

国内焊接协作机器手领域的专家涵盖学术界与产业界,他们在核心技术研发、行业标准制定及重大工程应用中发挥关键作用。以下从技术方向、行业贡献、典型案例三个维度展开分析: 一、学术界领军人物:理论创新与技术突破 1. 吴林(哈尔滨工业大学) 学术地位:中国焊接学会名誉…...

javaSE.Lambda表达式

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

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

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

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

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

深入解析 Android 图形系统:Canvas、Skia、OpenGL 与 SurfaceFlinger 的协作

在 Android 应用开发中&#xff0c;流畅的 UI 渲染是用户体验的核心。但你是否好奇&#xff0c;一个简单的 View 是如何从代码中的 onDraw() 方法一步步变成屏幕上的像素的&#xff1f;本文将从底层图形系统的视角&#xff0c;解析 Android 中 Canvas、Skia、OpenGL ES 和 Surf…...

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

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

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

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

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

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

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

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

车载以太网-TLS

文章目录 车载以太网与TLS的技术背景核心定位车载以太网TLS的技术架构车载TLS的核心安全机制TLS报文结构详解TLS工作机制密钥交换与计算流程标题完整握手流程(1-RTT)数据传输加密流程车载TLS的独特优化策略车载TLS的安全威胁相关标准车载以太网TLS(Transport Layer Security…...

大模型面经 | 手撕多头注意力机制(Multi-Head Attention)

大家好,我是皮先生!! 今天给大家分享一些关于大模型面试常见的面试题,希望对大家的面试有所帮助。 往期回顾: 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题一) 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二) 大模型面经 | 春招、秋招算法…...

02_位掩码逻辑及Java示例

文章目录 一、位掩码核心逻辑二、Java示例&#xff1a;权限管理‌三、关键点解析‌四、优缺点分析‌五、适用场景 位掩码&#xff08;Bitmask&#xff09;是一种利用二进制位进行状态管理的技术&#xff0c;通过位运算高效处理多个布尔标志。 一、位掩码核心逻辑 ‌基本概念‌…...

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

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

GO语言-数据类型

文章目录 变量定义1. 整数类型2. 浮点类型3. 字符类型4. 布尔类型5. 字符串类型5.1 字符串的本质5.2 常用字符串处理函数(strings包)5.3 修改字符串的方式 6. 数据默认值7. 类型转换 变量定义 代码如下&#xff1a; package mainimport "fmt"var i1 1000 var i2 i…...