系统调用brk 和 mmap 有什么不同?

系统调用brk 和 mmap 有什么不同

1. 核心功能差异

‌brk‌: 通过调整进程堆顶指针(_edata)扩展/收缩堆空间,仅适用于连续内存分配‌。
‌mmap‌:在进程虚拟地址空间中创建独立映射区域,支持文件/匿名内存映射,可分配非连续内存‌。

2. 内存管理机制

‌brk‌:
    分配时仅修改虚拟地址边界,物理内存按需分配(首次访问触发缺页中断)‌。
    释放时内存由malloc内部缓存,不立即归还操作系统‌。
‌mmap‌:
    分配时建立虚拟地址与文件/内存的映射关系,支持共享/私有模式‌。
    释放时通过munmap**立即归还虚拟地址空间和物理内存‌**。

3. 性能与适用场景

特性 brk mmap
分配大小‌ 适合小块内存(<128KB)‌ 适合大块内存(≥128KB)‌
碎片问题‌ 易产生堆碎片‌ 独立管理,无外部碎片‌
系统开销‌ 仅移动指针,开销低‌ 需系统调用,开销高‌
多线程‌ 需全局锁,性能受限‌ 支持线程独立映射,无锁竞争‌

4. 典型应用场景

‌brk‌:频繁分配/释放小内存(如字符串、结构体)‌。
‌mmap‌:大文件I/O、共享内存、进程间通信(IPC)‌。

问题思考:
1. 什么是缺页中断?
2. _edata 具体是指什么?除了_edata 区还有哪些内存区域的划分?

posted on 2025-09-25 13:57  小樊童鞋  阅读(32)  评论(0)    收藏  举报