【简记】Operating System—— memory management(part 1)

来源:互联网 发布:python读取json文件 编辑:程序博客网 时间:2024/04/30 11:48

This memo is based on the course of Dr.Li with Operating System as the reference book.

本章内容:

  • 内存管理的背景
  • 地址绑定
  • 连续内存分配

8.1 背景

8.1.1 基本硬件

CPU所能直接访问的存储器只有内存和处理器内的寄存器。如果数据不在内存中,那么在CPU 使用前必须先把数据移到内存中。

访问寄存器:通常只需要一个CPU时钟周期就可以解析井执行一个或多个指令
访问内存:可能需要多个CPU 时钟周期

由于内存访问频繁,需要用一些方法解决指令等待数据造成的暂停。
协调速度差异的内存缓存区,称为高速缓存( cache)。
高速缓冲存储器存储了频繁访问的 RAM 位置的内容及这些数据项的存储地址。当处理器(CPU)引用存储器中的某地址时,高速缓冲存储器便检查是否存有该地址。如果存有该地址,则将数据返回处理器;如果没有保存该地址,则进行常规的存储器访问。
这里写图片描述

确保每个进程都有独立的内存空间:(这里省略了逻辑地址转化为物理地址的过程)
基地址寄存器( base register ) 含有最小的合法物理内存地址,而界限地址寄存器( limit register) 决定了范围的大小。
这里写图片描述

===
8.1.2 地址绑定

源程序中的地址通常是用符号来表示的(如count) 。编译器通常将这些符号地址绑定(bind ) 在可重定位的地址(如”从本模块开始的第14 字节)。链接程序或加载程序再将这些可重定位的地址绑定成绝对地址(如74014 ) 。每次绑定都是从一个地址空间到另一个地址空间的映射。

三种可能发生绑定的时间段

  • 编译时(compile time )
  • 加载时(load time)
  • 执行时( execution time )

这里写图片描述

===
8.1.3 逻辑地址空间与物理地址空间

CPU 所生成的地址通常称为逻辑地址,而内存单元所看到的地址(即
加载到内存地址寄存器(memory-address register) 中的地址)通常称为物理地址。

运行时从虚拟地址到物理地址的映射是由被称为内存管理单元( memory-management unit,MMU) 的硬件设备来完成的。正如将在8.3 到8.7 节所要讨论的,有许多可选择的方法来完成这种映射。

一种可行的映射方法(采用基地址寄存器原理)
这里写图片描述

===
8.1.4 动态加载

指一个子程序只有在调用的时候才会被加载。所有子程序都以可重定位的形式保存在磁盘上。

===
8.1.5 动态链接与共享库

动态链接的概念与动态加载相似。只是这里不是将加载延迟到运行时, 而是将链接延迟到运行时。

如果有动态链接,二进制镜像中对每个库程序的引用都有一个存根(stub)。存根会用子程序地址来替换自己,并开始执行子程序。因此,下次再执行该子程序代码时,就可以直接进行,而不会因动态链接产生任何开销。

动态链接也可用于库更新(如修改漏洞)。


8.2 交换

进程可以暂时从内存中交换(swap) 到备份存储(backing store) 上,当需要再次执行时再调回到内存中。目的是解决内存紧张问题,带来的好处是进一步提高了内存利用率和系统吞吐量。


8.3 连续内存分配

内存通常分为两个区域: 一个用于驻留操作系统,另一个用于用户进程。
采用连续内存分配(cootiguous memory allocation ) 时,每个进程位于一个连续的内存区域。

8.3.1 内存映射与保护

重定位寄存器含有最小的物理地址值;界限地址寄存器含有逻辑地址的范围值。

有了重定位寄存器和界限地址寄存器,每个逻辑地址必须小于界限地址寄存器。 MMU 动态地将逻辑地址加上重定位寄存器的值后映射成物理地址。映射后的物理地址再送交内存单元。

===
8.3.2 内存分配

多分区方法( multiple-partition method )

这里写图片描述

内存不断地分配给进程,直到下一个进程的内存需求不能满足为止,这时没有足够大的可用孔来装入进程。操作系统可以等到有足够大的空间,或者往下扫描输入队列以确定是否有其他内存需求较小的进程可以被满足。

从一组可用孔中选择一个空闲孔的最为常用方法有首次适应( first-fit ) 、最佳适应( best-fit ) 、最差适应( worst-fit ) 。

  • 首次适应:分配第一个足够大的孔。查找可以从头开始, 也可以从上次首次适应结束时开始。一旦找到足够大的空闲孔,就可以停止。
  • 最佳适应:分配最小的足够大的孔。必须查找整个列表,除非列表按大小排序。这种方法可以产生最小剩余孔。
  • 最差适应:分配最大的孔。同样,必须查找整个列表,除非列表按大小排序。这种方法可以产生最大剩余孔,该孔可能比最佳适应方法产生的较小剩余孔更为有用。

模拟结果显示首次适应和最佳适应方法在执行时间和利用空间方面都好于最差适应方法。首次适应和最佳适应方法在利用空间方面难分伯仲,但是首次适应方法要更快些。

===
8.3.3 碎片

外部碎片:进程之间的空闲块
内部碎片:假如有一个进程需要18462 B。如果只准确分配所要求的块,那么还剩下一个2B 的孔。维护这一小孔的开销要比孔本身大得多。因此,通常将内存以固定大小的块为单元(而不是字节)来分配。采用这种方案,进程所分配的内存可能比所要的要大。这两个数字之差称为内部碎片,这部分内存在分区内,但又不能使用。

解决外部碎片的方法:

  • 紧缩:即重新移动内存内容。如果重定位是静态的,并且在汇编时或装入时进行的, 那么就不能紧缩。
  • 允许物理地址空间为非连续
阅读全文
0 0
原创粉丝点击