内存学习(四):内存映射4

简介: 内存学习(四):内存映射4

虚拟内存过量提交策略

虚拟内存过量提交,是指所有进程提交的虚拟内存的总和超过物理内存的容量,内存管理子系统支持3种虚拟内存过量提交策略。

  • (1)OVERCOMMIT_GUESS(0):猜测,估算可用内存的数量,因为没法准确计算可用内存的数量,所以说是猜测。
  • (2)OVERCOMMIT_ALWAYS(1):总是允许过量提交。
  • (3)OVERCOMMIT_NEVER(2):不允许过量提交。

默认策略是猜测,用户可以通过文件“/proc/sys/vm/overcommit_memory”修改策略。

在创建新的内存映射时,调用函数**__vm_enough_memory**根据虚拟内存过量提交策略判断内存是否足够,主要代码如下:

mm/util.c
    1   int __vm_enough_memory(struct mm_struct *mm, long pages, int cap_sys_admin)
    2   {
    3    long free, allowed, reserve;
    4    …
    5    if (sysctl_overcommit_memory == OVERCOMMIT_ALWAYS)
    6         return 0;
    7
    8    if (sysctl_overcommit_memory == OVERCOMMIT_GUESS) {
    9         free = global_page_state(NR_FREE_PAGES);
    10        free += global_node_page_state(NR_FILE_PAGES);
    11
    12        free -= global_node_page_state(NR_SHMEM);
    13
    14        free += get_nr_swap_pages();
    15
    16        free += global_page_state(NR_SLAB_RECLAIMABLE);
    17
    18        if (free <= totalreserve_pages)
    19              goto error;
    20        else
    21              free -= totalreserve_pages;
    22
    23        if (! cap_sys_admin)
    24              free -= sysctl_admin_reserve_kbytes >> (PAGE_SHIFT - 10);
    25
    26        if (free > pages)
    27              return 0;
    28
    29        goto error;
    30   }
    31
    32   allowed = vm_commit_limit();
    33
    34   if (! cap_sys_admin)
    35        allowed -= sysctl_admin_reserve_kbytes >> (PAGE_SHIFT - 10);
    36
    37   if (mm) {
    38        reserve = sysctl_user_reserve_kbytes >> (PAGE_SHIFT - 10);
    39        allowed -= min_t(long, mm->total_vm / 32, reserve);
    40   }
    41
    42   if (percpu_counter_read_positive(&vm_committed_as) < allowed)
    43        return 0;
    44   error:
    45    vm_unacct_memory(pages);
    46
    47    return -ENOMEM;
    48   }

1-允许过量提交的策略

  • 第5行代码,如果使用总是允许过量提交的策略,那么允许创建新的内存映射。
  • 第8行代码,如果使用猜测的过量提交策略,那么估算可用内存的数量,处理如下。
  • 1)第9行和第10行代码,空闲页加上文件页,文件页有后备存储设备支持,可以回收。
  • 2)第12行代码,共享内存页不应该算作空闲页,它们不能被释放,只能换出到交换区。
  • 3)第14行代码,加上交换区的空闲页数。
  • 4)第16行代码,加上可回收的内存缓存页。使用SLAB_RECLAIM_ACCOUNT标志创建的内存缓存,宣称可回收,dentry和inode缓存应该属于这种情况。
  • 5)第21行代码,减去保留的页数。
  • 6)第23行和第24行代码,如果进程没有系统管理权限,那么减去为根用户保留的页数。
  • 7)第26行和第27行代码,如果可用内存的页数大于申请的页数,那么允许创建新的内存映射。

2-不允许过量提交的策略

如果使用不允许过量提交的策略,那么处理如下。

  • 1)第32行代码,计算提交内存的上限。有两个控制参数:sysctl_overcommit_kbytes是字节数,sysctl_overcommit_ratio是比例值,sysctl_overcommit_kbytes的默认值是0,sysctl_overcommit_ratio的默认值是50。如果sysctl_overcommit_kbytes不是0,那么上限等于“sysctl_overcommit_kbytes + 交换区的空闲页数”,否则上限等于“(物理内存容量 − 巨型页总数)*sysctl_overcommit_ratio/100 + 交换区的空闲页数”。
  • 2)第34行和第35行代码,如果进程没有系统管理权限,那么需要为根用户保留一部分内存。
  • 3)第37~40行代码,为了防止一个用户启动一个消耗内存大的进程,保留一部分内存:取“进程虚拟内存长度的1/32”和“用户保留的页数”的较小值。
  • 4)第42行和第43行代码,vm_committed_as是所有进程提交的虚拟内存的总和,如果它小于allowed,那么允许创建新的内存映射。

内容来自前辈书籍:《Linux内核深度解析》

目录
相关文章
|
22天前
|
传感器 人工智能 物联网
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发
C 语言在计算机科学中尤其在硬件交互方面占据重要地位。本文探讨了 C 语言与硬件交互的主要方法,包括直接访问硬件寄存器、中断处理、I/O 端口操作、内存映射 I/O 和设备驱动程序开发,以及面临的挑战和未来趋势,旨在帮助读者深入了解并掌握这些关键技术。
40 6
|
2月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
77 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
6月前
|
NoSQL Java Redis
Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)
Redis系列学习文章分享---第十八篇(Redis原理篇--网络模型,通讯协议,内存回收)
87 0
|
6月前
|
缓存 Java
《JVM由浅入深学习九】 2024-01-15》JVM由简入深学习提升分(生产项目内存飙升分析)
《JVM由浅入深学习九】 2024-01-15》JVM由简入深学习提升分(生产项目内存飙升分析)
55 0
|
2月前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
59 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
3月前
|
存储 缓存 Linux
用户态内存映射
【9月更文挑战第20天】内存映射不仅包括物理与虚拟内存间的映射,还涉及将文件内容映射至虚拟内存,使得访问内存即可获取文件数据。mmap 系统调用支持将文件或匿名内存映射到进程的虚拟内存空间,通过多级页表机制实现高效地址转换,并利用 TLB 加速映射过程。TLB 作为页表缓存,存储频繁访问的页表项,显著提升了地址转换速度。
|
2月前
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
62 0
|
3月前
|
存储 安全 Linux
将文件映射到内存,像数组一样访问
将文件映射到内存,像数组一样访问
38 0
|
4月前
|
存储 JavaScript 前端开发
学习JavaScript 内存机制
【8月更文挑战第23天】学习JavaScript 内存机制
40 3
|
3月前
|
消息中间件 Linux 容器
共享内存的创建和映射过程
【9月更文挑战第1天】消息队列、共享内存及信号量在使用前需生成key并获取唯一ID,均通过`xxxget`函数实现。