操作系统之内存管理

简介: 内存的基础知识什么是内存因为cpu的处理速度很快,而外存的读取速度又很慢,所以我们就需要先加载到内存中,内存的读取速度比外存要快得多,如此实现更高效的处理进程的工作原理指令的工作原理从X=X+1大致看一下指令的执行过程指令的工作基于地址。每个地址对应一个数据的存储单元。逻辑地址(相对地址)vs物理地址(绝对地址)从写程序到程序运行—编译、链接、装入不修改装入模块中的指令地址就直接装入内存的话:也就是说只有当装入模块使用的内存从#0开始时,不修改装入模块中的指令地址才能行得通装入的三种方式绝对装入 这也叫就意味着这个程序

内存的基础知识
什么是内存

因为cpu的处理速度很快,而外存的读取速度又很慢,所以我们就需要先加载到内存中,内存的读取速度比外存要快得多,如此实现更高效的处理

进程的工作原理
指令的工作原理
从X=X+1大致看一下指令的执行过程

指令的工作基于地址。每个地址对应一个数据的存储单元。

逻辑地址(相对地址)vs物理地址(绝对地址)

从写程序到程序运行—编译、链接、装入

不修改装入模块中的指令地址就直接装入内存的话:

也就是说只有当装入模块使用的内存从#0开始时,不修改装入模块中的指令地址才能行得通

装入的三种方式
绝对装入

这也叫就意味着这个程序换一台就不能运行了,此方式灵活性较低

静态重定位

动态重定位

链接的三种方式
首先我们了解一下什么是链接:

程序的链接阶段主要做了以下几件事:

符号解析:将各个模块中使用的符号(函数名、全局变量名等)替换为实际的地址。例如如果模块A调用模块B的函数foo(),那么链接器会找到模块B中foo()的实际地址,并在模块A的调用指令中填入那个地址。
重定位:修改程序中用到的地址,以适应最终的加载地址。例如模块A中有一个data段从0x1000开始,模块B有一个data段从0x2000开始。那么链接器可能决定模块A加载到0x5000,模块B加载到0x6000。这时候链接器需要修改模块A中所有0x1000的地址为0x5000,修改模块B中的0x2000为0x6000。
解决外部符号:如果有模块调用了未定义的外部符号(例如调用了标准库函数),那么链接器需要链接适当的库来满足这些外部需求。
重复符号处理:如果有多个模块定义了相同的符号,链接器需要决定使用哪一个,并可能报错。
生成输出文件:链接的最后,链接器会将所有输入的目标文件组合成一个输出文件(可执行文件或共享库)。这个输出文件就包含了所有符号解析、重定位等处理的结果。
所以简单来说,链接的作用是将多个目标模块组合为一个连贯的程序,使其可以顺利执行或被其他程序使用。它解决了跨模块的符号引用和地址变化等问题,并生成最终的输出文件。

静态链接

装入时动态链接

运行时动态链接

我们总结一下这一章:

什么是内存管理?
内存空间的分配与回收

内存空间的扩展(实现虚拟性)

地址转换

地址转换三种方式

内存保护

内存保护的两种方式

最后我们总结一下这一章:

覆盖与交换技术

覆盖技术

交换技术

复习一下进程调度

最后我们总结一下这一章:

内存的分配与回收

单一连续分配

固定分区分配

分区说明表

动态分区分配(可变分区分配)

系统要用怎样的数据结构记录内存的使用情况呢?

当多个空闲分区都能满足要求时,应该选择哪个分区进行分配?

如何进行分区的分配?

如何进行分区的回收?

内部碎片与外部碎片

最后总结一下本章内容:

动态分区分配算法

首次适应算法

最佳适应算法

最坏(大)适应算法

临近适应算法

四种算法归纳比较

分页存储

基本分页存储管理的思想

分页存储管理的重要概念

如何实现地址的转换

如何计算页号和页偏移量

为什么页面大小一般设为2的整数次幂?

分页存储的逻辑结构

如何知道页面在内存中的起始地址?

最后我们总结一下这一章的内容:

分页存储管理的基本地址变换结构

页表寄存器

例题:

对页表项大小的进一步讨论

总结一下:

快表的地址变换结构
我们前面说了分页存储管理的基本地址变换结构,这一章是对基本地址变换结构的改进版。

什么是快表

能否把整个页表都放在TLB中?

局部性原理引入快表机制

引入快表后,地址的变换过程
一个例图了解基于快表的地址变换结构

引入快表后,地址变换的过程的文字描述:

基本地址变换与快表地址变换的比较

二级页表
为什么引入二级页表?
因为单级页表存在一些问题,所以引入二级页表和多级页表,有两个问题:

二级页表的原理和地址结构
对页表再次分组

二级页表的地址结构及对应关系

如何实现二级页表的地址变换?

上面的部分我们解决了问题一,接下来是问题二,这里简单叙述一下,后面的文章会继续深入剖析。

几个小细节

最后总结一下:

基本分段存储管理

什么是分段?

分段的逻辑地址结构

段表

地址变换

分段、分页管理的对比

分段实现信息共享共享

为什么分页不方便实现信息共享和保护?

分段比分页更容易实现信息共享的原因主要有:

分段的地址空间是逻辑地址空间,与物理地址空间分离。每个段都有一个段表,映射逻辑地址到物理地址。这个映射可以在不同的进程中共享,所以多个进程可以共享同一个段。
分段允许段重叠,不同进程可以共享某些段。而分页的页映射通常是唯一的,不允许重叠,所以难以直接在地址空间中共享页面。
分段的粒度较大,通常是一个函数、数据结构等,更适合作为共享单元。而分页的页大小较小,不太方便作为共享信息的基本单元。
分段可以实现共享只读段,多个进程只读访问同一段,而分页实现只读共享页较为困难。
具体例子:

共享程序代码段:多个进程可以共享只读的代码段,从而减少内存占用。
共享库段:多个进程可以共享动态链接库的代码和数据段。
共享数据段:多个进程共享只读数据段,如常量数据。
堆栈段不共享:每个进程有自己的唯一堆栈段。
相比而言,分页实现共享信息较为困难,通常需要更复杂的机制,如复制现有的共享页等,比较低效。所以,总体来说,分段更容易高效实现信息共享。

最后总结一下:

段页式存储管理

分页、分段的优缺点分析

分段+分页=段页式管理

段页式管理的逻辑地址结构

段页式存储的段表、页表

段页式管理的地址转换过程

最后总结一下:

虚拟内存

传统存储管理的特征、缺点

局部性原理

虚拟内存的定义和特征

如何实现虚拟内存技术

最后总结一下:

请求分页管理方式

页表机制—请求页表与基本页表的区别

缺页中断机构

地址变换机构

最后总结一下:

页面置换算法

最佳置换算法—OPT

先进先出置换算法—FIFO

最近最久未使用置换算法—LRU

时钟置换算法—CLOCK

改造型时钟置换算法
只需一轮

需要两轮

需要三轮:

需要四轮

总结:

页面分配策略

驻留集

驻留集(Resident Set)是操作系统管理内存的一个重要概念。它指的是一个进程当前占用的内存页面集合。

当一个进程运行时,它需要从辅助存储器(如硬盘)将代码和数据读入内存。不可能将整个进程的所有代码和数据都读入内存,因为内存有限。所以,操作系统会根据一定的页面置换算法(如LRU),选择将一些页面驻留在内存中,这些驻留在内存中的页面集合就是驻留集。

驻留集是描述一个进程运行时实际占用内存的页面集合,它的大小和内容随着进程的运行而动态变化,密切相关到操作系统的内存管理和进程调度。

页面分配、置换策略

固定分配局部置换、可变分配局部置换、可变分配全局置换

何时调入页面?

从何处调页?

抖动(颠簸)现象

工作集
工作集(Working Set)是操作系统内存管理的一个重要概念,与驻留集相类似,但有一定区别。

工作集指的是进程在最近一段时间内实际访问的页面集合。它表示进程近期的内存访问局部性,通过工作集的大小可以反映出进程最近一段时间的内存使用情况和访问模式。

操作系统通过定期统计每个进程的工作集,来发现进程的内存访问模式的变化。当工作集大小发生较大变化时,说明进程的内存访问模式可能已发生改变,这时操作系统会相应地调整进程的驻留集,以适应新的工作集大小和访问模式。

工作集与驻留集的主要区别在于:

工作集反映的是进程最近一段时间的内存访问情况,它是短期的和动态变化的。而驻留集表示进程当前占用的内存,它由工作集演变而来,相对而言是较长期和稳定的。
工作集的页面可能没有全部驻留在内存,而驻留集中的页面全部在内存中。工作集只是访问的页面集合,不代表这些页面实际驻留在内存。
操作系统不直接管理工作集的大小,它通过STATISTICS得到工作集信息,并据此调整驻留集。而驻留集的大小由操作系统的页面置换算法直接管理。
工作集用于发现进程内存访问模式的变化,指导驻留集的调整,而驻留集直接影响进程的运行效率。
总之,工作集和驻留集都描述进程占用和访问的内存,但工作集更注重内存访问模式,用于发现进程内存模式的变化;而驻留集直接影响进程运行,由操作系统根据工作集信息加以管理。两者互为依存,共同服务于操作系统的内存管理。

总结:

————————————————
版权声明:本文为CSDN博主「十八岁讨厌编程」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zyb18507175502/article/details/130643126

目录
相关文章
|
2天前
|
物联网 云计算
操作系统中的内存管理技术解析
【7月更文挑战第13天】本文将深入探讨操作系统中至关重要的内存管理技术,包括虚拟内存、分页和分段机制等核心概念。我们将从内存管理的基本原理出发,逐步过渡到高级技术如交换空间和文件映射,最后讨论现代操作系统中内存管理面临的挑战与未来发展方向。文章旨在为读者提供对操作系统内存管理全面而深入的理解。
14 7
|
1天前
|
缓存 算法 程序员
深入理解操作系统中的虚拟内存管理
【7月更文挑战第14天】本文将深入探讨操作系统中至关重要的组成部分——虚拟内存管理。通过分析其设计原理、实现机制以及性能优化策略,旨在为读者提供一个全面而深入的视角来理解虚拟内存在现代操作系统中的作用和重要性。文章不仅会涵盖虚拟内存的基本概念和功能,还会讨论其在多任务处理、内存保护及系统性能提升方面的贡献。
|
3天前
|
存储 算法 调度
深入理解操作系统的内存管理机制
【7月更文挑战第12天】本文将深入探讨操作系统中至关重要的内存管理机制。内存是计算机系统中宝贵的资源,其管理效率直接影响系统性能。我们将从内存管理的基本原理出发,逐步解析分页和分段技术、虚拟内存的概念以及内存分配策略等核心内容。通过实例分析,揭示现代操作系统如何优化内存使用,提高系统响应速度及资源利用效率。
|
2天前
|
存储 缓存 算法
操作系统中的内存管理机制探究
【7月更文挑战第13天】本文深入探讨了操作系统中至关重要的内存管理机制,揭示了其对系统性能与稳定性的影响。通过分析现代操作系统中内存管理的基本原理、关键技术以及面临的挑战,文章提供了对内存分配策略、虚拟内存技术和缓存管理等核心概念的深度解析。进一步地,文章讨论了内存泄漏和碎片化问题,提出了相应的解决策略,旨在为读者提供操作系统内存管理的全面视角,并指出未来可能的发展趋势。
|
4天前
|
缓存 监控 关系型数据库
深入理解Linux操作系统的内存管理机制
【7月更文挑战第11天】在数字时代的浪潮中,Linux操作系统凭借其强大的功能和灵活性,成为了服务器、云计算以及嵌入式系统等领域的首选平台。内存管理作为操作系统的核心组成部分,对于系统的性能和稳定性有着至关重要的影响。本文将深入探讨Linux内存管理的基本原理、关键技术以及性能优化策略,旨在为读者提供一个全面而深入的理解视角,帮助开发者和系统管理员更好地优化和管理Linux系统。
|
4天前
|
算法 Linux 调度
操作系统中的虚拟内存管理:原理与实现
本文深入探讨了操作系统中虚拟内存管理的核心概念,包括分页、分段、需求分页和页面置换算法。通过分析现代操作系统如Linux和Windows的虚拟内存实现机制,文章揭示了虚拟内存在提升内存利用率、进程隔离和保护内存中的关键作用。同时,讨论了虚拟内存管理面临的挑战,如内存泄漏、碎片化以及性能开销,并提出了相应的优化策略。
|
5天前
|
算法 安全 调度
深入理解操作系统:进程调度与内存管理
【7月更文挑战第10天】本文将深入探讨操作系统的核心机制,即进程调度和内存管理。我们将从理论和实践的角度出发,解释这些机制如何影响系统性能和用户体验。通过分析不同的调度算法和内存分配策略,我们旨在揭示操作系统设计背后的复杂性和精妙之处。
|
8天前
|
存储 算法 数据处理
深入理解操作系统之内存管理机制
【7月更文挑战第7天】本文旨在探讨操作系统中的内存管理机制,揭示其对现代计算机系统性能和稳定性的关键影响。我们将从内存管理的基础知识出发,逐步深入到高级概念如虚拟内存、分页和分段等技术,并讨论内存泄漏、碎片化及其解决方案。通过理论与实践的结合,读者将获得对操作系统内存管理机制的全面认识,并了解其在提升系统效率和资源利用方面的重要性。
|
11天前
|
算法 UED
深入理解操作系统:虚拟内存管理机制
【7月更文挑战第4天】在数字时代的浪潮中,操作系统的虚拟内存管理机制如同一座精巧的时间桥梁,连接着有限的物理资源与无限的程序需求。本文将揭开这座桥梁的秘密,从虚拟内存的基本概念出发,逐步深入到页面置换算法的世界,探讨它们如何影响系统性能和用户体验。通过对比分析不同的页面置换策略,我们旨在为读者提供一种全新的视角,以理解和评估现代操作系统中这一至关重要的功能。
14 1
|
3天前
|
存储 监控 安全
探索现代操作系统中的内存管理技术
【7月更文挑战第12天】在数字世界的心脏,操作系统扮演着至关重要的角色。本文将深入探讨内存管理技术,这一操作系统中的核心组件。我们将从基础的内存结构入手,逐步解析虚拟内存、分页和分段等高级概念。文章旨在为读者提供一个清晰的内存管理机制视图,并讨论其在性能优化和系统安全中的应用。通过分析现代操作系统如Linux和Windows的内存管理策略,我们可以更好地理解这些复杂系统的内部工作原理及其对计算领域的影响。