详解进程 及 探查进程

news2025/1/16 21:11:15

  • 进程的概念
    • PCB是什么
    • task_struct的作用
    • 如何执行进程
  • 进程的探查
    • 什么是bash
    • ps命令的使用(查看进程)
  • 创建进程
    • 探究父子进程

进程的概念

简而言之,进程就是正在在执行的程序

之前说过,程序执行的第一步Windows是双击程序Linux是 ./ ,系统接收到该命令时就会将磁盘中的程序代码载入到内存中,并为程序分配空间。

当程序被加载到内存后建立了自己的PCB,那他就是进程了。

PCB是什么

PCB的概念:含有该进程各种 信息 及 属性 的 数据结构,比如进程 ID ,用户 ID ,组 ID ,进程状态 ,优先级 ,I /O状态信息及程序数据等。
在这里插入图片描述
PCB是一般课本上的称呼(process control block), Linux操作系统下被称为PCB的实体是: task_struct

task_struct的作用

task_struct 是 Linux内核的一种数据结构,它会被装载到 RAM(内存) 里并且包含着进程的信息

其包含内容大致有:

1. 标示符: 描述本进程的唯一标示符,用来区别其他进程。
2. 状态: 任务状态,退出代码,退出信号等。
3. 优先级: 相对于其他进程的优先级。
4. 程序计数器: 程序中即将被执行的下一条指令的地址。
5. 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块
   的指针
6. 上下文数据: 进程执行时处理器的寄存器中的数据,可以理解为存储的是程序
    已经做了什么,下一步该做那些
8. I/ O状态信息: 包括显示的I/O请求,分配给进程的I/ O设备和被进程使用
   的文件列表。
9. 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号
   等。
   其他信息等

如何执行进程

首先咱要明白,Linux 下你所有的 命令 与你能 执行的操作 都与权限有关。

触发任何一个事件,系统都会将其定义成一个进程,并给予这个进程一个专属 ID ,称为PID ,同时根据触发这个进程的用户与相关属性关系,给予该进程PID设置对应权限

运行程序也一样也要受到权限的约束,所以task_struct 要存有必要的属性信息

正常情况下,task_struct会在内存中像链表一样依次排列,逐个进行
,但我们要知道任何事情都要分个轻重缓急,操作系统在执行进程时更是如此。

所以进程对应的task_struct中便有了优先级这一属性,他用PRI值来表示优先级,PRI值越小则优先级越高,所以下图中PRI为60的会比PRI为80的优先得到CPU的资源
在这里插入图片描述
优先级:是CPU分配资源的先后顺序

上图中PRI值只有两种是为了大家方便理解,实际上PRI值是根据进程属性决定的(NI值也会影响进程优先级后边会补充)

优先级的必要性: 系统进程数目众多,而CPU资源只有少量,甚至1个,所以进程之间是具有竞争属性的。为了高效完成任务,更合理竞争相关资源,便具有了优先级。

进程的探查

说了那么多,是时候见见进程了
在Linux下可用 ps 命令查看进程
命令:ps
作用: 查看属于当前用户的进程
在这里插入图片描述
上图可以看到输入 ps 回车后只看到了当前 ps 命令的进程及 bash 的进程,由此可以得出结论:命令只是某一程序快捷方式,执行时也会创建进程

什么是bash

每个用户登录时都会创建一个 bash 进程,各用户之间的 bash 进程互相之间没有影响。

1. bash是一个命令处理器, 运行在文本窗口中, 并能执行用户直接输入的命令.
2. bash还能从文件中读取Linux命令, 称之为脚本.
3. bash支持通配符, 管道, 命令替换, 条件判断等逻辑控制语句 

总结: bash可以称为命令行解释器,我么在命令行执行的进程都由他衍生而来。

ps命令的使用(查看进程)

首先先了解进程信息列表每一项分别表示什么
在这里插入图片描述

F :内核分配给进程的系统标志
UID : 启动该进程的用户
PID : 进程ID
PPID : 父进程ID(如果该进程是其他进程启动的)
PRI : 进程优先级(值越小,优先级越大)
NI :优先级的修正值
VSZ : 进程占用虚拟内存空间的大小
RSS :进程在未被交换出时占用的物理内存大小
WCHAN :进程休眠的内核函数地址
STST : 代表当前进程状态(R是可运行正在等待;O是正在运行;S代表休眠;Z代表僵化,已终止但找不到其父进程 ;T代表停止)

上面简单演示了ps命令,但其只显示了两行极短的内容这显然不是咱想要的
下面演示ps的BSD风格的指令
指令: ps la
作用:采用长格式显示与任意终端关联的所有进程
在这里插入图片描述
可以看到显示了好几个进程,其中有两个bash进程,因为这台现在有两个账号在登陆这。

其中右边一栏 COMMAND 是程序名,图中的./my_exe程序只是目前在另一个账号上运行的程序,其PID是19795,PPID表示父进程./my_exe程序
PPID为18505,而18505恰好是bash的PID.

所以得出第二个结论:在Linux命令行执行的命令,产生的进程都由bash进程衍生而来,也就是说命令行上执行产生的进程其PPID(父进程)都为bash

下图为ps的命令选项,由于都是查询类选项我就不一一示范了

选项描述
T显示与当前终端关联的所有进程
a显示与任意终端关联的所有进程
g显示包括控制进程在内的所有进程
r仅显示运行中的进程
x显示所有进程,包括未分配任何终端的进程
U userlist显示属于userlist列表中某个用户ID所有的进程
p pidlist显示PID在pidlist列表中的进程
t ttylist显示与ttylist列表中的某个终端关联的进程
o format除了标准列,还输出由 format指定的列
x以寄存器格式显示数据
z在输出中包含安全信息
j显示作业信息
l采用长格式显示
o format仅显示由format指定的列
s采用信号格式显示
u采用基于用户的格式显示
v采用虚拟内存格式显示
N namelist定义要在 wCHAN输出列中显示的值
o order定义信息列的显示顺序
s将子进程的数值统计信息(比如CPU和内存使用情况)汇总到父进程中
c显示真实的命令名称(用以启动该进程的程序名称)
e显示命令使用的环境变量
f用层级格式来显示进程,显示哪些进程启动了哪些进程
h不显示头信息
k sort指定用于排序输出的列
n使用数值显示用户ID、组ID以及 wCHAN信息
w为更宽的终端屏幕生成宽输出
H将线程显示为进程
m在进程之后显示线程
L列出所有的格式说明符
v显示ps命令的版本

创建进程

方法:进程可使用系统调用 fork() 函数创建新进程。

其中调用 fork() 的进程被称为父进程,新创建的进程被称为子进程
如下:在main中创建一个子进程
在这里插入图片描述
远行结果如下
在这里插入图片描述
如上所示使用 fork() 创建了子进程后,bbbbbb…居然被打印了两次,而aaaa…输出正常只打印了一次
为探究为什么咱使用两个函数辅助咱们观看结果
函数:getpid()
作用:返回当前进程PID

函数:getppid()
作用:返回当前进程PPID(父进程)
重新对代码编辑如下:

#include<unistd.h>  
#include<stdio.h>  
 int main()  
  {  
	  printf("aaaaaaaaaaaaaaaaaaa\n");  
      fork(); //创建一个子进程  
      printf("我的PID :%d  我的PPID :%d \n",getpid(),getppid());                                  
      return 0;  
   }  

执行程序后结果如下
在这里插入图片描述
可以看出第一个打印出自己PID 6389 的为父进程 , 因为第二个打印出自己的PPID 为 6389,所以PID 6390为子进程

但也说明了父子进程执行的代码是一样的。

探究父子进程

查看 fork 的说明:

1:如果子进程开启成功则给父进程返回子进程的PID,否则返回-1
2:会给子进程返回0

由此我下下以下程序:

  1 #include<unistd.h>
  2 #include<stdio.h>
  
  3 int main()
  4 {
  5   int n = 5;
  6   int i  = 1;
  7   printf("aaaaaaaaaaaaaaaaaaa\n");
  8  int pp =  fork(); //创建一个子进程
  9  if(pp == 0)//子进程程序
 10  {
 11     while(n--)
 12     {
 13       printf("我是子进程,i = %d 我的PID :%d  我的PPID :%d \n",i ,getpid(),getppid());
 14       sleep(1); i =99;//把值改掉
 15     }
 16  }
 17  else
 18  {                                                                                            
 19     while(n--)
 20     {             
 21       printf("我是父进程,i = %d 我的PID :%d  我的PPID :%d \n",i ,getpid(),getppid()); sleep(1);
 22     }     
 23  }
 24   return 0;
 25 }

如上图 pp 变量会接收 fork() 的返回值(目前不考虑进程创建失败的情况),上面已经叙述了父进程与子进程的代码是一致的 ,只是父进程中 pp 变量接收到的 fork() 返回值为其子进程的PID ,而子进程中的 pp 变量接收到的 fork() 返回值为0

所以上述代码中,子进程和父进程所执行的代码一致(子进程从fork()函数位置开始执行),只是 pp 变量不同
大致可以如下图
在这里插入图片描述
程序执行结果如下
在这里插入图片描述
和我们预想的一致,由于父子进程中的 pp 变量不同所以被 if 和 else 区分打印出了对应的

但程序代码的第 14 行,在子进程中把 i 的值改成了99,但父进程的i值并没有被改变

总结:内核通过对父进程的复制来创建子进程,子进程从父进程处继承数据段,栈段,以及堆段的副本后,可以修改这些内容,不会影响父进程的内容(在内存中被标记为只读的程序文本段则由父,子进程共享);

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

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

相关文章

vue路由篇

路由的理解 介绍 路由(英文&#xff1a;route)就是对应关系&#xff0c; 路由分为前端路由和后端路由&#xff0c;比如前端路由就是 Hash 地址与组件之间的对应关系。 具体来说&#xff1a;一个路由就是一组key-value的对应关系 key 为 url 路径value 可能是函数function 或…

反弹shell数据不回显带外查询pikaqiu靶场搭建

P1 文件上传下载&#xff08;解决无图形化和解决数据传输&#xff09; 解决无图形化&#xff1a; 当我们想下载一个文件时&#xff0c;通常是通过浏览器的一个链接直接访问网站点击下载的&#xff0c;但是在实际的安全测试中&#xff0c;我们获取的权限只是一个执行命令的窗口…

Flink 提交模式

Flink的部署方式有很多,支持Local,Standalone,Yarn,Docker,Kubernetes模式等。而根据Flink job的提交模式,又可以分为三种模式: 模式1:Application Mode Flink提交的程序,被当做集群内部Application,不再需要Client端做繁重的准备工作。(例如执行main函数,生成JobG…

sizeof以及strlen的用法以及注意事项

大家都知道&#xff0c;在c中算字符串长度和所占空间大小事不可避免的&#xff0c;甚至再有的时候&#xff0c;我们在写代码的过程中&#xff0c;就会用到这些数据。比如&#xff0c;下面这道题 struct Test { int Num; char *pcName; short sDate; char cha[2]; short sBa[4];…

Git常用命令复习笔记

1. Git与SVN区别&#xff0c;各自优缺点 Git&#xff1a; 分布式&#xff0c;每个参与开发的人的电脑上都有一个完整的仓库&#xff0c;不担心硬盘出问题&#xff1b;在不联网的情况下&#xff0c;照样可以提交到本地仓库&#xff0c;可以查看以往的所有log&#xff0c;等到有…

数据结构刷题(十七):530二叉搜索树最小绝对差、501二叉搜索树中的众数、236二叉树的最近公共祖先、235二叉搜索树的最近公共祖先

一、二叉搜索树的最小绝对差题目链接思路&#xff1a; 中序遍历保留为list for循环找最小绝对差二叉搜索树中序遍历后是有序的数组&#xff01;&#xff01;注意&#xff1a;i 1开始遍历解法&#xff1a;public int getMinimumDifference(TreeNode root) {List<Integer>…

【C++升级之路】第八篇:string类

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【C学习与应用】 ✒️✒️本篇内容&#xff1a;简单介绍string类的概念、string类的常用接口、string类的模拟实现&#xff08;各个常见接口的实现代码&…

初识数据结构——“数据结构与算法”

各位CSDN的uu们你们好呀&#xff0c;今天小雅兰进入一个全新的内容的学习&#xff0c;就是算法和数据结构啦&#xff0c;话不多说&#xff0c;让我们进入数据结构的世界吧 什么是数据结构&#xff1f; 什么是算法&#xff1f; 数据结构和算法的重要性 如何学好数据结构和算…

【开发者思维】优秀开发者应该具备的25个思维习惯

目录 1. 认真思考开发软件的目的 2. 明确软件设计的目标 3. 正确理解工作 4. 保持简洁 5. 控制复杂度 6. 软件维护 7. 保持一致 8. 优先级评测 9. 解决问题 10. 追求优秀即可 11. 预测

【MySQL中有哪些存储引擎?请你说说MySQL中innodb和myisam的区别?InnoDB引擎的三大特性?】

一.MySQL中有哪些存储引擎&#xff1f; InnoDB存储引擎 InnoDB是MySQL的默认事务型引擎&#xff0c;也是最重要、使用最广泛的存储引擎。它被设计用来处理大量的短期(short-lived)事务&#xff0c;应该优先考虑InnoDB引擎。MylSAM存储引擎 在MySQL 5.1及之前的版本&#xff0c…

PingCode 第三届开发者大会成功举办

PingCode 开发者大会或许会迟到&#xff0c;但永远不会缺席。原定于2022年10月24日举办的 “PingCode 开发者大会” 因疫情原因推迟&#xff0c;属于2022年 PingCode 开发者们的新知创想&#xff0c;不得不藏器待时。2023新春伊始&#xff0c;万象更新&#xff0c;伴随着万物逐…

不写代码、年薪百万,带你玩赚ChatGPT提示工程-高级提示

文章目录前言一、Zero-Shot提示二、Few-Shot 提示Few-shot Prompting 的局限性三、Chain-of-Thought Prompting四、Zero-Shot CoT五、Self-Consistency六、Generated Knowledge 提示七、Automatic Prompt Engineer (APE)总结前言 随着ChatGPT的大火&#xff0c;提示工程在大模…

按键修改阈值功能、报警功能、空气质量功能实现

按键修改阈值功能 要使用按键&#xff0c;首先要定义按键。通过查阅资料&#xff0c;可知按键的引脚如图所示&#xff1a;按键1&#xff08;S1&#xff09;通过KEY0与PA0连接&#xff0c;按键2&#xff08;S2&#xff09;通过KEY1与PE2连接&#xff0c;按键3&#xff08;S3&…

成本降低90%,OpenAI正式开放ChαtGΡΤ

今天凌晨&#xff0c;OpenAI官方发布ChαtGΡΤ和Whisper的接囗&#xff0c;开发人员现在可以通过API使用最新的文本生成和语音转文本功能。OpenAI称&#xff1a;通过一系列系统级优化&#xff0c;自去年12月以来&#xff0c;ChαtGΡΤ的成本降低了90%&#xff1b;现在OpenAI用…

供应链依赖:您的GitHub连接可能会触发什么?

不祥之兆&#xff0c;在针对 GitHub 存储库的攻击激增之后&#xff0c;很难避免。 最近的CircleCI漏洞&#xff08;客户的机密和加密密钥被盗&#xff09;清楚地表明&#xff0c;攻击者已经了解并利用了这个向量。 现在比以往任何时候都更需要公司保护这些非人类连接&#xf…

记录2023.3.3下午的校招

文章目录一、校招的总览意义&#x1f60e;二、校招时&#xff0c;公司是怎么做的&#xff1f;如何提问的&#xff1f;我又是怎么回答的&#x1f914;2.1 公司最喜欢提问你的问题&#x1f64c;三、校招期间&#xff0c;我应该如何去了解一家企业&#xff1f;&#x1f600;三、建…

LeetCode 982. 按位与为零的三元组 -- 哈希统计

按位与为零的三元组 困难 101 相关企业 给你一个整数数组 nums &#xff0c;返回其中 按位与三元组 的数目。 按位与三元组 是由下标 (i, j, k) 组成的三元组&#xff0c;并满足下述全部条件&#xff1a; 0 < i < nums.length 0 < j < nums.length 0 < k <…

【C++笔记】异常处理

C语言处理错误的方式 传统的错误处理机制&#xff1a; 1.终止程序缺陷&#xff1a;用户难以接受。 2.返回错误码&#xff1a;缺陷&#xff1a;需要自己去查错误码对应的解释。 C语言一般使用错误码来处理错误&#xff0c;部分情况下才会用终止情况处理处理严重的错误。 C异常…

初识Liunx下的进程状态和环境变量以及进程优先级

文章目录前言1.进程状态1.阻塞与挂起2.Linux下的进程状态1.概念知识2.R状态2.休眠状态(S/D&#xff09;3.T状态4.Z状态(僵尸进程)和X状态5.孤儿进程3.环境变量1.概念2.获取环境变量1.环境变量表2.函数获取环境变量3.关于环境变量的理解和main函数中的两个参数1.环境变量的理解2…

学习笔记--目标检测基础知识大全

来源&#xff1a;投稿 作者&#xff1a;LSC 编辑&#xff1a;学姐 目录 1.特点 2.数据集 2.1 VOCS数据集 2.2 COCO数据集 3.评价指标 3.1 GroundTruth 3.2 IOU(交并比&#xff0c;Intersection over Union) 3.3 基本指标 3.4 AP与mAp 3.5 案例演示 4. 脑图&#xff…