存储器是个宝贵但却有限的资源。一流的操做系统,须要可以有效地管理及利用存储器。程序员
内存为程序分配空间有四种分配方式:算法
一、连续分配方式编程
二、基本分页存储管理方式ide
三、基本分段存储管理方式spa
四、段页式存储管理方式操作系统
首先讲连续分配方式。连续分配方式出现的时间比较早,曾普遍应用于20世纪60~70年代的OS中,可是它至今仍然在内存管理方式中占有一席之地,缘由在于它实现起来比较方便,所需的硬件支持最少。连续分配方式又可细分为四种:单一连续分配、固定分区分配、动态分区分配和动态重定位分区分配。设计
其中固定分区分配方式,由于分区固定,因此缺少灵活性,即当程序过小时,会形成内存空间的浪费(内部碎片);程序太大时,一个分区又不足以容纳,导致程序没法运行(外部碎片)。但尽管如此,当一台计算机去控制多个相同对象的时候,因为这些对象内存大小相同,因此彻底能够采用这种内存管理方式,并且是最高效的。这里咱们能够看出存储器管理机制的多面性:即没有那种存储器管理机制是彻底没有用的,在适合的场合下,一种被认为最不合理的分配方案却可能称为最高效的分配方案。一切都要从实际问题出发,进行设计。对象
为了解决固定分区分配方式的缺少灵活性,出现了动态分配方式。动态分配方式采用一些寻表(Eg:空闲链表)的方式,查找能符合程序须要的空闲内存分区。但代价是增长了系统运行的开销,并且内存空闲表自己是一个文件,必然会占用一部分宝贵的内存资源,并且有些算法还会增长内存碎片。进程
可重定位分区分配经过对程序实现成定位,从而能够将内存块进行搬移,将小块拼成大块,将小空闲“紧凑”成大空闲,腾出较大的内存以容纳新的程序进程。内存
连续分配方式会造成许多“碎片”,虽然能够经过“紧凑”方式将许多碎片拼接成可用的大块空间,但须为之付出很大开销。因此提出了“离散分配方式”的想法。若是离散分配的基本单位是页,则称为分页管理方式;若是离散分配的基本单位是段,则称为分段管理方式。
分页存储管理是将一个进程的逻辑地址空间分红若干个大小相等的片,称为页面或页,并为各页加以编号,从0开始,如第0页、第1页等。相应地,也把内存空间分红与页面相同大小的若干个存储块,称为(物理)块或页框(frame),也一样为它们加以编号,如0#块、1#块等等。在为进程分配内存时,以块为单位将进程中的若干个页分别装入到多个能够不相邻接的物理块中。因为进程的最后一页常常装不满一块而造成了不可利用的碎片,称之为“页内碎片”。
在分页系统中,容许将进程的各个页离散地存储在内存不一样的物理块中(因此能实现离散分配方式),但系统应能保证进程的正确运行,即能在内存中找到每一个页面所对应的物理块。为此,系统又为每一个进程创建了一张页面映像表,简称页表。在进程地址空间内的全部页,依次在页表中有一页表项,其中记录了相应页在内存中对应的物理块号。在配置了页表后,进程执行时,经过查找该表,便可找到每页在内存中的物理块号。可见,页表的做用是实现从页号到物理块号的地址映射。
为了可以将用户地址空间中的逻辑地址,变换为内存空间中的物理地址,在系统中必须设置地址变换机构。地址变换任务是借助于页表来完成的。
页表的功能可由一组专门的寄存器来实现。因为寄存器成本较高,且大多数现代计算机的页表又很大,使页表项总数可达几千甚至几十万个,显然这些页表项不可能都用寄存器来实现,所以,页表大多驻留在内存中。由于一个进程能够经过它的PCB来时时保存本身的状态,等到CPU要处理它的时候才将PCB交给寄存器,因此,系统中虽然能够运行多个进程,但也只须要一个页表寄存器就能够了。
因为页表是存放在内存中的,这使得CPU在每存取一个数据时,都要两次访问内存。为了提升地址变换速度,在地址变化机构中增设了一个具备并行查询能力的告诉缓冲寄存器,又称为“联想寄存器”(Associative Lookaside Buffer)。
在单级页表的基础上,为了适应很是大的逻辑地址空间,出现了两级和多级页表,可是,他们的原理和单级页表是同样的,只不过为了适应地址变换层次的增长,须要在地址变换机构中增设外层的页表寄存器。
分段存储管理方式的目的,主要是为了知足用户(程序员)在编程和使用上多方面的要求,其中有些要求是其余几种存储管理方式所难以知足的。所以,这种存储管理方式已成为当今全部存储管理方式的基础。
(1)方便编程;
(2)信息共享:分页系统中的“页”只是存放信息的物理单位(块),并没有完整的意义,不便于实现共享;然而段倒是信息的逻辑单位。由此可知,为了实现段的共享,但愿存储器管理能与用户程序分段的组织方式相适应。
(3)信息保护;
(4)动态增加;
(5)动态连接。
分段管理方式和分页管理方式在实现思路上是很类似的,只不过他们的基本单位不一样。分段有段表,也有地址变换机构,为了提升检索速度,一样增设联想寄存器(具备并行查询能力的告诉缓冲寄存器)。因此有些具体细节在这个再也不赘述。
分页和分段的主要区别:
一、二者类似之处:二者都采用离散分配方式,且都要经过地址映射机构来实现地址变换。
二、二者不一样之处:
(1)页是信息的物理单位,分页是为实现离散分配方式,以消减内存的外零头,提升内存的利用率。或者说,分页仅仅是因为系统管理的须要而不是用户的须要。段则是信息的逻辑单位,它含有一组其意义相对完整的信息。分段的目的是为了能更好地知足用户的须要。
(2)页的大小固定且由系统决定,而段的长度却不固定。
(3)分页的做业地址空间是一维的,即单一的线性地址空间;而分段的做业地址空间则是二维的。
前面所介绍的分页和分段存储管理方式都各有优缺点。分页系统能有效地提升内存利用率,而分段系统则能很好地知足用户需求。咱们但愿可以把二者的优势结合,因而出现了段页式存储管理方式。
段页式系统的基本原理,是分段和分页原理的结合,即先将用户程序分红若干个段,再把每一个段分红若干个页,并为每个段赋予一个段名。在段页式系统中,地址结构由段号、段内页号和页内地址三部分所组成。
和前两种存储管理方式相同,段页式存储管理方式一样须要增设联想寄存器。
离散分配方式基于将一个进程直接分散地分配到许多不相邻的分区中的思想,分为分页式存储管理,分段存储管理和段页式存储管理. 分页式存储管理旨在提升内存利用率,知足系统管理的须要,分段式存储管理则旨在知足用户(程序员)的须要,在实现共享和保护方面优于分页式存储管理,而段页式存储管理则是将二者结合起来,取长补短,即具备分段系统便于实现,可共享,易于保护,可动态连接等优势,又能像分页系统那样很好的解决外部碎片的问题,以及为各个分段可离散分配内存等问题,显然是一种比较有效的存储管理方式。