我已经开始关注c编程了,虽然我不是一个完全的初学者(我对Java和Web开发有所了解)但是有很多我不理解的东西。
我的问题是关于何时首次将程序加载到内存中。我无法理解这里发生的事情。
程序启动时是将所有程序代码加载到内存中还是只加载了所需的程序代码?
在此过程之后,当程序运行时,当程序运行CPU时间或加载的代码保留在内存中时,此代码/指令集是否会交换进出物理磁盘?
如果两个进程可以共享同一组指令,这是否意味着每个进程在其虚拟内存空间中都有一个单独的代码段?
如果我的问题基本或措辞不好,我很抱歉,但我上周才开始看这个问题,经过一个周末的阅读后,我有更多的问题而不是答案!
答案 0 :(得分:5)
程序运行时是否所有程序代码都加载到内存中 已启动或只是需要加载的内容?
大多数现代操作系统都会“按需”加载,因此应用程序的起点(main
)将由操作系统加载,然后操作系统就会启动。当应用程序跳转到一段尚未在内存中的代码时,它会加载该位。
在此之后,此代码\指令集将被换入和换出 物理磁盘,因为进程获得CPU时间或加载代码 程序运行时留在记忆中?
如果操作系统决定需要一些内存,它可能会丢弃一些代码,并在以后需要时重新加载它[如果再次需要它 - 如果它是初始化的某些部分,它可能永远不会得到又打了]。
如果两个进程可以共享同一组指令,那么这意味着什么 每个进程在其虚拟内存空间中获得一个单独的代码段?
当然可以在同一应用程序的多个副本之间共享代码。同样,特定操作系统是否执行此操作取决于操作系统。 Linux当然在两个(不相关的)进程之间共享来自同一应用程序的代码副本[显然,分叉进程按照定义共享代码]。我相信Windows也可以。
共享库(分别用于Linux / Unix和Windows的“.so”和“.dll”文件)也用于在进程之间共享代码 - 相同的共享库用于许多不同的应用程序。
对于每个应用程序,数据空间当然是独立的,共享库也会在每个进程共享库时获得自己的数据部分。