memory - 为什么我们需要虚拟内存?

标签 memory memory-management operating-system

所以我的理解是每个进程都有自己的虚拟内存空间,范围从 0x0 到 0xFF....F。这些虚拟地址对应于物理内存 (RAM) 中的地址。为什么这种抽象级别有帮助?为什么不只使用直接地址?

我理解为什么分页是有益的,而不是虚拟内存。

最佳答案

这样做的原因有很多:

  • 如果您有一个已编译的二进制文件,则每个函数在内存中都有一个固定地址,调用函数的汇编指令将该地址硬编码。如果虚拟内存不存在,两个程序就无法加载到内存中并同时运行,因为它们可能需要在同一个物理地址具有不同的功能。

  • 如果两个或多个程序同时运行(或在它们之间进行上下文切换)并使用直接地址,则一个程序中的内存错误(例如,读取错误指针)可能会破坏正在运行的内存由另一个进程使用,由于一次崩溃而关闭了多个程序。

  • 类似地,存在一个安全问题,即一个进程可以通过猜测它位于哪个物理地址并直接读取它来读取另一个程序中的敏感数据。

  • 如果您尝试通过在切换到第二个进程时分页出一个进程的所有内存来解决上述两个问题,您会招致 大量 性能损失,因为您可能需要分页耗尽所有内存。

  • 根据硬件的不同,某些内存地址可能会保留给物理设备(例如,视频 RAM、外部设备等)。如果在编译程序时不知道这些地址是否重要,它们可能会在物理上中断插入- 通过读取和写入设备的内存来输入设备。更糟糕的是,如果该内存是只读或只写的,程序可能会将位写入一个期望它们停留在那里的地址,然后读回不同的值。

希望这会有所帮助!

关于memory - 为什么我们需要虚拟内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19349572/

相关文章:

c++ - 如何释放函数内分配的任何动态内存?

c++ - 为什么很多 Allocator 函数是可选的?

ios - 创建PDF时内存警告和崩溃

python - 将目录中的所有信息存储到一个列表中

assembly - 迷你操作系统中针对不同信号量的现成队列的优缺点

ios - Objective C中的内存泄漏问题

C++ 动态内存分配限制

c++ - 程序终止后动态分配的内存

linux - Unix 中如何处理信号?

c++ - 内存操作 - 我做错了什么?