【问题标题】:Updating the PTE bits from multiple cores - how do they avoid stepping on each other?从多个内核更新 PTE 位 - 它们如何避免相互踩踏?
【发布时间】:2021-10-31 13:58:25
【问题描述】:

我有一个关于具有多个线程属于同一进程的 SMP 系统的问题:
所有这些线程是否共享单个页面树,并且树中 PTE 的访问和脏位在刷新时根据 PTE 缓存原子地(读取-修改-写入操作)更新(访问和脏位)回来了吗?

或者是否有多达多个线程重复页表,每个页表在运行时专用于单个线程(如果另一个线程正在运行,则回收),因此不需要(rmw-)锁定内存在刷新 PTE 缓存的同时更新访问位和脏位时持有 PTE 条目?

【问题讨论】:

    标签: concurrency x86 operating-system paging page-tables


    【解决方案1】:

    同一进程的每个线程都有相同的 CR3 页表。

    对 PTE A 和 D 位的更新是原子的,大概是通过微码作为一种原子 OR 来完成的。 (IIRC,大多数现代 x86 CPU 将 A 或 D 位设置为微码辅助加载或存储指令,需要设置 TLB 条目中尚未设置的位。)

    How prompt is x86 at setting the page dirty bit? 引用了 Intel 和 AMD 的关于“自动锁定”主题的手册,例如 LOCK 前缀。

    与操作系统必须为每个硬件线程(也称为逻辑核心)(或为进程的每个软件线程,如果数量较小)维护每个进程的页表副本相比,更新的原子 RMW 相对便宜。稍微设置一下 CPU 已经是一个缓慢的微码辅助。此外,您不希望 N 个页表副本浪费 L3 缓存占用空间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-25
      • 2022-01-10
      • 2019-12-26
      • 1970-01-01
      • 1970-01-01
      • 2012-10-14
      相关资源
      最近更新 更多