Linux系统的页表一般多大?内存不足时强行申请内存会如何?

在 Linux 系统中,页表(Page Table)的大小和内存管理的具体行为与系统的架构(如 x86、x86_64、ARM 等)、内核配置以及内存分配机制密切相关。

1. Linux 页表大小

Linux 使用分页机制来管理内存,页表的大小取决于页面大小(Page Size)和系统的位数:

  • 页面大小:常见的是 4KB(2^12 字节),但某些架构支持更大的页面(如 64KB 或 2MB,称为 Huge Pages)。
  • 页表条目(PTE):每个页表条目记录一个页面对应的物理地址和权限信息。在 32 位系统中,一个 PTE 通常占用 4 字节;在 64 位系统中,通常是 8 字节。
  • 页表层级:Linux 通常使用多级页表。例如,在 x86_64 上,默认是 4 级页表(PML4、PDP、PD、PT),每级可以索引多个条目,具体数量取决于页面大小和地址空间。

页表本身占用内存,其大小与虚拟地址空间的使用量成正比,但具体大小由内核动态管理,通常不会直接暴露给用户。

2. 内存不够 500KB,申请 500KB 会发生什么

当进程尝试申请 500KB 内存(例如通过 malloc()mmap()),而系统可用内存不足时,以下情况可能发生:

场景分析

  • 用户态内存分配

    • 调用 malloc(500 * 1024) 时,C 库会向内核请求内存(通常通过 brkmmap 系统调用)。
    • 如果物理内存不足,内核会尝试从以下途径解决问题:
      1. 页面回收(Page Reclaim):内核会释放缓存或将不活跃的页面换出到交换分区(Swap)。
      2. 交换分区(Swap):如果系统配置了 Swap 并且有可用空间,内核会将部分内存页面移到 Swap 中,腾出物理内存。
      3. OOM Killer(Out-Of-Memory Killer):如果没有 Swap 或 Swap 也已用尽,内核会触发 OOM Killer,杀死一些占用内存较多的进程,以释放内存。
  • 结果

    • 如果有 Swap 且空间足够,申请可能会成功,但性能会下降(由于页面交换)。
    • 如果没有 Swap 或资源耗尽,申请可能会失败,malloc() 返回 NULL,或者进程被 OOM Killer 杀死。

极端情况

  • 如果系统完全没有可用内存(包括物理内存和 Swap),且无法回收页面:
    • 对于普通用户进程,申请失败,程序可能会崩溃(取决于程序如何处理分配失败)。
    • 对于内核态代码(例如驱动程序),可能导致系统崩溃(Kernel Panic)。

举例

假设当前可用内存只有 400KB,申请 500KB:

  1. 内核检查可用内存,发现不足。
  2. 如果有 1GB 的 Swap 空间,内核将部分数据换出,分配成功。
  3. 如果没有 Swap,OOM Killer 启动,杀死某个进程(可能是当前进程或另一个),然后重试分配。

3. 可能的系统行为

  • 成功分配:内存不足时通过 Swap 或页面回收解决问题。
  • 分配失败 :返回 NULL,程序需要处理这种情况。
  • 进程终止:OOM Killer 介入,进程被杀死。
  • 系统不稳定:如果内存压力过大,可能影响系统整体稳定性。

4. 如何验证

你可以通过以下方法在 Linux 上模拟和观察这种情况:

  • 检查当前内存:free -h

  • 限制内存:使用 ulimit -v 设置虚拟内存上限。

  • 编写测试代码:

    c 复制代码
    #include <stdio.h>
    #include <stdlib.h>
    
    int main() {
        size_t size = 500 * 1024; // 500KB
        void *ptr = malloc(size);
        if (ptr == NULL) {
            printf("内存分配失败\n");
        } else {
            printf("内存分配成功\n");
            free(ptr);
        }
        return 0;
    }
  • 观察 /proc/meminfo 或启用 dmesg 查看 OOM 日志。

总结

在内存不够 500KB 的情况下,申请 500KB 的结果取决于系统是否有 Swap、页面回收能力以及 OOM Killer 的行为。通常情况下,Linux 会尽力满足请求,但如果资源耗尽,申请要么失败,要么导致进程被终止。建议在内存紧张的系统中合理配置 Swap 并监控资源使用情况。

相关推荐
Livingbody1 小时前
基于【ERNIE-4.5-VL-28B-A3B】模型的图片内容分析系统
后端
你的人类朋友2 小时前
🍃Kubernetes(k8s)核心概念一览
前端·后端·自动化运维
追逐时光者3 小时前
面试第一步,先准备一份简洁、优雅的简历模板!
后端·面试
慕木兮人可4 小时前
Docker部署MySQL镜像
spring boot·后端·mysql·docker·ecs服务器
发粪的屎壳郎4 小时前
ASP.NET Core 8 轻松配置Serilog日志
后端·asp.net·serilog
倔强青铜三5 小时前
苦练Python第4天:Python变量与数据类型入门
前端·后端·python
倔强青铜三5 小时前
苦练Python第3天:Hello, World! + input()
前端·后端·python
倔强青铜三5 小时前
苦练Python第2天:安装 Python 与设置环境
前端·后端·python
Kookoos5 小时前
ABP VNext + .NET Minimal API:极简微服务快速开发
后端·微服务·架构·.net·abp vnext
倔强青铜三5 小时前
苦练Python第1天:为何要在2025年学习Python
前端·后端·python