进程控制(上)【Linux操作系统】

news2025/4/18 22:54:50

进程控制

写时拷贝

本质是一种减少深拷贝的方法
Linux中有很多拷贝的场景都用得上写时拷贝,下面以创建子进程时的写时拷贝为例:

子进程被创建的时候:
会继承父进程的mm_struct和页表
所以子进程刚刚继承时,父子进程的代码和数据都是共享的

系统是如何知道子进程/父进程修改数据的时候要发生写时拷贝的呢?
①父进程在使用fork创建子进程之前,就会把页表中的数据区的权限改成r(只读)
这样子进程继承到的页表中的数据区就也是只读的

②当子进程/父进程尝试修改数据区中的数据时,就是修改只读数据项,页表就会报错,就会触发缺页中断

③系统发现缺页中断之后,就会检测
1,如果发现用户要修改的这个区域一定是只读的,就把进程杀掉
2,如果这个区域一定是读写的,只是页表中的权限设置成只读的了,此时系统就会进行写时拷贝
在这里插入图片描述

所以:不止创建子进程写时拷贝的时候是这种原理
只要可能发生写时拷贝的数据被页表管理着,就都可以通过这个原理实现写时拷贝



错误码

用来判断进程任务执行是否成功,如果失败了错误是什么

main函数的返回值其实是错误码,是返回给父进程/操作系统的
在这里插入图片描述
进程错误码的的取值范围是[0-255],即一个字节
因为使用wait/waitpid等待回收错误码的时候,只给它留了8个比特位



进程中止

进程中止的方法:

①在main函数中return

②在任何地方使用exit函数[exit函数的参数就是错误码,它的头文件是stdio.h]

③_exit使用方法和exit一模一样


exit与_exit的区别:

本质区别就是exit是用户层的库函数,_exit是内核层的系统调用
所以exit函数中,调用_exit中止进程之前,可以进行一些用户层的收尾工作
比如:
exit中止进程时,会刷新用户级缓冲区和内核级缓冲区
也就是如果输出缓冲区中有数据,使用exit中止它会帮我们打印出来

_exit中止进程时,不会刷新用户级缓冲区,只会刷新内核级缓冲区

②exit是库里面的函数,是操作系统之外的操作,使用操作系统的资源时,只能对操作系统调用接口进行封装
exit其实就封装了_exit

_exit是系统调用接口,是操作系统内部的操作
在这里插入图片描述

所以:
其实我们之前再使用c/c++等高级语言时,所说的缓冲区都是语言级(用户级)的缓冲区

这个缓冲区里面的内容是存储在c/c++的标准库中的,即存储在共享区的

不是存储在操作系统中的内核级缓冲区
不然_exit中止进程时,就也能把缓冲区中信息输出/输入
但是因为语言级缓冲区在操作系统的上层,所以_exit中止进程后,内核缓冲区就关闭了,语言缓冲区中的数据没办法进入操作系统了
操作系统没看见语言缓冲区中传来信息,就以为里面没有



进程等待

wait(不常用)

头文件:sys/types.hsys/wait.h
返回值:pid_t[小于0说明回收失败,大于0时回收成功,返回的是回收的子进程的pid]
参数:

作用:等待并回收任意一个子进程
在这里插入图片描述


waitpid[常用]

头文件:sys/types.hsys/wait.h
返回值:pid_t n
①n小于0,说明回收失败/函数调用失败
②n大于0,回收成功,返回的是成功回收的子进程的pid
③n等于0(只有非阻塞等待才会出现),则表示函数调用成功,但是子进程还没执行完,还没退出

参数1.pid_t pid

如果是子进程的pid,就表示指定等待这个子进程
如果是-1,就表示等待任意一个进程


参数2,int* status

如果传nullptr则表示不需要获取退出信息==

即:用户自己定义一个int类型的变量
再把它的地址传进waitpid里面,操作系统就会把进程的PCB中存储的退出信息给status

status其实并不是一个整数,而是一个类似位图的东西
因为进程结束,分两种情况:
①正常退出,也就是通过main函数的return或者exit退出,这样就可以返回退出码
所以只有正常退出才能返回退出码(错误码)

②异常退出,也就是进程运行的途中,空指针访问/野指针等直接导致进程崩溃了
这样进程根本就运行不到返回退出码的地方
但是异常退出,也会有自己的退出信号码
[通过kill -l命令,可以看到Linux中所有的退出信号以及其对应的退出信号码]

进程之所以会异常退出,是因为进程运行时出现了较严重的错误(野指针,除0等
操作系统识别到以后,在代码还没跑完的时候,就直接使用信号中止了进程


所以
status中不仅仅存储了退出码,还存储了其他的退出信息

具体的:
status的:
①最低的7个比特位存储退出信号值
②第8个比特位存储core dump标志
③第9~16个比特位存储退出码
在这里插入图片描述

宏:
WIFEXITED(status):
若为正常终止子进程返回的状态,则为真(查看进程是否是正常退出)

WEXITSTATUS(status):
若WIFEXITED非零,提取子进程退出码。(查看进程的退出码)


参数3.标识是阻塞等待,还是非阻塞等待

如果该参数是0,表示阻塞式等待
如果为WNOHANG,表示非阻塞式等待



使用子进程完成任务的好处

①非阻塞等待或者创建多个子进程时,父子进程可以同时运行,父进程不用等子进程,提高并发度

②进程具有独立性,所以如果子进程出了问题,不影响父进程

③数据快照,子进程被fork出来,继承了父进程的PCB,页表等东西之后
就获取到了fork时父进程的数据
也就是对子进程从父进程那里获取到的数据进行了快照
快照之后,其他任何进程对这一块数据进行修改,这个子进程都“看不见”
因为写时拷贝,或者说进程具有独立性。所以数据快照之后,其他进程可以对这个数据任意修改

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

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

相关文章

5G网络下客户端数据业务掉线频繁

上层应用的日志和界面在待机状态下(即没有做通话等业务操作),会频繁提示“离线”。 主要先看有没有丢网,UL BLER有没有问题。确认没有问题。看到业务信道释放后也可以成功重新建链。所以以为这个只是终端业务进入dormant态的提示…

【Docker项目实战】使用Docker部署Gitblit服务器

【Docker项目实战】使用Docker部署Gitblit服务器 一、Gitblit介绍1.1 Gitblit 介绍1.2 主要特点 二、本次实践规划2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Gitblit镜像五、部署Gitbli…

Vitis: 使用自定义IP时 Makefile错误 导致编译报错

参考文章: 【小梅哥FPGA】 Vitis开发中自定义IP的Makefile路径问题解决方案 Vitis IDE自定义IP Makefile错误(arm-xilinx-eabi-gcc.exe: error: *.c: Invalid argument)解决方法 Vitis 使用自定义IP时: Makefile 文件里的语句是需要修改的,…

helm的go模板语法学习

1、helm chart 1.0、什么是helm? 介绍:就是个包管理器。理解为java的maven、linux的yum就好。 安装方法也可参见官网: https://helm.sh/docs/intro/install 通过前面的演示我们知道,有了helm之后应用的安装、升级、查看、停止都…

AI 语音公司 ElevenLabs 进军亚太市场设立东京子公司;EverTutor Live :语音交互 AI 教育平台丨日报

开发者朋友们大家好: 这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的 技术 」、「有亮点的 产品 」、「有思考的 文章 」、「有态度的 观…

STM32启动流程详解

STM32启动流程详解 本文档详细介绍STM32微控制器从上电到main函数执行的完整启动流程。 1. 上电与复位过程 当STM32芯片上电或复位时,硬件会执行以下步骤: 上电复位(POR)/低电平复位(PDR): 芯片接通电源或NRST引脚置低时触发初始PC值设置: 程序计数器…

Langchain + Gemini API调用基本操作

本文参考Langchain中ChatGoogleGenerativeAI的官方文档,在本地的jupyter notebook中运行。 关于API的细节在官方文档最开头给出: 我们在使用时,可以选择model"gemini-2.0-flash-001"或者生成图片的ChatGoogleGenerativeAI(model“…

【数据结构】4.单链表实现通讯录

在上一篇文章我们学会了用单链表来实现各种方法,在这一篇文章我们将在单链表的基础上实现通讯录。 0、准备工作 实现通讯录之前,我们还需要在单链表的基础上添加2个文件,头文件Contact.h和源文件Contact.c。Contact.c来实现通讯录方法的声明…

接口自动化测试(一)

一、HTTP请求的核心概念及原理详解 HTML:超文本标记语言-----通过<标记符>内容</标记符>格式-------页面 URL:统一资源定位符 返回数据有很多&#xff1a;页面、图片、视频&#xff0c;都可以进行返回---统称为&#xff1a;资源HTTP:超文本传输协议(请求-响应的协…

【JavaEE】Spring AOP的注解实现

目录 一、AOP 与 Spring AOP二、Spring AOP简单实现三、详解Spring AOP3.1 Spring AOP 核心概念3.1.1 切点&#xff08;Pointcut&#xff09;3.1.2 连接点&#xff08;Join Point&#xff09;3.1.3 通知&#xff08;Advice&#xff09;3.1.4 切面&#xff08;Aspect&#xff09…

揭秘大数据 | 22、软件定义存储

揭秘大数据 | 19、软件定义的世界-CSDN博客 揭秘大数据 | 20、软件定义数据中心-CSDN博客 揭秘大数据 | 21、软件定义计算-CSDN博客 老规矩&#xff0c;先把这个小系列的前三篇奉上。今天书接上文&#xff0c;接着叙软件定义存储的那些事儿。 软件定义存储源于VMware公司于…

OpenCV 图形API(37)图像滤波-----分离过滤器函数sepFilter()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 应用一个可分离的线性滤波器到一个矩阵&#xff08;图像&#xff09;。 该函数对矩阵应用一个可分离的线性滤波器。也就是说&#xff0c;首先&a…

flutter下载SDK环境配置步骤详解

目录 1.Flutter官网地址、SDK下载地址? 1.1 选择你电脑的系统​ 2.配置环境 3.解决环境报错 zsh:command not found:flutter 1.Flutter官网地址、SDK下载地址? flutter官网地址: URL 1.1 选择你电脑的系统 下载解压动目录就OK了 2.配置环境 1、打开命令行&#xf…

数据结构与算法入门 Day 0:程序世界的基石与密码

&#x1f31f;数据结构与算法入门 Day 0&#xff1a;程序世界的基石与密码&#x1f511; ps&#xff1a;接受到了不少的私信反馈&#xff0c;说应该先把前置的知识内容做一个梳理&#xff0c;所以把昨天的文章删除了&#xff0c;重新开启今天的博文写作 Hey 小伙伴们&#xff…

vscode终端运行windows服务器的conda出错

远程windows服务器可以运行&#xff0c;本地vscode不能。 打开vscode settings.json文件 添加conda所在路径

“大湾区珠宝艺境花园”璀璨绽放第五届消博会

2025年4月13日&#xff0c;第五届中国国际消费品博览会&#xff08;以下简称"消博会"&#xff09;重要主题活动——《大湾区珠宝艺境花园》启动仪式在海南国际会展中心2号馆隆重举行。由广东省金银珠宝玉器业厂商会组织带领粤港澳大湾区优秀珠宝品牌&#xff0c;以“…

十、自动化函数+实战

Maven环境配置 1.设计测试用例 2.创建空项目 1&#xff09;添加需要的依赖pom.xml <dependencies> <!-- 截图配置--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.6</…

Day09【基于jieba分词和RNN实现的简单中文分词】

基于jieba分词和RNN实现的中文分词 目标数据准备主程序预测效果 目标 本文基于给定的中文词表&#xff0c;将输入的文本基于jieba分词分割为若干个词&#xff0c;词的末尾对应的标签为1&#xff0c;中间部分对应的标签为0&#xff0c;同时将分词后的单词基于中文词表做初步序列…

自动化测试——selenium

简介 Selenium 是一个广泛使用的自动化测试工具&#xff0c;主要用于 Web 应用程序的自动化测试。它能实现的功能是网页的自动化操作&#xff0c;例如自动抢票刷课等。同时你应该也见到过有些网站在打开之后并没有直接加载出网站的所有内容&#xff0c;比如一些图片等等&#x…

Linux——进程通信

我们知道&#xff0c;进程具有独立性&#xff0c;各进程之间互不干扰&#xff0c;但我们为什么还要让其联系&#xff0c;建立通信呢&#xff1f;比如&#xff1a;数据传输&#xff0c;资源共享&#xff0c;通知某个事件&#xff0c;或控制某个进程。因此&#xff0c;让进程间建…