5885 字
29 分钟
内存管理

内存管理的重要性和目标#

1. 内存管理是什么#

1 1 1 1 1 内存管理 是计算机系统中 非常重要的一个方面,它负责管理计算机的内存资源,确保计算机可以高效的运行 各种程序和任务。内存管理的主要目标是 优化内存的使用,提高系统的性能和稳定性。

2. 内存管理的重要性和目标#

有6点,内容分别是什么 1 1 1 1 1 提高系统性能,确保程序运行稳定,实现公平的内存分配,内存保护,虚拟内存管理,内存碎片整理

1.提高系统性能: 内存管理可以确保系统中的内存资源被充分利用,避免出现内存浪费,从而提高系统的整体性能。当系统内存不足时,程序可能会变得缓慢或崩溃,因此合理分配和释放内存对于确保系统的高性能至关重要。

2.确保程序运行稳定: 不当的内存管理可能导致内存泄漏(Memory Leak)或内存溢出(Memory Overflow),这些问题会导致程序崩溃或不稳定。通过有效的管理内存,可以避免这些问题,并提高程序的稳定性。

3.实现公平的内存分配: 在多任务操作系统中,内存管理需要公平的为各个进程或任务分配内存资源,以确保每个任务都能获得足够的内存以完成其工作。

4.内存保护: 内存管理可以实现内存保护机制,确保一个程序无法访问其他程序的内存空间,从而增加系统的安全性

5.虚拟内存管理: 虚拟内存是一种内存管理技术,它允许程序访问比物理内存更大的内存空间,使得程序可以处理比实际物理内存更大的数据。虚拟内存管理可以提高系统的灵活性和效率

6.内存碎片整理: 内存分配和释放会导致内存碎片化,留下许多不连读的小块空闲内存。内存管理需要定期进行内存碎片整理,以合并和重组这些碎片,使得更大的连续内存块可以被分配给需要的程序

总结: 总的来说,内存管理是操作系统和计算机体系结构的核心组成部分,它直接影响计算机系统的性能、稳定性和安全性。有效的内存管理可以使计算机系统更高效的运行各种任务,并提供更好的用户体验

物理内存与虚拟内存#

3. 什么是物理内存#

1 1 1 1 1 物理内存是计算机实际存在的硬件内存,也称为主存或实存。它是由随机存取存储器(RAM)模块组成,用于存储当前运行的程序和数据。在物理内存中,数据可以直接被处理器(CPU)访问和操作。物理内存的大小通常是固定的,由计算机硬件决定,并且访问速度相对较快,因为它直接与处理器之间进行数据交换。然而,物理内存的大小有限,当运行的程序或任务需要的内存超过物理内存的大小时,可能会导致系统性能下降或程序崩溃。为了解决这个问题,虚拟内存被引入。

4. 什么是虚拟内存#

1 1 1 1 1 虚拟内存时一种抽象的内存概念,它扩展了物理内存的大小,允许程序访问比物理内存更大的内存空间。虚拟内存通过使用磁盘空间作为辅助存储,将物理内存中暂时不需要的数据交换到磁盘上,以释放出更多的物理内存供其他程序使用。

虚拟内存管理由操作系统负责,它将程序的虚拟地址映射到物理地址,使得程序在执行时感觉自己拥有连续的内存空间,而不用关心实际的物理内存大小。如果程序访问了虚拟内存中的某个页面,而该页面当前不在物理内存中,则操作系统会将对应的页面从磁盘加载到物理内存中,以满足程序的需求。

虚拟内存的使用允许更大的程序运行,并提供更好的内存管理和保护机制。它还能在不同程序之间提供隔离,使得每个程序运行在独立的虚拟地址空间,增加了系统的稳定性和安全性。

5. 物理内存与虚拟内存的总结#

物理内存是实际存在的硬件内存,直接与处理器交互,其大小有限。虚拟内存是通过使用磁盘空间扩展物理内存,为程序提供更大的地址空间和更灵活的内存管理机制。虚拟内存由操作系统管理,是一种重要的内存管理技术,提高了系统的效率和稳定性。

内核空间与用户空间#

6. 为什么要区分出内核空间和用户空间#

1 1 1 1 1 在操作系统中,内核空间(Kernel Space)和用户空间(User Space)是两种不同的内存区域,用于区分操作系统内核的执行环境和应用程序的执行环境。

7. 请详细介绍一下内核空间#

1 1 1 1 1 内核空间(Kernel Space) 内核空间是操作系统内核运行的区域,其中包含操作系统的核心代码和数据结构。在内核空间中,操作系统拥有对计算机硬件的直接访问权限,可以执行特权指令和访问受保护的硬件资源。这是因为内核空间的代码运行在特权级别最高的特权级(Ring 0),也称为内核模式。

操作系统内核负责管理系统的各种硬件和软件资源,提供各种服务和功能,如进程管理、内存管理、文件系统、设备驱动程序等。因为内核空间具有最高的特权级别,所以操作系统要非常谨慎的对待内核空间中的代码,以防止安全漏洞和系统崩溃。

8. 请详细介绍一下用户空间#

1 1 1 1 1 用户空间(User Space) 用户空间是供应用程序运行的区域,其中包含用户编写的应用程序代码和数据。在用户空间中,应用程序不能直接访问操作系统内核或特权指令,他们运行在较低的特权级别(通常是Ring 3),也称为用户模式。

应用程序在用户空间中运行,通过系统调用(System Call)来请求操作系统提供特权操作,例如文件读写、网络通信、进程创建等。系统调用是一种将控制权从用户空间切换到内核空间的方式,以便在受控环境下执行特定的操作。

一个重要的优势是,用户空间的应用程序运行在较低的特权级别,这意味着即使应用程序出现问题,比如崩溃或错误,通常不会影响整个操作系统的稳定性。操作系统 通过 严格控制用户空间的访问权限 来确保安全性和稳定性。

9. 内核空间与用户空间的总结#

1 1 1 1 1 内核空间是操作系统内核运行的高特权区域,用于管理系统资源和提供核心服务。用户空间是供应用程序运行的低特权区域,其中应用程序 通过系统调用 来请求操作系统的服务。这种区分 确保了操作系统的 稳定性和安全性,并使得应用程序 无法直接访问敏感资源或执行特权操作。

MMU内存管理单元#

10. 什么是MMU#

1 1 1 1 1 MMU是内存管理单元(Memory Management Unit)的缩写,是计算机体系结构中的 一个硬件组件或子系统,他是现代计算机系统中 用于实现虚拟内存的 关键组成部分。

11. MMU的作用#

1 1 1 1 1 MMU负责将 程序使用的虚拟地址(也成为逻辑地址) 转换为对应的物理地址,从而实现 虚拟内存的功能。虚拟内存是一种抽象的内存概念,它允许程序访问 比物理内存更大的内存空间,使得每个程序 都认为它具有连续的内存空间,而不需要关心 实际物理内存的大小和分布。

12. MMU的主要功能#

主要功能有5点,具体内容分别是什么 1 1 1 1 1 1.虚拟内存管理: MMU实现了虚拟内存的概念,允许每个进程在其自己的虚拟地址空间中运行,而不需要关心实际的物理内存布局。通过地址转换,MMU将程序使用的虚拟地址 转换为对应的物理地址,从而使得 每个进程认为它 具有连续的内存空间。

2.地址转换: MMU将程序中使用的虚拟地址转换为物理地址。这个转换是通过使用页表(Page Table)或页表树(Page Table Tree)数据结构来实现的。页表是一个映射虚拟页号和物理页号的数据结构,当程序访问虚拟地址时,MMU会根据页表中的映射关系 将虚拟地址转换为相应的物理地址。

3.虚拟内存保护: MMU通过检查访问权限位 来实现虚拟内存的保护机制。每个页表条目中都包含访问权限位,用于控制页面的读、写、执行等操作权限。这样,如果程序 试图访问未分配的内存或越界访问,MMU会检测到权限问题并引发异常,从而保护系统的稳定性和安全性。

4.缓存: MMU还负责缓存最近使用的页表条目,来加快地址转换的速度。由于页表可能很大,缓存页表条目 可以避免 每次地址转换都要访问主内存。

5.大页支持: 现代的MMU通常支持大页(例如2MB或4MB),这种大页可以降低页表的大小、降低访问次数,从而提高地址转换的效率。

13. MMU总结#

1 1 1 1 1 MMU是计算机体系结构的重要组成部分,它在操作系统和硬件之间建立了桥梁,实现了虚拟内存管理,从而提高了系统的效率、灵活性、稳定性。在现代计算机系统中,几乎所有的操作系统和处理器都支持MMU技术。

虚拟内存管理分页机制#

14. 虚拟内存管理分页机制的概念#

1 1 1 1 1 虚拟内存管理的分页机制是一种内存管理技术,它将虚拟地址空间和物理地址空间划分为固定大小的页面(或称页框),以实现虚拟内存的功能。

15. 虚拟内存管理分页机制的主要步骤#

请简要介绍虚拟内存管理分页机制的主要步骤及其原理 1 1 1 1 1 1.分页大小: 首先,虚拟内存管理需要确定分页大小,通常为4KB或更大。这意味着虚拟地址空间和物理地址空间 被划分成大小为4KB的页。

2.页表: 每个进程都有自己的页表,页表是一个数据结构,用于记录虚拟页面和对应物理界面之间的映射关系。在虚拟内存管理中,进程的页表用于 虚拟地址映射到物理地址。

3.地址转换: 当进程访问虚拟地址时,虚拟内存管理通过页表执行地址转换,将虚拟地址的高位部分(页号)用于查找页表 来找到对应的物理页号。然后,将虚拟地址的低位部分(页内偏移)与物理页号组合,得到实际的物理地址。

4.缺页异常: 如果 访问的虚拟页面 在页表中没有找到对应的映射关系,就会发生缺页异常。此时,操作系统会介入,查找该虚拟页面的数据或代码,将其从磁盘加载到一个空闲的物理页面,并更新页表,建立 从虚拟页面到物理页面的映射关系。这样,进程可以继续执行,并重新访问之前 缺失的虚拟页面。

5.页面置换: 当物理内存空间 不足以容纳所有活动的虚拟页面时,虚拟内存管理需要选择一些页面 换出到磁盘上 来释放出物理内存空间。常见的页面置换算法包括最近最少使用(LRU)、先进先出(FIFO)等。

16. 虚拟内存管理分页机制的作用#

1 1 1 1 1 虚拟内存管理分页机制 使得每个进程都认为 自己有连续的地址空间,并且不需要担心实际物理内存的大小。这种技术 允许在多个进程之间 共享物理内存,提高了内存的利用率,并且为操作系统提供了 更好的内存管理和保护机制

页表和页表项#

17. 页表和页表项概念的前提是使用什么技术#

1 1 1 1 1 计算机系统使用虚拟内存管理分页机制时

18. 页表的组织方式#

1 1 1 1 1 页表(Page Table) 页表是一个数据结构,它由多个==页表项==组成,用于建立虚拟地址与物理地址之间的映射关系,虚拟地址空间被划分为固定大小的页,例如4KB大小的页。页表中每个==页表项对应一个虚拟页面==,记录该虚拟页面映射到的物理页面。在虚拟内存管理中,每个进程都有自己的页表,这样不同的进程可以有相同的虚拟地址,因为使用不同的页表,所以它们会映射到不同的物理地址

19. 页表项的组织方式#

1 1 1 1 1 页表项(Page Table Entry) 页表项是页表中的一个单元,每个页表项记录了 一个虚拟页面与对应物理页面之间的映射关系。虚拟地址的==高位部分==(==通常称为虚拟页面号,VPN==) 用于 在页表中查找对应的页表项。

【存在疑问的内容,没有确定对不对】 每个页表项包含多个字段,页表项至少由一个有效位(valid bit)和一个N位地址字段(PFN)组成

20. 页表项的常见字段有哪些#

常见的有5个字段,请简要的介绍一下这五个字段 1 1 1 1 1 1.物理页面号(PPN:Physical Page Frame Number) 表示虚拟页面映射到的对应物理页面的编号

2.有效位(Valid Bit) 简单的理解 就是表示映射是否有效(1表示有效,0表示无效),如果页面当前不在内存中(被置换出去了或尚未加载),该位将被设置为0

  • 有效位为1,地址字段指向 该虚拟页对应的物理页 在内存中的起始位置
  • 有效位为0且地址字段为空时,表明该虚拟页表还没有被分配
  • 有效位为0且地址字段不为空,表明该虚拟页还在磁盘上,会指向磁盘中的起始位置

3.脏位(Dirty Bit) 表示页面 自从最后一次加载到内存以来 是否被修改过(写入),如果页面被修改过,需要在被置换出内存之前 将其写回磁盘

4.访问位(Accessed Bit) 表示页面 自从最后一次加载到内存以来 是否被访问过(读取或写入),当页面被访问时,硬件会自动设置该位

5.权限位 表示页面的访问权限(例如读、写、执行等)

21. 什么时候会用到多级页表#

1 1 1 1 1 对于大型虚拟地址空间,页表可能会非常大,占用大量内存,为了减少内存开销,可以采用多级页表的方式来组织页表。例如,可以使用二级页表或三级页表

22. 请简单的介绍一下在多级页表中页表级数的使用方式以及多级页表的作用#

1 1 1 1 1 在多级页表中,虚拟地址的高位部分 先用于查找第一级页表的页表项,然后再用于查找第二级页表的页表项,以此类推,直到找到最终的页表项 多级页表可以有效的减少每级页表的大小,从而节省内存空间

23. 虚拟内存分页机制与页表、页表项的关系#

1 1 1 1 1 虚拟内存管理分页机制 使用页表和页表项实现 虚拟地址到对应物理地址的映射

虚拟内存管理通过页表和页表项的转换,使得每个进程认为自己有连续的地址空间,并提供地址空间隔离、虚拟内存保护、页面置换等功能,提高了计算机系统的灵活性和效率

虚拟地址转换为物理地址#

24.请说明一下虚拟地址的内容#

1 1 1 1 1 一个n位的虚拟地址包含两部分:一个p位的虚拟页面偏移(VPO)和一个(n-p)位的虚拟页面号(VPN),其中高位是虚拟页面号(VPN),低位是虚拟页面偏移(VPO)。

25. 内存管理单元MMU如何得到物理地址的#

MMU(内存管理单元 Memory Management Unit)正是利用了虚拟页面号(VPN)来选择合适的页表项(PTE:Page Table Entry),然后将页表项(PTE)中的物理页面号(PPN)和虚拟页面偏移(VPO)串联起来,就得到了实际的物理地址 具体实现思路如下图。

26. 请举例说明虚拟地址如何转换为物理地址#

假如我们有一个虚拟地址空间和物理地址空间的大小都是4KB(4*1024字节),并且采用4KB的页面大小。我们使用单级页表(单一的页表,没有多级结构),其中每个页表项的大小为4字节

假设页表有以下内容(以十六进制表示): 虚拟页面号对应的物理页面号

虚拟页面号(VPN)物理页面号(PPN)
0x00000x1000
0x00010x2000
0x00020x3000
现在我们要将虚拟地址0x0001转换为物理地址
分3步
1
1
1
1
1
1.分解虚拟地址
虚拟地址0x0001的二进制表示为 0000 0000 0000 0001,其中前12位(==低位==)表示页偏移(偏移量),用于访问页面内部的具体位置。接下来的12位(==高位==)表示虚拟页面号(VPN),用于查找对应的页表项

【注意】 虚拟地址的位数硬背吧,看不懂 【扩展】 虚拟地址共有几位? ==24位==,存储器按字节编址,虚拟地址空间大小为16MB=224B,故虚拟地址为24位 页面大小为4KB=212B,故高12位为虚页号 主存地址空间大小为1MB=220B,故物理地址为20位 由于页内地址为12位,故高8位为页框号

2.查找页表项 我们使用虚拟页面号(VPN)0x0001查找页表,找到对应的页表项为0x2000

3.转换为物理地址 在页表项找到物理页面号(PPN)0x2000,将其与虚拟地址的页偏移(VPO)组合,得到物理地址为0x2000+00000001(页偏移)=0x2001

因此,虚拟地址0x0001经过MMU的处理,转换为物理地址0x2001。MMU根据页表中的映射关系,将虚拟地址的虚拟页面号转换为物理页面号,并加上页偏移得到最终的物理地址

Linux进程的地址空间布局,包括代码段、数据段、堆、栈等#

27. 请简单的介绍一下Linux进程的地址空间布局是什么#

1 1 1 1 1 Linux进程的地址空间布局是指 进程在虚拟内存中的地址分配情况。 Linux采用分段和分页机制,将进程的虚拟地址空间 划分为不同的段和页,用于存放不同类型的数据和代码

28. Linux进程的典型地址空间布局内容有哪些#

6点 1 1 1 1 1 1.代码段(Text Segment) 代码段用于存放程序的可执行命令,通常是程序的二进制代码,它是只读的,因为程序的代码一般不会被修改 代码段通常 位于虚拟地址的低地址部分,方便程序的执行

2.数据段(Data Segment) 数据段包含全局变量、静态变量、初始化的数据 在C语言中,全局变量和静态变量存放在数据段中,数据段是可读写的,允许对其中的数据进行读取和修改

3.BSS段 BSS(Block Started by Symbol)段也是数据段的一部分,用于存放未初始化的全局变量和静态变量,这些变量在程序启动时 会被自动初始化成0或空值,BSS段通常位于数据段的后面

4.堆(Heap) 堆用于动态内存分配,就是在程序运行时 根据需要 动态的分配内存,堆的大小不是固定的,堆可以根据应用程序的需求 动态增长或缩小,通常,堆的起始地址位于BSS段的末尾,并向高地址方向增长

5.栈(Stack) 栈用于存放:函数调用时的局部变量、函数参数、返回地址等。栈是一种后进先出(LIFO)的数据结构,每次函数调用时,会在栈上分配一块内存,用于存放当前函数的局部变量,栈的大小是有限的,并且在程序运行时 是自动增长和缩减的,栈通常位于虚拟地址的高地址部分

6.内核空间(Kernel Space) 内核空间用于存放操作系统内核的代码和数据,用户态的进程无法直接访问内核空间,所有对内核功能的访问 都需要通过系统调用来进行,内核空间通常位于虚拟地址的最高部分,地址空间的最后一部分留给内核使用

29. Linux进程地址空间布局的作用#

1 1 1 1 1 通过合理的划分和管理地址空间,Linux系统可以实现 多个进程的独立运行和地址空间隔离

内存管理
https://fuwari.cbba.top/posts/内存管理/
作者
Chen_Feng
发布于
2023-08-21
许可协议
CC BY-NC-SA 4.0