linux-kernel - 内核如何跟踪映射到其他进程的帧?
问题描述
关于小页面错误,维基百科说:
操作系统中的缺页处理程序只需要使内存管理单元中该页面的入口指向内存中的页面,并指示该页面已加载到内存中即可。它不需要将页面读入内存。如果内存由不同的程序共享并且页面已经被其他程序带入内存,则可能会发生这种情况。
内核如何知道一个页面已经被另一个进程带入内存?据我了解,对于任何给定的执行进程,内核只关心该进程的页表,所以如果有一些帧已经被另一个进程映射,内核是如何确定的呢?
解决方案
在虚拟内存系统中,操作系统必须在二级存储中维护进程地址空间的表示。那是虚拟内存的“虚拟”部分。
虚拟表示通常分为多个部分。每个部分都包含具有相同属性 (r/w/rw/rx) 的页面,并且连续存储。
通常,如果一个进程共享内存,它们共享整个部分。
操作系统必须在某处存储描述该部分的标题。该标头将指示该部分是否以及加载到物理内存中的位置。每个进程都必须有一个数据结构来指示该部分映射到逻辑地址空间的位置。
请记住,此机制可用于操作系统的所有进程共享的可分页区域。
当页面错误发生时,页面错误处理程序必须识别哪个部分包含导致错误的页面。然后它可以从节的标题中识别它是否驻留在物理内存中。
你提到的那篇文章是指VMS操作系统,这种软故障比较容易出现。在 VMS 中,库由操作系统安装,因此所有进程都被迫共享相同的代码。
推荐阅读
- swift - 如何在 SwiftUI 中的文本末尾实现“阅读更多”样式按钮
- scala - Spark scala如何将数据框中的整数列转换为十六进制大写字符串?
- r - 对R中列表中的所有小标题应用相同的操作
- javascript - 如何从表格行传递数据并在渲染时将其传递给另一个组件?
- python - 根据值范围拆分列
- github-actions - 如何保护生产凭证免受 Github Action 的影响?
- laravel - Laravel:我怎样才能assertJson一个数组
- python-3.x - 如何在 Python 中的 pandas.DataFrame 列上测量函数的经过时间?
- react-native - React Native 重叠的 touchables 同时触发
- webpack - Symfony 4.4 Webpack Encore:标签不会出现