码迷,mamicode.com
首页 > 其他好文 > 详细

操作系统之内存管理篇

时间:2020-09-17 21:19:04      阅读:57      评论:0      收藏:0      [点我收藏+]

标签:unit   第一个   大于   https   程序   储存器   取数据   html   load   

参考链接:
https://github.com/CyC2018/CS-Notes
https://blog.csdn.net/qq_29677867/article/details/91038642
https://www.jianshu.com/p/a805e2410fbe
https://www.cnblogs.com/onepeace/p/5066736.html
https://blog.csdn.net/guoweimelon/article/details/50853719

目录

内存基本概念

  • 何为内存
    存放数据的硬件,数据应放在内存中才能被cpu计算
    技术图片
    每个小房间就是一个存储单元。按字节编址时,每个存储单元大小为1字节(即8bit);若一个16位字长的计算机,按字编址时,每个存储单元大小为1个字(16bit)。
  • 何为指令
    我们写的代码要翻译成CPU能识别的指令。这些指令会告诉CPU应该去内存的哪个地址存/取数据,这个数据应该做什么样的处理。编译生成的指令中一般是使用逻辑地址(相对地址,或虚地址),而非物理地址(绝对地址,或实地址)。
    技术图片
  • 地址重定位
    把程序相对地址空间的逻辑地址转换成存储空间的绝对地址的工作叫做地址重定位,又叫地址映射或地址变换。
    静态重定位:在装入作业时,由装入程序把用户程序中的指令地址和数据地址全部转换成存储空间的绝对地址。这种地址转换工作是在程序执行前集中一次完成的,程序执行时就无需要再进行地址转换工作。主要优点是无需增加硬件地址变换机构,主要缺点是要求给每个程序分配一片连续的存储空间
    动态重定位:动态重定位是靠硬件的地址转换机构来实现的,通常使用一个重定位寄存器。在存储管理为程序分配一个主存区域后,装入程序直接把程序和数据装入到分配的存储区中,然后把这个存储区的起始地址送入重定位寄存器中。在程序执行时,对于每一个存储器的访问,都要讲相对地址转化成主存的绝对地址。主要优点是使用更加灵活有效,不用给程序分配一大片连续的空间,能够给用户提供一个比主存大的多的地址空间

内存管理技术一览(四种)

  1. 覆盖与交换
    https://blog.csdn.net/weixin_42076938/article/details/105579264
    https://www.debuginn.cn/270.html
    https://blog.csdn.net/qq_33826977/article/details/79776543
    (1)覆盖
    技术图片
    覆盖技术是指一个程序的若干程序段和几个程序的某些部分共享一个存储空间。覆盖技术的实现是把程序分为若干个功能上相对独立的程序,按照其自身的逻辑结构使那些不会同时执行的程序段共享同一块内存区域。未执行的程序段先保存在磁盘上,当有关程序段的前一部分执行结束后,把后续程序段调入内存,覆盖前面的程序段。
    将内存空间分为若干常驻区(被某段固定占用)和覆盖区(由多段共享,可根据运行情况替换)
    (2)交换
    把处于等待状态(比如说等待IO, 网络等阻塞的线程)的程序从内存移出,腾出内存空间,这个过程叫换出。把准备好竞争CPU的程序从辅存移动到内存,这个过程叫换入。交换需要备份存储,通常是快速磁盘
    (3)两者区别
    交换技术主要是在不同进程(或作业之间),而覆盖则用于同一个进程中。对于主存无法存放用户程序的矛盾,现代操作系统是通过虚拟内存技术来解决的,覆盖技术已成为历史,而交换技术在现代操作系统仍有较强的生命力。
  2. 单一连续分配
    使用于只有一个作业,将其全部装进内存。即内存只有一个作业。
    内存在此方式下分为系统区和用户区,系统区仅提供给操作系统使用,通常在低地址部分;用户区是为用户提供的、除系统区之外的内存空间。这种方式的优点是简单、无外部碎片,可以釆用覆盖技术,不需要额外的技术支持。缺点是只能用于单用户、单任务的操作系统中,有内部碎片,存储器的利用率极低。
    2.分区分配
    (1)固定分区
    将内存预先划分为固定大小的区域,每个分区只装入一道作业。当有空闲分区时,便可以再从外存的后备作业队列中,选择适当大小的作业装入该分区,如此循环。
    缺点:a.有些作业大于分区大小,无法装入(只能使用覆盖技术);2.有些作业太小,浪费所在分区的空间(即内碎片)
    (2)可变分区
    可变式分区在进程装入内存时,根据进程的大小动态地建立分区,并使分区的大小正好适合进程的需要
    缺点:随着换入换出,越来越多小碎片产生,即外碎片。解决碎片的方法是采取紧凑技术,即对碎片进行拼接,但是需要消耗系统资源。
    动态分区的分配策略:
    a.首次适应first fit:按地址顺序查找,第一个大小满足的分区就分配
    b.最佳适应best fit:按分区大小从小到大排序,找到第一个满足大小的分配
    c.最坏适应worst fit:按分区大小从大到小排序,找到第一个满足大小的分配
    d.临近适应next fit:从上一次分配的分区开始查找,找到第一个满足大小的分配
  3. 动态重定位分区分配
    可重定位分区分配通过对程序实现成定位,从而可以将内存块进行搬移,将小块拼成大块,将小空闲“紧凑”成大空闲,腾出较大的内存以容纳新的程序进程。
  • 分页式
  • 分段式
  • 段页式

虚拟内存

  • 目的:让物理内存扩充到更大的逻辑内存,从而使程序有更大的可用内存
  • how
    为了更好管理内存,操作系统将内存映射到地址空间。每个程序都有自己的地址空间,地址空间被分割成若干块(称为页)。这些页被映射到物理内存(不必是连续的,也不必全部装入)。
    若一个计算机可以产生16位地址,则一个程序的地址空间为0~64k
    技术图片
  • 地址映射
    https://blog.csdn.net/qq_37375427/article/details/84206495
  1. 由内存管理单元(Memory Management Unit, MMU)是一个硬件,不是软件。它用于将虚拟地址翻译成实际的物理内存地址。同时它还可以将特定的内存块设置成读、写或者可执行的属性,进而实现内存保护
    MMU的页表存储着页(程序地址空间)页框(物理内存空间)的映射表。
  2. 虚拟地址分为两部分,一部分存储页面号,一部分存储偏移量
    例子:下图的页表存放着 16 个页,这 16 个页需要用 4 个比特位来进行索引定位。例如对于虚拟地址(0010000000000100),前 4 位是存储页面号 2,读取表项内容为(110 1),页表项最后一位表示是否存在于内存中,1 表示存在。后 12 位存储偏移量。这个页对应的页框的地址为 (110 000000000100)。
    技术图片

页面置换算法

  • what
    当需要的页面不在内存中,缺页中断需要调入该页面。但是此时内存已无空间,所以需要选择淘汰页来装进新页。
  • 目的
    使页面置换率最低(也就是缺页率最低)
  • 6种算法
  1. 最佳(Optimal Replacement Algorithm, OPT)
    把最长时间内不再被访问的页调出,但这是理论上的方法,因为无法预知接下来调用的情况。例子如下(由页面引用结果得出,7确实在很久后才会被再次调用):
    技术图片
  2. 最近最久未被使用(Least Recently Used, LRU)
    把最近最久未被使用的页面调出,看的是历史调用而不是上面的未来调用。需要维护一个链表实现,每次将刚使用的页面放在链表首部(运行代价比较大)。例子如下:
    技术图片
  3. 最近未使用(Not Recently Used, NRU)
    设置两个标志,当被访问令R=1,当被修改令M=1,其中所有页面的R会定期清零。页面的状态有四种:
    (1)R=0,M=0
    (2)R=0,M=1
    (3)R=1,M=0
    (4)R=1,M=1
    调出顺序为(1)~(4)
  4. 先进先出(First In First Out, FIFO)
    调出的是最早进来的。缺点是可能会把那些频繁调用的页调出。
  5. 第二次机会算法
    改进的FIFO算法。用一个链表来实现,如果页面被访问(读或修改),设R=1。若需要淘汰一个页时,从链首取,若链首的R=0,则淘汰;若链首R=1,则变成R=0,然后将其放到链尾(相当于给了二次机会),继续考察链首。
    技术图片
  6. 时钟页面置换算法(Clock)
    由于第二次机会算法的链表操作代价较大,所以Clock算法采用环形链表(并维护一个指针指向当前页面,相当于上面方法的链首)。若需要淘汰一个页面时,且指针对应页面的R=0的话,直接淘汰,然后把新的页面放在这个空位,并且使指针移到前面一个。若指向的R=1,则把R置为0,指针直接移前面一个。

分段

  • 定义:这是为了满足用户要求而形成的一种储存管理方式。它把用户程序的地址空间分为若干个大小不同的段,每段可定义一组相对完整的信息。在储存器分配时,以段为单位,这些段在内存中可以不相邻接,所以也同样实现了离散分配。分段的做法是把每个表分成段,一个段构成一个独立的地址空间。每个段的长度可以不同,并且可以动态增长。
  • 地址映射
    技术图片
    虚拟地址由段号和段内地址组成,虚拟地址到实存地址的变换通过段表来实现。每个程序设置一个段表,段表的每一个表项对应一个段,每个表项至少包括三个字段:有效位(指明该段是否已经调入主存)、段起址(该段在实存中的首地址)和段长(记录该段的实际长度)。绝对地址=根据段号找到段表中的起始地址+段内地址 (如果段内地址超过限长则产生“地址越界”程序性中断事件达到存储保护)
  • 优点缺点
    https://www.cnblogs.com/onepeace/p/5066736.html
    技术图片

段页式

  • 定义
    程序的地址空间划分成多个拥有独立地址空间的,每个段上的地址空间划分成大小相同的页。这样既拥有分段系统的共享和保护,又拥有分页系统的虚拟内存功能
  • 地址结构
    技术图片
  • 优点缺点
    技术图片

内碎片和外碎片

内存管理方法 内碎片 外碎片
固定分区 1 0
动态分区 0 1
页式 1 0
段式 0 1
段页式 1 0

解释:在页式虚拟存储系统中,用户作业的地址空间被划分成若干大小相等的页面,存储空间也分成也页大小相等的物理块,但一般情况下,作业的大小不可能都是物理块大小的整数倍,因此作业的最后一页中仍有部分空间被浪费掉了。由此可知,页式虚拟存储系统中存在内零头。
在段式虚拟存储系统中,作业的地址空间由若干个逻辑分段组成,每段分配一个连续的内存区,但各段之间不要求连续,其内存的分配方式类似于动态分区分配。由此可知,段式虚拟存储系统中存在外零头。

地址映射方法

分页,分段,段页式的具体地址映射方法,看书!!!!

操作系统之内存管理篇

标签:unit   第一个   大于   https   程序   储存器   取数据   html   load   

原文地址:https://www.cnblogs.com/Cindy-H/p/13642266.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!