操做系统-内存管理


推荐书籍-《计算机操做系统》第四版 汤小丹
推荐Java重点知识点总结
https://github.com/myacai/JavaHandBook

存储器的多层结构

在这里插入图片描述

连续分配存储管理方式

单一连续分配
固定分区分配
动态分区分配
主要是指动态分区分配时所采用的几种算法。
动态分区分配又称为可变分区分配,是一种动态划份内存的分区方法。这种分区方法不预先将内存划分,而是在进程装入内存时,根据进程的大小动态地创建分区,并使分区的大小正好适合进程的须要。所以系统中分区的大小和数目是可变的。
在这里插入图片描述
首次适应(First Fit)算法:空闲分区以地址递增的次序连接。分配内存时顺序查找,找到大小能知足要求的第一个空闲分区。git

最佳适应(Best Fit)算法:空闲分区按容量递增造成分区链,找到第一个能知足要求的空闲分区。程序员

最坏适应(Worst Fit)算法:又称最大适应(Largest Fit)算法,空闲分区以容量递减的次序连接。找到第一个能知足要求的空闲分区,也就是挑选出最大的分区。github

基本分页储存管理方式

把主存空间划分为大小相等且固定的块,块相对较小,做为主存的基本单位。用户程序的地址空间分为若干个固定大小的区域,称为“页”。进程在执行时,以块为单位逐个申请主存中的块空间。web

由于程序数据存储在不一样的页面中,而页面又离散的分布在内存中,所以须要一个页表来记录逻辑地址和实际存储地址之间的映射关系,以实现从页号到物理块号的映射。算法

因为页表也是存储在内存中的,所以和不适用分页管理的存储方式相比,访问分页系统中内存数据须要两次的内存访问(一次是从内存中访问页表,从中找到指定的物理块号,加上页内偏移获得实际物理地址;第二次就是根据第一次获得的物理地址访问内存取出数据)。
在这里插入图片描述
为了减小两次访问内存致使的效率影响,分页管理中引入了快表机制,包含快表机制的内存管理中,当要访问内存数据的时候,首先将页号在快表中查询,若是查找到说明要访问的页表项在快表中,那么直接从快表中读取相应的物理块号;若是没有找到,那么访问内存中的页表,从页表中获得物理地址,同时将页表中的该映射表项添加到快表中(可能存在快表换出算法)。
在某些计算机中若是内存的逻辑地址很大,将会致使程序的页表项会不少,而页表在内存中是连续存放的,因此相应的就须要较大的连续内存空间。为了解决这个问题,能够采用两级页表或者多级页表的方法,其中外层页表一次性调入内存且连续存放,内层页表离散存放。相应的访问内存页表的时候须要一次地址变换,访问逻辑地址对应的物理地址的时候也须要一次地址变换,并且一共须要访问内存3次才能够读取一次数据。svg

基本分段储存管理方式

分页是为了提升内存利用率,而分段是为了知足程序员在编写代码的时候的一些逻辑需求(好比数据共享,数据保护,动态连接等)。操作系统

分段内存管理当中,地址是二维的,一维是段号,一维是段内地址;其中每一个段的长度是不同的,并且每一个段内部都是从0开始编址的。因为分段管理中,每一个段内部是连续内存分配,可是段和段之间是离散分配的,所以也存在一个逻辑地址到物理地址的映射关系,相应的就是段表机制。段表中的每个表项记录了该段在内存中的起始地址和该段的长度。段表能够放在内存中也能够放在寄存器中。
在这里插入图片描述
访问内存的时候根据段号和段表项的长度计算当前访问段在段表中的位置,而后访问段表,获得该段的物理地址,根据该物理地址以及段内偏移量就能够获得须要访问的内存。因为也是两次内存访问,因此分段管理中一样引入了联想寄存器。指针

分页与分段的比较

对程序员的透明性:分页透明,可是分段须要程序员显式划分每一个段。xml

地址空间的维度:分页是一维地址空间,分段是二维的。blog

大小是否能够改变:页的大小不可变,段的大小能够动态改变。

出现的缘由:分页主要用于实现虚拟内存,从而得到更大的地址空间;分段主要是为了使程序和数据能够被划分为逻辑上独立的地址空间而且有助于共享和保护。

虚拟内存

虚拟内存的目的是为了让物理内存扩充成更大的逻辑内存
若是存在一个程序,所需内存空间超过了计算机能够提供的实际内存,那么因为该程序没法装入内存因此也就没法运行。单纯的增长物理内存只能解决一部分问题,可是仍然会出现没法装入单个或者没法同时装入多个程序的问题。可是能够从逻辑的角度扩充内存容量,便可解决上述两种问题。

基于局部性原理,在程序装入时,能够将程序的一部分装入内存,而将其他部分留在外存,就能够启动程序执行。在程序执行过程当中,当所访问的信息不在内存时,由操做系统将所须要的部分调入内存,而后继续执行程序。另外一方面,操做系统将内存中暂时不使用的内容换出到外存上,从而腾出空间存放将要调入内存的信息。这样,系统好像为用户提供了一个比实际内存大得多的存储器,称为虚拟存储器。

虚拟存储器的特征:

屡次性:一个做业能够分屡次被调入内存。屡次性是虚拟存储特有的属性
对换性:做业运行过程当中存在换进换出的过程(换出暂时不用的数据换入须要的数据)
虚拟性:虚拟性体如今其从逻辑上扩充了内存的容量(能够运行实际内存需求比物理内存大的应用程序)。虚拟性是虚拟存储器的最重要特征也是其最终目标。虚拟性创建在屡次性和对换性的基础上行,屡次性和对换性又创建在离散分配的基础上

页面置换算法

最佳置换算法:只具备理论意义的算法,用来评价其余页面置换算法。置换策略是将当前页面中在将来最长时间内不会被访问的页置换出去。

先进先出置换算法:简单粗暴的一种置换算法,没有考虑页面访问频率信息。每次淘汰最先调入的页面。

最近最久未使用算法LRU:算法赋予每一个页面一个访问字段,用来记录上次页面被访问到如今所经历的时间t,每次置换的时候把t值最大的页面置换出去(实现方面能够采用寄存器或者栈的方式实现)。

时钟算法clock(也被称为是最近未使用算法NRU):页面设置一个访问位,并将页面连接为一个环形队列,页面被访问的时候访问位设置为1。页面置换的时候,若是当前指针所指页面访问为为0,那么置换,不然将其置为0,循环直到遇到一个访问为位0的页面。

改进型Clock算法:在Clock算法的基础上添加一个修改位,替换时根究访问位和修改位综合判断。优先替换访问位和修改位都是0的页面,其次是访问位为0修改位为1的页面。

最少使用算法LFU:设置寄存器记录页面被访问次数,每次置换的时候置换当前访问次数最少的。