当我们在谈程序地址空间时,我们在谈什么?

结论 :我们所说的程序地址空间其实就是虚拟地址空间*
*
1 why : 为什么要有虚拟地址空间 ? ? ?

产生背景: 在以前,那时候还没有虚拟地址空间 计算机的内存比较小, 要运行的程序比较多,狼多肉少,完全分不过来
而且,一个程序必须在连续的内存空间上才能运行, 由于待运行程序所占的内存空间大小不一,所以会产生一些内存碎片
,比如现在内存只有5MB 而现在由一个6MB的内存需要运行,此时本来就没有足够的内存空间,然而呢,
还有一些很小的内存片不能利用,产生内存资源的浪费. 这就,导致计算机内存资源的利用率非常低.
,于是呢我们的虚拟地址空间就出来工作了,替计算机解决这个问题.

概括: 计算机内存资源利用率太低**

2 what: 虚拟地址空间是什么 ? ? ?

我们平时所说的程序地址空间其实就是虚拟地址空间,实际上是操作系统通过mm_struct 这个结构体为进程描述的一个地址,因此也把它称为内存描述符. ,再更近 一步他就是我们所说的内存指针. (这个mm_struct 就存储在进程中,进程中由一个指针指向这个结构体,从而建立连接关系.)

3 ,how: 虚拟地址空间是怎如何来提高内存资源的利用率的 ???

首先, 当一个程序要运行时,操作系统首先为这个程序创建一个进程来描述它的运行状态,从而实现对他的组织管理,当CPU大佬要为这个程序分配资源来运行它时,需要将该程序加载到内存中,我们知道如果直接加载到物理内存上,由于程序的运行需要连续的地址空间,会降低内存资源的利用率,于是呢,我们先在虚拟地址空间为它分配一段连续的虚拟空间. 告诉进程,我这有连续的内存空间… 我们知道一个程序的运行需要将他加载到物理内存上才能实现真正的运行,于是呢,我们必须为虚拟内存地址和物理内存地址建立连接关系,如果直接建立一一对应的关系那么相当于我们什么也没有做,内存资源的利用率还是很低,那怎么才能提高内存资源的利用率呢,我们知道之所以内存资源利用率低是因为程序的运行需要连续的内存空间,因此我们必须使用别的内存分配机制. 我们的虚拟地址空间是这样解决的: 首先在虚拟地址空间和物理内存之间设立一个页表. 这个页表将虚拟内存和物理内存连接起来,同时页表中存储了一种映射关系,通过这种映射关系,将虚拟内存地址转换成物理地址. 页表将内存分为一个个大小为4K的内存单元,在分配物理内存的时候,页表可以随机分配任何一个空闲的内存单元给虚拟地址.这在物理内存上就实现了数据的离散存储.大大提高了内存资源的利用率.
一方面通过虚拟地址空间欺骗进程说:我这有连续的内存空间,实际上呢 ,在物理内存这边 实现了数据的离散存储,提高了内存的利用率.

以下图说明大致关系

在这里插入图片描述
4 页表是什么

页表是虚拟地址空间和物理地址空间的连接者,页表中存储了一种映射关系,通过这种映射关系,虚拟地址空间转换成物理地址空间
页表除了存储了映射关系以外还存储了这块地址的属性(读/写权限),因此可以通过页表实现对内存的访问控制.

5 当创建一个子进程时发生了什么? (写实拷贝技术)

当操作系统通过复制父进程创建一个子进程时,子进程和父进程指向同一块内存区域.当父子进程都没有新写入数据时,此时数据共享代码共享;当有任意一方试图写入时,便以写实拷贝技术的方式重新开辟空间各自拷贝一份数据,此时代码共享,数据独有
在这里插入图片描述
6 虚拟地址空间和页表有什么用?

1 提高内存的利用率
2 增加了内存访问控制
3 保持进程的独立性

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页