1

我编写了一个程序守护程序,当计算机的硬盘控制器崩溃时,它会启动某种自我修复程序。该程序已经可以正常运行,但我担心该程序(大约 18KB 的编译文件大小)可能不会被操作系统完全加载到 RAM 中,并且 - 当我真的很不走运时 - 一些程序页面必须从确切地说,当程序必须激活并且不再可能访问磁盘时。

毕竟,大多数时候程序都处于无限循环中,检查是否一切正常,并且 95% 的程序代码没有被使用。所以,我认为,内核可以通过从 RAM 中删除未使用的程序页面来优化 RAM 使用。

所以,我的问题是:Linux 是否将所有程序代码页加载并保存到内存中,一旦程序启动,就无需再次访问硬盘来运行程序代码本身?

技术细节:Linux Kernel 2.6.36+,大约 1 GB RAM,Debian 5,没有活动交换空间

我已经知道我可以通过调用来防止交换mlockall(MCL_CURRENT | MCL_FUTURE);,但想知道我是否真的需要更新我的机器。

4

2 回答 2

1

不,程序代码页是内存映射到进程的地址空间的,与任何其他页没有太大区别mmap(),因此如果您长时间不访问这些页,它们最终可能会从 RAM 中删除。为了避免它,只需使用mlockall()调用。

于 2013-10-10T10:02:55.160 回答
0

来自 mlockall 手册

mlockall() locks all pages mapped into the address space of the calling process.
This  includes  the pages of the code, data and stack segment, as well as shared
libraries, user space kernel data, shared memory, and memory-mapped files.   All
mapped pages are guaranteed to be resident in RAM when the call returns success‐
fully; the pages are guaranteed to stay in RAM until later unlocked.

因此,如果锁定,页面将在此处。但是,修改挂载的硬盘分区总是有很大的风险,不管是哪种锁。

于 2013-10-10T10:10:26.483 回答