操作系统-进程内存分配

说明:该文档是借鉴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

posted @ 2022-03-18 17:40  Jeff的技术栈  阅读(1534)  评论(0编辑  收藏  举报
回顶部