【问题标题】:Is all program code loaded into the text\code section\segment of memory是否所有程序代码都加载到 text\code section\segment 内存中
【发布时间】:2013-05-14 22:14:17
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: c memory operating-system segment


    【解决方案1】:

    程序运行时是否所有程序代码都加载到内存中 已启动还是仅加载了需要的内容?

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

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

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

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

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

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

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

    【讨论】:

    • 感谢您的回答,它涵盖了我需要知道的所有内容,不幸的是(通常情况下)它给我留下了更多相关的问题!如果加载了一个方法的指令并且在程序的生命周期中可以多次调用该方法,它会保留在内存中吗?我的另一个问题是关于生成图形显示的代码?我会假设这段代码必须在程序的生命周期内永久加载,还是我认为这个是不正确的?
    • 只要没有太多的内存短缺以至于操作系统“需要”内存用于其他用途,它就会保留在内存中。我不明白为什么“生成图形显示的代码”与任何其他代码有任何不同 - 它是代码,就像进行数学运算、在表格中搜索或以某个整数计算个数的代码一样。 [显然,实际在屏幕上绘制的 DRIVER 代码是内核模块或系统驱动程序,这些通常不是“可交换的”——这些通常也不是“按需加载”的,而是一次性加载的,并且典型情况下不卸载]。
    • 我应该补充一点,操作系统通常会以某种方式跟踪“自从使用此内存以来的时间”。因此,与最近运行的代码相比,一些一直闲置而没有使用的代码(或数据)更有可能被“踢出”。
    • 好的,再次感谢您抽出宝贵时间来解释这一点,我想我现在很高兴我理解的足够多,可以继续阅读!干杯。
    猜你喜欢
    • 2021-04-14
    • 2013-05-12
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 2022-08-05
    • 2017-01-05
    • 2019-04-24
    • 2012-06-30
    相关资源
    最近更新 更多