【操作系统学习笔记】(五)内存管理(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天前
|
JSON iOS开发 数据格式
tauri2-vue3-macos首创跨平台桌面OS系统模板
自研Tauri2.0+Vite6+Pinia2+Arco-Design+Echarts+sortablejs桌面端OS管理平台系统。提供macos和windows两种桌面风格模式、自研拖拽式栅格引擎、封装tauri2多窗口管理。
24 3
|
22天前
|
C语言 开发者 内存技术
探索操作系统核心:从进程管理到内存分配
本文将深入探讨操作系统的两大核心功能——进程管理和内存分配。通过直观的代码示例,我们将了解如何在操作系统中实现这些基本功能,以及它们如何影响系统性能和稳定性。文章旨在为读者提供一个清晰的操作系统内部工作机制视角,同时强调理解和掌握这些概念对于任何软件开发人员的重要性。
|
18天前
|
机器学习/深度学习 人工智能 缓存
【AI系统】推理内存布局
本文介绍了CPU和GPU的基础内存知识,NCHWX内存排布格式,以及MNN推理引擎如何通过数据内存重新排布进行内核优化,特别是针对WinoGrad卷积计算的优化方法,通过NC4HW4数据格式重排,有效利用了SIMD指令集特性,减少了cache miss,提高了计算效率。
35 3
|
20天前
|
安全 前端开发 Android开发
探索移动应用与系统:从开发到操作系统的深度解析
在数字化时代的浪潮中,移动应用和操作系统成为了我们日常生活的重要组成部分。本文将深入探讨移动应用的开发流程、关键技术和最佳实践,同时分析移动操作系统的核心功能、架构和安全性。通过实际案例和代码示例,我们将揭示如何构建高效、安全且用户友好的移动应用,并理解不同操作系统之间的差异及其对应用开发的影响。无论你是开发者还是对移动技术感兴趣的读者,这篇文章都将为你提供宝贵的见解和知识。
|
21天前
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
|
21天前
|
Linux 调度 C语言
深入理解操作系统:从进程管理到内存优化
本文旨在为读者提供一次深入浅出的操作系统之旅,从进程管理的基本概念出发,逐步探索到内存管理的高级技巧。我们将通过实际代码示例,揭示操作系统如何高效地调度和优化资源,确保系统稳定运行。无论你是初学者还是有一定基础的开发者,这篇文章都将为你打开一扇了解操作系统深层工作原理的大门。
|
21天前
|
人工智能 搜索推荐 Android开发
移动应用与系统:探索开发趋势与操作系统演进####
本文深入剖析了移动应用开发的最新趋势与移动操作系统的演进历程,揭示了技术创新如何不断推动移动互联网生态的变革。通过对比分析不同操作系统的特性及其对应用开发的影响,本文旨在为开发者提供洞察未来技术方向的视角,同时探讨在多样化操作系统环境中实现高效开发的策略。 ####
19 0
|
22天前
|
机器学习/深度学习 人工智能 算法
【AI系统】内存分配算法
本文探讨了AI编译器前端优化中的内存分配问题,涵盖模型与硬件内存的发展、内存划分及其优化算法。文章首先分析了神经网络模型对NPU内存需求的增长趋势,随后详细介绍了静态与动态内存的概念及其实现方式,最后重点讨论了几种节省内存的算法,如空间换内存、计算换内存、模型压缩和内存复用等,旨在提高内存使用效率,减少碎片化,提升模型训练和推理的性能。
42 1
|
1月前
|
测试技术 Android开发 开发者
移动应用与系统:涵盖移动应用开发、移动操作系统等相关话题####
本文深入探讨了移动应用开发的全过程,包括需求分析、设计、编码、测试以及发布等关键步骤。同时,还对当前主流的移动操作系统进行了简要介绍,并分析了它们之间的差异和各自的优势。通过实际案例,展示了移动应用开发的挑战与解决方案,旨在为读者提供一份全面的移动应用开发指南。 ####
|
1月前
|
算法 调度 开发者
深入理解操作系统:从进程管理到内存分配
本文旨在为读者提供一个深入浅出的操作系统知识之旅,从进程管理的基础概念出发,探索内存分配的策略与技巧。我们将通过实际代码示例,揭示操作系统背后的逻辑与奥秘,帮助读者构建起对操作系统工作原理的直观理解。文章不仅涵盖理论知识,还提供实践操作的指导,使读者能够将抽象的概念转化为具体的技能。无论你是初学者还是有一定基础的开发者,都能在这篇文章中找到有价值的信息和启发。