网站首页 > 技术文章 正文
三、存储管理
存储器管理的对象是主存储器(主存、内存)。存储器是计算机系统中的关键性资源,是存放各种信息的主要场所。如何对存储器实施有效的管理,不仅直接影响到存储器的利用率,而且还对系统性能有重大的影响。
存储管理的主要功能包括分配和回收主存空间、提高主存的利用率、扩充主存、对主存信息实现有效保护。
1、基本概念
1.1、存储器的结构
存储器的功能是保存数据,存储器的发展方向是高速度、大容量和小体积。
一般存储器的结构有“寄存器-主存-外存”结构和“寄存器-缓存-主存-外存”结构。存储组织的功能是在存储技术和CPU寻址技术许可的范围内组织合理的存储结构,使得各层次得存储器都处于均衡的繁忙状态。
(1)虚拟地址:对程序员来说,数据的存放地址是由符号决定的,故称为符号名地址,或者名地址。它是从0号单元开始编址,并顺序分配所有的符号名所对应的地址单元。由于符号名地址不是主存中的真实地址,因此也称为相对地址、程序地址、逻辑地址或称虚拟地址。
(2)地址空间:程序中由符号名组成的空间称为地址空间。源程序经过汇编或编译后形成二进制的目标程序。在目标程序中,程序指令和数据的位置按照字或字节单位根据它们的相对顺序来确定,称为相对地址。相对地址一般从0号地址开始依次编号。相对地址也称为逻辑地址或虚地址,把程序中由相对组成的空间叫做逻辑地址空间。相对地址空间通过地址再经过定位机构转换到绝对地址空间,绝对地址空间也叫做物理地址空间。
1.2、地址重定位
将逻辑地址转换成主存物理地址的过程称为地址重定位。
在可执行文件装入时,需要解决可执行文件中地址(指令和数据)与主存地址的对应关系,由操作系统中的装入程序和地址重定位机构来完成。地址重定位分为静态地址重定位和动态地址重定位。
- ① 静态地址重定位:静态地址重定位是指在程序装入主存时已经完成了逻辑地址到物理地址的变换,在程序执行期间不会再发生变化。静态地址重定位的优点是无须硬件地址变换机构的支持,它只要求程序本身是可重定位的,只对那些要修改的地址部分具有某种标识,由专门设计的程序来完成。在早期的操作系统中,多数都采用这种方法。
- 静态重定位的缺点是必须给作业分配一个连续的存储区域,在作业的执行期间不能扩充存储空间,也不能在主存中移动,多个作业难以共享主存中的同一程序副本和数据。
- ② 动态地址重定位:动态地址重定位是指在程序运行期间完成逻辑地址到物理地址的变换。其实现机制要依赖硬件地址变换机构,如基地址寄存器(BR)。动态地址重定位的优点是在程序执行期间可以换入和换出主存;程序可以在主存中移动,把主存中的碎片集中起来,可以充分利用空间;不必给程序分配连续的主存空间,可以较好地利用较小地主存块,可以实现共享。
2、存储管理方案
存储管理地主要目的是解决多个用户使用主存地问题,主要包括分区存储管理、分页存储管理、分段存储管理、段页式存储管理以及虚拟存储管理。
2.1、分区存储管理
分区存储管理是早期地存储管理方案,其基本思想是把主存的用户区划分成若干个区域,每个区域分配给一个用户作业使用,并限定它们只能在自己的区域中运行,这种主存分配方案就是分区存储管理方式。按分区的划分方式不同,可分为固定分区、可变分区和可重定向分区。
(1)固定分区:固定分区是一种静态分区方式,在系统生成时已将主存划分为若干个分区,每个分区的大小可以不相等。操作系统通过主存分配情况表管理主存。这种方法的突出问题是已分配区中存在未用空间,原因是程序或作业的大小不可能刚好等于分区的大小,故造成了空间的浪费。通常将已分配分区内未使用空间叫做零头或内碎片。
(2)可变分区:可变分区是一种动态分区方式,存储空间的划分是在作业装入时进行的,故分区的个数可变,分区的大小刚好等于作业的大小。可变分区分配需要两种管理表格:已分配表,记录已分配分区的情况;未分配表,记录未分配区的情况。请求和释放分区的主要由如下4种算法:
①最佳适应算法:假设系统中有n个空白区(空闲区或自由区),每当用户申请一个空间时,将从这n个空白区中找到一个最接近用户需求的分区。这种算法能保留较大的空白区,但缺点是查找合适空白区的代价大,且空白区不可能刚好等于用户要求的区,所以必然要将一个分区一分为二,随着系统不断地分配和释放空间,可能会产生无法再继续分配的小分区(碎片)。
②最差适应算法:系统总是将用户作业装入最大的空白分区。这种算法将一个最大的分区一分为二,所以剩下的空白区通常也大,不容易产生碎片。
③首次适应算法:每当用户作业申请一个空间时,系统总是从主存的低地址开始选择一个能装入作业的空白区。当用户释放空间时,此算法更容易实现相邻的空白区合并。
④循环首次适应算法:与首次适应算法的不同之处是,每次分配都是从刚分配的空白区开始寻找一个能满足用户要求的空白区。
引入可变分区后虽然主存分配更灵活也提高了主存利用率,但是由于系统在不断地分配和回收中,必定会出现一些不连续的小的空闲区,尽管这些小的空闲区的总和超过某一个作业要求的空间,但是由于不连续而无法分配。产生了未分配区的无用空间,通常称之为碎片。解决碎片的方法是拼接(或称紧凑),即向一个方向(例如向低地址端)移动已分配的作业,使那些零散的小空闲区连成一片。
(3)可重定位分区:可重定位分区时解决碎片问题简单而又行之有效的方法。其基本思想是:移动所有已分配好的分区,使之成为连续区域。如同队列有一个队员出列,指挥员叫大家“靠拢”一样。分区“靠拢”的时机是用户请求空间得不到满足时或某个作业执行完毕时。由于靠拢是需要代价的,所以通常是在用户请求空间得不到满足时进行。需要注意的是,当进行分区“靠拢”时会导致地址发生变化,所以有地址重定位问题。
分区保护的目的是防止未经核准的用户访问分区,常用如下两种方式:
(1)上界/下界寄存器保护:上界寄存器中存放的是作业的装入地址,下界寄存器装入的是作业的结束地址,形成的物理地址必须满足如下条件:
上界寄存器≦物理地址≦下界寄存器
(2)基址/限长寄存器保护:基址寄存器中存放的是作业的装入地址,限长寄存器装入的是作业的长度,形成的物理地址必须满足如下条件:
基址寄存器≦物理地址<基址寄存器+限长寄存器
2.2、分页存储管理
尽管分区管理方案是解决多道程序共享主存的可行方案,但是此方案的主要问题是用户程序必须装入连续的地址空间中,若没有满足用户要求的连续空间时,则需要进行分区靠拢操作,这就要耗费系统时间。为此引入了分页存储管理方案。
(1)分页管理
将一个进程的地址空间划分成为若干个大小相等的区域,称为页。相应的,将主存空间划分成与页相同大小的若干个物理块,称为块或页框。为进程分配主存时,可将进程中若干页分别装入多个不相邻接的块中。
(2)地址结构
分页系统的地址结构由两部分组成:前一部分为页号P;后一部分为偏移量W,即页内地址。下图中的地址长度为32位,其中0~11位为页内地址(每页大小为4KB),12~31位为页号,所以允许的地址空间大小最多为1MB个页。
(3)页表
将进程的每一页离散地分配到内存地多个物理块中后,系统应保证能在内存中找到每个页面所对应的物理块。为此,系统为每个进程建立了一张页面映射表,简称页表。如图所示,每个页在页表中占一个表项,记录程序中的某页在内存中对应的物理块号。进程在执行时,系统通过查找页表,就可以找到每页所对应的物理块号,实现页号到物理块号的地址映射。
(4)地址变换机构
地址变换机构的基本任务是利用页表把用户程序中的逻辑地址变换成内存中的物理地址,即将用户程序中的页号变换成内存中的物理块号。页表寄存器用来存放页表的起始地址和页表的长度。在进程未执行时,每个进程对应的页表的起始地址的长度存放在进程的PCB中,当此进程被调度时,就将它们装入页表寄存器。进行地址变换时,系统将页号与页表长度进行比较,如果页号大于等于页表寄存器中的页表长度L(页号从0开始),则产生越界中断。如未出现越界,则根据页表寄存器中的页表的起始地址的页号计算出此页在表项中的位置,得到此页的物理块号,将此物理块号装入物理地址寄存器中。于此同时,将有效地址(逻辑地址)寄存器中页内地址直接装入物理地址寄存器的块内地址字段中,完成从逻辑地址到物理地址的变换。
优点:内存利用率高,碎片小,分配及管理简单。
缺点:增加了系统开销,可能产生抖动现象。
(5)快表
页式存储管理至少需要两次访问内存,第一次时访问页表,得到数据的物理地址;第二次是存取数据。
做法:在地址映射机构中增加一个小容量的联想存储器,联想存储器由一组高速存储器组成,称为快表。
2.3、分段存储管理
段是信息的逻辑单位,因此分段系统的一个突出优点是易于实现段的共享,即允许若干个进程共享一个或多个段,可简单地实现段的保护。
在实现程序和数据的共享时,常常以信息的逻辑单位为基础。分页系统中的每一页只是存放信息的物理单位,其本身没有完整的意义,因而不便于实现信息共享,而段却是信息的逻辑单位,有利于信息的共享和保护。
在实际系统中,有些数据会不断地增长,而事先却无法知道数据段会增长到多大,分段存储管理方式可以较好地解决这个问题。
分段的基本管理方式中,作业的地址空间被划分为若干段,每段是一组完整的逻辑信息,如主程序段、子程序段、数据段及堆栈段等,每段都有自己的名字,都是从零开始编址的一段连续的地址空间,各段长度不等。分段系统的地址结构如图所示,逻辑地址由段号(名)和段内地址两部分组成。在此地址结构中,允许一个作业最多有216段,每段的最大长度为64KB。
在分段式存储管理系统中,为每一段分配一个连续的分区,进程中的各段可以离散地分配到内存地不同分区。
在系统中为每个进程建立一张段映射表,简称为“段表”。每段在表中占有一表项,其中记录了此段在内存中地起始地址(又称为“基址”)和段的长度,如下图所示。
利用段表寄存器中的段表长度与逻辑地址中的段号比较,若段号超过段表长度则产生越界中断。进程在执行中,通过查找到每个段所对应的内存区,实现逻辑段到物理内存区的映射。
2.4、段页式存储管理
先分段在分页,段式存储和页式存储的结合。
优点:空间浪费小、存储共享容易、能动态连接。
缺点:由于管理软件的增加,复杂性和开销也随之增加,需要的硬件以及占用的内容也有所增加,使得执行速度大大下降。
2.5、虚拟存储管理
前面介绍的存储管理方案中,必须为每个作业分配足够的空间,以便装入全部信息。当主存空间不能满足作业要求时,作业便无法装入主存执行。
如果一个作业的部分内容装入主存便可开始启动运行,其余部分暂时留在磁盘上,需要时再装入主存。这样,可以有效地利用主存空间。从用户角度看,此系统所具有的主存容量将比实际主存容量大得多,人们把这样的存储器称为虚拟存储器。虚拟存储器是为了扩大主存容量而采用的一种设计方法,其容量是由计算机的地址结构决定的。
2.5.1、程序局部性原理
程序在执行时将呈现出局部性规律,即在一段时间内,程序的执行仅局限于某个部分。相应地,它所访问的存储空间也局限于某个区域内。程序的局限性表现在时间局限性和空间局限性两个方面。
(1)时间局限性:如果程序中的某条指令一旦执行,则不久的将来此指令可能再次被执行;如果某个存储单元被访问,则不久以后此存储单元可能再次被访问。产生时间局限性的典型原因是程序中存在着大量的循环操作。
(2)空间局限性:一旦程序访问了某个存储单元,则在不久的将来,其附近的存储单元也最有可能被访问,即程序在一段时间内所访问的地址,可能集中在一定的范围内,其典型原因在于程序是顺序执行的。
2.5.2、虚拟存储器的实现
虚拟存储器具有请求调入功能和置换功能,可以把作业的一部分装入主存使其开始运行,能从逻辑上对主存容量进行扩充。虚拟存储器的逻辑容量由主存和主存和外存容量之和以及CPU可寻址的范围来决定,其运行速度接近于主存速度,成本接近于外存。虚拟存储器实现主要有以下三种方式。
(1)请求分页系统:在分页系统的基础上,增加了请求调页功能和页面置换功能所形成的页式虚拟存储系统。它允许只装入若干页的用户程序和数据(而非全部程序),就可以启动运行,以后再通过调页功能的页面置换功能,陆续把将要使用的页面调入主存,同时把暂不运行的页面置换到外存上,置换时以页面为单位。
(2)请求分段系统:在分段系统的基础上,增加了请求调段和分段置换功能所形成的段式虚拟存储系统。它允许只装入若干段(而非全部段)的用户程序和数据,就可以启动运行,以后再通过调段功能和置换功能将不运行的段调出,同时调入将要运行的段,置换是以段为单位。
(3)请求段页式系统:在段页式系统的基础上,增加了请求调页和页面置换功能所形成的段页式虚拟存储系统。
2.5.3、请求分页管理的实现
请求分页是在纯分页系统的基础上,增加了请求调页功能、页面置换功能所形成的页式虚拟存储系统,是目前常用的一种虚拟存储器的方式。
请求分页的页表机制是在纯分页的页表机制上形成的,由于只将应用程序的一部分调入主存,还有一部分仍在外存上,故需在页表中再增加若干项,如状态位、访问字段、辅存地址等供程序(数据)在换进、换出时参考。
在请求分页系统中,每当所要访问的页面不在主存时,便产生一个缺页中断,请求调入所缺的页。缺页中断与一般中断的主要区别在于:缺页中断在指令执行期间产生和处理中断信号,而一般中断指令在一条指令执行结束后,下一条指令开始执行前检查和处理中断信号;缺页中断返回到被中断指令的开始重新执行此指令,而一般中断返回到下一条指令执行;一条指令在执行期间,可能会产生多次缺页中断。
2.5.4、页面置换算法
在进程运行过程中,如果发生缺页而内存中又无空闲块时,为了保证进程能正常运行,就必须从内存中调出一页程序或数据送入磁盘的对换区。但究竟将哪个页面调出,需要根据一定的页面置换算法来确定。置换算法的好坏将直接影响系统的性能,不适当的算法可能会导致刚被换出的页很快又被访问,需重新调入,使得系统频繁地更换页面,以致一个进程在运行中把大部分时间花费在页面置换工作上,称此进程发生“抖动”(Thrashing,也称颠簸)。请求分页系统的核心问题是选择合适的页面置换算法。
常用的页面置换算法有:最佳置换算法、先进先出置换算法、最近最少使用置换算法、最近未用置换算法等。
(1)最佳(Optimal)置换算法
此算法选择那些永不使用的,或者是在最长时间内不再被访问的页面置换出去。但是要确定哪一个页面是未来最长时间内不再被访问的,很难估计。
(2)先进先出(FIFO)置换算法
此算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰。此算法实现简单只需把一个进程中已调入内存的页面按先后次序链接成一个队列即可。此算法简单直观,但性能差,会发生Belady异常现象。所谓的Belady现象,是指如果对一个进程未分配它所要求的全部页面,有时就会出现分配的页面数增多但缺页率反而提高的异常现象。
(3)最近最少未使用(Least Recently Used,LRU)置换算法
此算法是选择最近最少未使用的页面予以淘汰,系统在每个页面设置一个访问字段,用以记录这个页面自上次被访问以来所经历的时间为T,当要淘汰一个页面时,选择T最大的页面.
(4)最近未用置换算法
往前看,只看每个页面的第一次。
猜你喜欢
- 2024-10-20 操作系统概论:第四章 内存管理 操作系统内存管理笔记
- 2024-10-20 推荐一款nginx+redis+ehcache高并发与高可用缓存架构
- 2024-10-20 真正的缓存之王,Google Guava 只是弟弟
- 2024-10-20 操作系统-存储管理与文件管理-笔记
- 2024-10-20 图解Linux进程优先级 linux 进程优先级 线程优先级
- 2024-10-20 高性能缓存 Caffeine(一) 高效缓存cache的作用
- 2024-10-20 一文读懂进程调度算法 进程调度常用算法及其思想
- 2024-10-20 缓存最关心指标有哪些,这篇文章告诉你?
- 2024-10-20 缓存算法:LRU、LFU、随机替换等常见算法简介
- 2024-10-20 Caffine Cache 在 SpringBoot 中的使用
你 发表评论:
欢迎- 最近发表
-
- 在 Spring Boot 项目中使用 activiti
- 开箱即用-activiti流程引擎(active 流程引擎)
- 在springBoot项目中整合使用activiti
- activiti中的网关是干什么的?(activiti包含网关)
- SpringBoot集成工作流Activiti(完整源码和配套文档)
- Activiti工作流介绍及使用(activiti工作流会签)
- SpringBoot集成工作流Activiti(实际项目演示)
- activiti工作流引擎(activiti工作流引擎怎么用)
- 工作流Activiti初体验及在数据库中生成的表
- Activiti工作流浅析(activiti6.0工作流引擎深度解析)
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)