这可能取决于操作系统,但总的来说,据我所知,当出现页面错误(所需页面不在主内存中)时,OS会指示CPU从磁盘读取页面,我想知道操作系统在磁盘I / O的同时调度到另一个进程?如果确实如此,那么在上下文切换时将完全刷新TLB,对吗?
答案 0 :(得分:3)
或多或少,但页面错误并不总是意味着页面在磁盘上(它也可能根本不存在,是一个惰性分配页面,是一个写入的写入时复制页面,存在但标记为不可读/不可写,等等)。但如果就是这样,它可能会安排另一个线程,至少因为磁盘IO大约需要永远。
必要的切换量取决于它切换到的内容,从相同上下文切换线程并不意味着TLB刷新。如果需要TLB刷新,则可能不是完整刷新,因为全局页面(通常,您不会刷新内核页面的TLB条目)。还有PCID可以避免完全刷新(刷新可以限制为指定的进程上下文ID),但这是非常新的,并且使用起来很棘手,因为只有4096个不同的ID。
答案 1 :(得分: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