c - 基于分页的内存分配

标签 c memory-management linux-kernel operating-system kernel

在分页方面,内存分配究竟是如何工作的?我了解伙伴分配器、空闲列表算法等都是如何工作的,但是在虚拟内存和分页方面我很困惑。例如,假设我 malloc 10 个字节。假设有 10 个 4kb 的虚拟页面可用。操作系统使用这些页面之一来分配 10 个字节。操作系统现在会将此页面标记为“不免费”吗?我确定它不会那样做,但是它如何跟踪该页面中还剩下(4kb - 10 字节)?

最佳答案

Linux 仅适用于页面。

malloc 是一个 C 库函数。它的工作是允许分配任意大小的内存块。它通过使用 sbrkmmap 内核工具获取/增加/缩小页面池。它跟踪池中已分配和空闲的字节数。

如果一个页面被用来分配一些后来被释放的内存,内核无法知道它不再需要,除非 malloc 告诉它释放它(例如通过 munmap )。

malloc 从内核请求页面时,进程虚拟地址空间中的一个空闲虚拟页面被标记为有效并返回。访问无效页面会触发段错误。

通常分配是惰性的。这意味着最初没有分配实际页面(即后备存储)。进程第一次写入此虚拟页面时,会分配一个真实页面并将虚拟页面指向它。

然后这个真实页面可能会根据需要在物理内存和交换空间之间来回移动。

关于c - 基于分页的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28534418/

相关文章:

c - 用C有效迁移一个linux进程

c - 如何在c中创建动态大小的数组?

c# - List<struct> 与 List<class> 的性能

android - 在哪里可以查看Android系统中进程生命周期管理的android源码?

c - 需要采用现有程序并将计算分解为函数

c - ALSA Lib 1.1.2 编译错误

ios - Dealloc 正在推迟

c++ - C++ 中的 "new"和 "malloc"和 "calloc"有什么区别?

android - 插入电源时如何使Android设备启动?

c - 为什么消息队列没有类似轮询/选择的机制?