进程的地址空间本质是一个数据结构
一个进程包含的有代码和数据,以及操作系统所维护的相关数据结构,PCB模块,mm_struct,页表,MMU等
可以从下图中深入的理解进程的地址空间
首先说明一句话的,每个进程都认为自己是独享内存资源的!!!
每个进程都有自己的地址空间,也是虚拟的地址,认为自己是独享内存资源的,也就是内存有多大,它的虚拟空间就有多大,但是实际上的空间是由物理内存也就是真正的内存决定的,其中通过页表和MMU两个共同作用将虚拟地址和物理内存建立映射关系,从而存储数据。
为什么要引入地址空间呢?
1、通过添加一个软件层,完成有效的对进程操作内存进行权限管理,目的是为了保护物理内存和每个进程之间的数据,保证了每个进程都是独立的。
也就是说,每个进程不能直接的去访问物理内存,这样做有可能会导致进程访问到不属于他的空间,容易出现内存泄漏,不容易被管理。添加地址空间之后,进程需要通过页面访问对应的物理空间,不会出现越界的情况。而且操作系统可以通过权限的设置,来保护数据,看是否给你执行这个进程
2、将内存申请和内存使用的概念在时间上划分清楚,通过虚拟地址来屏蔽底层的内存申请过程,达到进程读写内存和OS操作系统进行内存管理操作,进行软件上面的分离。
也就是说,写一个程序的时候,需要申请空间,虚拟的地址空间已经开辟好了,然后等真正使用的时候会从物理空间上进行操作, 基于缺页中断进行物理内存申请
3、站在CPU和应用层的角度来看,进程可以统一的使用4GB的空间,而且由于每个空间的相对位置是比较确定的,管理起来是很方便的。
也就是说,CPU每次可以找main函数的在虚拟地址空间上是确定的,然后通过页表的映射去找到代码的位置,统一的形式比零散起来管理更加方便。