内存管理

第八章 内存管理
1.背景
1)内存:
由存储单元(字节或字)组成的一维连续地址空间;
由顺序编址的块组成,每块包含相应的物理单元;
用来存放当前正在运行的程序的代码或数据;
是程序中指令本身(程序计数器)所指向的存储空间。
内存可以分为:
系统区:用于存放操作系统。
用户区:用于装入并存放用户程序和数据。
防止用户进程越界,只访问其合法空间办法:基地址寄存器(存放最低合法物理内存地址),界限地址寄存器(偏移量)
2)指令与数据进行地址绑定:
1.编译时期 如果内存位置已知,可生成绝对代码;如果开始位置改变,需要重新编译代码。
2.加载时期 如果存储位置在编译时不知道,则必须生成可重定位代码。
3.执行时期 如果进程在执行时可以在内存中移动,则地址绑定要延迟到运行时。需要硬件对地址映射的支持,例如基址和限长寄存器。
3)逻辑地址与物理地址
逻辑地址与物理地址的映射方法:
静态地址重定位:在虚拟空间程序执行之前由装配程序完成地址映射工作。
优点:容易实现,无需硬件支持。
缺点:
1.程序经地址重定位后就不能移动了,因而不能重新分配内存,不利于内存的有效利用。
2.必须占用连续的内存空间,这就难以做到程序和数据的共享。

动态地址重定位: 在程序执行过程中,在CPU访问内存之前,将要访问的程序或数据地址转换成内存地址。
优点:
1.可以对内存进行非连续分配
对于同一进程的各分散程序段,只要把各程序段在内存中的首地址统一存放在不同的BR中,则可以由地址变换机构变换得到正确的内存地址。
2.动态重定位提供了实现虚拟存储的基础
动态重定位不要求在作业执行前为所有程序分配内存,也就是说,可以部分地、动态地分配内存。
3.有利于程序段的共享
缺点:
需要附加的硬件支持。
实现存储管理的软件算法比较复杂。
4)静态链接与动态链接
静态链接:为了程序正确执行,必须由连接装配程序把它们连接成一个可运行的目标程序
问题:花费时间,浪费空间
动态链接: 在程序开始运行时,只将主程序段装配好并调入内存,其它各段的装配是在主程序段的运行过程中逐步完成。每当需要调用一个新段时,再将这个新段装配好,并与主程序段链接
2.交换
进程可以从内存中暂时交换到备份存储上,当需要执行再交换回来。
滚入,滚出—交换的操作:在基于优先级的算法中,低优先级的进程被换出,这样高优先级的进可以被装入和执行。
3.连续内存分配(单一连续分配)
1)内存映射与保护
CPU逻辑地址先与界限地址寄存器比较,若相比较小则没有超出界限可以与重定位寄存器相加得到物理地址;否则地址错误。
2)内存分配办法:
固定分区法(将内存分为固定大小的分区,每个分区可以容纳一个进程)
特点:管理简单,系统开销小
不灵活、大程序可能无法装入
利用率低,浪费,内部碎片大
可变分区法(这里需要看课件或者书)
一开始所有内存都可被应用,称为孔,有进程需要时就查找足够大的孔。
选择空闲孔的办法:
1首次适应:寻找第一个足够大的孔。
l 优点:
l 1.算法简单
l 2.由于每次从低地址开始分配,高地址部分的大的空闲区被划分的机会比较少,比较容易满足大作业的需要空
l 缺点:
.留下碎片造成存储空间浪费
2.最佳适应:分配最小的足够大的孔。
l 优点:

l 1.先使用小存储区,以便把大存储区留给大的作业
l 缺点:
l 1.每次都要按空闲区大小重新调整可用表或*链,算法复杂
l 2.留下无法利用的小碎片造成存储空间浪费
3.最差适应:分配最大的孔
l 优点:
l 1.避免留下无法利用的小碎片造成存储空间浪费
l 缺点:
1.每次都要按空闲区大小重新调整可用表或*链,算法复杂
3)碎片
外部碎片:(首次适应与最佳适应均会留下外部碎片)随着进程装入载出内存剩余的空闲空间被分割为小片段。
内部碎片:进程所分配的内存大于所需要的内存。
解决办法:紧缩(移动内存内容,合并成一块)。
4.分页(不具备用户视角,映射对用户不可见)
分页允许进程的物理地址空间可以是非连续的。
1)基本方法
将物理内存分为固定大小的块(称为帧);将逻辑内存分成同样大小的块(称为页);执行一个大小为n页的进程,要发现n个空闲帧并把程序装入其中。
分页技术不会产生外部碎片,只会有少量内部碎片。
2)页物理地址与逻辑地址的转换(这个需要记忆啊)
逻辑地址%页大小=页偏移 逻辑地址/页大小=页号(对应帧号)
物理地址=对应帧号*块大小+页偏移
3)分页的硬件支持
(PTBR) 页表基址寄存器指向页表
(PRLR) 页表长度寄存器定义页表的大小
(TLBs)关联的快速内存,特殊的硬件缓冲,也称相联存储器或转换表缓冲区
页号在TLB中被找到概率:命中率。
4)内存保护
通过每个帧相关联的保护位来实现
1.一位用来定义页是可读写的还是只读的。
2.一位与页表中的每一条目关联:有效无效位,有效说明在进程的逻辑地址空间中
5)共享页
进程之间的共享只读代码(可重入代码,纯代码)留一份拷贝,放到共享页中。
5.页表结构(需要看课件书)
1.层次页表(P256)
将大页表进行分层
多级页表结构
2.哈希页表
算法:虚拟地址中的虚拟页号转换到哈希表中,用虚拟页号与链表中的每一个元素的第一个域比较,如果相等,就用第二个域来形成物理地址。(P258)
3.反向页表(P259)
反向页表中对于每个真正的内存页或帧才有一个条目
表项包含真正内存地址的页的虚拟地址,它包括拥有这个页的进程的信息

这样从两方限定了页表范围。
6.分段(体现用户视角,映射对用户可见)
1)基本方法
逻辑地址空间是由一组段组成,每个段都有自己的名称长度。地址指定了段名称,段内偏移。用户可以指定两者。
实现机制:段表,每个条目均有段基地址和段界限。
2)硬件结构
(STBR)段表基址寄存器指向内存中的段表地址
(STLR)段表长度寄存器指出进程中的段数
3)段物理地址与逻辑地址转换
段号用作段表的索引,段偏移小于段界限时,偏移与段基地址相加为物理地址。