【操作系统学习笔记】(五)内存管理(2)关于分页系统的设计与实现

简介: 本文是个人学习《现代操作系统》的笔记。
本文首发于稀土掘金。该平台的作者 逐光而行 也是本人。

本文是个人学习《现代操作系统》的笔记。

分页系统中的设计

局部分配与全局分配策略

  • 问题背景:如何在相互竞争的可运行进程之间分配内存。
  • 管理内存动态分配的一种方法:PFF(page fault frequency)

注:它指出了分配的 时机 ,控制了分配集的大小,但不会具体指出要替换哪一个

  • 局部全局、各种具体算法的划分不是从同一个维度考虑的。有的算法可同时支持全局和局部,如FIFO和LRU;有的算法只有局部才有意义,如工作集和WSClock算法。

负载控制

  • 两级调度思想:一些进程被放入磁盘期间,用一个短期调度程序调度剩余进程。

关于页面大小的选择

page大小是操作系统的可选参数。

在内存中有n个段,页面大小为p字节时,会有np/2字节的内部碎片。

共享page

多个进程通过共享程序页表来共享同一个程序。

共享库(windows中称作DLL(动态链接库))

优点:

  • 使可执行文件更小
  • 节省内存空间
  • 如果共享库中的一个函数因为修正bug被更新了,不需要重新编译

缺点:
由于多个进程共用,装载时进行重定位行不通。

解决方案:

  • 写时复制(和使用共享库的目的相悖)
  • 变异共享库时,增加一个特殊编译选项,让编译器不要产生绝对地址的指令。

共享库实质

内存映射文件

清除策略

双指针策略:前指针由分页守护进程控制,后指针用于页面置换。

分页守护进程

  • 定义:大多数时候睡眠、定期被唤醒以检查内存状态的后台进程。
  • 工作原理:通过预定的页面置换算法换出内存,以保证有足够多的空闲页框。

实现虚拟内存系统的注意事项

分页

  • 新进程创建时,操作系统要确定程序和数据初始时有多大,并为它们创建一个页表。
  • 进程被换出时,页表不需要在内存中;进程运行时,它必须在。
  • 缺页中断发生时,操作系统必须通过硬件寄存器以确定是哪个虚拟地址造成了缺页中断。
  • 进程退出时,操作系统必须释放进程的页表、页面和硬盘占用空间。

缺页中断处理的过程

  • 硬件陷入内核
  • 启动汇编代码例程暂存信息(栈思想)(该例程将操作系统作为函数调用)
  • 发生缺页中断时,尝试确定需要哪个虚拟页面,并检查该地址是否有效,存取与保护是否一致。

    • if不一致,向进程发出一个信号或kill掉该进程;
    • else if 无空闲页框,执行置换页面算法淘汰掉一个页面腾出页框。
    • else if 所选页框脏了,将该页写回磁盘,并发生一次上下文切换,期间挂起该进程,先运行其他进程。
    • else 通过磁盘操作将其装入

之后可理解为对上述操作的出栈过程。

指令备份

  • 背景:为什么需要备份?

当程序访问不在内存中的页面时,引起缺页中断的指令会半途停止并trap,取出页面后需重新启动引起trap的命令。

  • 实现

CPU设计上,通过使用一个隐藏的内容寄存器,在每条指令执行之前,把程序计数器内容复制到该寄存器。

虚拟内存与I/O间的关系

在等待I/O完成时,某进程被挂起,另一个进程运行,这期间产生一个缺页中断。

磁盘管理-当页面被换出时会放在磁盘的哪个位置

  • 静态备份:在磁盘上设置特殊的交换分区,甚至从文件系统划分一块独立磁盘。

    • 注意:为了避免溢出,最好为context data stack都保留交换区,并且允许其实际多于一个快
  • 动态备份:页面换出时才分配磁盘空间。
    特点:每个进程都必须有一张表,用于记录每个页面相应的磁盘地址

分段

segment,这和初学汇编时的段思想一致

  • page是定长的,segment不是
  • segment是一个逻辑实体,但一般不会同时包含多种不同类型的内容。
相关文章
|
2月前
|
机器学习/深度学习 人工智能 缓存
【AI系统】推理内存布局
本文介绍了CPU和GPU的基础内存知识,NCHWX内存排布格式,以及MNN推理引擎如何通过数据内存重新排布进行内核优化,特别是针对WinoGrad卷积计算的优化方法,通过NC4HW4数据格式重排,有效利用了SIMD指令集特性,减少了cache miss,提高了计算效率。
80 3
|
2月前
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
|
2月前
|
机器学习/深度学习 人工智能 算法
【AI系统】内存分配算法
本文探讨了AI编译器前端优化中的内存分配问题,涵盖模型与硬件内存的发展、内存划分及其优化算法。文章首先分析了神经网络模型对NPU内存需求的增长趋势,随后详细介绍了静态与动态内存的概念及其实现方式,最后重点讨论了几种节省内存的算法,如空间换内存、计算换内存、模型压缩和内存复用等,旨在提高内存使用效率,减少碎片化,提升模型训练和推理的性能。
113 1
|
2月前
|
开发框架 .NET PHP
网站应用项目如何选择阿里云服务器实例规格+内存+CPU+带宽+操作系统等配置
对于使用阿里云服务器的搭建网站的用户来说,面对众多可选的实例规格和配置选项,我们应该如何做出最佳选择,以最大化业务效益并控制成本,成为大家比较关注的问题,如果实例、内存、CPU、带宽等配置选择不合适,可能会影响到自己业务在云服务器上的计算性能及后期运营状况,本文将详细解析企业在搭建网站应用项目时选购阿里云服务器应考虑的一些因素,以供参考。
|
3月前
|
监控 Java Android开发
深入探讨Android系统的内存管理机制
本文将深入分析Android系统的内存管理机制,包括其内存分配、回收策略以及常见的内存泄漏问题。通过对这些方面的详细讨论,读者可以更好地理解Android系统如何高效地管理内存资源,从而提高应用程序的性能和稳定性。
118 16
|
3月前
|
缓存 Java Linux
如何解决 Linux 系统中内存使用量耗尽的问题?
如何解决 Linux 系统中内存使用量耗尽的问题?
281 48
|
3月前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
|
4月前
|
运维 JavaScript Linux
容器内的Nodejs应用如何获取宿主机的基础信息-系统、内存、cpu、启动时间,以及一个df -h的坑
本文介绍了如何在Docker容器内的Node.js应用中获取宿主机的基础信息,包括系统信息、内存使用情况、磁盘空间和启动时间等。核心思路是将宿主机的根目录挂载到容器,但需注意权限和安全问题。文章还提到了使用`df -P`替代`df -h`以获得一致性输出,避免解析错误。
125 0
|
6天前
|
运维 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot 是阿里云推出的一款操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行和系统运维调优等功能。通过简单的命令行操作,用户可以快速获取所需信息并执行任务,极大提升了Linux系统的使用效率。安装步骤简单,只需在阿里云服务器上运行几条命令即可完成部署。使用过程中,OS Copilot不仅能帮助查找命令,还能处理文件和复杂场景,显著节省了查找资料的时间。体验中发现,部分输出格式和偶尔出现的英文提示有待优化,但整体非常实用,特别适合Linux初学者。
50 10
|
1月前
|
弹性计算 运维 Ubuntu
os-copilot在Alibaba Cloud Linux镜像下的安装与功能测试
我顺利使用了OS Copilot的 -t -f 功能,我的疑惑是在换行的时候就直接进行提问了,每次只能写一个问题,没法连续换行更有逻辑的输入问题。 我认为 -t 管道 功能有用 ,能解决环境问题的连续性操作。 我认为 -f 管道 功能有用 ,可以单独创建可连续性提问的task问题。 我认为 | 对文件直接理解在新的服务器理解有很大的帮助。 此外,我还有建议 可以在非 co 的环境下也能进行连续性的提问。
75 7

推荐镜像

更多