• 内存管理:程序是如何被优雅的装载到内存中


    内存管理:程序是如何被优雅的装载到内存中

    一、内存交换

    1. 内存是为了弥补硬盘与CPU间的速度鸿沟的。
    2. 内存交换:同时运行多个程序时,所有程序的总体积往往超过内存容量,当有新程序需要加载到内存时,系统会将闲着的整个程序从内存暂时挪到硬盘,为新程序腾出空间,需要执行旧程序时再重新腾出其他空闲程序,将旧程序挪回内存。
    3. 内存收缩:内存交换时,内存中不同程序间会产生较小的不连续的小间隔,形成内存碎片,这些碎片较小,很难分配给新的程序,导致内存空间浪费,这这时会从左到右依次将程序在内存中挪移,使被使用空间变得连续,达到消灭碎片的目的,但是这种挪移成本较高。
    4. 动态增长问题:当程序所需内存动态增长时,若相邻空间空闲则直接使用,否则会将整个进程移到更大的连续空间去,若空间不满足,则会触发交换机制,成本较高;一种解决方案就是,程序在申请内存时,多申请一些来满足可预期的动态增长。

    二、空闲内存管理

    1. 位图法:每个内存块都对应一个位,用1和0表示是否被使用,优点是快速明了;缺点是位图占空间,内存块较小时尤其显著。另外当程序末尾占用不满一个块时,会浪费空间。
    2. 链表法:通过链表节点将一个进程所占内存块关联起来。如何从链表中找到一块合适的内存空间,首次适应算法、下次适配算法、最佳适配算法、最差适配算法、快速适配算法

    三、虚拟内存:小内存运行大程序

    它的基本思想就是,每个程序拥有自己的地址空间,尤其注意后面的自己的地址空间,然后这个空间可以被分割成多个块,每一个块我们称之为(page)或者叫页面,对于这些页来说,它们的地址是连续的,同时它们的地址是虚拟的,并不是真正的物理内存地址,那怎么办?程序运行需要读到真正的物理内存地址,别跟我玩虚的,这就需要一套映射机制,然后MMU出现了,MMU全称叫做:Memory Managment Unit,即内存管理单元,正常来说,CPU读某个内存地址数据的时候,会把对应的地址发到内存总线上,但是在虚拟内存的情况下,直接发到内存总线上肯定是找不到对应的内存地址的,这时候CPU会把虚拟地址告诉MMU,让MMU帮我们找到对应的内存地址,没错,MMU就是一个地址转换的中转站。

    1. 对于程序来说,不需要像内存交换那样把所有的指令都加载到内存中才能运行,可以单独运行某一页的指令。
    2. 当进程的某一页不在内存中的时候,CPU会在这个页加载到内存的过程中去执行其他的进程。
  • 相关阅读:
    JDK源码之LinkedList
    MySQL常规知识点总结
    根据不同分辨率载入相应CSS样式表
    关于1.0.0版Backbone.js调用validate
    弹性盒模型计算
    使用CocoaPods
    Objective-C中的Block[转]
    将UTF8编码转化为中文 - NSString方法
    添加第三方类库造成的Undefined symbols for architecture i386:编译错误
    App适配iPhone 6/ Plus和iOS 8:10条小秘诀
  • 原文地址:https://www.cnblogs.com/JaxYoun/p/15521953.html
Copyright © 2020-2023  润新知