例如,我在课堂上听说全局变量只是放在内存中的特定位置。什么是防止两个程序意外地为不同的变量使用相同的内存位置?
此外,两个程序是否对其参数和局部变量使用相同的堆栈?如果是这样,是什么阻止变量相互交错并搞乱索引?
好奇。
答案 0 :(得分:5)
这是现代操作系统通过在单独的虚拟地址空间中加载每个进程来完成的。多个进程可以引用相同的virtual address,但是在现代硬件的帮助下,操作系统会将每个进程映射到一个单独的物理地址,并确保一个进程无法访问分配给另一个进程的物理内存 1 。
<小时/> 1 调试器是一个值得注意的例外:操作系统通常为调试器提供特殊的机制来连接到其他进程并检查它们的内存空间。
答案 1 :(得分:4)
大多数现代处理器都有一个内存管理单元(MMU),它为操作系统提供了为每个进程创建受保护的独立内存部分的能力,包括每个进程的单独堆栈。在MMU的帮助下,处理器可以将每个进程限制为仅修改/访问已分配给它的内存。这可以防止一个进程写入另一个进程内存空间。
大多数现代操作系统将使用MMU的功能为每个进程提供保护。
以下是一些有用的链接:
Memory Management Unit
Virtual Memory
答案 2 :(得分:2)
您的问题的简短回答是操作系统处理这些问题。它们是非常严重的问题,并且操作系统工作的很大一部分是将所有内容保存在单独的空间中。操作系统运行跟踪所有其他程序的程序,并确保它们各自使用空间。这样也可以使堆栈分离。每个程序都运行由OS分配的自己的堆栈。操作系统如何进行此分配实际上是一项复杂的任务。