【Linux】进程地址空间的理解

进程地址空间的理解

一,什么是程序地址空间

在我们写程序时,都会有这样下面的内存结构,来存放变量和代码等数据。

一个进程要执行,必须要有其对应的这样的内存结构。一个系统中有很多进程要执行,则要对应有很多进程空间。但是实际上的物理内存就那么大,无法给每一个进程都分配这么多的空间。则操作系统给每一个进程都划分了一个这样的虚拟的内存结构,这个虚拟的内存结构就叫做进程地址空间

二,页表和虚拟地址空间

以下面例子为例讲解。在Linux下,我们编写一个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){ 
		g_val=100;
		printf("child[%d]: %d : %p\n", getpid(), g_val, &g_val);
	}else{ //parent
		sleep(3);
		printf("parent[%d]: %d : %p\n", getpid(), g_val, &g_val);
	}
	sleep(1);
	return 0;
}

结果:

child3046: 100 : 0x80497e8

parent3045: 0 : 0x80497e8

这里看到 g_val 在父进程和子进程中的地址一样,但是内容不一样,则一定说明 g_val 在父进程和子进程的中的物理内存不一样,但是这里显示的地址却是一样的。这说明在这里的地址是虚拟地址而不是物理地址。

知道了虚拟地址,现在来讲解一下虚拟地址和物理地址之间的关系:

复制代码
虚拟地址和物理地址之间是由页表来构成的一种映射关系

由上面的讲解可知,操作系统给每个进程分配了一个进程地址空间,这个进程地址空间是一个虚拟地址空间,通过页表来映射到物理地址上。

由上图可看到,上述例子中子进程和父进程中 g_val 的地址一样,但值不一样。本质是因为打印的地址是虚拟地址,当子进程对 g_val 的值做修改时,在物理地址层面,会开辟一块新空间存放 g_val 的值,再修改进程中 g_val 的映射关系,使其指向新开辟的空间。

三,为什么要有进程地址空间

所以为什么要有进程地址空间并且设计这样的页表映射的结构呢?

首先,页表的出现让虚拟地址和物理地址之间产生一种映射关系,但是不只是映射关系,还对这个物理地址进行了权限的保护

当对常量区进行映射时,页表结构中会检测权限,当对这段空间做修改时,检测到只读,则拒绝对这段区间进行修改

其次,页表的出现对虚拟地址和物理地址之间进行了解耦

页表让物理内存的管理和进程的管理进行了分离,在进程层面,数据的存储看起来有其对应的区域,但在物理层面,数据按照一种有序的方式存放进而提高物理空间的利用率

进程地址空间的作用有三个:

1. 进程地址空间是为了保护物理内存

当出现非法访问时,进程地址空间和页表会识别并且拒绝访问,从而保护了物理空间的完整性
2. 降低操作系统的耦合度

和上述一致,页表和进程地址空间会让对进程的管理和对物理空间的管理分离,进而降低了操作系统的耦合度 ,提高了整体效率
3. 保证每个进程的独立性

操作系统为每个进程都分配了一个这样的虚拟的进程地址空间,让每个进程都可以对其数据进行统一管理,保证其独立性,再由页表映射到物理地址上,又不会干扰物理地址的存放

相关推荐
RisunJan2 分钟前
Linux命令-scriptreplay(终端会话回放)
linux·运维·chrome
spencer_tseng12 分钟前
[kylin & linux] install docker
linux·docker·kylin
x²+(y-√³x²)²=11 小时前
Linux打包文件到Windows,文件/文件类型丢失
linux·运维·windows
世人万千丶1 小时前
去重插入与超限淘汰:ArkTS 实现鸿蒙搜索历史的 LIMIT 艺术
运维·服务器·学习·华为·harmonyos·鸿蒙
柒号华仔2 小时前
「速通Shell」聚砖成墙,Shell函数封装之道
linux·ssh·bash
未来之窗软件服务2 小时前
企业自动化运营-电子合同预览-东方仙盟
运维·自动化·仙盟创梦ide·东方仙盟
程序员与背包客_CoderZ2 小时前
Linux D-Bus通信协议详解:从入门到C/C++编码实战
linux·服务器·c语言·c++·嵌入式硬件·嵌入式软件·dbus
Android系统攻城狮2 小时前
Linux PipeWire深度解析之pw_properties_iterate调用流程与实战(六十五)
linux·运维·服务器·音频进阶·pipewire音频进阶
研华科技Advantech3 小时前
案例 | 从离线巡检到在线看护:研华PHM解决方案赋能石油钻井平台智能运维
运维·人工智能·边缘计算
難釋懷3 小时前
Nginx主动健康检查
运维·nginx