Linux基础4-进程5(程序地址空间详解)

上篇文章:Linux基础4-进程4(环境变量,命令行参数详解)-CSDN博客

本章重点:

1 重新理解c/c++地址空间

2 虚拟地址空间

一. c/c++地址空间

地址空间布局图:

 运行下列代码,进行观察

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>int global_value = 100;
int main()
{pid_t id = fork();if(id < 0){printf("fork error!\n");return -1;}else if(id == 0) //子进程{int cnt = 0;while(1){printf("子进程,pid:%d ppid:%d | global_value:%d,&global_value: %p\n",getpid(),getppid(),global_value,&global_value);sleep(1);cnt++;if(cnt == 10){global_value = 1234;printf("子进程已经修改了全局变量!\n");}}}else {//父进程while(1){printf("父进程,pid:%d ppid:%d | global_value:%d,&global_value: %p\n",getpid(),getppid(),global_value,&global_value);sleep(2);}}return 0;
}

        我们定义一个全局变量,创建父子进程。让他们打印各自的全局变量值和其地址,然后让子进程修改其全局变量,观察父子进程各自的全局变量和其地址

运行结果如下

可以看到,子进程修改全局变量后,父子进程全局变量的地址相同但是值却不相同!这是为什么呢?

地址没变:说明这里使用的地址不是物理地址,我们C语言所使用的地址不是物理地址而是虚拟地址(逻辑地址)

我们所打印出来的地址空间排布,都是虚拟地址。所以上面的地址分布图是虚拟地址空间

OS访问变量时候,必须要通过虚拟地址找到其物理地址才能访问

二. 理解虚拟地址空间

每一个进程都会认为自己占有所有的系统资源,每当需要的时候就向操作系统申请。

地址空间的本质:是内核中的一种数据结构 mm_struct。与PCB类似

struct mm_struct
{char* when;char* who;char* targrt;char* sum;......
}

我们通过管理mm_struct进而管理每一个进程的虚拟地址空间。使用mm_struct描述每一个进程的虚拟地址,再用链表将其连接起来就能够管理

虚拟地址空间

1 地址空间描述的基本空间是字节

2 以32位操作系统为例,每一个虚拟地址空间具有 2^32 B = 4GB  个字节

3 每一个字节都代表唯一的地址,所以一共能够表示 2^32个地址

000000000 00000000 00000000 00000000

000000000 00000000 00000000 00000001

.

.

11111111 11111111 11111111 11111110

11111111 11111111 11111111 11111111

所以我们只需要用 2^32个数字用于表示每一个字节的区域即可

虚拟地址空间通过类似下列代码进行调整各区域的大小

struct mm_struct
{unit32_t code_start,code_end;    //代码区unit32_t data_start,data_end;    //常量区(数据段)unit32_t heap_start,heap_end;    //堆区unit32_t stack_start,stack_end;  //栈区// ......
};//分配地址
*mm = malloc(struct mm_struct)
*mm->code_start=0x1111 1111    //区域的起始地址
*mm->code_end= 0x1211 1111     //区域的结束地址
//起始地址和结束地址的中间部分称为虚拟空间*mm->data_start=0x1300 0000
*mm->data_end= 0x1400 0000//堆栈区的调整,本质就是修改各个区域的start和end
//我们使用malloc new 申请堆空间,定义局部变量,函数调用-> 就是扩大堆栈区的空间
//函数调用完毕,free空间->就是缩小栈区,堆区空间*mm->heap_start=0x1400 0001
*mm->heap_end= 0x1500 0000*mm->stack_start=0x7ffff 7fff
*mm->stack_end= 0x8fff ffff

我们在PCB中定义一个指针指向 mm_struct,这样就能给进程分配进程地址空间

三. 虚拟地址空间与内存,磁盘之间的关系

如上图,每一个进程都有自己的进程地址空间,进程地址空间通过页表映射到物理内存中。

进程运行时候,将磁盘中的数据加载到内存中,然后通过页表与进程地址空间形成映射关系。

每一个进程都有自己的进程地址空间

每一个进程都有自己独立的进程地址空间,他们都通过页表和内存之间的映射找到对应的代码和数据。

这样就能够保证进程之间的独立性,统一使用相同的虚拟地址空间而不会相互干扰

这也说明了为什么我们最开始的时候,父子进程的全局变量的地址相同而值不同的原因!

尽管他们的虚拟地址空间相同,他们通过页表映射到物理内存是不相同的!

四. 为什么要存在进程地址空间

4.1 进程直接访问物理内存,如果发生非法访问咋办?

如果发生了非法访问,这样是非常不安全的。因为会访问和干扰到其他进程的数据

操作系统通过页表可以拦截进程的非法操作,从而达到保护操作系统的目的!(每一个进程都要遵守这一规则)

4.2 虚拟地址空间的存在,可以保证进程之间的独立性

如上图,最开始父子进程的全局变量其实是一个(即通过页表映射到的物理地址相同)。

然后当子进程修改全局变量的时候,会发生写时拷贝

写实拷贝:父子进程任何一方尝试修改(写入)相同物理内存的数据,OS会先进程数据拷贝,然后更改修改进程的页表映射关系。然后再让进程进行修改

写实拷贝能够保证不同进程的数据进程分离从而达到了进程之间的独立性

进程 = PCB + 进程对应的数据代码

我们知道:每一个进程的PCB都是独立的,现在每一个进程对应的数据代码也是独立的

这说明:进程是独立的

4.3 方便进程和编译器以统一的视角,来看待对应的代码和数据的各个区域

我们知道 进程的 mm_struct(进程地址空间)和 C语言程序中的逻辑地址,二者的规则是一样的!

这样一来,我们只要编译完代码就能够直接使用。

我们编译完的可执行程序,在没有加载到内存中的时候,有没有逻辑地址呢?        有!

虚拟地址空间,操作系统要遵守这个规则,编译器也要遵守这个规则。        编译器编译代码的时候就是通过地址空间的方式进行编址的!

五.下章重点:进程控制

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

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

相关文章

动态规划-背包问题——[模版]01背包(背包母题)

1.题目解析 题目来源 [模版]01背包_牛客题霸_牛客网 测试用例 2.算法原理 1.状态表示 第一小问&#xff1a;求最大价值 第二小问&#xff1a;求充满时的价值 2.状态转移方程 第一小问&#xff1a;求最大价值 第二小问&#xff1a;求充满时的价值 3.初始化 第一小问&#xff1a…

JavaWeb之会话跟踪技术

前言 这一节主要讲会话跟踪技术 1.补充 为了提交Gitee我修改了模块的目录&#xff0c;就是移动了模块&#xff0c;导致模块不是Maven了&#xff0c;可以在右边的Maven小工具&#xff0c;点加号&#xff0c;把模块重新添加为Maven 2. 概述 3. Cookie 3.1 基本使用 //发送coo…

第二十周周报:回顾篇

目录 摘要 Abstract 1 深度学习基础知识 1.1 学习率 1.1.1 自适应学习率 1.1.2 学习率调度 1.2 归一化 1.2.1 批量归一化 1.2.2 特征归一化 1.3 激活函数 1.3.1 Sigmoid函数 1.3.2 Tanh函数 1.3.3 ReLU函数 1.3.4 Leak ReLU函数 1.3.5 PReLU函数 1.3.6 ELU函数…

智能化SCRM方案助力企业高效管理与营销转型

内容概要 现代企业面临着复杂多变的市场环境&#xff0c;传统的管理与营销方式常常无法满足日益增长的需求。这时&#xff0c;智能化SCRM方案便应运而生&#xff0c;为企业带来了新的机遇与挑战。智能化SCRM方案不仅仅是一个单一的工具&#xff0c;它更像是一个全面的解决方案…

PRD2012学习笔记

图例位置&#xff1a; 使用 loc‘upper left’ 指定图例的基本位置为左上角。 使用 bbox_to_anchor(0.1, 0.9) 来进行自定义位置调整&#xff0c;其中 (0.1, 0.9) 指定图例相对于图形区域的坐标 (x, y)。 0.1 表示距离左边界的比例位置&#xff0c;0.9 表示距离上边界的比例位置…

【01课_初识算法与数据结构】

一、理解算法 1、算法的概念 算法&#xff0c;个人理解就是计算一段逻辑&#xff0c;最简化&#xff0c;最快速的方式、方法 每个函数&#xff0c;就包含了一定的算法&#xff0c;执行一定的计算逻辑 算法是一系列程序指令&#xff0c;用于解决特定的运算和逻辑问题 2、衡…

《⼆叉搜索树》

《⼆叉搜索树》 1. ⼆叉搜索树的概念2. ⼆叉搜索树的性能分析3 二叉树的功能说明及实现3.1 ⼆叉搜索树的插⼊3.2 ⼆叉搜索树的查找3.3 ⼆叉搜索树的删除 4二叉搜索树的实现代码5 ⼆叉搜索树key和key/value使⽤场景5.1 key搜索场景&#xff1a;5.2 key/value搜索场景&#xff1a…

stm32 踩坑笔记

串口问题&#xff1a; 问题&#xff1a;会改变接收缓冲的下一个字节 串口的初始化如下&#xff0c;位长度选择了9位。因为要奇偶校验&#xff0c;要选择9位。但是接收有用数据只用到1个字节。 问题原因&#xff1a; 所以串口接收时会把下一个数据更改

卫星授时服务器,单北斗授时服务器,北斗卫星时钟服务器

当前NTP授时服务器已经实现内部的元器件及芯片实现采用国产化&#xff0c;已经证明了国产产品已经摆脱需要依靠进口元器件及芯片才能实现的产品研发、也证明了大国崛起。下来我们来分析下国产化服务器具备的优势。 1、采用国产操作系统&#xff1a;使用国产化系统Linux更加可靠…

Windows11免密码自动登录

按winR&#xff0c;打开运行&#xff0c;输入Control Userpasswords2&#xff0c;打开用户账户。 打开该设置&#xff0c;取消选中该选项&#xff0c;点击应用&#xff0c;输入想要自动登录的账户和密码&#xff0c;即可开机后自动登录Windows。 若此界面无该选项&#xff0c;…

C++使用开源ConcurrentQueue库处理自定义业务数据类

ConcurrentQueue开源库介绍 ConcurrentQueue是一个高性能的、线程安全的并发队列库。它旨在提供高效、无锁的数据结构&#xff0c;适用于多线程环境中的数据交换。concurrentqueue 支持多个生产者和多个消费者&#xff0c;并且提供了多种配置选项来优化性能和内存使用。 Conc…

中仕公考:2025年省考可以开始准备了!

“各省公务员考试”&#xff0c;是选拔和招录公务员的一种重要方式。该考试由各省级主管部门统一安排&#xff0c;编制归属于各个省份。 考试时间 各省的考试时间有所不同&#xff0c;但通常省联考的时间一般安排在3-5月之间。 户籍限制 部分岗位对考生的户籍有限制&#x…

保姆级教程,免费短链平台

神行短链 开源代码: https://github.com/EASTCATV/openShortLink.git 保姆级教程,5分钟打造属于自己的短链 免费短链平台 免费使用 短链生成 免费使用 地址: short.godsdo.com short.godsdo.com 打包命令 sbt clean && sbt packagedocker run -d \ --name shot…

三十六、Python基础语法(JSON操作)

JSON&#xff08;JavaScript Object Notation&#xff09;是一种基于文本&#xff0c;轻量级的数据交换格式。它易于人阅读和编写&#xff0c;同时也易于机器解析和生成&#xff0c;在自动化测试中经常用来存放测试数据。 JSON的特点&#xff1a; 基于文本&#xff0c;不包含图…

linux基础-完结(详讲补充)

linux基础-完结 一、Linux目录介绍 二、基础命令详细讲解 1. ls&#xff08;列出目录内容&#xff09; 2. cd&#xff08;更改目录&#xff09; 3. clear&#xff08;清除终端屏幕&#xff09; 4. pwd(显示你当前所在的目录) 5. vim(文本编辑器) 6. touch&#xff08;创…

【SAP】关于权限的继承

关于权限的父role和子role的权限继承&#xff0c;既可以 从子role主动去父role那里“取”。从父role“推”到子role 我自己之前一直用的是方法1&#xff0c;但由于子role很多&#xff0c;一个一个手工维护花了不少时间。 后来得知有方法2&#xff0c;特此测试。 我准备了父R…

信息安全数学基础(46)域和Galois理论

域详述 定义&#xff1a; 域是一个包含加法、减法、乘法和除法&#xff08;除数不为零&#xff09;的代数结构&#xff0c;其中加法和乘法满足交换律、结合律&#xff0c;并且乘法对加法满足分配律。同时&#xff0c;域中的元素&#xff08;通常称为数&#xff09;在加法和乘法…

时序约束进阶五:Set_Max_Delay与Set_Min_Delay详解

目录 一、背景 二、Max/Min_delay约束 2.1 约束设置参数 2.2 约束说明 三、场景说明 3.1 路径分段 3.1.1 无效的约束对象 3.1.2 设计代码 3.2 有效的约束对象 3.3 datapath only 3.3.1 工程设计 3.3.2 datapath only报告 3.4 clock group约束优先级 3.4.1 MAX/MIN…

搭建实验仪器知识库:从产品手册到智慧资源的飞跃

在科研、教学及工业生产领域&#xff0c;实验仪器作为探索未知、验证理论、提升效率的重要工具&#xff0c;其重要性不言而喻。然而&#xff0c;随着技术的不断进步和仪器的日益复杂化&#xff0c;如何高效、准确地使用这些仪器成为了科研人员、技术人员及学生面临的共同挑战。…

OA项目 python + vue3

准备工作 创建django项目 在setting.py进行数据库的配置&#xff1a; DATABASES {default: {ENGINE: django.db.backends.mysql,NAME: , #数据库名字USER: , #连接的数据库的用户名PASSWORD: ,HOST: 127.0.0.1,PORT: 3306,} }安装app&#xff1a; rest_framwork: 关闭csrf…