vaakian / vaakian.github.io

some notes
https://vaakian.github.io
3 stars 0 forks source link

操作系统 - 存储器管理笔记 #8

Open vaakian opened 4 years ago

vaakian commented 4 years ago

一、存储器分区

静态分区、动态分区。

内存分配匹配算法:

从可用分区链表中,从链头开始寻找,使用第一个能够满足程序的分区。

已知主存256K, 0S占用低位16K,现有一作业序列如下: J1要求134K,J2要求30K,J3要求64K,J1完成,J3完成,J4要求60K,J5要求62K, J2完成,J6要求12K, J7要求32K.试用最佳适应法为上述作业分配主存,画出主存分配情况和自由主存队列。(分配时,高地址处作为已分配区)

注意:在内存回收时,涉及到与相邻的空闲空间合并 image

二、存储器保护

防止程序越界,限制程序访问空间。

程序访问内存时,将访问的相对地址(基地址+偏移地址,偏移地址[相对地址]不应该有负数)和限长寄存器比较,如果超过限长寄存器,则发出越界信号。

程序访问内存时,将访问的内存地址和上下界比较,如果超过上界或下界,则发出越界信号。

下界<= 程序可访问的内存<=上界

vaakian commented 4 years ago

image

这里有一个疑问,在9.4时,JOB3可以正常进入内存,那么是他和剩余的JOB2竞争,还是在9.4同一时刻JOB2先进入CPU,然后JOB3进入内存?

作业名 进入输入井时间 进入内存时间 开始执行时间 计算时间 完成时间 周转时间
JOB1 8.0 8.0 8.0 1.0 9.0 1.0
JOB2 8.2 8.2 9.9 0.6 10.5 2.3
JOB3 8.4 9.4 9.4 0.5 9.9 1.5
JOB4 8.6 8.6 9.0 0.4 9.4 0.8
vaakian commented 4 years ago

分页管理

前景概要:

固定分区:一个进程只能使用一个分区。缺点是不能满足大内存进程,且小进程占用一个固定分区会产生较大的碎片。 动态分区:为每一个进程动态分配分区大小,但当进程回收后,后来的进程无法完全匹配该分区大小,会产生大大小小不同的碎片。 以上两种分区管理方法,都是一个程序占用一个连续的内存块(分区),操作系统可以较为方便的将内存的物理地址和相对地址(逻辑地址)进行转换。而分页式管理方法,是将程序划分成若干个小块,将各个块分布在不连续的页框(大大小小相等的分区、每个分区就是一个页框),页框越小,则产生的碎片就越小。但此时,需要一种新的方法,将程序的逻辑地址和物理地址进行映射。

example:若进程需要23MB内存,而每个内存固定分区只有10mb,显然装不下。 那么才用分页管理,将进程划分为10mb+10mb+3mb分别装入三个分散的分区,就只产生了7mb碎片。若将固定分区进一步划分成2m,那么进程可以装入11*2mb+1mb,这样就产生了1mb的碎片,进一步提高了内存利用率。

将内存空间分为一个个相等的分区,每个分区叫做页框(或内存块、页帧、物理块),每个页框有一个编号,即“页框号“(或内存块号、页帧号、物理块号),页框号从0开始。

逻辑地址组成:页号 + 页内偏移量

获取地址:物理地址=页内偏移地址+页基地址

页号=get页号(逻辑地址) 页内偏移地址=get页内偏移地址(逻辑地址)

物理地址=get页基地址(页号)+页内偏移量 image

image 商是页号、余数是页内偏移