11

我已经开始研究 c 编程,虽然我不是一个完整的初学者(我有 java 和 web 开发的知识),但有很多东西我不明白。

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

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

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

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

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

4

1 回答 1

7

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

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

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

如果操作系统决定需要一些内存,它可能会丢弃一些代码,并在以后需要时重新加载它[如果它再次需要 - 如果它是初始化的一部分,它可能永远不会再次受到打击] .

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

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

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

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

于 2013-05-20T11:34:58.193 回答