![如果虚拟内存只是将程序放回磁盘,那么将程序加载到 RAM 中有什么意义呢?](https://linux22.com/image/1379468/%E5%A6%82%E6%9E%9C%E8%99%9A%E6%8B%9F%E5%86%85%E5%AD%98%E5%8F%AA%E6%98%AF%E5%B0%86%E7%A8%8B%E5%BA%8F%E6%94%BE%E5%9B%9E%E7%A3%81%E7%9B%98%EF%BC%8C%E9%82%A3%E4%B9%88%E5%B0%86%E7%A8%8B%E5%BA%8F%E5%8A%A0%E8%BD%BD%E5%88%B0%20RAM%20%E4%B8%AD%E6%9C%89%E4%BB%80%E4%B9%88%E6%84%8F%E4%B9%89%E5%91%A2%EF%BC%9F.png)
看完之后这个问题关于虚拟内存,我突然想问:当程序运行时,它就像在绕圈行走,它会从磁盘加载到内存中,但内存中没有足够的空间,因此它会被重新加载到磁盘(作为页面文件)。计算机是否有必要最初将程序的 100% 加载到内存中?我记得学习过一种东西,它让每个进程都感觉自己在地址空间中单独运行,因此它可以从第一个地址开始,这是虚拟化内存的主要原因吗?还是与此无关?
答案1
原因就是速度。进程也可以在运行时增长,例如 k-meleon。或者在运行时产生新进程,例如 chrome.exe。缓存比 RAM 快,而 RAM 又比磁盘快。
因此,只要有缓存,数据就会被放入缓存中。理想的情况是 CPU 在缓存中执行数据。其次是它在 RAM 中执行数据。
CPU 从不处理磁盘上的内容,它不处理磁盘上的内容,它只处理 RAM 位置或毫无疑问是缓存位置。或者读取/写入设备的位置。
并不是所有东西,甚至是所有你想运行的东西都会被交换到磁盘然后再返回到 RAM。只有当前不使用且不太可能很快使用的东西才会被优先交换,以便释放 RAM 来供更多使用的东西使用。
Web 浏览器也有缓存,即磁盘缓存!它们将内容本地存储在磁盘上,而不是从网上获取。您可以本地运行 Web 代理,将网站存储在本地,如果网站在线发生变化,则将获取网站内容。这使您可以更快地浏览。(虽然我猜您可能会遇到网站未正确指定所做的更改的问题,并且您只能从本地磁盘缓存加载旧副本)但这个想法是更快。在这种情况下,较快的区域是本地硬盘,较慢的区域是远程/在线区域。
生活中,你会进行这种交换,把需要的东西放在身边,把不需要的东西放在仓库里。你不会把所有东西都放在仓库/车库里,并说仓库/车库里有很多空间。这样太慢了。
答案2
- 磁盘上的组织可以(几乎肯定会)有所不同,因此页面/交换文件分区经过优化以加载虚拟内存页面,而您的日常文件系统将针对其特定特性进行优化,例如“不要浪费磁盘空间”。
- 另外,您的可执行文件在磁盘上不能完全运行,相对指针在加载时会调整到虚拟地址空间,因此一旦在加载时完成此操作,它就可以进行分页了。
- 您的程序在磁盘上可能很小,然后它做的第一件事就是为某些东西分配一大块内存,这些内存可以被分页到交换区以供稍后程序执行时使用。
总而言之,按照其工作方式进行通常会更快。