为什么代码段对于同一程序的不同实例是通用的

时间:2009-09-29 10:14:50

标签: c++ c process operating-system

我想知道为什么代码段对于同一程序的不同实例是常见的。

对于Eg:考虑程序P1.exe正在运行,如果正在运行P1.exe的另一个副本,则代码段对于两个正在运行的实例都是通用的。为什么会这样?。

答案将受到高度赞赏。

提前致谢。

4 个答案:

答案 0 :(得分:5)

如果有问题的代码段是从DLL加载的,则可能是操作系统很聪明并重新使用已加载的库。这是使用动态加载的库代码的核心要点之一,它允许代码在多个进程之间共享。

不确定Windows是否足够聪明,可以使用常规EXE文件的代码部分来执行此操作,但如果可能,这将是有意义的。

它也可能是虚拟内存愚弄你;两个进程可能看起来在同一个地址上具有相同的内容,但该地址是虚拟的,因此它们实际上只显示了物理内存的映射。

答案 1 :(得分:2)

代码通常是只读的,因此制作代码的多个副本会很浪费。

此外,Windows(至少,我不能说这个级别的其他操作系统)使用分页基础结构来直接从可执行文件中输入和输出代码,就好像它是一个分页文件一样。由于您正在处理相同的可执行文件,因此它从同一位置分页到同一位置。

现代操作系统实际上不再支持自修改代码。可以生成新代码(通过在分配内存时设置正确的标志),但这与原始代码段是分开的。

答案 2 :(得分:1)

代码段(应该是)是静态的(不会改变),因此没有理由不将它用于多个实例。

答案 3 :(得分:0)

编辑:哦,也许我误解了这个问题。我以为他在问为什么两个进程在代码段寄存器中具有相同的值。

只是从基本级别开始,Segmentation只是一种实现内存隔离和分区的方法。 Paging是实现这一目标的另一种方式。在大多数情况下,您可以通过分段实现任何目标,您可以通过分页实现。因此,x86上的大多数现代操作系统根本不使用分段,而是完全依赖于分页设施。

因此,所有进程通常都会在(Base = 0,Limit = 4GB,Privilege level = 3)的普通段下运行,这意味着代码/数据段寄存器在确定物理地址时不起作用。 ,仅用于设置进程的权限级别。所有进程通常都以相同的权限运行,因此它们在段寄存器中都应具有相同的值。