是否所有程序代码都加载到文本\代码段\内存段中

ber*_*olo 7 c memory operating-system segment

我已经开始关注c编程了,虽然我不是一个完整的初学者(我对Java和Web开发有所了解)但有很多我不理解的东西.

我的问题是关于何时首次将程序加载到内存中.我无法理解这里发生的事情.

程序启动时是将所有程序代码加载到内存中还是只加载了所需的程序代码?

在此过程中,当程序运行时,当进程获得CPU时间或加载的代码保留在内存中时,此代码/指令集是否会交换进出物理磁盘?

如果两个进程可以共享相同的指令集,这是否意味着每个进程都有它的虚拟内存空间,一个独立的代码段?

我很抱歉,如果我的问题基本或措辞不好,但我上周才开始看这个问题,经过一个周末的阅读后,我有更多的问题而不是答案!

Mat*_*son 5

启动程序时,是否已将所有程序代码都加载到内存中?或者仅加载了所需的代码?

大多数现代OS都会“按需”加载,因此应用程序(main)的起点将由OS加载,然后OS才在此处启动。当应用程序跳转到尚未在内存中的一段代码时,它将加载该位。

之后,随着进程获得CPU时间,此代码\指令集是否会在物理磁盘中换入或换出,或者在程序运行时加载的代码是否保留在内存中?

如果操作系统决定需要一些内存,则很可能会抛出一些代码,并在以后需要时重新加载它们(如果再次需要-如果它是初始化的一部分,则可能永远不会再被击中) 。

如果两个进程可以共享同一组指令,这是否意味着每个进程在其虚拟内存空间中获得一个单独的代码段?

当然,可以在同一应用程序的多个副本之间共享代码。同样,特定的操作系统是否执行此操作取决于该操作系统。Linux当然可以在两个(不相关的)进程之间共享同一应用程序的代码副本(显然,分叉的进程根据定义可以共享代码)。我相信Windows也可以。

共享库(分别用于Linux / Unix和Windows的“ .so”和“ .dll”文件)也用于在进程之间共享代码-相同的共享库用于许多不同的应用程序。

对于每个应用程序,数据空间当然是分开的,并且共享库在共享库的每个进程中也将获得自己的数据部分。