操作系统——内存管理(一)
一:程序的装入和链接
用户程序要在系统中运行,必须先将它装入内存,然后再将其转变为一个可以执行的程序,通常都要经过以下几个步骤:
(1)编译
(2)链接
(3)装入
二:连续分配存储管理方式
1、单一连续分配
在单一连续分配方式中,内存被分为系统区和用户区。系统区通常位于内存的低地址部分,用于存放操作系统相关数据;用户区用于存放用户进程相关数据。
特点:同一时刻内存中只能有一道用户程序,用户程序独占整个用户区空间。所以并不支持多道程序并发运行。
优点:实现简单;无外部碎片;可以采用覆盖技术扩充内存;不一定需要采取内存保护。
缺点:只能用于单用户、单任务的操作系统中;有内部碎片,存储器利用率极低。
(分配给某进程的内存区域中,如果有些部分没有用上,就是"内部碎片")
2、固定分区分配
20世纪60年代出现了支持多道程序的系统,为了能在内存中装入多道程序,且这些程序之间又不会相互干扰,于是将整个用户空间划分为若干个固定大小的分区,在每个分区中只装入一道作业,这样就形成了最早的、最简单的一种可运行多道程序的内存管理方式。
划分分区的方法:
1、分区大小相等
2、分区大小不等
操作系统需要建立一个数据结构――分区说明表,来实现各个分区的分配与回收。每个表项对应一个分区,通常按分区大小排列。每个表项包括对应分区的大小、起始地址、状态(是否己分配)。
优点:实现简单,无外部碎片
缺点:
a.当用户程序太大时,可能所有的分区都不能满足需求,此时不得不采用覆盖技术来解决,但这又会降低性能;
b.会产生内部碎片,内存利用率低。
3、动态分区分配
(1)动态分区分配中的数据结构
(2)基于顺序搜索的动态分区分配算法
(1)首次适应算法(First Fit)
(2)邻近适应算法(Next Fit)循环首次适应算法
(3)最佳适应算法(Best Fit)
(4)最坏适应算法(Worst Fit)
(3)基于索引搜索的动态分区分配算法
(1)快速适应算法(quick fit)
(2)伙伴系统(buddy system)
(3)哈希算法
(4)动态可重定位分区匹配
(1)紧凑
移动作业从把多个分散的小分区拼接成一个大分区的方法称为拼接或紧凑。
虽然"紧凑"能获得大的空闲空间,但也带来了新的问题,即经过紧凑后的用户程序在内存中的位置发生了变化,此时若不对程序和数据的地址加以修改(变换),则程序必将无法执行。为此,在每次"紧凑"后,都必须对移动了的程序或数据进行重定位。为了提高内存的利用率,系统在运行过程中是经常要进行"紧凑"的,每"紧凑"一次,就要对移动了的程序或数据的地址进行修改,这不仅是一件相当麻烦的事情,而且还大大地影响到系统的效率。下面要介绍的动态重定位方法将能很好地解决此问题。
(2)动态重定位
三、对换(Swapping)
问题:内存中被阻塞的进程占用大量空间,外存上却有许多作业因为内存不足而等待。
对换:把内存中暂时不能运行的进程或暂时不用的程序和数据调出到外存上,以便腾出足够的内存空间。
高级调度、中级调度、低级调度的通俗介绍:
https://blog.csdn.net/weixin_42468707/article/details/123299838
那么应该在外存(磁盘)的什么位置保存被换出的进程呢?
在支持对换的OS中,磁盘空间分为文件区和对换区两部分。
文件区
◆占大部分
◆更关注空间利用率
◆采用离散分配方式,减少碎片
对换区
◆占小部分
◆更注重访问速度
◆连续分配方式,对速度有利