操作系统--存储管理1

0.先复习组成原理的一些相关的知识点
* 程序必须被装入内存后(此时是以机器指令形式存在),才能被(以进程为单位)CPU 解析并执行。注意:内存中存储的是数据/机器指令。
* CPU访问主存过程(各种类型数据通过总线传送)
分类:读过程、写过程(涉及:控制总线、地址总线、数据总线)
读过程:将地址发送给地址总线同时向控制总线传读命令,根据地址
在内存中找到相应的存储单元,将需要的数据通过数据总线返回。
写过程:将数据发到数据总线,将地址发给地址总线,向控制总线发写
命令,将数据存储在相应的存储单元内部。
* CPU能够直接访问的存储结构:主存和寄存器;
CPU访问寄存器速度快,访问主存速度慢
* cache:位于CPU内部,将CPU经常访问的数据/指令copy一份在其中
目的是为了减少CPU访问主存的次数,减小获取数据的时间。
* 通常低地址空间存储的是OS内核代码;高地址空间存储的是用户进程代码
存储管理
* 逻辑地址空间:是程序中表达位置的符号,程序/cpu看到的地址全是逻辑地址
逻辑地址空间的范围可能大于实际的地址空间。CPU要进行访问内 存的时候,先经过地址转化,再将这个地址传递给地址总线。
* 物理地址空间:实际的地址-绝对地址;地址总线上真实的地址,范围根据总线
的条数决定;通常以数值的形式给出。
* 指令和数据的地址绑定---将逻辑地址转化为物理地址的时间
地址绑定:将程序的符合地址--转化为程序执行需要的绝对地址的过程。
这个过程可能发送在3个阶段。
1.编译时期
如果代码、数据的存放的首地址已知,编译阶段可以确定绝对地址。
如果首地址变更,则需要重新编译。
2.装入的时候
如果代码、数据的存放的首地址未知,编译阶段生产的地址是可重定为的
地址,只有在装入的时候才可以确定其绝对地址。
3.运行的时候
如果允许进程在执行的时候迁移其代码、数据(允许进程在执行的时候地址进行 改变),那么地址绑定也在执行的时候进行。需要硬件支持其地址映射。

* 存储管理单元(MMU)
MMU是CPU内部的硬件装置,功能是将逻辑地址转化为物理地址,速度比较快。
地址转化的时间:就是将地址传给地址总线之前完成转化。
注意:具体转化的策略存在不同。
注意:用户进程只能对逻辑地址进行处理。CPU也只能看到逻辑地址。物理地址是
固定不变的。
* 动态连接(C/C++)
进程即将用到的代码段,不会被预先连接进入程序,只有真正被调用的时候
才会被连接;该技术需要OS的动态连接库配合(windows的.dll)
* 动态装入--提高对内存的利用率
简单的说:进程的代码不会一次性加载进内存,而是根据需要进行加载进内存
不需要OS进行特别的支持
* 交换技术:进程从内存中换出/换入--换出后存储在外存的交换区--硬盘
交互的过程:大部分时间都在传送进程数据,是比较花费时间,通常只有当要
换出的数据比较多的时候,统一换出。
注意:OS只要保证就绪队列的进程位于内存中,其他队列的进程就直接全部
换出,在其再次进入就绪队列的时候换入。
交换的思想:已经被主流OS采用,是比较重要的思想。
* 交换技术和覆盖技术的区别:
覆盖 一个程序不需要把所有的指令和数据都装入内存,而是将程序划分为若干
功能相关独立的程序段,按照程序逻辑结构把若干功能相对独立的片段共 享一段内存,这样使得用户感觉内存扩大,程序源需要提供清晰的覆盖结 构,对程序员的要求比较高。
交换 先将内存的部分程序写到外存的交换区,按照需求,在从外存交互区中
读程序到内存中执行。交互完全是OS提供实现,对程序员透明。
区别:交换的单位是进程,覆盖的单位是某个进程的部分片段代码。

1.OS内存管理的基本思想--主要是对主存的管理
* 围绕这如何将逻辑地址转化为物理地址;定义一种地址映射的关系
y = f(x):x逻辑地址,y物理地址-->进而产生各种内存分配策略
不同的内存分配策略对应一种不同的地址映射函数。
(其实这个过程中又产生了许多新的问题用来支持这个操作)
* 如何对存储管理算法的评价和比较
# 硬件支持 # 性能 # 碎片 # 重定位 # 交换
# 内存共享 # 内存保护
2.连续内存分配--(进程全部进内存地址连续)
* 概念:
给进程分配一块 >= 进程大小的连续内存空间
* 连续区内存分配硬件支持
运用重定为寄存器防止用户进程访问其他的进程空间,或修改OS的代码和数据
base寄存器--基地址寄存器:保存了进程的逻辑地址的起始地址
bound寄存器--界限寄存器:保存了进程逻辑地址范围。
MMU:通过上面的寄存器使得MMU能够动态的映射没一个逻辑地址到物理地址
注意:在CPU将地址传给总线前转化的过程中,MMU先检查范围在进行转化,
假如不符合范围base/base+bound则发生异常进入OS内核态,通常情况
OS就会终止该用户进程。
* 连续内存分配产生的问题
# 多个长度不等的hole散布在内存内
# 当一个进程申请进入内存,OS选择一个合适的hole分配给这个进程
此时存在不同的分区选择算法
# OS维护一些管理信息:分区分配情况,已经分配和未分配的hole
---出现的问题:OS如何在一串hole为某个进程选择一个Hole?---
即动态存储分配--存在几种常见的策略
first-fit:首次适应,每次从头开始找,找到的第一个满足条件就分配给进程
best-fit:遍历整个hole,找到所有满足的hole,将这些满足中的最小的hole
分配给进程。【将Hole按照长度递增放在一个队列里面】
存在的问题:每次进程结束释放的分区都是相对较小的
worst-fit:和best-fit相反,每次分配都是找的最大的hole分配给进程
next-fit:找到第一个合适的hole后再继续找到下一个合适的hole并分配
---动态分配后新的问题碎片----存在内部/外部碎片
# 外部碎片:其实就是进程被分配分区/释放分区后剩余的主存的不连续hole;
这些hole通常比较小,无法用于进程分配。通常将这些hole合并
可能时候分配某个进程
# 内部碎片:指的:分配给进程的hole >进程占的内存大小;这些内部碎片
是属于分区内部,无法被再次利用。
OS如何应对减少这些碎片,以提高内存的利用率
1.对于外部碎片:采取紧缩的技术--重排内存块
将所有的hole合并成一个大的hole;
前提条件:支持在运行时的代码数据重定位。
2.分区对换:抢占处于等待的进程的内存资源:
具体实现将等待的进程换出到外存的交换区,腾出内存空间
注意:紧缩技术代价较高,需要进行数据复制,此时CPU不能做其他操作
连续分区分配存在内部碎片+外部碎片
* 连续分配的缺点:
1,产生内部/外部碎片
2,内存利用率低

posted @ 2017-10-27 14:49  sun1993  阅读(226)  评论(0编辑  收藏  举报