通常,进程内存映射由堆栈,文本,数据+ bss和堆组成。
内存地址独立于除文本部分之外的其他进程。
我的问题是关于文本部分,是否只有子进程可以共享
与其父进程相同的文本部分?或其他过程也可以共享它。
=============================================== =======================
@avd:是的,请参考维基百科
http://en.wikipedia.org/wiki/Process_isolation
"进程隔离可以通过虚拟地址空间来实现,其中进程A的地址空间不同于进程B的地址空间 - 防止A写入B。"
这就是我的意思,每个进程都有自己的内存映射。
但是,当我阅读操作系统手册时,它提到可以共享文本部分。所以我对此不太清楚,或者我可能误解了本书的那一部分。
=============================================== ======================= 额外信息:
http://www.hep.wisc.edu/~pinghc/Process_Memory.htm
如果要同时执行程序的第二个副本,则进程共享文本段。在此设置中,系统使用指针引用先前加载的文本段,而不是重新加载重复的文本段。如果需要,可以在编译时使用-N选项关闭使用C / C ++编译器时的默认共享文本。
答案 0 :(得分:1)
每个进程都有自己的虚拟地址。 虚拟地址不会与包括子进程在内的任何人共享。但是这些虚拟地址被OS内核和MMU翻译成了,或者换句话说,映射到物理地址。
问题是来自不同地址空间的虚拟地址可以指向相同的物理地址!例如,当fork进程分叉时,它会获得自己的虚拟地址空间,但除非这个子进程不改变(写入)它的内存,否则与父进程共享内存<强>阅读。当子进程将尝试修改某些内存内核时,将为子进程创建特定页面的单独自己的副本,并且它将不再被共享(直到子进程自行分叉)。这称为写入时复制(CoW)。
所以真实的是,可以通过将不同的虚拟页面映射到相同的物理页面(称为帧)来共享文本部分。