1

这可能取决于操作系统,但总的来说,据我所知,当发生页面错误(所需页面不在主内存中)时,操作系统将指示 CPU 从磁盘读取页面,我想知道操作系统是否调度到另一个磁盘 I/O 的过程?如果确实如此,那么将在上下文切换时完全刷新 TLB,对吗?

4

2 回答 2

4

或多或少,但页面错误并不总是意味着该页面在磁盘上(它也可能根本不存在,是一个惰性分配页面,是一个写入时复制的页面,存在但被标记为不可读/不可写等)。但如果是这样的话,它可能至少会安排另一个线程,因为磁盘 IO 大约需要永远。

必要的切换量取决于它切换到什么,在同一上下文中的线程之间切换并不意味着 TLB 刷新。如果需要 TLB 刷新,则可能不是完全刷新,因为全局页面(因此通常不会刷新内核页面的 TLB 条目)。还有一个 PCID 来避免完全刷新(刷新可以限制为指定的进程上下文 ID),但这是最近的事,而且使用起来很棘手,因为只有 4096 个不同的 ID。

于 2015-02-28T23:29:04.747 回答
0

特定于进程的页面在 TLB 条目中使用 nG(非全局)位标记为非全局条目,并且还存储 pid(ARM 术语中的地址 ID)。现在这篇文章清楚地阐述了这个概念。

“对于非全局条目,当更新TLB并将条目标记为非全局时,除了正常的翻译信息外,TLB条目中还会存储一个值。这个值称为地址空间ID(ASID),这是操作系统分配给每个单独任务的数字。如果当前的 ASID 与存储在条目中的 ASID 匹配,则后续 TLB 查找仅在该条目上匹配。这允许为特定的特定任务存在多个有效的 TLB 条目页面标记为非全局,但具有不同的 ASID 值。换句话说,我们在上下文切换时不一定需要刷新 TLB。”

来源:https ://developer.arm.com/documentation/den0024/a/The-Memory-Management-Unit/Context-switching

于 2021-07-11T08:39:07.693 回答