程序地址空间(虚拟地址 | 分段式内存管理 | 分页式内存管理)

内存区域划分:
在这里插入图片描述
地址:通常所说的地址,都是内存的地址,是内存单元的编号。程序运行时,就会将指令和数据放到指定的内存当中去。而程序只有在运行的时候才会占据内存,因此程序地址空间又被叫做进程地址空间

我们来看一段代码:
在这里插入图片描述我们都知道,一块内存空间只能存储一个数据不可能存储两个数据,并且地址空间相同,所指向的数据就一定相同,但是为什么上面地址相同,所指向的数据却不同,是内存分配错误吗?

实际上在进程中,程序访问的地址是虚拟地址。我们所说的程序地址空间叫做进程的虚拟地址空间。进程访问内存数据的时候,先将虚拟地址通过页表映射转化为物理地址然后访问
在这里插入图片描述创建子进程会复制父进程大部分的pcb,也会复制虚拟地址空间和页表,所以刚开始父进程和子进程通过页表映射,会映射到同一块物理地址,但是当子进程的数据要发生改变时,系统会重新为子进程开辟一块空间,此时虽然父子进程的g_val虚拟地址相同,但是页表映射的物理地址不同。

虚拟地址空间实际上是系统给进程所描述的一个假的地址空间,是一个mm_struct结构体,并且每个进程都有自己独立的虚拟地址空间,也就是每个进程都有自己的mm_struct结构体描述。

系统为每个进程都描述一个完整的、连续的虚拟地址空间,实际物理内存用的时候再给进程分配。这样的话,对于每个进程自己感觉都有一块完整的、连续的内存可以使用。

为什么我们不能直接访问物理内存?

设想,如果我们有16M物理内存空间,系统为每个进程描述一个完整的、连续的空间,内存中有4M和8M的进程,现有一个5M的进程,要被加载到内存中运行。4M进程已经运行完,可以拿出内存,8M进程还在继续运行,现在内存碎片加起来足够5M,但是进程需要连续的空间,内存中没有连续的5M,此时5M进程就不能被加载到内存中运行,只能等8M进程运行完,5M才能被加载到内存,这样不仅浪费了内存,运行效率也会降低。
在这里插入图片描述
系统为每个进程描述一块完整的、连续的虚拟地址,若这个虚拟地址可以通过页表映射到物理地址,映射到的物理地址可以不连续,只要物理内存有空间存储,这样就可以将内存碎片利用起来,就实现了数据在物理内存上的离散式存储,可以提高内存利用率

另一方面就是访问的安全性。如果一个进程中有恶意程序,若直接访问物理内存,可能会篡改其他进程的数据,这样其他进程就会崩掉。但虚拟地址通过页表进行映射,页表中会有内存访问控制,映射的过程中会查看此进程是否有访问权限等信息,这样就会提高访问的安全性。

总结:

虚拟地址空间,是系统为每个进程通过mm_struct结构体虚拟的一个地址空间,使用虚拟地址空间的目的是为了让进程能够访问一块连续的、完整的地址,并且经过页表映射到物理内存后,可以实现数据在物理内存上的离散式存储,提高内存利用率,并且在页表中可以进行内存访问控制,让进程更加安全。

虚拟地址如何通过页表获取物理地址—内存管理方式

分段式内存管理: 将地址空间分为多段(代码段、数据段…),便于编译器进行地址管理。

分段式虚拟地址组成:段号+段内的偏移地址;在系统中有一个段表:一个个段表项(段号,物理内存起始地址)

段内偏移:具体一个变量首地址相对于内存起始段地址的偏移。
在这里插入图片描述通过虚拟内存地址段号从段表中找出对应的段号,再通过对应的物理内存起始段地址映射到物理内存,再通过虚拟内存的段内偏移找到唯一的物理地址。

分页式内存管理: 将地址空间分为多个小块(页),实现数据离散式存储,提高内存利用率。

分页式虚拟地址组成:页号+页内偏移;系统中有一个页表(页号,物理内存块起始地址、权限控制、缺页中断位…)
在这里插入图片描述与分段式内存管理相似,通过虚拟内存的页号找到页表的对应页号,再通过对应物理起始块地址映射到物理内存,再通过虚拟内存的页内偏移找到唯一的物理地址。

假设物理内存大小为4G,页的大小为4096字节,页数为4G / 4096 = 2^20,意味着页号占了虚拟地址的高20位,低12位就是页内偏移。

段页式:将虚拟地址空间进行分段,在每个分段内进行分页式管理,集合了分段分页的优点进行内存管理。

缺页中断:

磁盘有两种分区:交换分区(swap)、文件分区(filesystem)
交换分区:当物理内存不够用的时候,将物理内存中不活跃的数据,交换到磁盘的交换分区上,腾出内存用于新的数据处理。交换分区只有一个。
文件分区:用来进行磁盘文件存储。文件分区可有多个。

缺页中断:当我们通过虚拟地址访问物理内存的时候,发现数据没有在物理内存中,被交换到交换分区中,则触发缺页中断,通过内存置换算法,重新将数据加载到内存中。

LRU----最近最久未使用置换算法

基本思想:置换最近一段时间以来最长时间未访问过的页面。根据程序局部性原理,刚被访问的页面,可能马上又要被访问;而较长时间内没有被访问的页面,可能最近不会被访问。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值