进程虚拟地址空间
为什么操作系统不直接让进程访问一个物理地址,而是访问一个虚拟地址
- 程序在编译时,会自动地给指令和数据进行地址编号,但是如果地址不连续,就会程序运行不起来,编译器的地址管理比较麻烦(无法动态的获知物理空间的使用情况,也就无法为数据进行编号)
- 进程直接访问物理地址,如果此时有一个野指针,那么在进行操作野指针的时候可能会改变其他空间的数据,造成不安全的事件发生(无法进行内存访问控制)
- 程序运行空间通常需要一块连续的空间,空间利用率低,通过虚拟地址空间映射到物理内存上进行数据存储,可以实现数据在物理空间上离散式存储,提高内存的利用率,并且每个进程都有一份属于自己的连续空间使用
如何通过虚拟地址空间找到物理地址
操作系统中内存的管理方式:
- 分段式
采用分段式管理内存,将虚拟地址的组成分为段号+段内偏移量,通过查询段表找到对应的段号对应的物理内存地址,然后加上虚拟地址对应的段内偏移量找到实际的内存物理空间地址
分段式的优点:对编译器的地址管理比较友好,但是没有解决数据连续存储率低的问题
-
分页式
因为通常物理块比较小,并且不要求同一个进程的多个数据必须在同一个块内,因此分页式实现了数据在物理内存中的离散式存储,提高了内存利用率
并且页表会在进行访问的时候进行内存访问控制 -
段页式
在段页式系统中,为了获得一条指令或数据,须三次访问内存。第一次访问是访问内存中的段表,从中取得页表始址;第二次访问是访问内存中的页表,从中取出该页所在的物理块号,并将该块号与页内地址一起形成指令或数据的物理地址;第三次访问才是真正从第二次访问所得的地址中,取出指令或数据。