【问题标题】:Memory allocation in terms of paging分页方面的内存分配
【发布时间】:2015-04-16 13:12:20
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    Linux 仅适用于页面。

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

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

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

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

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

    【讨论】:

    • +1,虽然物理内存的一部分通常称为帧,以区别于映射到它的虚拟内存区域(页面)。
    • 这是常用的操作系统教科书术语。虚拟页面指向真实页面。后者是一种抽象,它标识一条数据(什么)并指向当前包含该数据的物理页面(位置)。该模型的优点是跟踪虚拟页面映射到哪条数据(例如,在克隆进程时)在概念上与跟踪该数据的存储位置(例如,在交换时)无关。一个操作系统可能只使用两个级别,但内容和位置(框架)之间的概念差异仍然存在,并且使用此模型更容易解释。
    猜你喜欢
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 2011-01-31
    • 2013-04-03
    • 2020-11-04
    相关资源
    最近更新 更多