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

进程的管理与控制详解:创建、终止、阻塞等待与非阻塞等待

目录

一、进程创建

1、实例

2、fork函数详解

(1)fork函数模板

(2). fork() 函数的工作原理

(3). fork() 返回值和错误处理

3、如何理解进程创建过程

二、进程终止

1、终止是在做什么?

2、进程终止,有三种情况

3、进程如何终止?

三、进程等待

1、为什么要等待?

2、怎么等待?

(1)wait函数

(2)waitpid函数

四、阻塞等待与非阻塞等待


一、进程创建

1、实例

int main()
{ pid_t pid;pid = fork();if(pid < 0){//创建失败printf("forkfailed\n");return 1;//终止程序,退出码设置为1,以显示错误退出}else if(pid == 0){//子进程printf("I am a child process!,chailPID:%d\n",getpid());}else {//父进程,返回值>0 printf("I am a father process!,fatherPID:%d,childPID:%d\n",getpid(),pid);}return 0;
}

2、fork函数详解

(1)fork函数模板

#include <unistd.h>pid_t fork(void);

fork() 函数返回两次,
一次在父进程中返回子进程的进程 ID (PID),
一次在子进程中返回 0。
如果 fork() 失败,返回一个负值,表示错误。

(2). fork() 函数的工作原理

调用 fork() 函数时,操作系统会创建一个新的进程(子进程),该子进程是调用进程(父进程)的一个副本。
新进程(子进程)会复制父进程的地址空间、代码段、数据段和堆栈等信息,但是它们会有各自独立的内存空间。
子进程的 PID 和父进程不同,但是它们会继承父进程的文件描述符和信号处理器等。
fork() 后,父进程和子进程同时开始执行代码,但是它们执行的顺序和执行的内容可能有所不同,具体取决于操作系统的调度策略。

(3). fork() 返回值和错误处理

如果 fork() 返回值 >  0,则这是在父进程中返回的子进程的 PID。
如果 fork() 返回值等 == 0,则这是在子进程中返回的。
如果 fork() 返回值 <  0,则表示创建新进程失败,可能是因为系统资源不足或者其他错误。

3、如何理解进程创建过程

进程:内核的相关管理数据结构(task_struct mm_struct)+ 页表 + 代码和数据
上述对进程的描述,是从进程具有独立性的角度出发去看待
进程具有独立性,说明有各自的PCB、页表、数据;
而代码虽然是共享的,但是权限是只读的不能修改,因此互不影响

当使用fork创建进程时:
分配新的内存块和内核数据结构给子进程
将父进程部分数据结构内容拷贝给子进程
添加子进程到系统进程列表中
fork返回,开始调度器调度

为什么给父进程返回子进程的PID,给子进程返回0?
前者因为方便父进程对子进程标识的管理
后者因为返回创建成功与否的标志

fork常规用法:子进程执行和父进程类似的任务 / 子进车执行全新的任务

fork调用失败的原因
系统进程太多,资源不够

二、进程终止

1、终止是在做什么?

释放曾经的代码和数据所占据的空间
释放内核数据结构(但是task_struct延后,Z状态的僵尸进程)

2、进程终止,有三种情况

a、代码跑完,结果正确

b、代码跑完,结果不正确
那么,代码跑完,正确不正确,我怎么知道?怎么判断?
可以通过进程的退出码决定

c、代码没有跑完,异常提前退出
如果进程异常,退出码就没有意义
但是,如果出现了异常,我想知道,为什么出现异常?出现了什么异常?
出现什么异常,通过看退出信号是多少判断
进程出现异常,本质是因为进程收到了OS发给进程的信号
例如:kill -9 XXX
这个命令本质是XXX进程收到了OS的信号,为9,就会以killed的形式终止

那么,如何判断进程终止是处于上述三种情况的哪一种?
1、先确认是否异常退出
2、如果不是异常,就说明代码跑完,看退出码

因此,衡量一个进程退出到底是什么情况?
需要两个数字:退出码(跑完) + 退出信号(异常)的组合
而这个退出信息,要给父进程bash知道,确保父进程对子进程的管理
因此,进程的PCB task_struct就会存在两个属性:

int sig_code
int exit_code

在vs编程运行崩溃时,发生了什么?
是因为进程做了不该做的事情,OS杀掉了进程

main函数的返回值是什么意思?

int main()

{

        //...

        return 0;

}

是本进程的退出码,这个退出码交给父进程,让父进程知道子进程退出的情况(成功 / 失败且失败的原因是什么)
退出码为0,表示成功
退出码不为0,表示失败

查看退出码:

echo $?

?这个问号,是父进程bash获取到的,最近一个子进程退出的退出码

返回值返回给谁?返回给父进程bash
这个返回值是退出码,退出码交给bash之后,如果不是0,表示错误
此时bash会通过一定的形式将退出码转化为错误描述,strerrot函数

char* strerrot(int erronum):错误码转化为错误描述

以下是常见错误:

错误码 (errnum)错误描述 (错误码对应的错误描述)
1操作不允许的权限
2系统找不到指定的文件
3系统找不到指定的路径
4系统没有空间供处理此操作
5输入/输出错误
6设备不可用
7存储设备无法访问
8请求的文件描述符超出范围
9文件已经打开
10操作过多的文件系统
11资源暂时不可用
12文件名过长
13权限不足,拒绝访问
14资源暂时不可用,尝试再次

main函数为什么要有返回值?
这是因为本质上,我们自己写的所有进程任务,都是bash的子进程
而子进程的运行状况如何,父进程得知道,便于对子进程的管理
所以,父进程怎么知道子进程的状态呢?通过main函数的返回值判断
所以,main函数返回值的本质,是通知父进程任务执行情况

又为什么返回0?
0表示进程执行成功
非0表示失败,而且用不同的非0数字表示错误的原因类型,每个数字对应一个错误的描述

char* strerrot(int erronum):错误码转化为错误描述

3、进程如何终止?

a、main函数中直接return,表示进程终止(非main函数,return表示函数结束)

b、代码调用exit函数(引起一个正常的进程终止)
参数类似于main函数的return退出码
当调用exit函数时,可以在进程的任意位置退出

c、_exit(终止一个调用进程)
exit和_exit的区别是什么?
区别在于exit在退出时,会刷新缓冲区;_exit不会
exit是C语言库函数;_exit是系统调用
所以,本质上,exit一定会调用_exit系统接口
因为不允许用户直接越过操作系统访问底层的进程数据
所以,我们可以知道,缓冲区是介于系统调用和库函数之间的
也就是说,缓冲区不是操作系统内核缓冲区

三、进程等待

任何进程,在退出的情况下,一般必须要被父进程进行等待
如果退出时,父进程不管不顾,退出进程就会处于Z(僵尸状态),长期如此,就会造成内存泄漏
僵尸状态:进程没有被执行,不在CPU的运行队列,此时操作系统就会回收存在内存中的代码数据,但是不会释放PCB结构体
同时,僵尸进程无法被杀死,因为已经死了的僵尸,不能死两次
具体详情,可以参考博主的其他文章:零基础进程最详解:进程状态、僵尸进程、孤儿进程、阻塞态、挂起态、进程切换、进程常用命令、进程创建、队列优先级_僵尸进程孤儿进程-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/qq_51216031/article/details/140850173?spm=1001.2014.3001.5501

1、为什么要等待?

(1)通过父进程等待,解决子进程退出时的僵尸问题,回收系统资源
(2)获取子进程的退出信息(因为父进程要知道子进程因为什么退出,但是并非必要)

2、怎么等待?

通过wait / waitpid函数

(1)wait函数

wait 函数是一个阻塞式的系统调用,用于暂停父进程的执行,直到一个子进程结束或者收到一个信号为止。一旦子进程终止,wait 函数会获取子进程的终止状态并返回。

pid_t wait (int *status);//返回值是,等待成功时,子进程的pid
status:等待父进程中,任意一个子进程退出,如果不关心子进程的退出状态,可以传入 NULL。

返回值:如果成功,返回终止子进程的进程ID(PID)。
如果出错,返回 -1。

如果子进程没有退出,父进程一直在阻塞等待状态,即S(sleeping)状体
这种阻塞,本质是在等待子进程这个软件状态就绪,即返回信息,再死亡释放子进程

(2)waitpid函数

pid_t waitpid(pid_t pid, int *status, int options);
返回值:当正常返回的时候,返回收集到子进程的进程ID

参数:

第一个参数pid:等待的子进程PID:
< -1:等待进程组ID等于pid绝对值的任何子进程。
-1:等待任何子进程。
0:等待与调用进程在同一进程组的任何子进程。
> 0:等待指定PID的子进程。

第二个参数status:一个整型指针,用于存储子进程的退出状态信息。如果不关心子进程的退出状态,可以传入 NULL。

第三个参数options:指定等待的选项,例如 WNOHANG 可以使 waitpid 成为非阻塞的。

返回值:如果成功,返回终止子进程的进程ID(PID)。
如果出错,返回 -1。

WIFEXITED(status):获取退出码,返回值非0为正常退出,不正常为0

子进程返回的信息,就是通过wait_pid中的参数status获取的
因此,status不能简单视为一个整数
status在32位下,我们只关心低16位
在这16位中,8-15表示退出状态,0-6表示退出信号

低16位的含义:

退出状态:位于低16位的8-15位。这个部分表示子进程的退出状态。通常,如果子进程正常退出,这个状态会是0。
退出信号:位于低16位的0-6位。这部分表示导致子进程终止的信号。如果子进程不是正常退出(比如因为接收到了某个信号而终止),那么这部分会包含有关信号的信息。

四、阻塞等待与非阻塞等待

如果子进程没有退出
此时父进程在执行waitpid进行等待,处于阻塞等待状态
进程阻塞的本质就是进程不在运行调度队列中,状态不为R
如果父进程一直处于阻塞状态,就相当于父进程什么也没有做,就只是在等待子进程的退出
这样不好
那么可不可以让父进程不处于阻塞状态去等待呢?
可以,这种状态叫做非阻塞等待
怎么做?设置函数参数

pid_t waitpid(pid_t pid, int *status, int options);

对于该函数的options参数值设置为WNOHANG值(一个宏)
WNOHANG 是一个宏定义,通常在使用 waitpid 函数时用作参数,用于指定在调用 waitpid 函数时的父进程处于非阻塞等待状态。
具体来说:WNOHANG 的全称是 "Wait No Hang"。
非阻塞等待的时候 + 循环 = 非阻塞轮询
在非阻塞轮询情形下,父进程就可以做其他的事情

如何理解呢?

假设,你有一个女朋友,假设,注意,我说的是假设哈
你在大学谈了一个女朋友
周末你约她出去玩,可是她说他要化妆,要打扮一下
于是你就到她的宿舍楼下等
此时,你和你女朋友的处境就相当于子进程和父进程
你是父进程,你女朋友是子进程

如果在等的期间,你一句话都不敢说,啥也不敢做,
就像一个二棒槌一样杵在楼下等待
那么,此时你这个父进程就相当于阻塞等待状态
啥也没做,就是等,浪费生命,浪费时间

但是,如果你在等的期间,你每隔几分钟打个电话问个情况,说好了没有啊?
如果她告诉你好了,就出发
如果她告诉你没有好,那你也不能像棒槌一样干杵着
所以,你就刷刷抖音,欣赏欣赏风景,做自己的事情
然后再时不时打电话问情况
好了,就出发;没好,就做自己的事情
于是,此时,你和你女朋友的状态,就相当于非阻塞等待状态
打电话相当于一个函数调用,她给你的答复好没好是返回值
你拿到这个返回值当作一个参数,作为参考
返回值为好了,你就结束等待
返回值为没好,你就继续做手头的事情
这就是非阻塞等待状态
同时,你每隔几分钟打一次电话,
这个就叫做轮询
所以,
非阻塞等待的时候 + 循环 = 非阻塞轮询
在非阻塞轮询情形下,父进程就可以做其他的事情

虚拟地址空间是时代技术发展的产物
代码是只读属性,为什么是只读?
因为页表的权限设置只有只读,而我们使用的都是虚拟地址
会被页表部分修改命令被拦截

相关文章:

进程的管理与控制详解:创建、终止、阻塞等待与非阻塞等待

目录 一、进程创建 1、实例 2、fork函数详解 (1)fork函数模板 (2). fork() 函数的工作原理 (3). fork() 返回值和错误处理 3、如何理解进程创建过程 二、进程终止 1、终止是在做什么&#xff1f; 2、进程终止&#xff0c;有三种情况 3、进程如何终止&#xff1f; 三…...

【从零开始一步步学习VSOA开发】开发环境搭建

开发环境搭建 开发 VSOA 首先需要搭建开发环境&#xff0c;这里讲解 Windows 下 C/C 开发环境搭建方法。 下载 IDE 并申请授权码 SylixOS 的开发和部署需要 RealEvo-IDE 的支持&#xff0c;因此您需要先获取 RealEvo-IDE 的安装包和注册码。 RealEvo-IDE 分为体验版和商业版…...

一篇文章让你用我的世界中的红石搞懂什么是ALU!

目录 1.一些在开始的约定 2.七大逻辑门电路 1、 与门 2、 或门 3、 非门 5、 或非门 6、 异或门 7、 同或门 3.半加器 4.全加器 5.ALU 1.一些在开始的约定 相同的概念&#xff1a;相同的概念&#xff1a;高电平低电平逻辑真逻辑假 开关的开 开关的关 灯的亮 灯…...

硬盘数据恢复:所需时长、全面指南及注意事项

在数字化时代&#xff0c;硬盘作为我们存储重要数据的核心设备&#xff0c;其重要性不言而喻。然而&#xff0c;由于各种原因&#xff0c;如误删除、格式化、硬盘故障等&#xff0c;我们时常面临数据丢失的困境。数据恢复不仅关乎个人隐私和信息安全&#xff0c;更可能影响到我…...

基于SpringBoot+Vue的科研管理系统(带1w+文档)

基于SpringBootVue的科研管理系统(带1w文档) 基于SpringBootVue的科研管理系统(带1w文档) 科研的管理系统设计过程中采用Java开发语言,B/S结构&#xff0c;采取springboot框架&#xff0c;并以MySql为数据库进行开发。结合以上技术&#xff0c;对本系统的整体、数据库、功能模块…...

计算机组成原理 —— 五段式指令流水线

计算机组成原理 —— 五段式指令流水线 五段式指令流水线运算类指令LOAD指令的执行过程STORE指令的执行过程条件转移指令执行过程无条件转移指令的执行过程 我们今天来看看五段式指令流水线&#xff1a; 五段式指令流水线 五段式指令流水线是一种常见的处理器架构设计中采用的…...

【Bigdata】什么是关系联机分析处理

这是我父亲 日记里的文字 这是他的生命 留下留下来的散文诗 几十年后 我看着泪流不止 可我的父亲已经 老得像一个影子 &#x1f3b5; 许飞《父亲写的散文诗》 关系联机分析处理&#xff08;Relational Online Analytical Processing&#xff0c;简称 ROLA…...

svd在求解最小二乘中的应用

文章目录 线性最小二乘的直接解法&#xff08;正规方程解法&#xff09;什么是伪逆&#xff1f;伪逆矩阵的一般形式伪逆矩阵与SVD的关系 线性最小二乘的直接解法&#xff08;正规方程解法&#xff09; 对于 A x b \boldsymbol{A}xb Axb的线性最小二乘问题&#xff0c;有直解析…...

JVM—垃圾收集算法和HotSpot算法实现细节

参考资料&#xff1a;深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践&#xff08;第3版&#xff09;周志明 1、分代回收策略 分代的垃圾回收策略&#xff0c;是基于这样一个事实&#xff1a;不同的对象的生命周期是不一样的。因此&#xff0c;不同生命周期的对象可以采取…...

nvidia系列教程-AGX-Orin基础环境搭建

目录 前言 一、Agx-Orin&#xff08;32GB&#xff09;介绍 1.1 GPU 1.2 CPU 1.3 NVDLA 1.4 内存 1.5 存储 二、安装JetPack SDK 三、基础环境配置 四、jetpack软件版本 总结 前言 NVIDIA Jetson AGX Orin 是一款功能强大的嵌入式AI平台&#xff0c;专为需要高性能和低…...

使用SpringAOP实现公共字段填充

文章目录 概要整体架构流程技术细节小结 概要 在新增员工或者新增菜品分类时需要设置创建时间、创建人、修改时间、修改人等字段&#xff0c;在编辑员工或者编辑菜品分类时需要设置修改时间、修改人等字段。这些字段属于公共字段&#xff0c;也就是也就是在我们的系统中很多表…...

c++初阶-----适配器---priority_queue

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…...

VSCode上安装C#环境教程

本章教程,教你如何在vscode上,可以快速运行一些基础的c#代码。 1、下载 .NET Code SDK 下载地址:https://dotnet.microsoft.com/zh-cn/download/dotnet/sdk-for-vs-code?utm_source=vs-code&utm_medium=referral&utm_campaign=sdk-install 根据自己的操作系统,选择…...

VS Code 和 Visual Studio 哪个更好

文章目录 VS Code 和 Visual Studio 哪个更好Visual Studio Code简介Visual Studio简介相同点差异点总结 VS Code 和 Visual Studio 哪个更好 Visual Studio Code简介 Visual Studio Code&#xff08;简称 VS Code&#xff09;是一款开源的、免费的、跨平台的、轻量级的代码编…...

FCA-数据分析理论试卷

其他参考&#xff1a; https://segmentfault.com/a/1190000043363073 https://blog.csdn.net/CSDN_WYY/article/details/137082340 Part.1&#xff1a;判断题&#xff08;总分&#xff1a;8分 得分&#xff1a;8&#xff09; 第1题 判断题 对任意事件A和B&#xff0c;必有 …...

WPF程序通过CadLib4加载CAD .dwg格式文件

1、下载CadLib相关dll文件&#xff0c;主要用到的&#xff1a;WW.dll、WW.Cad.dll、WW.GL.dll 2、程序中引用dll库。 3、创建WPF程序&#xff0c;使用Canvas来加载dwg文件&#xff0c;支持拖动和放大缩小。 4、部分代码&#xff1a; public void Init(string filename) {tr…...

图表全能王(ChartStudio) 上架VisionPro!

图表全能王(ChartStudio) - 终极图表制作工具&#xff01;支持条形图、折线图、面积图、柱形图、条形图、饼图、玫瑰图、雷达图、牛肉图、风琴图、旭日图、桑基图等图表。 https://apps.apple.com/app/chartstudio-data-analysis/id6474099675 https://apps.apple.com/cn/app/…...

【云原生】Job一次性任务详解

Job一次性任务 文章目录 Job一次性任务一、Job介绍二、运行示例Job 一、Job介绍 Job会创建一个或者多个Pod&#xff0c;并将继续重试Pod的执行&#xff0c;直到指定数量的Pod成功终止。随着Pod成功借宿&#xff0c;Job跟踪记录成功完成的Pod个数。当数量达到指定的成功个数阈值…...

化工厂人员定位采用多种定位技术的融合定位系统的好处

由于化工厂内环境的复杂性和危险性&#xff0c;通常单一的定位技术很难满足全厂区的人员定位需求&#xff0c;如果能将不同定位技术融合在一起&#xff0c;发挥出它们各自的优势&#xff0c;那么就能解决以上问题。 融合定位技术诞生背景 随着科技的不断发展&#xff0c;多种定…...

使用AI绘图工具生成风景图像的教程

随着人工智能技术的飞速发展&#xff0c;AI绘图工具在图像生成和艺术创作方面变得越来越强大&#xff0c;无论你是一个设计师、艺术家&#xff0c;还是仅仅对生成艺术感兴趣的爱好者&#xff0c;AI绘图工具都可以帮助你轻松地创作出惊艳的风景图像。 在这篇教程中&#xff0c;…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

docker详细操作--未完待续

docker介绍 docker官网: Docker&#xff1a;加速容器应用程序开发 harbor官网&#xff1a;Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台&#xff0c;用于将应用程序及其依赖项&#xff08;如库、运行时环…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

微信小程序云开发平台MySQL的连接方式

注&#xff1a;微信小程序云开发平台指的是腾讯云开发 先给结论&#xff1a;微信小程序云开发平台的MySQL&#xff0c;无法通过获取数据库连接信息的方式进行连接&#xff0c;连接只能通过云开发的SDK连接&#xff0c;具体要参考官方文档&#xff1a; 为什么&#xff1f; 因为…...

selenium学习实战【Python爬虫】

selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...