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 并监控资源使用情况。

相关推荐
Victor3561 小时前
Redis(76)Redis作为缓存的常见使用场景有哪些?
后端
Victor3561 小时前
Redis(77)Redis缓存的优点和缺点是什么?
后端
摇滚侠4 小时前
Spring Boot 3零基础教程,WEB 开发 静态资源默认配置 笔记27
spring boot·笔记·后端
天若有情6736 小时前
Java Swing 实战:从零打造经典黄金矿工游戏
java·后端·游戏·黄金矿工·swin
一只叫煤球的猫7 小时前
建了索引还是慢?索引失效原因有哪些?这10个坑你踩了几个
后端·mysql·性能优化
magic334165638 小时前
Springboot整合MinIO文件服务(windows版本)
windows·spring boot·后端·minio·文件对象存储
开心-开心急了9 小时前
Flask入门教程——李辉 第一、二章关键知识梳理(更新一次)
后端·python·flask
掘金码甲哥9 小时前
调试grpc的哼哈二将,你值得拥有
后端
小学鸡!9 小时前
Spring Boot实现日志链路追踪
java·spring boot·后端
用户214118326360211 小时前
OpenSpec 实战:用规范驱动开发破解 AI 编程协作难题
后端