Linux系统篇:进程篇二:【进程概念与进程父子关系】

发布时间:2026/10/15 13:16:00

Linux系统篇:进程篇二:【进程概念与进程父子关系】 一进程的课本概念课本概念系统的一个执行实例正在执行的程序内核观点担当分配系统资源CPU时间内存的实体进程 内核数据结构task_struct自己的程序代码和数据二进程的实际概念2.1什么是PCB/task_struct程序在没有被运行起来的时候都是一个个在磁盘上面的文件运行起来后就要被加载进内存此时操作系统必然要对多个被加载到内存中的程序进行管理管理的核心逻辑是先描述再组织先描述操作系统描述进程的各种数据创建了一个PCB,PCB是什么PCB全称是Process Control Block 即进程控制块在Linux操作系统中用于描述进程的结构体叫做struct task_structPCB和task_struct是抽象和具体的关系它包含了进程的所有属性举例如下标示符描述本进程的唯一标示符用来区别其他进程状态任务状态退出代码退出信号等优先级相对于其他进程的优先级程序计数器程序中即将被执行的下一条指令的地址内存指针包括程序代码和进程相关数据的指针2.2操作系统内部组织的进程链表操作系统在每一个task_struct里面放了一个指针于是每一个PCB连接在一起形成了一个链表于是对进程的管理就变成了对链表的增删查改操作的本质不是直接去操作我们的代码与数据而是去找我们的PCB用PCB去修改我们的代码和数据举个简单的例子我们去找工作面试一群人按顺序去找面试官比如面试官为CPU那这个时候我们的简历就是PCB我们人就是数据和代码这就是先描述再组织的结构关于进程我们还有两个结论进程 PCB 加载到内存的代码和数据而不是代码和数据操作系统对进程的管理 操作系统滴哦链表的增删查改这也是解耦三系统调用与进程查看3.1系统调用存在哪里在man手册里面查看前者是系统调用后者是库函数调用3.2系统调用1 #include stdio.h 2 #include unistd.h 3 #include sys/types.h 5 int main() 6 { 7 while(1) 8 { 9 sleep(1); 10 printf(我是一个进程我的pid: %d\n, getpid()); // 获取当前进程的pid 11 } 12 }unistd.h:包含了各种系统服务的函数原型是访问系统调用(如getpid)的门户sys/types.h:提供进程ID等数据类型的定义如pid_tsleep让进程进入休眠状态getpid:通过系统调用直接向内核申请获取当前进程的唯一标识符PID除了getpid外我们还补充一个getppid获取父进程的pid3.3查看一个进程创建一个进程之后我们可以通过使用ps axj命令该命令会列出系统中所有进程的详细状态信息为了更加高效的观察我们会通常结合管道和脚本进行优化1.基础过滤使用grep‘文件名’筛选特定进程2.去除干扰加上grep -v grep过滤掉过滤指令本身的进程。这是因为当我们执行ps axj | grep 文件名时grep命令本身也是一个进程也会出现在ps的输出结果中从而干扰我们的观察。而grep -v grep中的-v选项表示反向匹配即排除包含grep关键字的行这样就能把grep命令自身的进程过滤掉只保留我们真正关心的进程信息。3.保留标题栏使用head-1显示ps输出的首行属性说明PID不会一成不变当我们crtlc杀死进程后再次运行看到的pid就不一样了杀死进程的方式还有一种kill -9进程pid但是始终有一个pid是始终不变的查看它我们发现这个就是bash所以说命令解释器本质也是一个进程它是一个会在你的终端不断打印而且不断阻塞等待你输入的一个进程操作系统对每一个用户都会创建一个bash除了上述的方式查看进程还有一种办法通过/proc目录查看进程系统把一个个进程都转化为了文件进程结束文件消失或者指定打开一个进程的文件夹/proc/213813.4进程与工作目录exe - /home/whb/code/code/merge_class/lesson12/myprocess cwd - /home/whb/code/code/merge_class/lesson12第一个是进程的路径让进程知道自己是从哪里来的它的代码和数据在磁盘的什么位置第二个是进程的当前的工作目录当我们使用相对路径打开文件系统会自动将cwd的路径与文件名进行拼接从而确定文件在磁盘上的位置#include unistd.h chdir(/home/whb); // 将进程的工作目录切换到 /home/whb fopen(hello.txt, a); // 此时文件将创建在 /home/whb 目录下这也是为什么新建文件会出现在可执行文件同级目录的原因---因为进程启动时cwd默认继承父进程通常是shell所在的路径动态修改chdir系统调用进程可以通过chdir接口来动态改变自己的工作目录#include unistd.h chdir(/home/whb); // 将进程的工作目录切换到 /home/whb fopen(hello.txt, a); // 此时文件将创建在 /home/whb 目录下在shell是本质进程的情况下cd内部其实就是封装了一个chdir函数四进程的父子关系4.1进程树我们的进程是一个单亲繁殖系统类似B树一颗多叉树从根节点出发延申出多个子进程譬如我们一切命令都有一个共同的父进程bash4.2子进程的创建我们来介绍一个创建子进程的系统调用fork()头文件#includeunistd.h一句话核心fork()就是进程的分身术--调用一次原地复制出一个一模一样的子进程让程序真正分头行动作用创建分身产生子进程继承父进程的代码和数据并发处理让父进程同时运行互不干扰地处理不同任务环境隔离子进程在独立空间运行崩溃不影响父进程#includeiostream #includeunistd.h #includestring #includesys/types.h using namespace std; void Func_Test_Process() { pid_t _id fork(); if(_id 0) { string strerror(fork fail); throw strerror; } else if(_id 0) { while(1) { printf( 这是一个子进程子进程的pid是: %d ,子进程的ppid是: %d .\n,getpid(),getppid()); sleep(1); } } else if(_id 0) { while(1) { printf( 这是一个父进程父进程的pid是: %d ,父进程的ppid是: %d .\n,getpid(),getppid()); sleep(1); } } } int main() { try { Func_Test_Process(); } catch(string str) { coutstrendl; } }如上父子进程都拿着各自的-id去执行对应的代码我们的父进程创建一个子进程默认是将父进程PCB中的数据拷贝一份给子进程并且修改一部分内容比如pid和ppid。于是子进程就会自然而然的指向父进程的那段数据和代码于是子进程与会去执行父进程后面的那一段代码相当于有两个进程同时执行代码值得注意的是父进程必须获得子进程的pid才能方便管理子进程不必获得父进程的pid因为子进程可以使用ppid之后我们还有问题else和ifelse为什么可以同时执行一个局部变量为什么可以同时0和0一个函数为什么可以有两个返回值4.3一个函数为什么可以有两个返回值首先一点一个函数达到了return其核心功能就算是完成了fork也是如此fork在return之前就完成了任务1.申请新的pcb2.拷贝父pcb给子进程3.子pcb放入进程list中4.甚至放入调度队列中因此我们得到子进程的创建时间点一定在return之前于是fork内部必然会有两个进程两个返回值4.4为什么else和if else可以同时执行在我们的认知内if else和else永远互斥但在Linux系统编程中进程改变了这一点还有一个概念代码是共享的但是执行流是独立的当fork函数执行完成之后系统里就存在两个独立的执行流父进程和子进程父进程拿着fork返回的子进程pid继续向下执行遇到if分支进行逻辑判断后进入分支子进程拿着fork返回的0继续向下执行遇到if分支进行了不同的逻辑判断之后进入到了不同分支内综上其实并不是在一个进程内执行了两个分支而是两个进程各自执行了属于自己的分支4.5为什么一个局部变量可以同时等于0和大于0同一个变量_id为什么可以即是0又是进程pid这里涉及到了linux的内存管理技术写时拷贝1.初始状态fork刚完成时紫禁城的页表指向的物理内存和父进程是同一块也就是说他们最初确实共享一个_id的内存空间2.发生写入当fork准备返回结果并写入_id变量时操作系统会发现有两个进程尝试操作这块内存3.触发拷贝为了保证进程结果的独立性互不干扰操作系统会为子进程重新开辟一块物理空间把父进程的内容拷贝过去然后修改子进程页表的映射关系。你在父进程看到_id它映射的是一块存着子进程PID的物理内存你在子进程看-id,它映射的是另一块存着0的物理内存由上我们还能得出一个结论进程具有独立性两个进程的PCB的数据结构是独立的。即使共享也不会影响数据又有写时拷贝守护
延伸阅读

更多相关文章

2026/10/15 13:16:00

python的机器人基础原理工业场景模拟第二十七篇:多工位连续搬运,设置多组关节路点,完成多段连续关节空间多项式轨迹插值。

《Python机器人基础原理》第二十七篇:多工位连续搬运——设置多组关节路点,完成多段连续关节空间多项式轨迹插值1. 实际工业应用场景周一早晨,某3C电子装配产线的上下料工位。一台4-DOF俯仰型关节臂升降轴机械手(基座偏航θ₁ 大…

2026/10/15 13:15:59

python的机器人基础原理工业场景模拟第二十六篇:机械臂两点转运,给定起点终点关节角度生成多项式轨迹,输出速度时间变化曲线。

《Python机器人基础原理》第二十六篇:机械臂两点转运——给定起点终点关节角度生成多项式轨迹,输出速度时间变化曲线1. 实际工业应用场景周五上午,某新能源电池模组产线的电芯搬运工位。一台3-DOF垂直关节机械臂(基座偏航θ₁ 大…

2026/10/15 15:26:58

SpringBoot奖学金评定系统:动态规则引擎与多源数据整合实践

1. 项目背景与核心价值奖学金评定是高校学生管理工作中最具挑战性的环节之一。记得去年帮母校学工处做系统升级时,他们的Excel表格里躺着17个评分维度,人工核算经常出现小数点后三位的误差。传统评审方式主要面临三个痛点:多源数据整合困难&a…

2026/10/15 15:26:58

Matlab与Python图像数据交换方案:格式、维度与性能对比

最近在做的一个图像处理项目里,我同时用了Matlab和Python——前期用Matlab做算法原型验证,后期又要接到Python的深度学习流程里。两边来回倒腾数据,最头疼的其实不是算法本身,而是图像数据在两种语言之间的传递。矩阵、numpy arra…

2026/10/15 15:26:58

跳球物理模拟实战:从重力积分到碰撞检测的完整实现

1. 跳球项目的整体设计与核心思路1.1 从“跳球”这个名字说起第一次看到“跳球”这个标题,很多人脑子里浮现的可能是篮球开场那一下——裁判把球往空中一抛,两边的人同时起跳争抢。这个画面感其实非常准确,因为“跳球”这个项目本质上就是在模…

2026/10/15 15:26:58

Java Swing+JDBC水果超市管理系统课设源码解析与避坑指南

简介:面向Java初学者的水果超市管理系统源码包,适合正在学习Java GUI、集合框架与JDBC数据库编程的读者。项目提供两种典型实现:一种基于ArrayList完成内存数据管理,另一种使用MySQL数据库并通过JDBC进行增删改查,帮助…

2026/10/15 15:21:58

计算机基础++:把背过的名词变成能解释现象的地图

我面试过不少候选人,也带过新人,慢慢发现一个共性现象:很多人能把“进程和线程的区别”“TCP和UDP的区别”背得滚瓜烂熟,可你只要把问题稍微换一下,变成“如果让你设计一个聊天软件,你会选 TCP 还是 UDP&am…

2026/10/14 11:31:03

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/14 17:41:07

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/15 13:42:16

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/15 0:02:22

防关联浏览器哪个好?三款产品实测差异解析

新手做多店铺,最纠结的就是防关联浏览器选哪个。飞跨、网易、站斧这三款被问得最多,先给结论:要一体化省心、长期便宜,选站斧;要网易招牌和稳,选网易;预算紧做东南亚 Lazada,选飞跨。…

2026/10/15 0:02:22

影刀RPA深度实战:大模型Fine-tuning定制RPA专用Prompt与指令生成

影刀RPA深度实战:大模型Fine-tuning定制RPA专用Prompt与指令生成 一、技术背景 大模型(LLM)在通用场景下表现强大,但当我们将 GPT-4 或 Qwen 直接用于生成影刀RPA操作指令和 XPath 定位时,准确率通常只有 40%-60%。原因…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑