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应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
目录
相关文章
|
1月前
|
缓存 Linux
linux 手动释放内存
在 Linux 系统中,内存管理通常自动处理,但业务繁忙时缓存占用过多可能导致内存不足,影响性能。此时可在业务闲时手动释放内存。
118 17
|
3月前
|
监控 Linux
如何检查 Linux 内存使用量是否耗尽?这 5 个命令堪称绝了!
本文介绍了在Linux系统中检查内存使用情况的5个常用命令:`free`、`top`、`vmstat`、`pidstat` 和 `/proc/meminfo` 文件,帮助用户准确监控内存状态,确保系统稳定运行。
1193 6
|
21天前
|
消息中间件 Linux
Linux中的System V通信标准--共享内存、消息队列以及信号量
希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。
111 48
|
2天前
|
缓存 NoSQL Linux
Linux系统内存使用优化技巧
交换空间(Swap)的优化 禁用 Swap sudo swapoff -a 作用:这个命令会禁用系统中所有的 Swap 空间。swapoff 命令用于关闭 Swap 空间,-a 参数表示关闭 /etc/fstab 文件中配置的所有 Swap 空间。 使用场景:在高性能应用场景下,比如数据库服务器或高性能计算服务器,禁用 Swap 可以减少磁盘 I/O,提高系统性能。
20 3
|
2天前
|
缓存 Linux
Linux查看内存命令
1. free free命令是最常用的查看内存使用情况的命令。它显示系统的总内存、已使用内存、空闲内存和交换内存的总量。 free -h • -h 选项:以易读的格式(如GB、MB)显示内存大小。 输出示例: total used free shared buff/cache available Mem: 15Gi 4.7Gi 4.1Gi 288Mi 6.6Gi 9.9Gi Swap: 2.0Gi 0B 2.0Gi • to
14 2
|
1月前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
147 20
|
5月前
|
安全 Linux Shell
Linux上执行内存中的脚本和程序
【9月更文挑战第3天】在 Linux 系统中,可以通过多种方式执行内存中的脚本和程序:一是使用 `eval` 命令直接执行内存中的脚本内容;二是利用管道将脚本内容传递给 `bash` 解释器执行;三是将编译好的程序复制到 `/dev/shm` 并执行。这些方法虽便捷,但也需谨慎操作以避免安全风险。
277 6
|
3月前
|
Linux
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
479 58
|
3月前
|
缓存 Java Linux
如何解决 Linux 系统中内存使用量耗尽的问题?
如何解决 Linux 系统中内存使用量耗尽的问题?
313 48
|
2月前
|
算法 Linux
深入探索Linux内核的内存管理机制
本文旨在为读者提供对Linux操作系统内核中内存管理机制的深入理解。通过探讨Linux内核如何高效地分配、回收和优化内存资源,我们揭示了这一复杂系统背后的原理及其对系统性能的影响。不同于常规的摘要,本文将直接进入主题,不包含背景信息或研究目的等标准部分,而是专注于技术细节和实际操作。