虚拟内存原理:虚拟内存的思想是创建一个与内存中的实际地址不相对应的虚拟地址空间。该系统将内存的正式副本存储在磁盘上,并仅在RAM中缓存最常用的数据。为了实现这一点,我们将虚拟内存分解为称为页面的块;典型的页面大小为4千字节。我们还将RAM分解为页帧,每个帧的大小与页面大小相同,可以容纳任何一页虚拟内存。
我正在运行一个Linux系统,交换区是空的,因为主内存中有足够的空间。话虽如此,是否仍然存在有页的虚拟内存,并且进程是否会继续使用虚拟地址而不是主内存中其部分的物理地址?
如果磁盘中没有交换区域,系统中是否也有虚拟内存?
简单地说,虚拟内存在Linux系统中总是可用的,并且进程总是有虚拟地址吗?
发布于 2017-07-04 19:01:13
虚拟内存(分页)在CPU级别上启用。这意味着CPU使用MMU将虚拟地址(如应用程序看到的)转换为物理地址。内存被分割成页面。页可以加载到内存中,也可以加载到磁盘中。如果页面位于磁盘上,那么访问此页面将导致页面错误,由OS (OS从磁盘加载页面)进行处理。
因此,如果您没有交换,您仍然有虚拟内存,CPU仍然使用MMU并将内存拆分成页面,但是OS不能将这些页面移动到磁盘上。
http://wiki.osdev.org/Paging
发布于 2021-10-02 18:10:42
不是的。
正如user996142所提到的,有两种东西叫做虚拟地址空间。但是,您在问题中所显示的定义更具体地讨论了交换空间。不管怎样,我认为这两种说法都相当复杂。
在CPU级别,您需要一个MMU来拥有所谓的虚拟内存地址。正如其他用户所提到的,计算机具有物理内存,这些内存是给定物理地址的。在大多数情况下,物理内存从0开始,并增长到您拥有的内存总量。有些体系结构也喜欢在末尾有内存(地址-1,-2,-3.)所有CPU都没有MMU芯片,尤其是在嵌入式系统中。有些这样的系统仍然使用8位CPU,这些CPU实际上不能使用MMU (这些内存限制在64‘t可寻址内存)。
在系统级别,虚拟内存是您提到的交换空间。同样,这也不一定是可用的。在Linux的大多数发行版中,在安装时都会自动创建交换。但是,有些系统不会自动执行此操作(例如,DigitalOcean提供的Ubuntu机器默认不提供交换空间.)在大多数情况下,有一些交换是一件好事,避免让操作系统杀死进程来恢复RAM (因此,您不知道刚刚发生了什么)。
内核负责为您管理所有这些。
MMU部分是一个非常低的水平。对于大多数实现来说,它需要在Linux下运行进程。如果没有该功能,您要么需要可以在任何位置运行的进程(这在运行在68K处理器上的旧Mac上是件有趣的事情,您可以创建大约64 to的代码块,这些代码可以放置在内存中的任何位置),或者有一种重新定位进程的方法.
交换是一个非常高的层,它允许您通过将一些数据放到磁盘上来运行进程,这些进程可以使用比计算机上的RAM更多的方式。当然,在速度方面有一个巨大的惩罚。在大多数情况下,最好运行一个进程,一旦完成,运行下一个进程等等,以避免交换到磁盘。
作为一个重要方面,进程的代码(解释语言如python和php的程序集代码,即解释器二进制代码)在磁盘上以只读模式不可更改和可用。这意味着:您可以交换进程的部分代码,然后根据需要重新加载它,而不必交换RAM中的数据。数据必须写入磁盘,这很慢。只需阅读代码即可。因此,如果流程代码的一部分从未被执行过,那么这一页代码可以非常快地交换出来并重新加载,以防它在以后再次被执行。该交换不需要交换磁盘或交换文件。因此,即使您的交换空间是0Kb,内核仍然可以交换运行进程的代码以保存一些RAM。
https://unix.stackexchange.com/questions/375280
复制相似问题