操作系统内存管理问题

2021-09-22 15:36:48 +08:00
 huangya

最近在看一些操作系统的书籍。假设: 硬件支持 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 的原理或者设计。谢谢!

945 次点击
所在节点    问与答
3 条回复
Jooooooooo
2021-09-22 16:13:12 +08:00
挺好的问题, 可以拿来当面试题了.
yinusxxxx
2021-09-22 17:09:40 +08:00
我最近也在看 OS 的书,尝试回答一下,不一定对

会不会被换出?换到哪里?何时换出?交换空间和内存是如何关联的?
1.可能会。
2. Linux 可以是交换分区或者交换文件。
3. 为了保证有少量的空闲内存,大多数操作系统会设置高水位线( High Watermark,HW ) 和低水位线( Low Watermark,LW ),来帮助决定何时从内存中清除页。当操作系统发现有少于 LW 个页可用时,后台负责释放内存的线程会开始运行,直到有 HW 个 可用的物理页。
4. 通过页表和 mmap 系统调用

page table 是不是需要更新?

物理页被换出后,页表项上会有标志位(存在位)表示这个页不在物理内存上,如果此时请求这个页,会引发页错误。

从哪里请求在磁盘上的页?

换出的时候页表项上有某几个位保存了在磁盘上的位置。

oom 为什么发生?

如果正在运行的程序所需的内存超出了物理内存,那么就会发生频繁的换页,这种情况叫做抖动。通过这种一直换页的操作可以支撑很大的内存的,但是操作系统不会让你这个干,操作系统检测到这种内存过载的情况,有些激进一点的就会使用 oom-killer 把它杀掉。
huangya
2021-10-08 10:23:31 +08:00
@yinusxxxx 感谢分享,提供了需要有用的信息。最近一段长时间都在为一件事情焦头烂额,各地奔走。现在才回复。不好意思。
>2. Linux 可以是交换分区或者交换文件。

程序中的代码段也需要换到交换分区或者交换文件吗?我的理解是这些已经在 disk 上了,应该不需要。像堆这种在程序运行中产生的数据才需要换到交换分区或者交换文件上。不知道你对这个问题怎么理解。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/803401

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX