当 运行 程序在共享内存 space 中的多个处理器上并行运行时,每个处理器是否都有自己的 .TEXT 段?

When running a program in parallel on multiple processors in shared-memory space, does each processor have it's own .TEXT segment?

This user 问为什么同一个文件的两个 Linux 进程不能共享同一个文本段,响应者回答说现代操作系统沙箱程序默认情况下和共享库是唯一的OS(不包括存储内存)未复制的实体。

虽然我之前在研究,但是,我 found(1) other(2) (3) that talked about how the operating system is trying to balance optimization with process-memory protection, and so through a combination of virtual memory addressing and page table lookups, as well as optimizations like copy-on-write,两个程序 可能 共享同一个 .TEXT 段,尽管它们不会意识到这一点.我这样说对吗?

Excerpt: So the real thing is that text section could be shared by mapping different virtual pages to the same physical pages (called frames).

我问的原因是因为我们正在研究一个在共享内存模型中运行的分子动力学模拟器,我们正在尝试确定是否只有一个处理器负责保存程序代码,或者如果每个处理器都需要自己的本地副本。 (有 6,000 个处理器。)

同样让我感到困惑的是 OpenMP Memory Model 是 "shared",但每个线程都有 "private access to each variable"(幻灯片 5/19),这听起来很像共享的库 [so/dll] 模型,我想知道这是否是共享资源的一般运作方式。

Additional Source - 这个问题询问的是共享内存,但它是否是所有进程都可以访问的特定位置。在他的图表中,我想知道这三个文本段是否可以简化为一个文本段和 n-指针,本质上。

这里看起来像是误会,部分原因是 "shared" 术语的不同用法。即,文本段的共享与 OpenMP 内存模型没有太多共同点。

从技术角度来说,只看 Linux 下的文本页面共享状态就很容易了。有一些有用的 /proc//smaps 文件,其中对于每个映射 Linux 内核报告 Shared_Clean 状态下的大小(有关详细信息,请参阅 man 5 proc)。

比如我运行单身的时候less /proc/self/smaps 对于第一个映射,我看到

Shared_Clean: 0 kB Private_Clean: 108 kB

但是在运行宁二之后less /proc/self/smaps 在同一台机器的另一个终端我得到了

Shared_Clean: 108 kB Private_Clean: 0 kB

因此,我们看到 /usr/bin/less 的代码实际上在不同进程之间共享。

对我来说,第一个参考文献中关于 "sandboxes" 的答案无效。我们可以看到共享就在这里。您可以尝试您的特定工作负载,看看实际代码会发生什么。