我是这个领域的总菜鸟,所以请忍受我的问题并回答:)
我正在阅读有关进程地址空间,虚拟内存和分页的信息。我理解页面被换入和换出RAM的机制。据记录,每个进程都有一个4GB的虚拟地址空间,其中一部分用于用户空间(特定于每个进程 - 1或2 GB),其余部分是内核空间(在所有进程中都是通用的)。由于每个进程的虚拟地址空间存储在二级存储中,这是否意味着每次启动一个进程时,它在我的硬盘中保留4 GB?每次启动进程时,我都没有看到我的硬盘空间减少了4GB ......或者是虚拟空间没有被保留为块,而是从小处开始,可以增长到4GB。如果你知道任何有助于我理解这个复杂话题的东西,请发表一些看法,并发表一些关于这个主题的链接。
答案 0 :(得分:2)
首先,虚拟地址内存管理不利用二级存储,它只是将程序和主内存划分为一些分区大小,主内存分区称为帧,程序分区称为页面,主内存和帧中的每个分区都相同大小(即分区大小)
当执行或使用某个程序时,内核会检查这些程序的所有页面是否都可以放入主内存中,如果是这样的话,它会将所有页面保存在主内存中,否则它将只保留首先需要的页面然后当稍后需要其他页面时,它会删除主存储器中的一个页面(即主存储器中的帧)(使用页面替换算法),然后将请求的页面传输到已删除的帧(您刚刚选择从主存储器中删除) 对于从页面到帧的地址映射,内核使用页面映射表 它准确地告诉了这个特定页面位于主存储器中的哪个帧
检查以下参考资料: https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Memory/virtual.html https://www.bottomupcs.com/virtual_addresses.xhtml
答案 1 :(得分:1)
这里是非文字的,可以详细说明数百页的文章(参见有关该主题的cs书籍)。
但总之,你错了:虚拟内存不存储在二级存储中。它可以在那里,但通常不是。 OS正在处理它,根据其信息,它将数据保存在正常存储器中(例如,当时进程处于活动状态时),或者它处于hdd状态(例如,当存储器很短且进程处于非活动状态时)。
虚拟化意味着,对于流程它是透明的,它不知道数据的存储位置,它总是通过相同的指针访问。系统可以根据具体情况更改底层存储(然后将数据交换进或出)。
答案 2 :(得分:0)
虚拟地址空间不会“存储”在任何地方。只有为进程分配的内存页面可以存储在内存/磁盘上。
内存分配取决于操作系统。即在Windows中,分配和管理可以通过程序使用相应的memory functions完成,如VirtualAlloc将内存映射到地址空间,VirtualProtect函数指定在程序的地址空间中分配的内存块应该具有的属性。
答案 3 :(得分:-1)
嗯,对于这个领域的总菜鸟来说,这是一个很好的问题。实际发生的是,正在执行的进程认为它具有所有内存,而它只有少量内存随着它的增长而扩展。这个内存称为虚拟内存。
我希望这个答案很有帮助。