代码段和数据段为什么分开存放?

  1. 当程序被装载后,数据和指令分别被映射到两个虚存区域。数据区域对进程来说是可读写的,而指令区域对进程来说是只读的,所以这两个虚存区域的权限可以被分别设置成可读写和只读。这样可以防止程序的指令被有意或无意的改写。

  2. 对于现代的CPU来说,它们有着极为强大的缓存体系。由于缓存在现代计算机中的地位非常重要,所以必须尽量提高缓存的命中率。指令区和数据区的分离有利于提高程序的局部性。现代CPU的缓存一般都被设计成数据缓存和指令缓存你分离,所以程序的指令和数据被分开存对CPU的缓存命中率提高有好处。

  3. 最重要的原因就是当系统中运行多个该程序的副本时,它们的指令都是一样的,所以内存中只需要保存一份改程序的指令部分。对于指令这种只读的区域来说时这样,对于其他的只读数据也一样,比如很多程序里面带有的图标,图片,文本等资源也是属于可共享的。当然每个副本进程的数据区域时不一样的。它们时进程私有的。不要小看这个共享指令的概念,它在现代操作系统里面占了极其重要的地位,特别时在有动态链接库的系统中,可以节省大量的内存。