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

详解进程 及 探查进程

  • 进程的概念
    • 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  else18  {                                                                                            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值并没有被改变

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

相关文章:

详解进程 及 探查进程

进程的概念PCB是什么task_struct的作用如何执行进程进程的探查什么是bashps命令的使用&#xff08;查看进程&#xff09;创建进程探究父子进程进程的概念 简而言之&#xff0c;进程就是正在在执行的程序 之前说过&#xff0c;程序执行的第一步Windows是双击程序Linux是 ./ &a…...

汇编相关问题

汇编语言期末复习题DX&#xff1a;单项选择题 DU&#xff1a;多项选择题 TK&#xff1a;填空题 MC&#xff1a;名词解释 v JD&#xff1a;简答题 CXFX&#xff1a;程序分析题 CXTK&#xff1a;程序填空题 BC&#xff1a;编程题第1章&#xff1a;基础知识1、在汇编语言程序的开发…...

华为OD机试Golang解题 - 火星文计算 2 | 包含思路

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典文章目录 华为Od必看系列使用说明本期题目…...

成功解决configure: error: the HTTP rewrite module requires the PCRE library

文章目录 前言问题复现问题解决思考环节总结前言 大家好,我是沐风晓月,本专栏是记录日常实验中的所有疑难杂症,教程的安装,程序的bug,甚至各类报错,如果你也遇到了困惑和问题,欢迎与我一起交流学习。 另外不要解决完问题就结束了,思考环节也要好好看看哦。 问题复现…...

UNIX--GDB调试

通常&#xff0c;在为调试而编译时&#xff0c;我们会关掉编译器优化选项(-O)&#xff0c;并打开调试选项(-g)。另外&#xff0c;-Wall 在尽量不影响程序行为的情况下选项打开所有 warning&#xff0c;也可以发现许多问题&#xff0c;避免一些不必要的 BUG。 GDB 命令-启动、退…...

孤单数算法

1.背景 腾讯终面&#xff1a;孤单的QQ号码怎么找&#xff1f; 问题一&#xff1a;有n个QQ号码&#xff0c;除1个孤单的QQ号码外&#xff0c;其余的QQ号码都是成双成对的&#xff0c;求这个孤单的QQ号码&#xff0c;要求&#xff1a;时间复杂度为O(n), 空间复杂度为O(1). 问题…...

triangulate_object_model_3d算子总结

目录 1.去掉固定方向的点云干扰 2.增加八叉树深度,实现更高细节级别的三角测量 3.腐蚀和膨胀,得到更平滑的点云 1.去掉固定方向的点云干扰 例程:triangulate_object_model_3d_xyz_mapping.hdev...

ZincSearch Java 客户端教程

ZincSearch Zinc 简单、强大&#xff0c;不了解的同学可以参见我之前的博客。今天我们这里谈谈 Java 环境如何集成 Zinc 客户端&#xff0c;跟如何使用的。 安装 Zinc 到 Github 的官方 Releases 下载&#xff1a; 我的是 Windows 开发环境&#xff0c;下载 zincsearch_0.4…...

数据结构(一)(嵌入式学习)

数据结构干货总结&#xff08;一&#xff09;基础线性表的顺序表示线性表的链式表示单链表双链表循环链表循环单链表循环双链表栈顺序存储链式存储队列队列的定义队列的常见基本操作队列的顺序存储结构顺序队列循环队列队列的链式存储结构树概念二叉树二叉树的创建基础 数据&a…...

合成复用原则-快速理解

什么是合成/聚合复用原则&#xff1f; 合成/聚合复用原则是在一个新的对象里面使用一些已有的对象&#xff0c;使之成为新对象的一部分&#xff1b;新的对象通过向这些对象的委派达到复用已有功能的目的。 简述为&#xff1a;要尽量使用合成/聚合&#xff0c;尽量不要使用继承…...

Scala04 方法与函数

Scala04 方法与函数 Scala 中的也有方法和函数的概念。 Scala中的 方法 是类的一部分。 Scala中的 函数 是一个对象&#xff0c;可以赋值给变量。 在类中定义的函数就是方法 4.1 方法 Scala 中方法 与 Java 中类似&#xff0c;是组成类的一部分 4.1.1 语法结构 格式&#x…...

XJTUSE专业课与实验指南(已经开源)

文章目录XJTUSE专业课与实验指南大一小学期大二上课程实验大二下课程实验大二小学期大三上课程实验大三下课程实验XJTUSE专业课与实验指南 github地址&#xff1a;https://github.com/yijunquan-afk/XJTUSE-NOTES.git &#x1f4c4;写在前面 1️⃣ 本篇文章仅供参考&#xff0…...

Spring面试专题

讲师&#xff1a;邓澎波 Spring面试专题 1.Spring应该很熟悉吧&#xff1f;来介绍下你的Spring的理解 1.1 Spring的发展历程 先介绍Spring是怎么来的&#xff0c;发展中有哪些核心的节点&#xff0c;当前的最新版本是什么等 通过上图可以比较清晰的看到Spring的各个时间版本…...

【truncate、delete和drop的6大区别!】

在MySQL中&#xff0c;truncate、delete和drop是三个常用的命令&#xff0c;它们可以用于删除表或表中的数据&#xff0c;下面是它们的六大区别&#xff1a; 语法不同&#xff1a; truncate和delete是SQL语句&#xff0c;drop是DDL&#xff08;数据定义语言&#xff09;语句。…...

如何入门Vue:掌握Vue的核心概念和基本用法

Vue是一种流行的JavaScript框架&#xff0c;它可以让开发者更容易地构建响应式的用户界面。Vue的设计理念是简单易懂&#xff0c;它的核心库只关注视图层&#xff0c;可以与其它库或现有项目很好地结合。在本文中&#xff0c;我将介绍Vue的基础概念和如何开始使用Vue。Vue的基本…...

APM飞控使用动捕等外部定位

本文初次写于2023.03.03&#xff0c;pixhawk飞控应该是刷写了ArduPilot 4.1以上的版本。 机载计算机通过WIFI和vrpn_ros_client获取动捕系统&#xff08;vicon或者nokov&#xff09;的无人机定位数据&#xff08;x&#xff0c;y&#xff0c;z四元数&#xff09;&#xff0c;然…...

【vulhub漏洞复现】CVE-2013-4547 Nginx 文件名逻辑漏洞

一、漏洞详情影响版本 Nginx 0.8.41 ~ 1.4.3 / 1.5.0 ~ 1.5.7通过%00截断绕过后缀名的限制&#xff0c;使上传的php内容文件被解析执行。当Nginx得到一个用户请求时&#xff0c;首先对url进行解析&#xff0c;进行正则匹配&#xff0c;如果匹配到以.php后缀结尾的文件名&#x…...

Kubernetes中配置livenessProbe、readinessProbe和startupProbe

livenessProbe、readinessProbe和startupProbe作用kubelet使用livenessProbe&#xff08;存活探针&#xff09;来判断何时重启容器。例如&#xff0c;当程序中产生死锁的时候&#xff0c;程序还在运行&#xff0c;通过livenessProbe可以检测到程序已不能正常提供服务。这种情况…...

冰箱压缩机 方案

压缩机是制冷系统的心脏&#xff0c;它从吸气管吸入低温低压的制冷剂气体&#xff0c;通过电机运转带动活塞对其进行压缩后&#xff0c;向排气管排出高温高压的制冷剂气体&#xff0c;为制冷循环提供动力&#xff0c;从而实现压缩→冷凝→膨胀→蒸发 ( 吸热 ) 的制冷循环。压缩…...

一文带你入门,领略angular风采(上)!!!

话不多说&#xff0c;上代码&#xff01;&#xff01;&#xff01; 一、脚手架创建项目 1.安装脚手架指令 npm install -g angular/cli 2.创建项目 ng new my-app(ng new 项目名) 3.功能选择 4.切换到创建好的项目上 cd my-app 5.安装依赖 npm install 6.运行项目 npm start或…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

深入理解JavaScript设计模式之单例模式

目录 什么是单例模式为什么需要单例模式常见应用场景包括 单例模式实现透明单例模式实现不透明单例模式用代理实现单例模式javaScript中的单例模式使用命名空间使用闭包封装私有变量 惰性单例通用的惰性单例 结语 什么是单例模式 单例模式&#xff08;Singleton Pattern&#…...

镜像里切换为普通用户

如果你登录远程虚拟机默认就是 root 用户&#xff0c;但你不希望用 root 权限运行 ns-3&#xff08;这是对的&#xff0c;ns3 工具会拒绝 root&#xff09;&#xff0c;你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案&#xff1a;创建非 roo…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

在golang中如何将已安装的依赖降级处理,比如:将 go-ansible/v2@v2.2.0 更换为 go-ansible/@v1.1.7

在 Go 项目中降级 go-ansible 从 v2.2.0 到 v1.1.7 具体步骤&#xff1a; 第一步&#xff1a; 修改 go.mod 文件 // 原 v2 版本声明 require github.com/apenella/go-ansible/v2 v2.2.0 替换为&#xff1a; // 改为 v…...

相关类相关的可视化图像总结

目录 一、散点图 二、气泡图 三、相关图 四、热力图 五、二维密度图 六、多模态二维密度图 七、雷达图 八、桑基图 九、总结 一、散点图 特点 通过点的位置展示两个连续变量之间的关系&#xff0c;可直观判断线性相关、非线性相关或无相关关系&#xff0c;点的分布密…...

41道Django高频题整理(附答案背诵版)

解释一下 Django 和 Tornado 的关系&#xff1f; Django和Tornado都是Python的web框架&#xff0c;但它们的设计哲学和应用场景有所不同。 Django是一个高级的Python Web框架&#xff0c;鼓励快速开发和干净、实用的设计。它遵循MVC设计&#xff0c;并强调代码复用。Django有…...

工厂方法模式和抽象工厂方法模式的battle

1.案例直接上手 在这个案例里面&#xff0c;我们会实现这个普通的工厂方法&#xff0c;并且对比这个普通工厂方法和我们直接创建对象的差别在哪里&#xff0c;为什么需要一个工厂&#xff1a; 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类&#xff1a; 两个发…...