存储器管理
-
程序运行分为三个阶段,编译,链接,装入。
编译:将程序分为若干个目标块
链接:将库函数以及各个目标块链接成一个整体
装入:装入内存进行执行
1.1 装入,可以分为绝对装入,可重定位装入,动态运行时装入
绝对装入:适用于单道系统,装入内存后。由于程序中的相对地址于内存中的物理地址相同,所以不需要对程序和数据的地址进行修改
可重定位装入:适用于多道系统,根据内存的实际情况,将链接好的模块装入,逻辑地址于内存中的物理地址不同,所以需要在装入的时候进行地址变换,又因为地址变换是在装入的时候一次,完成的以后不能在改变,所以又称为静态装入
动态运行时候装入:把模块装入内存后,并不立即把装入模块的逻辑地址转换为物理地址,而是等到程序执行的时候再去进行转换。
1.2 链接,可以分为,静态链接,装入时链接,运行时链接
静态链接:在装入前,一次链接好,不在改变,需要解决两个问题,对相对地址进行转化,变换外部调用符号。
装入时链接:在装入一个模块的时候若发生一个外部调用事件,将引起装入程序去找出相对于的外部目标模块,并将其装入内存
运行时动态链接:运行的时候在进行模块装入
2.存储空间的分配
2.1 连续分配
2.1.1 单一连续分配:适用于单道系统,存储器分为系统区和用户区,用户区内存中仅有一道用户程序,整个内存的用户空间,该程序独占
2.1.2:固定分区:
分区大小相同:所有的内存分区大小相同
分区大小不同 :为增加存储器分配的灵活性。
内存分配:将区分按照大小进行排队,建立一张分区使用表。
2.1.3动态分区
数据结构:空闲分区表,空闲分区链。
分区分配算法 :
1. 基于顺序搜索
首次适应算法
循环首次适应算法
最佳适应算法
最坏适应算法
2. 基于索引搜索
最快适应算法(将大小相同的空闲分区,分为一组)
伙伴系统
哈希算法
3.动态可重定位
紧凑
动态重定位
2.1.4内存分配与回收
1. 内存分配: 从空闲链表头开始检索,根据分区分配算法找到相适应的空闲块,移 除。
2.内存回收:会出现四种情况,
2.1 回收区前面是空闲区域,则将回收区空间大小合并到前面,修改前面的分区大小
2.2 回收区后面是空闲区域,则将回收区空间大小合并到后面,修改后的分区大小
2.3 回收区前面后都是空闲区域,则将回收区空间大小合并道前面,修改前面的分区大小,去除后面分区的表项
2.4 回收区前后都不是空闲区域,新建表项插入空闲分区链表。- 对换:是指把内存中暂时不能运行的进程或者暂时不用的程序和数据换出到外存上,以便腾出足够的内存空间,把已具备运行条件的进程或者进程所需要的程序数据换入内存。
-
离散分配内存
4.1分页式
页面:分页存储管理将进程的逻辑地址空间分成若干个页,并为各页加以编号,由于进程的最后一页经常装不满以块,而形成不可利用的业内碎片
页面大小:一般与块的大小相同。
地址结构:页号+页内偏移量
页表:实现逻辑地址到物理地址的映射,大多数页表都驻留在内存里
快表:联想存储器,在CPU给出有效地址之后,地址变换机构将页号送入高速缓冲寄存器,若其中没有该页号,则访问内存中的页表,找到后送入地址寄存器的同时,还要送入快表保存。
4.1.2访问内存的有效时间
无快表:EAT= 2t(t表示一次访问内存的时间)
有快表:EAT = 2t+r-t*a (r表示查找快表所需要的时间,a表示命中率)
4.1.3多级页表
4.2分段式
4.2.1引入的目标:方便用户编程,信息共享,信息保护,信息增长,动态链接
分段与分页的区别
1. 页是信息的物理单位,段是信息的逻辑单位
2. 页的大小由系统固定,段的长度由用户固定,且不定长
3.页的用户地址空间是一维,段是二维的
4.3段页式
将分页式,与分段结合,分页能有效的提高内存的利用率,分段能更好的满足用户需求。
地址:段号+段内号+页内地址
地址变换过程:利用段号与段长进行比较,若未越界,利用段的起始地址和段号来求出段的对应的表项,从中得到该段的页表起始地址,利用逻辑地址中的找到对应页,在找出对应的块号。三次访问内存,一次是段表,一次是页表,一次是物理块号