首页 > 系统相关 >操作系统学习笔记(三)——内存管理

操作系统学习笔记(三)——内存管理

时间:2023-08-27 21:34:13浏览次数:68  
标签:操作系统 内存 虚拟地址 笔记 地址 页表 分段 物理

一、虚拟内存

将进程所用的地址隔离开,让操作系统为每个进程分配独立的一套虚拟地址。虚拟内存可以使进程的运行内存超过物理内存的大小。

进程持有的虚拟地址会通过 CPU 芯片中的内存管理单元(MMU)的映射关系,来转换变成物理地址,然后再通过物理地址访问内存,如下图所示:

有两种映射方法:

1、分段:

由于程序由若干逻辑段组成,例如代码分段、数据分段、栈段、堆段。不同的段有不同的属性,所以使用分段的形式将段分离出来。

分段机制下的虚拟地址有两部分组成,段选择因子和段内偏移量。

段选择因子和段内偏移量:

  • 段选择因子就保存在段寄存器里面。段选择因子里面最重要的是段号,用作段表的索引。段表里面保存的是这个段的基地址、段的界限和特权等级等。

  • 虚拟地址中的段内偏移量应该位于 0 和段界限之间,如果段内偏移量是合法的,就将段基地址加上段内偏移量得到物理内存地址。

虚拟地址是通过段表与物理地址进行映射的,分段机制会把程序的虚拟地址分成 4 个段,每个段在段表中有一个项,在这一项找到段的基地址,再加上偏移量,于是就能找到物理内存中的地址,如下图:

2、分页:

分页是把整个虚拟和物理内存空间切成一段段固定尺寸的大小。这样一个连续并且尺寸固定的内存空间,我们叫页(Page)。

页表是存储在内存里的,内存管理单元 (MMU)就做将虚拟内存地址转换成物理地址的工作。

在分页机制下,虚拟地址分为两部分,页号和页内偏移。页号作为页表的索引,页表包含物理页每页所在物理内存的基地址,这个基地址与页内偏移的组合就形成了物理内存地址,见下图。

 

 快表:在 CPU 芯片中,加入了一个专门存放程序最常访问的页表项的 Cache,这个 Cache 就是 TLB(Translation Lookaside Buffer) ,通常称为页表缓存、转址旁路缓存、快表等。

3、段页式内存管理

段页式内存管理实现的方式:

  • 先将程序划分为多个有逻辑意义的段,也就是前面提到的分段机制;
  • 接着再把每个段划分为多个页,也就是对分段划分出来的连续空间,再划分固定大小的页;

这样,地址结构就由段号、段内页号和页内位移三部分组成。

段页式地址变换中要得到物理地址须经过三次内存访问:

  • 第一次访问段表,得到页表起始地址;
  • 第二次访问页表,得到物理页号;
  • 第三次将物理页号与页内位移组合,得到物理地址。

 

二、内存满了会发生什么?

当分配物理内存的时候,如果空闲物理内存不够,就会进行内存回收的工作:

  • 后台内存回收:在物理内存紧张的时候,会唤醒 kswapd 内核线程来回收内存,这个回收内存的过程异步的,不会阻塞进程的执行。
  • 直接内存回收:如果后台异步回收跟不上进程内存申请的速度,就会开始直接回收,这个回收内存的过程是同步的,会阻塞进程的执行。

 在经历完直接内存回收后,空闲的物理内存大小依然不够,那么就会触发 OOM 机制,OOM killer 就会根据每个进程的内存占用情况和 oom_score_adj 的值进行打分,得分最高的进程就会被首先杀掉。

 

标签:操作系统,内存,虚拟地址,笔记,地址,页表,分段,物理
From: https://www.cnblogs.com/coooookie/p/17660900.html

相关文章

  • Notion笔记汉化
    Notion笔记汉化关注我的订阅号【靠谱杨的挨踢生活】回复【Notion】获取中文包1、进入notion的安装路径,把文件复制到这个位置(如图所示)C:\Users\用户名\AppData\Local\Programs\Notion\resources\app\renderer2、打开preload.js3、在最后一行加上require("./notion-zh_CN")......
  • 【操作系统】第一章 操作系统发展历程
    1.手工操作阶段所有运算工作需人工干预缺点:1.一个用户占用全机,导致资源利用率低2.CPU由于需要等待手工操作,利用不充分2.批处理阶段主要为了解决人工操作的问题,批处理系统的主要优点在于全自动处理,效率高。1.单道批处理系统主要有:自动性、顺序性和单道性的特征。缺点在于......
  • 学生信息登记表单的录入删除代码JS+HTML TOMCAT听课笔记
    <!DOCTYPEhtml><html><head></head><body><formclass="info"autocomplete="off">姓名:<inputtype="text"class="uname"name="uname"&......
  • 最近改db课设的小笔记
    解决Mac无法访问localhost和127.0.0.1://启动服务apache服务器sudoapachectlstart//失败的话,重启服务sudoapachectlrestart巧用Druid数据源实现数据库连接密码的加密解密:https://cloud.tencent.com/developer/article/1981172https://blog.csdn.net/IndexMan/article......
  • 操作系统学习笔记(二)——操作系统结构
    一、内核作为应用和硬件设备之间的桥梁,负责应用程序只与内核交互,不用关心硬件的细节。4个基本能力:管理进程、线程,决定哪个进程、线程使用CPU,也就是进程调度的能力;管理内存,决定内存的分配和回收,也就是内存管理的能力;管理硬件设备,为进程与硬件设备之间提供通信能力,也就是硬......
  • [算法学习笔记][刷题笔记] 单调队列优化 dp
    前置知识·单调队列单调队列顾名思义,一般用于解决滑动RMQ问题。它的原理非常简单。我们维护一个双端队列,这个双端队列只维护可能成为区间最值的元素。最基础的单调队列,例如滑动窗口。直接依据题意维护即可。这里提供单调队列模板(STLdeque版)单调队列模板(STLdeque版)......
  • 操作系统学习笔记(一)——硬件
    一、冯诺依曼模型定义计算机基本结构为5个部分:存储器、运算器、控制器、输入设备、输出设备。运算器和控制器在中央处理器(CPU)里,存储器就是常见的内存,输入输出设备就是计算机外接的设备,比如键盘是输入设备,显示器是输出设备。1、内存 程序和数据存储在内存里,存储数据的基本单......
  • 多行多列合并成一列内存数组的结果
    问题:多行多列合并成一列内存数组的结果函数公式解决:{=PHONETIC(OFFSET(A1:E1,ROW(1:23)-1,))}用Offset函数生成一个多维引用,每个平面分别是A:E表的每一行。利用Phonetic函数将每个平面里的内容进行合并。此公式的缺陷在于被合并的内容只能是文本,如果数据源中包含数值、日......
  • openGauss学习笔记-52 openGauss 高级特性-LLVM
    openGauss学习笔记-52openGauss高级特性-LLVMopenGauss借助LLVM(LowLevelVirtualMachine)提供的库函数,依据查询执行计划树,将原本在执行器阶段才会确定查询实际执行路径的过程提前到执行初始化阶段,从而规避原本查询执行时候伴随的函数调用、逻辑条件分支判断以及大量的数据读取......
  • go 进阶训练营 微服务可用性(下)笔记
    降级:减少工作量,丢弃不重要的请求。确定具体采用哪个指标作为流量评估和优雅降级的决定性指标:如CPU、延迟、队列长度、线程数量、错误等当服务进入降级时,需要执行什么动作?流量抛弃或者优雅降级应该在服务的哪一层实现?是否需要在整个服务的每一层都实现,还是可以选择某个高层面......