【操作系统】虚拟页和物理页

一、前置概念

实模式:直接操作物理内存。每次只能运行一个程序,不安全;最大使用内存1M,限制太大。
保护模式:虚拟地址被转换为物理地址,要有页表。

装载器:把指令和数据加载到内存运行。要满足两个条件:

  • 1)可执行程序加载后占用内存空间应该是连续的。
  • 2)我们需要同时加载很多个程序,并且不能让程序自己规定在内存中加载的位置。

那就是我们可以在内存里面,找到一段连续的内存空间,然后分配给装载的程序,然后把这段连续的内存空间地址,和整个程序指令里指定的内存地址做一个映射。

二、分段分页

分段分页都是操作系统发展过程中为了更好地使用内存资源

2.1 直接映射(为物理地址)

问题:

  • 1)进程地址空间不隔离。不小心程序数据被修改,导致运行异常。
  • 2)内存使用效率低。内存碎片需将运行数据暂时拷贝到硬盘,再重装入内存,效率十分低下。

解决方法: 增加中间层,将虚拟地址映射为物理内存地址。

2.2 分段含义、优劣

段: 系统分配出来的连续内存空间。
分段: 找出连续物理内存和虚拟内存地址映射的方法。
优劣: 解决了程序本身不需要关系具体物理内存的问题,同时带来内存碎片的问题。

补充:
优:没内部碎片、重定位段比整个地址空间更容易;
劣:有外部碎片、很难将连续内存分配给可变大小分区、昂贵的内存管理算法。
内存交换:可解决内存不连续的问题,将内存写到硬盘,重新加载,让剩下的内存空间连续。
		 Linux的swap分区就是作用。但硬盘访问速度太慢,会有性能瓶颈,机器可能出现卡顿。

段表存储在线性地址空间,而页表则保存在物理地址空间。

2.3 分页

页: 切成的连续且尺寸固定的内存空间。
分页: 分段导致内存碎片和交换空间太大,为了让交换写入的数据更少,出现了内存分页。

  • 和分段相比,分页把(虚拟/物理)整块内存切成一段段固定尺寸的大小内存存储单元。

缺页错误: 操作系统读取特定页,发泄数据没加载到物理内存(缓存未命中),就会触发CPU Page Fault。

三、虚拟地址和物理地址

3.1 含义

虚拟内存地址Virtual Memory Address):指令里用到的内存地址。
定义的虚拟地址空间是连续,使程序编写难度降低。因为每个进程都提供了一个一致的、私有的、连续完整的地址空间,让每个进程都产生了一种自己在独享主存的错觉。
物理内存地址Physical Memory Address):实际内存硬件里面的空间地址,它是真实的物理地址

3.2 地址转换

内存管理单元 - MMUMemory Management Unit):将虚拟地址转换为物理地址,借助存放在内存中的页表动态翻译虚拟地址。
页表:将虚拟内存地址映射到物理内存地址的映射表,能将虚拟内存里的页一一映射到物理内存里面。
地址变换高速缓冲/快表 - TLBTranslation lookaside buffer):存储当前最可能被访问到的页表项,是部分页表项的一个副本,减少了因MMU导致的处理器性能下降。

页号Directory)和偏移量Offset) 可用来计算内存地址转换,步骤:

  • S1:把虚拟内存地址切分成页号和偏移量的组合;
  • S2:从页表里,查询出虚拟页号对应物理页号
  • S3:拿物理页号+偏移量,就得到了物理内存地址。

1

多级页表:

  • 问题:数字范围: 0 − 2 20 0-2^{20} 0220,一个页号是4字节(Byte

  • 1个页表: 2 20 ∗ 4 B = 4 M 2^{20}*4B = 4M 2204B=4M
    当内存达到4G时,页表占用内存空间太大。

  • 多级页表(1-2-32-1 [4级-1级])时,
    每1级用5个比特表示,1级 2 5 = 32 2^5=32 25=32 个条目, 32 ∗ 4 B = 128 B 32*4B=128B 324B=128B
    1个 4级索引表 8M= 2个 3级索引表(4M+4M)=2个 2级索引表=64个1级索引表
    共69个索引表,每个128字节,大概 69 ∗ 128 B ( 约 ) = 2 6 ∗ 2 7 B    9 K B 69*128B (约)= 2^6*2^7B~~9KB 69128B()=2627B  9KB空间。只有4MB的1/500。
    2

四、问题

1、分段分页含义?

分段:分配连续完整的内存,然后将虚拟内存地址映射为物理内存地址的方法。
分页:分段导致外部内存碎片和交换空间太大,为了让交换写入数据更少,出现了内存分页。和分段相比,分页把(虚拟/物理)整块内存切成一段段固定尺寸的大小内存存储单元,减少了内存碎片的大小。

追问1:为什么分段?(*2)

分段引入主要扩大了内存地址,程序地址不再需要原始硬编码,程序调试更简便。
把虚拟空间的的虚拟地址空间的虚拟内存组织成一些长度可变的内存块单元

追问2:为什么分页?(*2)

分段内存碎片太大,因此提出了分页,用大小相同的页替换大小不同的段。

  • 划分颗粒度更小,然后通过映射将虚拟地址映射为物理地址,映射关系是通过页表实现的。最后将逻辑上连续线性地址转换为可不连续的物理地址,。
2、虚拟内存和物理内存(*6)理解、作用、联系?

虚拟内存地址Virtual Memory Address):指令里用到的内存地址。
定义的虚拟地址空间是连续,使程序编写难度降低。因为每个进程都提供了一个一致的、私有的、连续完整的地址空间,让每个进程都产生了一种自己在独享主存的错觉。
物理内存地址Physical Memory Address):实际在内存硬件里面的空间地址,它是真实的物理地址

追问1:什么时候进行交换?

物理内存不足时,会将最近最少频率使用的页框移出物理内存,放到存储空间(swap分区)。

追问2:不使用虚拟内存可能会出现什么问题?
  • 1)进程地址空间不隔离。有Bug/恶意的程序修改其它程序的内存数据,会导致其它程序运行异常。
  • 2)内存使用效率低。可能有大量的内存数据频拷贝到硬盘,释放空间给另一个程序使用,效率释放低下。
  • 3)程序运行的地址不确定。当内存剩余空间满足程序要求,系统会随机分配一段连续空间,因为随机分配,所以运行地址不确定。
3、Linux内存管理及(页面置换)算法(*2)。

……

4、什么是缓存?有哪些缓存的更新算法?

……LRU……

5、malloc是怎么分配内存?

……

6、XXX语言内存分布?

……

五、参考

【段页】
1、出处: 深入探究:操作系统为什么要引入虚拟地址?
2、分段机制和分页机制
3、分段
4、怎样通俗的理解操作系统中内存管理分页和分段?
5、内存分页不就够了?为什么还要分段?还有段页式?
6、linux中为什么要有分段和分页机制
7、09 | 程序装载:“640K内存”真的不够用么?

【虚拟地址与实际地址】
1、40 | 理解内存(上):虚拟内存和内存保护是什么?
2、读懂操作系统之虚拟内存地址翻译原理分析篇(二)
3、虚拟内存的那点事儿
4、80386学习(五) 80386分页机制与虚拟内存

  • 11
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
式地址重定位操作系统是一种常见的内存管理技术,通常用于将虚拟内存地址转换为物理内存地址。在这种系统中,内存被划分为大小相等的框,而程序使用的内存也被划分为相同大小的面。每个面都有一个唯一的,而每个都映射到一个特定的框。 当程序引用一个虚拟地址时,操作系统虚拟地址分解为内偏移量,并将映射到相应的框。然后,操作系统内偏移量添加到框的物理地址中,从而获得物理地址。 但是,当操作系统将进程从一个物理地址空间移动到另一个物理地址空间时,所有的虚拟地址都必须被重新映射到新的物理地址。这个过程就被称为表重定位。 在式地址重定位系统中,表存储在主存储器中,并通过表寄存器来访问。当一个程序引用一个虚拟地址时,处理器将虚拟地址中的发送到表寄存器,并获取与该相关联的表项。表项包括该所映射的物理。然后,处理器将物理虚拟地址中的内偏移量组合,从而计算出物理地址。 当操作系统需要将一个进程从一个地址空间移动到另一个地址空间时,表必须被更新,以便将旧的物理映射到新的物理。这个过程通常涉及到表基址寄存器和表长度寄存器的更新,以及所有虚拟地址的重新映射。 总之,式地址重定位操作系统是一个基于分内存管理的系统,它通过将虚拟地址映射到物理地址来管理内存。在这个系统中,表被用来存储虚拟物理之间的映射关系,并且在地址空间移动时需要进行重定位操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值