【Linux】进程 | 控制块pcb | task_struct | 创建子进程fork

目录

Ⅰ. 进程的概念(Process)

1. 什么是进程?

2. 多进程管理

3. 进程控制块(PCB)

task_struct 的结构

Ⅱ. 进程查看与管理

1. 使用指令查看进程

2. /proc 查看进程信息

3. 获取进程 ID

4. 创建子进程

原因:fork()的 机制

总结

文章手稿:


xmind:

 内容:理解“进程”的概念及其在操作系统中的管理,并探讨进程控制块 (PCB) 的重要性及其结构。本文还将介绍如何查看和管理进程,以及如何通过系统调用创建进程。

文章手稿可见文末

Ⅰ. 进程的概念(Process)

1. 什么是进程?

进程是一个运行中的程序。当可执行文件被加载到内存中时,该程序就成为了一个进程。

2. 多进程管理

操作系统中可能同时存在大量的进程吗?of course

操作系统需要管理这些进程,以确保系统资源(如CPU时间、内存等)合理分配。管理进程的本质是对进程数据的管理。

我们需要 先描述再组织。(上一章我们讲过)

所以,当一个程序加载到内存时,操作系统做的不仅仅只是把代码和数据加入到内存,

还要管理进程,创建对应的数据结构。

Linux 操作系统的内核是 C 语言写的,描述时就用到struct啦

3. 进程控制块(PCB)

在操作系统中,用于描述进程的结构体称为进程控制块(PCB)。在Linux中,这种结构体称为 task_struct

task_struct 的结构
struct task_struct {volatile long state;void *stack;atomic_t usage;unsigned int flags;     unsigned int ptrace;unsigned long ptrace_message;siginfo_t *last_siginfo; int lock_depth;         // ... 其他属性
};

task_struct 包含进程的所有属性数据,如进程状态、优先级、程序计数器、内存指针、上下文数据、I/O状态信息和记账信息等。

操作系统对进程的管理,最终变成了对链表的增删查改。

什么是进程?目前为止我们可以总结成:进程 = 可执行程序 + 该进程对应的内核数据结构

操作系统不相信任何人的,不会直接暴露自己的任何数据结构,代码逻辑,其他数据相关的细节。

想做系统是通过 系统调用 的方式,对外提供接口服务的。

下面我们将来学习一些系统接口


Ⅱ. 进程查看与管理

1. 使用指令查看进程

 运行

通过下面这些命令,可以方便地查看和管理系统中的进程。

指令含义
ps a显示现行终端机下的所有程序,包括其他用户的程序
ps -A显示所有程序
ps c列出程序时,显示每个程序真正的指令名称
ps -e显示所有程序
ps e列出程序时,显示每个程序所使用的环境变量
ps f用ASCII字符显示树状结构,表达程序间的相互关系
ps -H显示树状结构,表示程序间的相互关系
ps -N显示所有的程序,除了执行ps指令终端机下的程序之外
ps s采用程序信号的格式显示程序状况
ps S列出程序时,包括已中断的子程序资料
ps -t <终端机编号>指定终端机编号,并列出该终端机的程序状况
ps u以用户为主的格式来显示程序状况
ps x显示所有程序,不以终端机来区分
ps -l显示详细PID信息

通过指令如 ps 和 top 可以查看系统中的进程信息。例如,使用 ps aux 可以显示系统中所有的进程:

$ ps aux

若需查看特定进程,可以使用 grep 过滤:

$ ps aux | grep 'mytest' | grep -v grep

相当于Windows 下的任务管理器:

2. /proc 查看进程信息

/proc 是一个虚拟文件系统,包含当前系统的实时进程信息。

$ ls /proc

左边蓝色的就是pid

3. 获取进程 ID

每一个进程在系统中,都会存在一个惟一的标识符--pid

我们可以尝试在proc 目录下找到这个 pid ,发现这个18705 目录

ctrl+c 可以发现进程具有实时性

 接下来我们重启来继续研究一下文件的创建和存储

 对代码进行一些改写

#include <stdio.h>
#include <unistd.h>int main(void) {FILE* fp = fopen("log.txt", "w");  // 若不存在就创建之while (1) {printf("I am m a process!\n");sleep(1);}
}

C语言专栏中讲到过,fopen 后面如果不带路径,那么会默认在当前路径。

所谓的当前路径,其本质 —— 当前进程所在的路径

进程会自己维护,进程会知道自己的工作路径在哪里

  • exe:指出进程对应的可执行程序的磁盘文件
  • cwd:指出进程当前的工作路径

可以通过 getpid() 和 getppid() 系统调用获取当前进程和父进程的 ID。

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>int main(void) {printf("PID: %d, PPID: %d\n", getpid(), getppid());return 0;
}

运行可以看到:

 除了ctrl+c ,我们还可以这么终止进程

$ kill -9 [pid]   # 给这个进程发送9号信号

上面看到的ppid 我们也可以来测试一下

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>int main(void) {while (1) {printf("I am m a process! , pid: %d, ppid: %d\n",getpid(), getppid());sleep(1);}
}

4. 创建子进程

通过 fork() 系统调用可以创建子进程。fork() 有两个返回值:父进程返回子进程的 PID,子进程返回 0。

为什么可以返回两个值呢? 

我们可以来测试一下 

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>int main(void) {pid_t id = fork();if (id == 0) {// 子进程while (1) {printf("我是子进程,我的pid: %d,我的父进程是 %d\n", getpid(), getppid());sleep(1);}} else {// 父进程while (1) {printf("我是父进程,我的pid: %d,我的父进程是 %d\n", getpid(), getppid());sleep(1);}}
}
原因:fork()的 机制

fork() 后,父进程和子进程会共享代码,数据则各自独立。通过不同的返回值,可以让父进程和子进程区分不同的执行流,执行不同的代码块。

具体是怎么区分的可见文末手稿中的图解~ 

总结

进程是操作系统中非常重要的概念。通过进程控制块(PCB)对进程进行描述和管理是操作系统的一项重要职责。通过使用各种工具和系统调用,我们可以方便地查看和管理进程,从而确保系统资源的有效利用。

文章手稿:

 

 

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

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

相关文章

STM32启动流程 和 map文件的作用

一&#xff0c;启动流程 1. 复位/上电 2. 根据 BOOT0/BOOT1 确定程序从哪个存储位置执行 3. 初始化 SP 及 PC 指针 将 0X08000000 位置的栈顶地址存放在 SP 指针中 将 0x08000004 位置存放的向量地址装入 PC 程序计数器 4. 初始化系统时钟 5. 初始化用户堆栈 6. 进入main函数 二…

Jmeter TCP接口测试-实例

1、TCP接口结构 TCP接口&#xff1a;只有IP和PORT 传参数据类型根据开发定义的类型 需要添加一个ascii码的十进制字节结束符&#xff0c;tcp才会关闭 2、TCP接口环境搭建 在testfan-tcp-server.jar目录下&#xff0c;启动cmd命令行&#xff0c;输入&#xff1a; java -jar…

如何在 SwiftUI 视图中显示应用图标和版本

文章目录 前言获取应用图标获取应用版本创建 SwiftUI 视图总结前言 在应用中显示应用图标和版本是为用户提供快速识别应用版本和变体的好方法,无论是内部用户(如测试人员或利益相关者)还是外部用户。 在本文中,我将展示如何创建一个可访问的 SwiftUI 视图,既能显示应用图…

字符串匹配 --- BF算法 KMP算法

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏&#xff1a; 算法Journey 本篇博客我们将介绍关于字符串匹配的BF算法以及KMP算法&#xff0c;请放心食用~ &#x1f3e0; 字符串匹配 假设有一个字符串为主串str&#x…

2.移植freertos到stm32f103c8t6

目录 1.步骤 2.freertos配置时常见的选项卡意思 1.步骤 2.freertos配置时常见的选项卡意思

【unity实战】Unity中基于瓦片的网格库存系统——类似《逃离塔科夫》的库存系统

最终效果 文章目录 最终效果前言素材下载图片配置获取格子坐标动态控制背包大小添加物品移动物品物品跟随鼠标创建物品的容器&#xff0c;定义不同物品修改物品尺寸修复物品放置位置问题按物品尺寸占用对应大小的格子判断物品是否超出边界范围物品放置重叠&#xff0c;交换物品…

深度解析:机器学习如何助力GPT-5实现语言理解的飞跃

文章目录 文章前言机器学习在GPT-5中的具体应用模型训练与优化机器翻译与跨语言交流&#xff1a;情感分析与问答系统&#xff1a;集成机器学习功能&#xff1a;文本生成语言理解任务适应 机器学习对GPT-5性能的影响存在的挑战及解决方案技术细节与示例 文章前言 GPT-5是OpenAI公…

24/06/26(1.1129)动态内存

strtok 字符串分割函数 #include<stdio.h> int main(){ char str[] "this,a sample string."; char* sep ","; char* pch strtok(str, sep); printf("%s\n", pch); while (pch ! NULL){ printf("%s\…

惊天大瓜姬圈天莱女明星出轨风波

#惊天大瓜&#xff01;姬圈天菜女明星出轨风波#近日&#xff0c;娱乐圈掀起了一场前所未有的风暴&#xff01;狗仔队放出重磅消息&#xff0c;直指某位姬圈天菜级别的女明星深陷出轨泥潭。消息一出&#xff0c;引发了网友们的热议和猜测&#xff0c;究竟这位神秘的女明星是谁&a…

各式各样神奇的注意力机制变型

当输入sequence N很大的时候&#xff0c;这个时候self-attention 占据了绝大部分算力 Local Attention / Truncated Attention 只需要关注附近的attention, local attention 和cnn 差不多&#xff0c;可以加速计算&#xff0c;但效果不一定好 Stride attention 空几格attenti…

[保姆级教程]uniapp自定义标签页切换组件

文章目录 导文样式改成动态列表切换点击效果加上点击自动滑动scroll-view加上切换组件效果 导文 unaipp自带的标签页和ui设计相差太大&#xff0c;直接修改组件比手写一个还麻烦&#xff0c;下面手写一个。 样式 先用scroll-view做一个滑动&#xff0c;不然多的话滑动不了。 &l…

神经网络学习8-反向传播

back propagation 拿到前面传回来的L对z的偏导&#xff0c;再分别算损失值对x和w的偏导 反向传播 前馈过程求局部梯度 反向传播 这里的loss&#xff08;wxb-y)^2,第一个关于b的偏导为2(wxb-y),第二个关于w的为2w(wxb-y)

【机器学习300问】128、简述什么Word2Vec?

一、一句话说明Word2Vec是什么&#xff1f; Word2Vec是一种常见的词嵌入技术。Word2Vec的目标是将每个词表示为一个向量&#xff0c;使得这些向量能够反映出词语之间的相似性和关联性。 word2vec算法通过预测中心词和上下文词的共现概率来学习词向量&#xff0c;能够捕捉词语之…

植物大战僵尸杂交版v2.1最新直装版,苹果+安卓+PC+防闪退工具+修改工具+高清工具+通关存档整合包更新

今天我要和各位聊聊一款让全网疯狂的游戏——《植物大战僵尸杂交版》。这可不是简单的游戏&#xff0c;它可是让B站的UP主“潜艇伟伟迷”一夜成名的大作&#xff0c;让无数玩家为之疯狂的魔改神作&#xff01; 记得2009年&#xff0c;《植物大战僵尸》横空出世&#xff0c;那时…

LDO芯片手册,实例应用分析

在进行电路设计时LDO是经常用到的&#xff0c;尤其在为芯片&#xff0c;晶振等敏感电路进行供电时应用更多&#xff0c;下面选取一款比较常用的LDO芯片&#xff0c;一起进行更深入的学习。 SGM2036特点简介 SGM2036&#xff0c;圣邦微一款比较常用的LDO芯片手册 可以先大致看…

【ajax实战04】数据管理平台——富文本编辑器

一&#xff1a;富文本编辑器简介 富文本&#xff1a;带样式&#xff0c;多格式的文本&#xff0c;在前端一般使用标签配合内联样式实现。 富文本编辑器&#xff1a;用于编写富文本内容的容器 二&#xff1a;wangEditor插件 https://www.wangeditor.com/ 对于将富文本编辑器…

CAN通信协议

文章目录 STM32-CAN1. CAN基础知识2. CAN协议2.1. CAN协议与ISO/OSI基本参照模型的关系2.2. CAN协议及标准规格2.3. CAN协议2.3.1. 帧的种类2.3.2. 数据帧2.3.3. 遥控帧2.3.4. 错误帧2.3.5. 过载帧2.3.6. 间隔帧 2.4. 优先级的决定2.5. 位填充2.6. 错误的种类2.7. 位时序 3. CA…

鸿蒙系统最简单安装谷歌服务及软件的方法

哈喽&#xff0c;各位小伙伴们好&#xff0c;我是给大家带来各类黑科技与前沿资讯的小武。 近日&#xff0c;华为开发者大会在东莞松山湖召开&#xff0c;发布了盘古大模型5.0和纯血版的鸿蒙 HarmonyOS NEXT 全场景智能操作系统&#xff0c;而根据研究机构 Counterpoint Resea…

ITSG、COST-G、Tongji和WHU Level-2数据产品读取绘图(Matlab)

数据介绍&#xff1a; ICGEM International Center for Global Gravity Field Models (gfz-potsdam.de) ITSG 2018&#xff1a;Institute of Geodesy at Graz University of Technolog&#xff08;格拉茨理工大学大地测量研究所&#xff09; 2018版本&#xff0c;最高60阶球谐…

Java导出excel合并行功能

导出的excel需要上下行相同的数据进行行合并的功能。如图显示 这里我使用的是项目框架自带的导出模板代码&#xff0c;是在这套模板基础之上做的修改。 // 我主要演示的就是mergeRows方法的操作&#xff0c;dataList是导出数据的集合。 workbook ExcelTools.expData(workbook…