内存管理

内存管理发展历程

一、 DOS时代:(单进程)同一时间只有一个进程运行 (也有一些特殊算法可以支持多进程)
二、 windows9x - 多个进程装入内存
问题:
1)内存不够用
2)互相打扰
三、为了解决这两个问题,诞生了现在的内存管理系统:虚拟地址 分页装入 软硬件结合寻址

  1. 内存分页:分成固定大小的页框(page frame)最基本的分页大
    是4k。把程序(硬盘上)分成4k大小的块,用到哪一块加载哪一块。
    加载中,内存满就交换分区。
    流程举例:把进程分页后,记录到页表。之后告诉进程调度器有个进程要进入内存。假如程序入口在第三页,那么进程调度器会通知进程,先将第3页内容装入内存执行。在执行中,如果用到第4块,就把第四块装入。要是满了,进行交换分区(LRU算法,把最近最久没用的拿到SWAP分区【硬盘实现,速度慢】)
注: - LRU leetCode 146题 **哈希表(保证 查找操作O(1)) + 链表(保证 排序操作和新增操作O(1))** 最终 链表--> 双向链表(保证 左边指针 指向右边块) - 所有涉及到缓存的,基本都是LRU(least recently used,最不常用算法),LFU
  1. 虚拟内存(解决相互打扰问题)
    1)DOS Win31 … 可以互相干掉对方的内存
    2)为了保证互不影响 - 让进程工作在虚拟空间,程序中用到的空间地址不再是直接的物理地址,而是虚拟的地址,这样,A进程永远不可能访问到B进程的空间
    3)虚拟空间多大呢?寻址空间 - 64位系统 2 ^ 64,比物理空间大很多 ,单位是byte
    4)站在虚拟的角度,进程是独享整个系统 + CPU
    5)内存映射:偏移量 + 段的基地址 = 线性地址 (虚拟空间)
    6)线性地址通过 OS + MMU(硬件 Memory Management Unit)转换成物理地址
    【所以操作系统非常安全】
    在这里插入图片描述

  2. 缺页中断
    需要用到页面内存中没有,产生缺页异常(一种特殊中断),由内核处理并加载【慢】

ZGC

算法叫做 Colored Pointer
GC信息记录在指针上,不是记录在头部, immediate memory use
不支持32位,不支持指针压缩

42位指针 寻址空间4T JDK13 -> 16T 目前为止最大16T 2^44

CPU如何区分一个立即数 和 一条指令?
总线内部分为:数据总线 地址总线 控制总线

地址总线目前:48位 四位为颜色指针

颜色指针本质上包含了地址映射的概念