美文网首页知识大搜罗创业程序员
操作系统简明-5.0:内存管理 干货整理

操作系统简明-5.0:内存管理 干货整理

作者: Dongle聊测试 | 来源:发表于2017-06-12 17:12 被阅读67次

    cache

    cpu只能访问内存和处理器内部的寄存器,如果某些数据不在内存中,那么,必须要移到内存后才能供cpu访问,比如某些机器指令,数据
    我们来看一组访问速度对比

    |内置寄存器|寄存器|内存|
    |-|-|
    |极快|快|...|

    • 内置寄存器:往往在一个cpu时钟周期就能完成访问
    • 寄存器:一个时钟周期可以执行多个指令
    • 内存:多个时钟周期完成访问

    但是,有句话叫做不作就不会死,内存越慢,我们越要频繁使用,为此需要在cpu与内存之间增加cache(高速缓存)

    进程访问保护

    除了增加内存访问速度,还确保操作系统不能被用户进程访问到,以及用户间不能相互访问,这里介绍一种硬件实现方案:

    1. 每个进程有独立的内存空间
    2. 确定进程可以访问的合法地址范围


    硬件方案:我们用基地址寄存器以及界限地址寄存器确定这个范围,比如进程3,可访问的范围是300040~420940


    不知少侠们对这个解决办法还满意否☺

    连续内存管理

    内存分为两个区域:操作系统与用户进程



    通常来说,中断向量的位置决定了操作系统的位置,本来操作系统既可以驻留在低内存,又可以跑到高内存玩耍(中断向量在低内存)
    如果将多个进程同时放在内存中,就需要考虑如何分配内存空间,因此采用连续内存分配--->每个进程处于一个连续内存区域内

    连续的内存管理算法:best fit,first fit

    但是面临的困难是:在极端情况下,可能总内存满足需求,但是由于内存碎片分布,因此实际无法满足需求
    好比:这有100M内存,但是仅仅50M连续,剩下50M平均1k分布,这样的话就很尴尬了

    非连续内存处理办法

    分页管理

    通常是把小碎片连在一起,便可以扩大内存,但是这么做总会消耗时间,因此不采用,下面我们来提出更好的办法:分页管理

    每个座位是一个单位,我要100个座位(100M),因此我给你不连续或连续的座位都无所谓

    对于进程来讲,看到的却是是单一,线性,连续的内存

    页表:是一个线性数组,存放逻辑页与物理页的对应关系,从逻辑上来讲,是一个映射关系

    有这么几个好处

    • 保护功能:因为页表是一个虚拟映射,每个进程都有自己的页表,那我要求M(p1)∩M(p2)=∅,如此一来,进程间就不可相互访问了
    • 大大简化内存分配:操作系统只需要记住哪些物理内存被分配出去,哪些没有被分配出去即可(你要内存,我只需从物理内存的头找到尾)
    • 可以避免碎片化,因为假设逻辑页最少10k,你要5k,我给你10k,你好我好大家好

    有这么几个坏处

    • 对于每次内存访问,我们需要做两次物理内存访问:第一次访问页表,查出物理位置,然后再访问对应位置(这是很致命的问题)

    处理器速度是最快的(访问寄存器),而对应的,访问内存会比之慢两个数量级:飞机速度800公里/小时,两个数量级是8公里/小时

    TLB:我们要设计高速缓存TLB解决上述问题,TLB是页表的子集

    页表 物理页
    xxx xxxx

    如果页表不在TLB内,要持续更新页表和物理页

    两个进程要通信,共享内存是一个很好的方法(页表指向同一个物理内存上,M(p)∩M(q)≠∅)

    综上:页表的好处多多,无论从内存分配,还是地址保护,异或是内存共享都是一个完美的解决方案

    分级页表

    借鉴一位大神

    虚拟内存

    运行一个进程时,要把进程指定的数据,指令放到机器内部中,因为运行中要访问这些数据,指令。但是并不需要把全部的指令和数据都要放到机器中,有些并不会用到:比如代码的异常处理,只有异常出现时,才会做出应对

    虚拟内存:做分页管理时,把某些页放到磁盘上,需要时再弄回来,也就是说,我可以把磁盘和内存整合到一起,内存不够时,调来磁盘假装为内存(让物理页指向磁盘)

    磁盘块的大小与页的大小应该一致



    早期时候,由于磁盘比较小,因此要留一些空间来存放页,如果要访问已经交换出去的页,操作系统要到磁盘上去,把他读回来

    好处:

    • 可以跑一个进程,由于虚拟内存大于物理内存,因此他不受物理内存的限制
    • 进程可以自己共享某个内存:数学成绩不好,用物理成绩弥补,英语成绩不够,用化学成绩来补
    • 多个进程的内存总和,要大于物理内存的合

    缺点:

    • 附加资源消耗
    • 空间:页表的存放需要占用空间,由于每个进程都有一个页表,100个进程就要有100个页表(后面会讲如何存放页表)
    • 时间 :从虚拟地址映射到物理地址上去,必然要消耗时间
    • 虽然我们一再强调,虚拟内存可以超过物理地址,但实际情况完成的并不怎么好:我们有40G物理内存,20G磁盘内存,而哈希表的特点是随机访问,如果哈希表大量的访问落到了磁盘上去,要知道磁盘慢6个数量级,真不敢想象

    cache

    主存是备用存储器的cache,备用存储器是主存的拓展
    好比书包与图书馆:两者是互补关系

    静态变量就是全局变量,只不过静态变量有作用域

    相关文章

      网友评论

        本文标题:操作系统简明-5.0:内存管理 干货整理

        本文链接:https://www.haomeiwen.com/subject/aowhqxtx.html