前言:操作系统需要对内存创建抽象模型以及管理内存,让程序员更方便的使用内存。
一、无内存抽象
在很久以前,程序员都直接访问物理内存,例如:mov r1,1000。
二、抽象:地址空间
1、概念:程序在内存可能会互相影响,甚至修改操作系统导致程序无法正常运行。所以,系统设计人员必须解决两个问题:保护以及重定位。因此将内存抽象为地址空间,地址空间是一个进程用于寻址内存的一套地址集合,进程与进程之间的地址空间相互独立。
2、基址与界限寄存器:每一个CPU配置一个基址寄存器和一个界限寄存器,每个进程拥有独自的寄存器值。每一个进程访问内存取出指令的时候,CPU把逻辑地址发送给地址总线前会与基址相加,然后检查是否大于界限寄存器的值,如果大于它,会发出错误中断执行。
3、交换技术:将所有进程一直保存在内存中,会极大的浪费内存空间。解决内存超载,最简单的策略是交换技术。将一个进程完整调入内存,使它运行一段时间后放回磁盘,空闲进程主要存储在磁盘上。
a.概念
ABCD表示四个进程,随着进程的运行,进程在磁盘与内存之间交换
固定分配:每个进程需要的内存空间不随时间变化
动态分配:进程随着时间增长,可能之增长数据段,也有可能数据段和堆栈段一起增长。
b.动态管理
①使用位图的存储管理
这种方法,内存会被划分成规定大小的内存单元,每个单元对应位图的一位。0表示占用,1表示空闲(或者相反)。内存大小一定,位图大小与分配单元成反比。如果,进程的大小不是分配单元的整数倍,那么在最后一个分配单元中会有一定的内存被浪费。
②使用链表的存储管理
维护一个内存段以及空闲段的链表(双链表更好),链表的每个节点包含以下内容:空闲区或进程的指示标志,起始地址,长度以及下一个节点的地址。
实例:
当X进程撤销时,它会检查它前后两个节点,决定是以何种方式进行合并。在a中,节点数目不变,但是需要把X进程内存空间的所在节点的P改为H。
分配算法:当按照地址顺序在链表中存放进程和空闲区时,有几种算法从磁盘换入进程。
a.首次适配法
b.下次适配法
c.最佳适配法
d.最差适配法
...
三、虚拟内存技术
前言:程序具有局部性原则,每个程序拥有自己的地址空间,这些空间被分割成多个块,每一块称为一个页或者页面。每一页都有连续的地址,这些页被映射到物理内存。当程序引用到在物理空间的地址时,指令立即执行。如果引用到的地址不在物理空间时,那么由操作系统将缺失的页装入内存。
1、分页(一维线性,通过取模和求整可以得到地址)
a.当程序执行mov reg, 1000时,他把地址为1000的内存单元的内容复制到寄存器中。
b.由程序产生的地址为虚拟地址,他们构成了一个虚拟地址空间。在有虚拟内存的计算机上,这个地址被发送到内存管理单元中(MMU),MMU把虚拟地址映射为物理内存地址。
示例:一台计算机可以产生16位地址,地址范围为0到64k,且这些地址为虚拟地址。然后计算机只有32k的物理内存。因此,可以编写64k的程序,但是磁盘需要足够大的空间保存64k程序的完整副本。
c.虚拟地址空间按照固定大小划分为称为页面的若干单元,物理内存中对应的二单元称为页框(page frame),页面大小与页框大小通常一样大。
d.如果MMU发现该页面没有被映射,那么CPU陷入到操作系统,这个陷阱称为缺页中断。
e.页表
①作为一种简单的实现,虚拟地址到物理地址可以概括如下:虚拟地址被分为虚拟页号和偏移量两部分
②页表相当于一个函数,,参数是虚拟页号,结果是页框号。
③页表项示例
2、分段(二维,必须要基址和偏移量才能得到地址)
a、分段概念
在分段存储管理方式中,作业的地址空间被划分成为多个段。逻辑地址由段名和段内地址组成。
b、段表
系统为每个进程简历一张段映射表,表项记录了该段在内存中的基址和段长度
3、段页式存储管理(三维,段号+段内页号+页内地址)
a、先将用户程序分段,然后把每个段划分成若干页,并为每个段赋名。
b、在这里,段表记录的是页表始址和页表长度·
c、获取一条指令需要三次访问内存
①访问内存中的段表,获得页表始址
②访问内存中的页表,获得物理块号,物理块号与页内地址形成物理地址
③读取内存中的数据