当前位置: 首页 > 面试题库 >

叉子-相同的内存地址?

易波涛
2023-03-14
问题内容

这是关于Linux中的C语言。

fork()main()其中创建2个子进程。然后,在两个子进程中都运行一个函数abc(),其中有一个局部变量x。我在其中写一些价值。然后,我用打印此变量的地址printf("%p",&x)

这两个过程都打印相同的地址。我以为每个孩子都会得到父母记忆的(独立)副本。我需要每个进程都有自己的变量x。我该怎么办或我做错了什么?


问题答案:

您需要了解,物理内存与进程的虚拟地址空间之间存在脱节。

每个进程都有 自己的 4G虚拟地址空间,这是操作系统和硬件内存管理器将您的虚拟地址映射到物理地址的工作。

因此,尽管 看起来 两个进程的变量地址相同,但这只是 虚拟 地址。

内存管理器会将其映射到完全不同的 物理 地址a。

此映射还使您可以运行十个进程,每个进程占用1G的空间,即使您的计算机只有4G的物理内存。操作系统可以将您的内存中的一部分交换到磁盘上,并在您尝试使用它们时将其重新带回。

a:通常是这样。如果您在进程之间共享内容,则它可能映射到相同的物理地址。例如,共享内存,内核代码和数据,动态库等。



 类似资料:
  • 我想写一个方法来确定一棵树是否至少有一对相同的子树,这些子树的值和结构都必须相同。 假设给你一棵树,如下所示: 这将返回,因为我们有一对根为的相同树。 我的想法是遍历每个节点,构建一个映射到

  • 问题内容: 假设我创建了一个信号量。如果我派生了一堆子进程,它们还会使用相同的信号量吗? 另外,假设我创建了一个内部带有信号灯并分叉的结构。所有子进程仍然使用相同的信号量吗?如果不是,将struct + semaphores存储在共享内存中是否允许子进程使用相同的信号量? 我对派生的子进程如何使用相同的信号量感到非常困惑。 问题答案: 假设我创建了一个信号量。如果我派生了一堆子进程,它们还会使用相

  • 问题内容: Dalvik的内存模型与Java的相同吗?我对引用和非/非原始变量的读写是否是原子的特别感兴趣,但是我也想知道两个平台的内存模型之间是否存在差异。 问题答案: 从4.0(冰淇淋三明治)开始,Dalvik的行为应与JSR-133(Java内存模型)相匹配。 从3.0(Honeycomb)开始,大多数组件都已安装到位,但忽略了一些在实践中很难遇到的小事情(例如,最终确定中的一些边缘案例)。

  • 问题内容: 当我发现有时候,不同的类实例位于相同的内存位置时,我正在玩图书馆。 下面的两个示例都展示了上述行为: 这让我很吃惊,所以也许您可以 解释为什么发生这种情况 。 该程序按我期望的方式运行,如下所示。 问题答案: 您的问题与Python如何分配内存有关。 tldr; Python使用堆来存储内存。释放资源后,它会到达堆的顶部。 Python必须分配内存来创建对象的实例。为了提高内存效率,P

  • 下面的代码安全吗?编写类似这样的代码可能很有诱惑力: 该映射仅用于字符串文本。 我认为这是完全合法的,似乎正在起作用,但是我从未见过保证在两个不同地方使用的文字指针是相同的。我无法设法让编译器为具有相同内容的文本生成两个单独的指针,所以我开始怀疑这个假设有多坚定。 我只关心相同内容的文字是否可以有不同的指针。或者更正式地说,上面的代码可以除外吗? 我知道有一种方法可以编写代码来确保它有效,我认为上

  • 问题内容: 拥有Java代码 该字符串将分配在相同的内存位置(或多倍): 是否多次启动同一程序(并行)执行? 可能的答案: 我目前是C#开发人员(尽管在上个千年中使用Java编程)。 我之所以问这个问题,是因为我相信.NET CLR和Java(JVM)之间是相同的,我希望得到.NET应用程序的答案(但由于经常遇到的“应用程序”池术语而引起疑问)。 答案是 字符串 实习生池由同一JVM或.NET C