1. 内存为程序分配空间的四种分配方式
存储器是个宝贵但却有限的资源。一流的操作系统,需要能够有效地管理及利用存储器。
内存为程序分配空间有四种分配方式:
1、连续分配方式
2、基本分页存储管理方式
3、基本分段存储管理方式
4、段页式存储管理方式
首先讲连续分配方式。 连续分配方式 出现的时间比较早,曾广泛应用于20世纪60~70年代的OS中,但是它至今仍然在内存管理方式中占有一席之地,原因在于它 实现起来比较方便,所需的硬件支持最少 。连续分配方式又可细分为四种: 单一连续分配、固定分区分配、动态分区分配和动态重定位分区分配 。
其中固定分区的分配方式,因为分区固定,所以缺乏灵活性,即 当程序太小时,会造成内存空间的浪费( 内部碎片 ) ; 程序太大时,一个分区又不足以容纳,致使程序无法运行( 外部碎片 ) 。但尽管如此,当一台计算机去控制多个相同对象的时候,由于这些对象内存大小相同,所以完全可以采用这种内存管理方式,而且是最高效的。这里我们可以看出存储器管理机制的多面性:没有那种存储器管理机制是完全没有用的,在适合的场合下,一种被认为最不合理的分配方案却可能称为最高效的分配方案。 一切都要从实际问题出发,进行设计。
为了解决固定分区分配方式的缺乏灵活性,出现了 动态分配方式 。动态分配方式采用一些 寻表(Eg: 空闲链表 ) 的方式,查找能符合程序需要的空闲内存分区。但代价是增加了系统运行的开销,而且内存空闲表本身是一个文件,必然会占用一部分宝贵的内存资源,而且有些算法还会增加内存碎片。
可重定位分区分配通过对程序实现成定位,从而可以将内存块进行搬移,将小块拼成大块,将小空闲“紧凑”成大空闲,腾出较大的内存以容纳新的程序进程。
连续分配方式 会形成许多“碎片”,虽然可以通过“紧凑”方式将许多碎片拼接成可用的大块空间,但须为之付出很大开销。所以提出了“ 离散分配方式 ”的想法。如果 离散分配的基本单位是页 ,则称为 分页管理方式 ;如果离散分配的基本单位是段,则称为 分段管理方式 。
分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号,从0开始,如第0页、第1页等。相应地,也把内存空间分成与页面相同大小的若干个存储块,称为(物理)块或页框(frame),也同样为它们加以编号,如0#块、1#块等等。在为进程分配内存时,以块为单位将进程中的若干个页分别装入到多个可以不相邻接的物理块中。由于进程的最后一页经常装不满一块而形成了不可利用的碎片,称之为“ 页内碎片 ”。
在分页系统中,允许将进程的各个页离散地存储在内存不同的物理块中(所以能实现离散分配方式) ,但系统应能保证进程的正确运行,即能在内存中找到每个页面所对应的物理块。为此,系统又为每个进程建立了一张页面映像表,简称 页表 。在进程地址空间内的所有页,依次在页表中有一页表项,其中记录了相应页在内存中对应的物理块号。在配置了页表后,进程执行时,通过查找该表,即可找到每页在内存中的物理块号。可见, 页表的作用是实现从页号到物理块号的地址映射 。
为了能够将用户地址空间中的 逻辑地址,变换为内存空间中的物理地址 ,在系统中必须设置 地址变换机构 。地址变换任务是借助于页表来完成的。
页表 的功能可由一组专门的寄存器来实现。由于寄存器成本较高,且大多数现代计算机的页表又很大,使页表项总数可达几千甚至几十万个,显然这些页表项不可能都用寄存器来实现,因此,页表大多驻留在内存中。因为一个进程可以通过它的PCB来时时保存自己的状态,等到CPU要处理它的时候才将PCB交给寄存器,所以,系统中虽然可以运行多个进程,但也只需要一个页表寄存器就可以了。
由于 页表是存放在内存中 的,这使得 CPU在每存取一个数据时,都要两次访问内存 。为了提高地址变换速度,在地址变化机构中增设了一个 具有并行查询能力的高速缓冲寄存器 ,又称为“联想寄存器”(Associative Lookaside Buffer)。
在单级页表的基础上,为了适应非常大的逻辑空间,出现了两级和多级页表,但是,他们的原理和单级页表是一样的,只不过为了适应地址变换层次的增加,需要在地址变换机构中增设外层的页表寄存器。
分段存储管理方式 的目的,主要是为了满足用户(程序员)在编程和使用上多方面的要求,其中有些要求是其他几种存储管理方式所难以满足的。因此,这种存储管理方式已成为当今所有存储管理方式的基础。
分段管理方式和分页管理方式在实现思路上是很相似的,只不过他们的基本单位不同。分段有 段表 ,也有 地址变换机构 ,为了提高检索速度,同样增设 联想寄存器(具有并行查询能力的高速缓冲寄存器) 。所以有些具体细节在这个不再赘述。
分页和分段的主要区别:
1、两者相似之处:两者 都采用离散分配方式,且都要通过地址映射机构来实现地址变换 。
2、两者的不同之处:
(1)页是信息的 物理单位 ,分页是为实现离散分配方式,以消减内存的外零头,提高内存的利用率。或者说,分页仅仅是由于 系统管理的需要 而不是用户的需要。段则是信息的 逻辑单位 ,它含有一组其意义相对完整的信息。 分段的目的是为了能更好地满足用户的需要 。
(2) 页的大小固定 且由系统决定,而 段的长度却不固定 。
(3)分页的作业地址空间是 一维 的,即单一的线性地址空间;而分段的作业地址空间则是 二维 的。
前面所介绍的分页和分段存储管理方式都各有优缺点。 分页系统能有效地 提高内存利用率 ,而分段系统则能很好地 满足用户需求 。 我们希望能够把两者的优点结合,于是出现了段页式存储管理方式。
段页式系统的基本原理,是分段和分页原理的结合,即 先将用户程序分成若干个段,再把每个段分成若干个页 ,并为每一个段赋予一个段名。在段页式系统中,地址结构由段号、段内页号和页内地址三部分组成。
和前两种存储管理方式相同,段页式存储管理方式同样需要增设联想寄存器。
离散分配方式 基于将一个进程直接分散地分配到许多不相邻的分区中的思想,分为分页式存储管理,分段式存储管理和段页式存储管理. 分页式存储管理旨在提高内存利用率,满足系统管理的需要,分段式存储管理则旨在满足用户(程序员)的需要,在实现共享和保护方面优于分页式存储管理,而段页式存储管理则是将两者结合起来,取长补短,即具有分段系统便于实现,可共享,易于保护,可动态链接等优点,又能像分页系统那样很好的解决外部碎片的问题,以及为各个分段可离散分配内存等问题,显然是一种比较有效的存储管理方式。
更多Linux内核视频教程文档资料免费领取【 内核 】自行获取。
内核学习网站:
Linux内核源码/内存调优/文件系统/进程管理/设备驱动/网络协议栈-学习视频教程-腾讯课堂
2. os的内存管理机制分析
相辅相成的!缺一不可!
3. 采用什么存储管理方式不会产生内部碎片
在分段存储管理方式中,作业的地址空间被划分为若干个段,每禅衡枝个段定义了一组逻辑信息。分段系统的一个突出优点,是易于实现段的共享,即允许若干个进程共享一个或多个分段,且对段的保护也十分简单易行。
内部碎片就是为每个进程分布的内存空间之中所没有被使用到的内存碎片。通常出现在分页式存储管理之中。分段式存储管理不会产生内部碎片归根结底是由分段本身的定义出发的。如果说分页式是系统对内存的分割,那么分段式就是用户对程序数据的分割。将一个程序分段是有逻辑意义的独立单位的,故不会产生内部碎片。
引入分段拦姿式存储管理本就在一定程度上贺敏解决了内部碎片,并且满足了用户的需求。但是分段式存储管理也有不足之处,内存利用率变低了。
4. 分段存储管理需提供二维地址
一. 分页存储管理
1.基本思想
用户程序的地址空间被划分成若干固定大小的区域,称为“页”,相应地,内存空间分成若干个物理块,页和块的大小相等。可将用户程序的任一页放在内存的任一块中,实现了离散分配。
2. 分页存储管理的地址机构
15 12 11 0
页号P 页内位移量W
页号4位,每个作业最多2的4次方=16页,表示页号从0000~1111(24-1),页内位移量的位数表示页的大小,若页内位移量12位,则2的12次方=4k,页的大小为4k,页内地址从000000000000~111111111111
若给定一个逻辑地址为A,页面大小为L,则
页号P=INT[A/L],页内地址W=A MOD L
3. 页表
分页系统中,允许将进程的每一页离散地存储在内存的任一物理块中,为了能在内存中找到每个页面对应的物理块,系统为每个进程建立一张页面映射表,简称页表。页表的作用是实现从页号到物理块号的地址映射。
页表:
页号 物理块号 存取控制
0 2
1 15(F)
2 14(E)
3 1
4. 地址变换
(1) 程序执行时,从PCB中取出页表始址和页表长度(4),装入页表寄存器PTR。
(2) 由分页地址变换机构将逻辑地址自动分成页号和页内地址。
例:11406D=0010|110010001110B=2C8EH
页号为2,位移量为C8EH=3214D
或11406 DIV 4096=2
11406 MOD 4096=3214
(3) 将页号与页表长度进行比较(2<4),若页号大于或等于页表长度,则表示本次访问的地址已超越进程的地址空间,产生越界中断。
(4) 将页表始址与页号和页表项长度的乘积相加,便得到该页表项在页表中的位置。
(5) 取出页描述子得到该页的物理块号。 2 14(E)
(6) 对该页的存取控制进行检查。
(7) 将物理块号送入物理地址寄存器中,再将有效地址寄存器中的页内地址直接送入物理地址寄存器的块内地址字段中,拼接得到实际的物理地址。
例:0010|110010001101B
1110|110010001101B=EC8EH=60558D
或 14*4096+3214=60558D
5. 具有快表的地址变换机构
分页系统中,CPU每次要存取一个数据,都要两次访问内存(访问页表、访问实际物理地址)。为提高地址变换速度,增设一个具有并行查询能力的特殊高速缓冲存储器,称为“联想存储器”或“快表”,存放当前访问的页表项。
二.分段存储管理
1.基本思想
将用户程序地址空间分成若干个大小不等的段,每段可以定义一组相对完整的逻辑信息。存储分配时,以段为单位,段与段在内存中可以不相邻接,也实现了离散分配。
2. 分段存储方式的引入
方便编程
分段共享
分段保护
动态链接
动态增长
3. 分段地址结构
作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。例程序段、数据段等。每个段都从0开始编址,并采用一段连续的地址空间。
段的长度由相应的逻辑信息组的长度决定,因而各段长度不等。整个作业的地址空间是二维的。
15 12 11 0
段号 段内位移量
段号4位,每个作业最多24=16段,表示段号从0000~1111(24-1);段内位移量12位,212=4k,表示每段的段内地址最大为4K(各段长度不同),从000000000000~111111111111
4. 段表
段号 段长 起始地址 存取控制
0 1K 4096
1 4K 17500
2 2K 8192
5. 地址变换
(1). 程序执行时,从PCB中取出段表始址和段表长度(3),装入段表寄存器。
(2). 由分段地址变换机构将逻辑地址自动分成段号和段内地址。
例:7310D=0001|110010001110B=1C8EH
段号为1,位移量为C8EH=3214D
(3). 将段号与段表长度进行比较(1<3),若段号大于或等于段表长度,则表示本次访问的地址已超越进程的地址空间,产生越界中断。
(4). 将段表始址与段号和段表项长度的乘积相加,便得到该段表项在段表中的位置。
(5). 取出段描述子得到该段的起始物理地址。1 4K 17500
(6). 检查段内位移量是否超出该段的段长(3214<4K),若超过,产生越界中断。
(7). 对该段的存取控制进行检查。
(8). 将该段基址和段内地址相加,得到实际的物理地址。
例:0001|110010001101B
起始地址17500D+段内地址3214D=20714D
三.分页与分段的主要区别
分页和分段有许多相似之处,比如两者都不要求作业连续存放.但在概念上两者完全不同,主要表现在以下几个方面:
(1)页是信息的物理单位,分页是为了实现非连续分配,以便解决内存碎片问题,或者说分页是由于系统管理的需要.段是信息的逻辑单位,它含有一组意义相对完整的信息,分段的目的是为了更好地实现共享,满足用户的需要.
(2)页的大小固定,由系统确定,将逻辑地址划分为页号和页内地址是由机器硬件实现的.而段的长度却不固定,决定于用户所编写的程序,通常由编译程序在对源程序进行编译时根据信息的性质来划分.
(3)分页的作业地址空间是一维的.分段的地址空间是二维的.
四.段页式存储管理
1.基本思想:
分页系统能有效地提高内存的利用率,而分段系统能反映程序的逻辑结构,便于段的共享与保护,将分页与分段两种存储方式结合起来,就形成了段页式存储管理方式。
在段页式存储管理系统中,作业的地址空间首先被分成若干个逻辑分段,每段都有自己的段号,然后再将每段分成若干个大小相等的页。对于主存空间也分成大小相等的页,主存的分配以页为单位。
段页式系统中,作业的地址结构包含三部分的内容:段号 页号 页内位移量
程序员按照分段系统的地址结构将地址分为段号与段内位移量,地址变换机构将段内位移量分解为页号和页内位移量。
为实现段页式存储管理,系统应为每个进程设置一个段表,包括每段的段号,该段的页表始址和页表长度。每个段有自己的页表,记录段中的每一页的页号和存放在主存中的物理块号。
2.地址变换的过程:
(1)程序执行时,从PCB中取出段表始址和段表长度,装入段表寄存器。
(2)由地址变换机构将逻辑地址自动分成段号、页号和页内地址。
(3)将段号与段表长度进行比较,若段号大于或等于段表长度,则表示本次访问的地址已超越进程的地址空间,产生越界中断。
(4)将段表始址与段号和段表项长度的乘积相加,便得到该段表项在段表中的位置。
(5)取出段描述子得到该段的页表始址和页表长度。
(6)将页号与页表长度进行比较,若页号大于或等于页表长度,则表示本次访问的地址已超越进程的地址空间,产生越界中断。
(7)将页表始址与页号和页表项长度的乘积相加,便得到该页表项在页表中的位置。
(8)取出页描述子得到该页的物理块号。
(9)对该页的存取控制进行检查。
(10)将物理块号送入物理地址寄存器中,再将有效地址寄存器中的页内地址直接送入物理地址寄存器的块内地址字段中,拼接得到实际的物理地址。
5. 段页式存储管理地址转换需要什么支持
映射速度,硬件需要提供如下 2 个寄存器: 段表始址寄存器;② 段表长度寄存器; (5)地址映射过程 在段页式存储猜族管理 ...
网络知道
总结段氏存储管理的地址转换 - 网络文库
2页发布时间: 2022年08月17日
(4)硬件支持 为加快地址映射速度,硬件需要提供如下野兆铅 2 个寄存器: 段表始址寄存器;② 段表长度寄存器; (5)地址映射过程 在段页式存储管理中,...
网络文库
操作系统——段式存储管理 - Linux加油站的博客 - CSDN博客
1. 基本原理 前面介绍的各种存储管理中,供用户使颂好用的逻辑地址都是连续的,用户在编制大型程序时就会感到不方便。一个实际的程序往往是由若干段组成的,例如
2. 转换和地址保护 为使作业正确执行 ,首先须记下各段位置 ,为此系统设立一个“段表”记录作业每个段在内存中首地址和长度,如图3.22所示。在作业
3. 段页式存储管理 用户作业采用分段结构后,不仅方便了编制程序(各模块可以独 立编程),而且具有逻辑上清晰的优点。段式存储管理支持了用户的分段观点,但它的
CSDN编程社区
3.1.11 OS之段页式存储管理(段表、页表、地址转换、)
1. 分页、分段的优缺点分析
6. 《网络操作系统》下
26.D27.B28.A29.B30.C31.D32.A33.B34.B35.C36.C37.A38.B39.D40.A41.C42.A43.A44.C45.C46.C47.D48.B49.D50.A
不一悄册伏姿改定全对启携
7. 分页和分段存储管理相同点是什么
基本分段存储管理方式和基本分页存储管理方式二者的理论基础都是相对差不多的,二者都是建立在内存分区管理思想和程序局缺逗部性原理的基础之上。
基本分页存储管理方式在存储器管理中,连续分配方式会形成许多“碎片”,虽然可通过“紧凑”方法将许多碎租扮此片拼接成可用的大块空间,但须为之付出很大开销。
在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。例如,有主程序段MAIN、子程序段X、数据段D及栈段S等。
(7)若os采用分段存储管理方式扩展阅读:
基本分段存储管理方式和基本分页存储管弊迅理方式原理的结合就是段页式系统的基本原理,即先将用户程序分成若干个段,再把每个段分成若干个页,并为每一个段赋予一个段名。
在段页式系统中,为了便于实现地址变换,须配置一个段表寄存器,其中存放段表始址和段表长TL。进行地址变换时,首先利用段号S,将它与段表长TL进行比较。
8. 基本分段存储管理方式的分段系统的基本原理
在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。例如,有主程序段MAIN、子程序段X、数据段D及栈段S等,如图4-17所示。每个段都有自己的名字。为了实现简单起见,通常可用一个段号来代替段名,每个段都从0开始编址,并采用一段连续的地址空间。段的长度由相应的逻辑信息组的长度决定,因而各段长度不等。整个作业的地址空间由于是分成多个段,因而是二维的,亦即,其逻辑地址由段号(段名)和段内地址所组成。
分段地址中的地址具有如下结构:
在该地址结构中,允许一个作业最长有 64 K个段,每个段的最大长度为64 KB。分段方式已得到许多编译程序的支持,编译程序能自动地根据源程序的情况而产生若干个段。例如,Pascal编译程序可以为全局变量、用于存储相应参数及返回地址的过程调用栈、每个过程或函数的代码部分、每个过程或函数的局部变量等等,分别建立各自的段。类似地,Fortran编译程序可以为公共块(Common block)建立单独的段,也可以为数组分配一个单独的段。装入程序将装入所有这些段,并为每个段赋予一个段号。 为了实现从进程的逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址和段表长度TL。在进行地址变换时,系统将逻辑地址中的段号与段表长度TL进行比较。若S>TL,表示段号太大,是访问越界,于是产生越界中断信号;若未越界,则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的起始地址,然后,再检查段内地址d是否超过该段的段长SL。若超过,即d>SL,同样发出越界中断信号;若未越界,则将该段的基址d与段内地址相加,即可得到要访问的内存物理地址。
下图示出了分段系统的地址变换过程。
像分页系统一样,当段表放在内存中时,每要访问一个数据,都须访问两次内存,从而极大地降低了计算机的速率。解决的方法也和分页系统类似,再增设一个联想存储器,用于保存最近常用的段表项。由于一般情况是段比页大,因而段表项的数目比页表项的数目少,其所需的联想存储器也相对较小,便可以显着地减少存取数据的时间,比起没有地址变换的常规存储器的存取速度来仅慢约10%~15%。
9. 采用段式存储管理的系统中,若地址用24位表示,其中8位表示段号,则允许每段最大长度是
2^16。
采用段式管理的系统中,其逻辑地址分为段号和页内偏移量。本题的地址一共24位,使用了8位表示段号,那么把剩下的 16 位全部用来表示段内偏移量就能使每段长度最大从而每段允许的最大长度为 2^16。
产生是与程序的燃老模块化直接物段腔有关的,段式管理是通过段表进行的,包括段号或段名、段起点、装入位、段的长度等。此外还需要主存占用区域表、主存可用区域表。
(9)若os采用分段存储管理方式扩展阅读:
为了进行段式管罩衫理,每道程序在系统中都有一个段(映象)表来存放该道程序各段装入主存的状况信息。
段表中的每一项(对应表中的每一行)描述该道程序一个段的基本状况,由若干个字段提供。段名字段用于存放段的名称,段名一般是有其逻辑意义的,也可以转换成用段号指明。
由于段号从0开始顺序编号,正好与段表中的行号对应,如2段必是段表中的第3行,这样,段表中就可不设段号(名)字段。
段表中还可以根据需要设置其它的字段。段表本身也是一个段,一般常驻在主存中,也可以存在辅存中,需要时再调入主存。假设系统在主存中最多可同时有N道程序,可设N个段表基址寄存器。
10. 有一个操作系统采用段式存储管理方案,用户区内存为512K,分配时截取空闲块的前半部分(小地址部分)。初
最先适配:两个空块。10K,位于290~299;112K,位于400~511;
若再申请80K,会在起始为400K的位置再分配80K空间。
最佳适配:两个空块。60K,位于240~299;62K,位于450~511;
若再申请80K,会无法分配。
结果说明,最先适配会在存储器前端产生一些细小的空块,虽然适配时可能会将巨大的空块分割得比较小,然而一些进程释放空间后,会产生较大的可利用空块。而最佳适配虽然名叫最佳适配,实际上由于占有的空间太接近块的大小,会产生很多无法利用的小空块,性能并不好。