最近在看一些操作系统的书籍。假设: 硬件支持 MMU,且 enable 了 MMU 。使用的是虚拟存储(VM). 支持多个程序并发执行。分时系统。
那么当程序 P1 切换到 P2 运行的时候(P1 没有结束退出),有没有可能 P2 需要的物理内存不够,从而把 P1 占用的物理内存的内容临时放到 磁盘( disk ) 上,从而腾出物理内存空间挪给 P2 用。如果是,具体的细节有哪些:
1.比如 P1 占用的堆的内容会不会临时存到 disk 上。如果是,是存到哪里?( linux 是 swap 分区?).程序中的代码段是不是不需要存,因为这些本来就已经在 disk 上了?
2.P1 的 page table 是不是也要更新?
3.如果可以把其他程序占用的物理内存临时存到 disk 上,那 Linux 上的 OOM 是怎么发生的? swap 分区也不够了?
大家回答的时候,可以针对具体的操作系统来讨论这些策略,也可以说一些 general 的原理或者设计。谢谢!
1
Jooooooooo 2021-09-22 16:13:12 +08:00
挺好的问题, 可以拿来当面试题了.
|
2
yinusxxxx 2021-09-22 17:09:40 +08:00 1
我最近也在看 OS 的书,尝试回答一下,不一定对
会不会被换出?换到哪里?何时换出?交换空间和内存是如何关联的? 1.可能会。 2. Linux 可以是交换分区或者交换文件。 3. 为了保证有少量的空闲内存,大多数操作系统会设置高水位线( High Watermark,HW ) 和低水位线( Low Watermark,LW ),来帮助决定何时从内存中清除页。当操作系统发现有少于 LW 个页可用时,后台负责释放内存的线程会开始运行,直到有 HW 个 可用的物理页。 4. 通过页表和 mmap 系统调用 page table 是不是需要更新? 物理页被换出后,页表项上会有标志位(存在位)表示这个页不在物理内存上,如果此时请求这个页,会引发页错误。 从哪里请求在磁盘上的页? 换出的时候页表项上有某几个位保存了在磁盘上的位置。 oom 为什么发生? 如果正在运行的程序所需的内存超出了物理内存,那么就会发生频繁的换页,这种情况叫做抖动。通过这种一直换页的操作可以支撑很大的内存的,但是操作系统不会让你这个干,操作系统检测到这种内存过载的情况,有些激进一点的就会使用 oom-killer 把它杀掉。 |