【Linux】————进程控制

 9efbcbc3d25747719da38c01b3fa9b4f.gif

                                                      作者主页:     作者主页

                                                      本篇博客专栏:Linux专栏

                                                      创作时间 :2024年10月10日

9efbcbc3d25747719da38c01b3fa9b4f.gif

一、程序地址空间:

1、C/C++中的程序地址空间:

在c++中我们了解了这样的空间分布图。

我们应如何去创建和访问变量呢?

本质就是:起始地址+偏移量(其实我们的变量类型就是偏移量)

但是上面这些其实不是内存!!!

我们下面来做一个小实验!!!

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int g_val = 0;
int main()
{
     pid_t id = fork();
     if(id < 0)
     {
         perror("fork");
         return 0;
     }
     else if(id == 0)    
     { 
         //child
         printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
     }
     else
     {     
         //parent
         printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
     }
 
     sleep(1);
     return 0;
}

这里我们可以看到上面这两个输出的变量和地址是相同的,这就说明子进程是按照父进程的模板得到的,父进程没有将代码进行修改,可是只要将代码稍微改一下。

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int g_val = 0;
int main()
{
     pid_t id = fork();
     if(id < 0)
     {
         perror("fork");
         return 0;
     }
     else if(id == 0)    
     { 
         //child
         g_val = 100;
         printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
     }
     else
     {     
         //parent
         printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
     }
 
     sleep(1);
     return 0;
}

这里我们发现,两个进程的地址相同,可是对应的变量的内容竟然不同,这是为什么呢?

我们可以得出以下的结论:

变量的内容不一样,父子进程绝对不是输出的同一个变量

但地址值是一样的,说明这个地址绝对不是物理地址

在Linux下,这种地址叫做虚拟地址

我们在C/C++中看到的地址,全部都是虚拟地址,用户是看不到物理地址的,用OS统一管理

OS负责将虚拟地址转换为物理地址

2、进程地址空间:

上面的图就可以说明问题,同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址。 

那么我们应该如何去理解虚拟地址相同而物理地址不同的问题呢?

  1. 父进程有自己的虚拟地址,也有自己的页表
  2. 子进程被创建时,父进程会将自己的页表也给到子进程
  3. 但是子进程在改变数据时,会发生写时拷贝,物理地址改变了,但是虚拟地址没有改变

什么是地址空间?什么是区域划分?

我们在创建进程的时候不仅要有 pcb,也要管理地址空间(先描述,在组织),有一个 struct mm_struct 的结构体。

为啥要有地址空间?

1、让进程以统一的视角看待内存,通过虚拟地址加页表,可以将乱序的内存变为有序,分门别类的规划好,乱序---->有序

2、存在虚拟地址空间,可以有效地进行进程访问内存的安全检查

我们如何去理解 存在虚拟地址空间,可以有效的进行进程内存的安全检查呢?

我提一个问题,我们 常量区的变量 为啥不能修改呢?

我们页表中除了有映射外,还有权限的限制,当进程要修改常量区的变量时,直接在页表就没有权限。

 地址空间的补充

每个进程都有自己的页表。


二、进程创建:

1.作者主页

在linux中fork函数时非常重要的函数,它从已存在进程中创建一个新进程。新进程为子进程,而原进程为父进程。

进程调用fork,当控制转移到内核中的fork代码后,内核做:

当一个进程调用fork之后,就有两个二进制代码相同的进程。而且它们都运行到相同的地方。但每个进程都将可以开始它们自己的旅程,看如下程序: 

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
 
int main()
{
     printf("Before: %d\n", getpid()); 
 
     pid_t id = fork();
     if(id < 0)
     {
         perror("fork");
         return 0;
     }
     else if(id == 0)    
     { 
         //child
         printf("child: %d \n", getpid());
         sleep(2);
     }
     else
     {     
         //parent
         printf("parent: %d \n", getpid());
         sleep(2);
     }
 
     
     return 0;
}

从结果中可看出,fork之前父进程独立执行,之后父子进程分别执行,执行先后由调度器完全决定

其中,默认情况下,父子进程共享代码,但是数据各有一份(但是如果父子进程只对数据进行读取,不需要私有)

程序=代码(逻辑)+数据

代码共享:所有进程共享代码,不过一般都是fork执行之后,为啥代码是共享的,因为代码不可以修改,所以是共享的

为啥各自的数据要私有一份呢,因为进程之间具有独立性,数据是很多的,且不是所有的数据都要全部拷贝,把本来可以在后面拷贝,甚至不要拷贝的数据,都拷贝了,就比较浪费时间和空间,所以拷贝的过程不是立马做的,而是写时拷贝!!!

2、写时拷贝

通常,父子代码共享,父子再不写入时,数据也是共享的,当任意一方试图写入,便以写时拷贝的方式各自一份副本。具体见下图:

父子进程代码共享,数据独有:当任意一方试图写入,便以写时拷贝的方式拷贝一份副本

3.fork常规用法

  • 一个父进程希望复制自己,使父子进程同时执行不同的代码段。例如,父进程等待客户端请求,生成子进程来处理请求。
  • 一个进程要执行一个不同的程序。例如子进程从fork返回后,调用exec函数。

4.fork调用失败的原因

  1. 系统中有太多的进程。
  2. 实际用户的进程数超过了限制。

三、进程终止

1.进程终止的概念

main 函数的返回值可以被父进程获取的,用来判断子进程的干活的情况 。

查看上一个进程的退出码 

echo $?

我们父进程就可以通过这两个数字来判断子进程的退出情况 。

代码异常终止,退出码就没有意义了!!!

 2.进程常见退出方法

3._exit函数 

  1. _exit函数 是系统调用函数。
  2. _exit函数 在终止进程的时候,不会自动刷新缓冲区。

4.exit函数

  1. exit函数 是库函数。
  2. exit函数 在终止进程的时候,会自动刷新缓冲区。

exit最后也会调用_exit, 但在调用_exit之前,还做了其他工作:

  1. 执行用户通过 atexit或on_exit定义的清理函数。
  2. 关闭所有打开的流,所有的缓存数据均被写入。
  3. 调用_exit。


四、进程等待

1.什么是进程等待

通过 wait/waitpid 的方式,让父进程(一般情况)对子进程进行资源回收等待过程!!!


之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。
另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程。
最后,父进程派给子进程的任务完成的如何,我们需要知道。如,子进程运行完成,结果对还是不对,或者是否正常退出。
父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息。

2.进程程序替换原理 

用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前后该进程的id并未改变。

我们就可以解释 进程程序替换后还有一个printf没有执行,为啥呢?

 3.进程程序替换的函数

最后:

十分感谢你可以耐着性子把它读完和我可以坚持写到这里,送几句话,对你,也对我:

1.一个冷知识:
屏蔽力是一个人最顶级的能力,任何消耗你的人和事,多看一眼都是你的不对。

2.你不用变得很外向,内向挺好的,但需要你发言的时候,一定要勇敢。
正所谓:君子可内敛不可懦弱,面不公可起而论之。

3.成年人的世界,只筛选,不教育。

4.自律不是6点起床,7点准时学习,而是不管别人怎么说怎么看,你也会坚持去做,绝不打乱自己的节奏,是一种自我的恒心。

5.你开始炫耀自己,往往都是灾难的开始,就像老子在《道德经》里写到:光而不耀,静水流深。

最后如果觉得我写的还不错,请不要忘记点赞✌,收藏✌,加关注✌哦(。・ω・。)

愿我们一起加油,奔向更美好的未来,愿我们从懵懵懂懂的一枚菜鸟逐渐成为大佬。加油,为自己点赞!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

VR线上展厅:超越时空的沉浸式展览,打造个性化、高效展览新模式

一、沉浸式漫游&#xff1a;打破时空限制&#xff0c;尽享虚拟之旅 VR线上展厅通过高度逼真的3D场景构建&#xff0c;为参观者营造了一个仿佛置身其中的虚拟世界。借助各种显示设备&#xff0c;用户能够自由穿梭于各个展区之间&#xff0c;无论是漫步在历史悠久的博物馆&#…

双语大脑的神经可塑性能力:来自健康和病理个体的见解

摘要 双语经验的神经印记对于理解大脑如何处理优势语言和非优势语言至关重要&#xff0c;但关于它的研究仍然没有定论。不同的研究表明神经处理存在相似性或差异性&#xff0c;这对患有脑肿瘤的双语患者具有重要意义。保留术后的双语功能需要考虑到术前的神经可塑性变化。在这…

【论文阅读笔记】End-to-End Object Detection with Transformers

代码地址&#xff1a;https://github.com/facebookresearch/detr 论文小结 本文是Transformer结构应用于目标检测&#xff08;OD&#xff09;任务的开山之作。方法名DETE&#xff0c;取自Detection Transformer。   作为2020年的论文&#xff0c;其表现精度在当时也不算高的…

pytorch导入数据集

1、概念&#xff1a; Dataset&#xff1a;一种数据结构&#xff0c;存储数据及其标签 Dataloader&#xff1a;一种工具&#xff0c;可以将Dataset里的数据分批、打乱、批量加载并进行迭代等 &#xff08;方便模型训练和验证&#xff09; Dataset就像一个大书架&#xff0c;存…

mongodb GUI工具(NoSQLBooster)

介绍 跨平台的MongoDB GUI工具&#xff0c;支持Windows、macOS和Linux。自带服务器监控工具、Visual Explain Plan、查询构建器、SQL查询等功能。提供免费版本&#xff0c;但功能相比付费版本有所限制。 免费版可供个人/商业使用&#xff0c;但功能有限。 安装成功后&#x…

大疆M2006+C610 pid参数调优

官方给的示例代码里给的是1.5, 0.1, 0 但试了下空转时显然不太行. 自己摸索出0.8, 0.03, 0 表现如图中的蓝色线 期望速度先两秒的1000,然后一秒的2000,一秒的3000, 0 2000 表现还不错,可以看到0.5秒后与期望值的差距控制在大概10%之内,但还是感觉有些过调 对了先说一下基础知识…

有什么方法可以保护ppt文件不被随意修改呢?

在工作或学习中&#xff0c;我们常常需要制作powerpoint演示文稿&#xff0c;担心自己不小心改动了或者不想他人随意更改&#xff0c;我们可以如何保护PPT呢&#xff1f;下面小编就来分享两个常用的方法。 方法一&#xff1a;为PPT设置打开密码 为PPT设置打开密码是最直接有效…

活动预告|博睿数据将受邀出席GOPS全球运维大会上海站!

第二十四届 GOPS 全球运维大会暨研运数智化技术峰会上海站将于2024年10月18日-19日在上海中庚聚龙酒店召开。大会将为期2天&#xff0c;侧重大模型、DevOps、SRE、AIOps、BizDevOps、云原生及安全等热门技术领域。特设了如大模型 运维/研发测试、银行/证券数字化转型、平台工程…

九寨沟,智慧旅游新名片

九寨沟属于自然类景区&#xff0c;以优美的自然风光取胜&#xff0c;景区文化内涵相对缺失。智慧化和文旅融合是智慧文旅景区的两个必备条件&#xff0c;九寨沟在智慧文旅景区建设过程中&#xff0c;经历了两个阶段&#xff0c;先是从传统景区迈向智慧景区&#xff0c;然后是充…

设计模式:单例

一.什么是单例模式 单例模式是一种设计模式&#xff0c;指在整个程序生命周期中有且仅有一个实例的类。可以分为懒汉式以及饿汉式。 懒汉式&#xff1a;只有在类的实例被使用时才生成唯一实例。但是存在线程安全以及内存泄露的问题。可以节省系统资源。 饿汉式&#xff1a;程序…

10万+收藏!10万转发!AI绘画如何助力育儿赛道引爆短视频平台?

在自媒体领域&#xff0c;内容创作的竞争日益激烈&#xff0c;但育儿自媒体一直是一块热门且持久的“金矿”&#xff0c;吸引了无数创作者投身其中。然而&#xff0c;如何在这片红海中脱颖而出&#xff0c;成为了许多创作者面临的难题。而AI绘画的出现&#xff0c;无疑解决了创…

这种好看的航线图怎么绘制?超简单~~

今天这篇推文小编给大家介绍一个我一直想绘制的可视化作品-航线地图&#xff0c;网上有很多类似的教程&#xff0c;但在小编看来&#xff0c;都或多或少有些不完美&#xff0c;小编这次就对其进行完善和美化&#xff0c;主要内容如下&#xff1a; 航线地图所需数据处理 航线地…

Linux实践|设置静态 IP 地址

引言 如果您是 Linux 系统管理员&#xff0c;那么您将需要在系统上配置网络。与可以使用动态 IP 地址的台式机不同&#xff0c;在服务器基础设施上&#xff0c;您需要设置静态 IP 地址&#xff08;至少在大多数情况下&#xff09;。 本文[1]旨在向您展示如何在最常用的 Linux 发…

The 2024 ICPC Kunming Invitational Contest K. Permutation(交互 期望)

在知乎内查看 题目 思路来源 题解 首先特判n1的情况&#xff0c;其实也不用问 分治&#xff0c;假设当前解决到[l,r]&#xff0c;要递归的vector是x&#xff0c; 维护两个vector L、R&#xff0c;代表下一步要在[l,mid]和[mid1,r]分治的vector 每次将x random_shuffle后&a…

UE4 材质学习笔记01(什么是着色器/PBR基础)

1.什么是shader 着色器是控制屏幕上每个像素颜色的代码&#xff0c;这些代码通常在图形处理器上运行。 现如今游戏引擎使用先进的基于物理的渲染和照明。而且照明模型模型大多数是被锁定的。 因此我们创建着色器可以控制颜色&#xff0c;法线&#xff0c;粗糙度&#xff0c;…

C++竞赛初阶—— 石头剪子布

题目内容 石头剪子布&#xff0c;是一种猜拳游戏。起源于中国&#xff0c;然后传到日本、朝鲜等地&#xff0c;随着亚欧贸易的不断发展它传到了欧洲&#xff0c;到了近现代逐渐风靡世界。简单明了的规则&#xff0c;使得石头剪子布没有任何规则漏洞可钻&#xff0c;单次玩法比…

Qt实现Halcon窗口显示当前图片坐标

一、前言 Halcon加载图片的窗口&#xff0c;不仅能放大和缩小图片&#xff0c;还可以按住Ctrl键显示鼠标下的灰度值&#xff0c;这种方式很方便我们分析缺陷的灰度和对比度。 二、实现方式 ① 创建显示坐标和灰度的widget窗口 下图的是widget部件&#xff0c;使用了4个label控…

使用正则表达式删除文本的奇数行或者偶数行

用智谱清言和kimi搜出来的结果都没法在notepad生效&#xff0c;后面在overflow上找到的答案比较靠谱。 查找&#xff1a;^[^\n]*\n([^\n]*) 替换&#xff1a;\1 删除偶数行 查找&#xff1a;^([^\n]*)\n[^\n]* 替换&#xff1a;\1 代码解释 ^&#xff1a;这个符号代表字符…

【Linux】认识Linux内核中进程级别的文件结构体【files_struct】&文件IO模型初步演示

前言 大家好吖&#xff0c;欢迎来到 YY 滴 系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Linux》…

输电线路悬垂线夹检测无人机航拍图像数据集,总共1600左右图片,悬垂线夹识别,标注为voc格式

输电线路悬垂线夹检测无人机航拍图像数据集&#xff0c;总共1600左右图片&#xff0c;悬垂线夹识别&#xff0c;标注为voc格式 输电线路悬垂线夹检测无人机航拍图像数据集介绍 数据集名称 输电线路悬垂线夹检测数据集 (Transmission Line Fittings Detection Dataset) 数据集…