Linux内存管理

本文涉及的产品
公网NAT网关,每月750个小时 15CU
简介: Linux内存管理

Linux中的程序都是在进程中执行的,而每个进程都有自己的虚拟地址空间,进程中的内存操作,比如访问,插入数据都是在这块虚拟地址空间上操作的。

虚拟地址空间

虚拟地址空间是一个进程所使用的虚拟内存地址的集合,每个进程都有自己独立的虚拟地址空间。

虚拟地址空间由操作系统管理,可以分为多个部分,如代码段、数据段、堆栈等。

程序员在编写代码时可以使用虚拟地址,而不必考虑物理内存的实际位置。

当程序被执行时,操作系统将虚拟地址转换为物理地址,以便访问实际内存。

虚拟地址空间的好处是可以让多个进程共享同一份代码,同时还能够保护进程间的内存访问,增强系统的安全性和稳定性。

虚拟地址空间的功能

内存隔离:进程A可以在其虚拟地址空间中创建一个大型数组,而不会干扰其他进程的内存。进程B也可以创建一个相同大小的数组,但它在自己的虚拟地址空间中,两个进程的数组相互隔离。同一个线程组的用户线程共享用户虚拟地址空间,内核线程没有用户虚拟地址空间。

内存映射:当进程A访问其虚拟地址空间中的数组元素时,操作系统将虚拟地址映射到物理内存中相应的地址。例如,虚拟地址0x1000可能映射到物理内存地址0x4000。进程A无需知道具体的物理内存地址,只需要通过虚拟地址访问数组。这里需要用到内存管理单元中的页表缓存部件中的页表映射,将虚拟地址转换为物理地址。而页表映射就是通过页表项实现的,可以将页和对应物理地址对应起来。

虚拟内存管理:虚拟内存管理:假设数组的大小超过了可用的物理内存大小。在这种情况下,操作系统可以将虚拟地址空间中未被使用的部分保存在磁盘上的交换文件中。当进程A需要访问被交换出的数据时,操作系统会将其重新加载到物理内存中,这样进程A可以继续访问它。通过这种虚拟内存管理技术,进程A可以使用比物理内存更大的地址空间。

内存保护:操作系统可以为进程A的虚拟地址空间设置访问权限。例如,操作系统可以将数组的某个区域设置为只读,以防止进程A在不经过授权的情况下修改数据。这提供了一定的安全性和数据完整性保护。

虚拟内存

虚拟内存更多被定义为一项操作系统的内存管理技术,它将虚拟地址空间和物理内存结合起来,扩展了可用的内存空间。虚拟内存将虚拟地址空间中的部分数据暂时保存在硬盘上的交换文件中,而不是全部存储在物理内存中。这样,即使实际的物理内存有限,进程仍然可以访问大于物理内存大小的数据。

物理内存

物理内存是计算机中实际存在的内存,也称为硬件内存或主存储器。它是由芯片组成的硬件设备,用于存储正在运行的程序和数据。计算机需要将数据从硬盘等外部存储设备读取到物理内存中,才能通过CPU进行处理和操作。物理内存的大小直接影响计算机的性能和运行速度。

虚拟内存地址空间布局

虚拟内存地址空间又分用户空间和内核空间,其中用户空间是程序员通过代码分配使用,内核空间的使用来源于CPU的调度处理。

1.用户空间

应用程序使用malloc()申请内存,使用free()释放内存,malloc()/free()是glibc 库的内存分配器ptmalloc 提供的接口,ptmalloc 使用系统调用brk/mmap 向内核以页为单位申请内存,然后划分成小内存块分配给用户应用程序。

2.内核空间

内核空间的基本功能:虚拟内存管理负责从进程的虚拟地址空间分配虚拟页,sys_brk 用来扩大或收缩堆,sys_mmap 用来在内存映射区域分配虚拟页,sys_munmap 用来释放虚拟页。

页分配器负责分配物理页,当前使用的页分配器是伙伴分配器。内核空间提供把页划分成小内存块分配的块分配器,提供分配内存的接口kmalloc()和释放内存接口kfree()。块分配器:LAB/SLUB/SLOB。

3.硬件层面

处理器包含一个称为内存管理单元(Memory Management Unit,MMU)的部件,负责把虚拟地址转换成物理地址。内存管理单元包含一个称为页表缓存(Translation Lookaside Buffer,TLB)的部件,保存最近使用的页表映射,避免每次把虚拟地址转换物理地址都需要查询内存中的页表。

用户虚拟地址空间布局

Linux 内核使用内存描述符mm_struct 描述进程的用户虚拟地址空间,每个进程在内核中都有一个对应的mm_struct结构。

mm_struct结构包含了与进程内存管理相关的信息,其中一些重要的字段包括:

  1. pgd:指向进程页表的指针。页表用于将虚拟地址映射到物理地址,pgd存储了页表的基地址。
  2. mmap:链表结构,记录了进程当前所拥有的内存映射区域。每个内存映射区域都包含了起始地址、结束地址、权限标志等信息。
  3. mm_rb:红黑树结构,用于快速查找和管理进程的虚拟地址空间。
    还有代码段、数据段、堆、栈的起始/结束地址等参数成员。

同一个线程组的用户线程共享用户虚拟地址空间,因为线程组是同一个进程的一组线程,他们共享进程资源,比如内存空间、文件描述符等。

内核线程是没有用户虚拟地址空间的,因为内核线程不属于任何用户线程,内核线程是操作系统内核的一部分,它们在内核空间运行,负责处理系统任务和管理硬件资源。只有内核虚拟地址空间,内核虚拟地址空间通常是操作系统的一部分,与用户进程的虚拟地址空间分开管理。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
2月前
|
安全 Linux Shell
Linux上执行内存中的脚本和程序
【9月更文挑战第3天】在 Linux 系统中,可以通过多种方式执行内存中的脚本和程序:一是使用 `eval` 命令直接执行内存中的脚本内容;二是利用管道将脚本内容传递给 `bash` 解释器执行;三是将编译好的程序复制到 `/dev/shm` 并执行。这些方法虽便捷,但也需谨慎操作以避免安全风险。
177 6
|
10天前
|
算法 Linux 开发者
深入探究Linux内核中的内存管理机制
本文旨在对Linux操作系统的内存管理机制进行深入分析,探讨其如何通过高效的内存分配和回收策略来优化系统性能。文章将详细介绍Linux内核中内存管理的关键技术点,包括物理内存与虚拟内存的映射、页面置换算法、以及内存碎片的处理方法等。通过对这些技术点的解析,本文旨在为读者提供一个清晰的Linux内存管理框架,帮助理解其在现代计算环境中的重要性和应用。
|
16天前
|
存储 缓存 监控
|
1月前
|
存储 缓存 监控
Linux中内存和性能问题
【10月更文挑战第5天】
38 4
|
1月前
|
算法 Linux
Linux中内存问题
【10月更文挑战第6天】
41 2
|
13天前
|
缓存 算法 Linux
Linux内核中的内存管理机制深度剖析####
【10月更文挑战第28天】 本文深入探讨了Linux操作系统的心脏——内核,聚焦其内存管理机制的奥秘。不同于传统摘要的概述方式,本文将以一次虚拟的内存分配请求为引子,逐步揭开Linux如何高效、安全地管理着从微小嵌入式设备到庞大数据中心数以千计程序的内存需求。通过这段旅程,读者将直观感受到Linux内存管理的精妙设计与强大能力,以及它是如何在复杂多变的环境中保持系统稳定与性能优化的。 ####
22 0
|
1月前
|
存储 缓存 固态存储
|
1月前
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
46 0
|
3月前
|
Linux 调度
深入理解Linux虚拟内存管理(七)(下)
深入理解Linux虚拟内存管理(七)
67 4
|
3月前
|
存储 Linux 索引
深入理解Linux虚拟内存管理(九)(中)
深入理解Linux虚拟内存管理(九)
36 2