操作系统 空间的协调-主存储器

一、内存的分配

1.1程序内的分配

分段:程序在执行时的虚拟地址布局时分段的。

 xt/.rodata/.rwdata/.zidata    存放各个大小固定的段,分配是已知的。

.stack    分配也是已知的,而且这个段一般比较小,MB量级。

.heap    最大的段。程序中所有的内存分配请求都在这一段进行。

应用程序的内部:

指令流的分工    多个指令流可以分工合作,完成程序的功能。

按性质分工    不同的指令流处理不同性质的工作,如一些指令流主要负责I/O,另一些指令流主要负责计算等等。

按对象分工    不同的指令流处理不同部分的工作,如每功能个指令流负责处理一 部分数据或一个服务对象。

动态内存分配

功能性质的不确定性    很多应用程序有很多功能,但用户这次要用哪个功能它不知道。因此,它必须等待用户的决定才能加载那个功能对应的数据。当然,也可以在应用程序启动时加载一 切,但那些用不到的功能就造成空间浪费。

工作阶段的不确定性    哪怕对于同一个功能,在不同的工作阶段,它需要的内存的数量也是不同的。当然,也可以直接按照最大用量阶段的内存用量进行分配,但此时就会造成空间浪费。 服务对象的不确定性    即便在同一个工作阶段,如果该阶段针对的对象的大小不同,为了容纳这些对象,使用的内存的数量也会不同。当然,也可以直接按照最大的对象来分配内存,但对于较小的对象而言这将造成空间浪费。

动静态对比        相对于静态内存分配,动态内存分配最大的特点就是其动态性。动态性是为了在不确定情况下节约内存而引入的。如果一台计算机的内存是无限大的,或者工作性质、工作阶段、服务对象是完全确定的,不需要动态内存分配。

动态内存分配请求的生命周期:

程序内的分配策略:

固定分区法:

固定块法:我们可以把堆空间划分成多个大小相等的内存块。每次动态分配内存的时候,我们都分配固定的一块空间。这相当于把malloc的参数给丢掉了,不管它传递进来什么都分配一个可能的最大请求。

碎片:出于某些原因,无法有效利用而被浪费掉的资源。在这里是出于内存分配策略被浪费掉的内存空间。

内部碎片:实际上已经指派给某个分配,但是逻辑上无法被这个分配利用的资源。这通常是由于分配粒度导致的;如果实际分配的粒度和分配请求的粒度不一致,每次分配的资源数目要向上取整到分配请求的粒度,造成浪费。这些因为取整而额外多出来的内存就是内部内存碎片。如果分配的粒度与请求的粒度是一致的,不存在内部碎片。

改进        单固定块简单,但是内部碎片实在是太多了。较小的内存分配实际上可以用较小的内存块。如果能维持多个不同大小的内存块,就有望改善这个问题。

多固定块法    在单固定块的基础上修改一下,维持多个内存块池。每次动态分配的时候,从最接近的能满足大小的内存池中分配一整块。

例子回顾    重新考虑1MB和100MB分配的例子。假设维持两个内存块池,各包含1MB和100MB的块,且池内所含的内存一样多。这种情况下,

(1)两个内存块池各包含多少内存块?(2)若每次分配都是1MB,完成最大次数的分配后,浪费的资源是多少?

 

 

 不会产生内部碎片,但是外部碎片仍然无法避免。因为分配出去的每一小块一定会利用,但是可能会因为每一小块太小而无法进行分配,所以仍然可能会有外部碎片。

 

 

 

 

1.2程序间的分配

 

二、进程与内存隔离

2.1虚拟地址

回顾 略

2.2进程的描述

 

 

 

 

 

2.3内存隔离机制

 

 

 

 

 

三、内存的活用

3.1请求分页

 

3.2替换算法

 

 

 

 

 

 

 

 

 

3.3内存映射

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值