【发布时间】:2015-05-01 12:23:44
【问题描述】:
这可能取决于操作系统,但总的来说,据我所知,当发生页面错误(所需页面不在主内存中)时,操作系统会指示 CPU 从磁盘读取页面,我想知道操作系统是否在磁盘 I/O 时调度到另一个进程?如果是这样,那么在上下文切换时将完全刷新 TLB,对吗?
【问题讨论】:
标签: operating-system virtual-memory context-switch tlb page-tables
这可能取决于操作系统,但总的来说,据我所知,当发生页面错误(所需页面不在主内存中)时,操作系统会指示 CPU 从磁盘读取页面,我想知道操作系统是否在磁盘 I/O 时调度到另一个进程?如果是这样,那么在上下文切换时将完全刷新 TLB,对吗?
【问题讨论】:
标签: operating-system virtual-memory context-switch tlb page-tables
或多或少,但页面错误并不总是意味着该页面在磁盘上(它也可能根本不存在,是一个惰性分配页面,是一个写入时复制的页面, 存在但被标记为不可读/不可写等)。但如果是这样的话,它可能至少会安排另一个线程,因为磁盘 IO 大约需要永远。
所需的切换量取决于它切换到的内容,在同一上下文中的线程之间切换并不意味着 TLB 刷新。如果需要 TLB 刷新,它可能不是 complete 刷新,因为全局页面(因此通常情况下,您不会刷新内核页面的 TLB 条目)。还有一个 PCID 可以避免完全刷新(刷新可以限制为指定的进程上下文 ID),但这是最近才出现的,而且使用起来很棘手,因为只有 4096 个不同的 ID。
【讨论】:
进程特定的页面被标记为非全局条目,在 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
【讨论】: