目录
说明:该文档是借鉴B站博主的,地址为https://www.bilibili.com/video/BV1yv411C7Kr
下面的图片都是切图的,因为图上有标识,不能切图成功。所有标识打码了,如有侵权,联系删除
进程内存分配3种方式
1.连续固定内存分配
2.非连续内存分配(动态分配)
3.虚拟内存
一:连续固定内存分配
连续分配:为一个进程分配一片连续的内存空间,类似顺序表
优点:快
缺点:比较难划分,连续的很长的内存空间不好找
连续固定内存分配:在进程来之前就已经内存分区分配了
缺点:浪费空间
1.单一连续分配方式
单一连续分配方式:只能用于单用户,单任务的操作系统中。只存在一个进程运行
2.固定分区分配
固定分区分配:分区大小相等
缺点:若进程太小,则空间浪费。若进程太大,超过一个分区容量,则无法装入
优点:如果每个进程需要的内存都刚好是一个分区的大小,则实现简单,每个进程都满足要求。
适用系统:比如车间机床,每个机床都一样
3.分区大小不等分配
分区按大小排队
连续内存分配管理方式
1.首次适应算法
2.最佳适应算法
3.最坏适应算法
动态分配过程
分配大小:只能分配2的整数次幂大小空间.2,4,8,32,64,128,256,512,1024...
下图:
进程1需要64kb:内存动态分配64kb给进程1
进程2需要128kb:内存动态分配128kb给进程2
进程3需要100kb:内存动态分配128kb给进程3
进程4需要100kb:内存分配不了,剩余的内存小于100kb
内存碎片-外部碎片/内部碎片(连续的)
内部碎片(已经被分配出去):进程3只需要100kb,分配了128kb给进程3。剩余28kb就是内部碎片,无法分配给其他进程
外部碎片(还没有被分配出去):由于太小了,无法分配给新进程
空闲分区链/空闲分区表
空闲分区链:多个不连续的内存空间,用链表串起来
下图:
进程2结束了,蓝色的空间是空闲的内存
伙伴系统算法
伙伴系统是对以上两种内存方式对一种折中方案
原理:
1.整个分区大小为2的n次方
2.新的进程需要空间S,可讲分区进行i次划分,得到空间2的(n-1)次方
3.当满足2的(n-i-1)<S<=2的(n-i)的时候,则把大小2的(n-i)的分区分配给进程
合并条件:大小相同,地址相邻(由同一块分割而来)
原理图:
最开始为1M整块的内存
来了一个A进程,需要66K:1M划分一半,512大于66K:
512K划一半,256大于66k,继续划分:
265k划一半,128k大于66k,128k的一半64k小于66k,所以128k分配给A
又来了个B进程,需要251K:所以把256k分配给B
又来了个C进程,需要41k:128K大于41K,128K的一半64大于41K,64K的一半32小于41k,所以把64K分配给C
又来了个D进程,需要130K:所以把256K分配给D
这时,C进程执行完了,回收内存64k,合并128K
这时,进程B执行完了,回收内存256K,不能合并,因为左边是128K,大小不一致不能合并,不是同一块分区分裂的不能合并
这时,进程D执行完了,回收内存256K,和右边的合并。因为来自同一块内存区
这时,进程A执行完了,回收内存128K,依次合并:
自学b站博主的,切图学习。不打马萨克图放不上去。如有侵权,联系删除
二:非连续内存分配
非连续分配:零散的内存空间,类似于链表
优点:容易划分空间
1.页式管理
虚地址和实地址
页,页框
内存分配规则:以页为单位进行分配,逻辑上相邻的页和物理上不一定相邻。
逻辑地址:虚地址,比如页里面页号
物理地址:实地址,内存中单元的实际地址,可直接寻址。比如页框号
左边是虚地址,右边是实际地址
左边虚地址相邻,右边实地址不相邻
页:页内的地址空间是连续的,连续相同大小的内存框
分配
左边虚地址相邻,右边实地址不相邻
页,页框,页表的关系
框号的页内地址与页号的页内地址相同
页:每一个页长相同
页表:页号和页框号的映射关系,逻辑地址和物理地址的映射关系,因为每一个页长相同,所以没有页长
页表是保存在内存中的,是进程的一部分,每个进程都有一个页表
进程在执行,则页表起始地址保存在页表基址寄存器(基地址就是起始地址)
进程没有执行,则页表起始地址保存在进程控制块中
虚地址找到实地址必须通过页表找
内部碎片
分配
2.段式管理
段式设计思想
进程地址空间按某种逻辑关系划分为若干个段,每个段都有自己的名字
比如主程序段main,子程序段ADD,子程序段sum
段式内存分配
以段为单位分配,每段一片连续的内存空间,段之间可以不连续
段表
段长:因为每个页长相同,所以没有页长。反之,段长不同,所以要记录段长。防止越界
基地址:物理地址的起始地址
外部碎片
注意:页式产生的是内部碎片,段式产生的是外部碎片
3.段式与页式对比
可重入代码:多个进程允许同时访问公共区域代码。
页式多进程访问公共资源
特点:多了一张很大的页表
页表要比段表大的多
段式多进程访问公共资源
特点:多了一张段表
段表要比页表小的多
段式与页式对比
1):
页是物理单位,分页的目的是实现离散分配,减少外部碎片,提高内存利用率。分页仅仅是由于系统管理的需要而不是用户的需要。
段是信息的逻辑单位,每段都有一组其意义相对完整的信息。分段的目的是为了更好的满足用户的需要
2):
页大小固定且由系统决定,由系统把逻辑地址划分为页号和页内地址两部分,由硬件实现,在洗头中只有一种大小的页面
段长不固定,取决于用户编写的程序,通常由编译程序在对源程序编译时,由信息的性质划分。
3):
分页的地址空间对程序员是一维的
分段地址空间对程序员是二维的,程序员在标识一个地址时,即需给出段名,又需给出段内地址
4.段页式存储管理
4.1为什么设计段页式
为了综合段式和页式的优点,克服两者的缺点
4.2设计思想
先按照逻辑关系划分为段,然后再在段内分页划分。
内存划分的时候与页式一致,分配的时候以页为单位。
4.3虚地址转实地址过程
三:虚拟内存管理
一个进程需要的内存空间大于内存的总容量,不管连续分配还是非连续分配都不满足,容量不够。
虚拟内存管理:从硬盘划分内存
优点:即便进程大于内存总容量,也可以运行
功能:可以在较小的内存中运行要求较大的进程
实现方法:让不会同时执行的程序模块共享一片储存区
3.1覆盖技术原理-一个进程在较小的空间运行
覆盖技术原理:让不会同时执行的程序共享内存,不会同时执行就是没有调用关系
比如下图:
B-C:无调用关系,可以共享内存
D-E:无调用关系,可以共享内存
总大小:115K
实际大小:85K
优点:小空间运行大内存
缺点:增减编程难度,增加执行时间
3.2交换技术原理-多个进程在较小的空间运行
功能:可以增加正在执行,或者需要执行的进程的内存
实现方法:将暂时不执行的进程换出内存,将即将执行的进程换入内存。那么即将执行的进程,或者正在执行的进程内存就变大了
提示:换入换出的单位时整个进程
交换的时机(换出其他未执行的进程):
1.正在执行的进程发现内存不足
2.即将进入内存执行的进程发现内存不足
换出:
当某进程运行中需要更多的内存空间,但又无足够的内存空间时,则系统将某进程换出。一般选择处于阻塞状态且优先级最低的进程换出。
换入:
系统定时查看所有进程的状态,从中找出“就绪态”状态且已换出的进程,将其中换出时间最久的进程换入
3.3覆盖技术与交换技术的比较
覆盖:
1.发送在同一个进程内的不同时执行的模块,无调用关系的模块
2.解决一个进程的空间需求无法满足的问题
交换:
1.以进程为单位
2.解决多个进程的空间需求无法满足的问题
3.4局部性原理
时间局部性
一条指令的第一次执行和下一次执行,一个数据的第一次访问和下一次访问都集中在一个较短的时期内。
通俗讲:一条指令循环的执行,间隔时间短
空间局部性
当前执行的指令和临近执行的几条指令,当前访问的数据和临近访问的几个数据都集中在一个较小的区域内。
通俗讲:需要执行第一条指令和第二条指令在空间上很近
分支局部性
一条条转指令的两次执行,很可能跳到相同的位置
通俗讲:比如if语句,多次执行,条件满足则条转到相同位置
3.5虚拟存储技术
3.5.1原理
1):装载程序的时候,仅将当前需要执行的页面或者段装入内存。
2):执行过程中所需要的程序或者数据不在内存,则将相应的页或者段调入内存。
3):将暂时不用的页或者段保存到外存中。
实现方式:
虚拟页式存储方式和虚拟段式存储方式
3.5.2虚拟页式存储管理页表机制
3.5.3虚拟页式存储管理页表地址转换
3.5.4缺页中断
缺页中断:每当要访问的页不在内存时,便产生缺页中断,请求系统将缺页调入内存
缺页中断特点:
1):在指令执行期间产生和处理中断信号,而非通常的在指令执行完之后检测处理中断
2):一条指令在执行期间,可能产生多次缺页中断
3.6置换算法
3.6.1最佳置换算法
选择换出的页,将是以后永不使用的或者最长时间内不再被访问的页。因无法预知哪个页下次调用时间,所以这是一种理想的算法
最佳置换算法:9次缺页处理
3.6.2先进先出置换算法(FIFO)队列类算法
总是将最先进入内存的页换出,或者选择在内存中驻留时间最久的页换出
3.6.3最近最久未使用置换算法(LRU)堆栈类算法
选择最近最久未使用的页换出,是一种用“最近的过去”作为“最近的将来”的估计的方法
具体方法:
用访问字段A来记录一个页自上次被访问以来经历的时间,当置换一个页时,选择经历时间t值最大的,即最近最久未使用的页换出。
3.6.4Clock置换算法
访问页面时,在页表项中记录下访问情况,缺页时,从上次查找结束的位置顺序查找未被访问的页面换出。
具体方法:页表中增加访问位,用来描述过去一段时间的访问情况,各个页面组织成循环链表,用一个指针指向最先调入的页。指针扫描循环链表,找到第一个未被访问的页换出。
3.7页框分配策略
3.7.1固定分配局部置换
为每个进程分配固定数目的页框(物理块),假设n个,如果发生缺页,则只能从这n个中选出一个换出
缺点:这种方法难以确定n的大小。n太小,则缺页频繁,系统吞吐量太低;n太大,则内存中能够驻留的进程数量少,系统并行率低。
3.7.2可变分配全局置换
系统保持一个空闲页框队列,为进程分配内存时首先给进程分配一定量的页框,当发生缺页时,吸引从空闲页框队列取出一个页框给进程,并将缺页装入。
特点:当空闲框队中的页框用完时,系统才能从内存中选择一页调出,该页可能是系统中任意进程的页,因此叫全局置换
3.7.3可变分配局部置换
首先为每个进程分配一定数目的页框,发送缺页时,只允许从该进程在内存的页中换出一页。
特点:若雀跃频繁,系统会适当的增加进程的页框数。若缺页率很低,则系统会适当减少进程的页框数目。
3.8抖动和工作集
3.8.1抖动
如果多道程度过高,导致过于频繁的页换入与换出,使得调度页的耗时比进程时机运行的时间还多,系统效率急剧下降的现象称为抖动。
产生的原因:内存中并行的进程过多,每个进程分到的页框数过少,缺页过于频繁,页换入换出耗时过大,导致cpu利用率过低,调度程序误以为cpu利用率低的原因是并行度不够高,就会增加多道程序的度,使得新进程进一步装入内存,反而导致cpu利用率下降。
解决方法:
1.增大内存空间,让程序分配到更多的页框,减少频繁换入换出
2.减少多道程序的度数(减少并行),让程序分配到更多的页框,减少频繁换入换出
3.8.2工作集
在当前一段时间内使用的页的集合。
驻留集:给进程分配的所有页框的集合
3.9案例题
1.
C
2.
C
3.
B
4.
B
5.
C
6.
B
7.
C
8.
A
9.
B
10.
B
11.
C
12.
A
13.
最近最久未使用置换算法(LRU)堆栈类算法
A
14.
C
15.
A
16.
D
17.
A