进程加载

进程加载

前提:基于硬件的语言编写的程序(Java 编写的程序是在虚拟机上运行的 -> 存在一定的出入)

编译

  • 定义:
    • 编译程序将 ==源代码==(高级语言)编译成处理器可识别的 ==目标代码==
    • 编译程序将 ==目标代码== 分割成许多目标代码段,目标代码段被封装形成 ==目标模块==
    • 编译程序为每个目标模块分配 ==逻辑地址空间== 然后 ==存放在磁盘== 中
  • 细节:
    • Java 源代码被编译成 字节码 被虚拟机执行 <-> C/C++ 源代码被编译成 汇编语言 被操作系统执行
    • 编译程序并不是操作系统的一部分,不同的语言的编译器是不同的:Java 编译器是 javacC/C++ 编译器是 gcc

链接

加载

  • 定义:

  • 分类:

    • 静态加载:程序加载时将所有目标模块全部加载进入内存

      全部加载进入内存会使内存的利用率变低:因为并不是所有的目标模块都会被经常使用,如果部分模块不会经常使用,那么加载到内存就是浪费

    • 动态加载:

      • 定义:只有在程序的目标模块 ==被调用时== 才会加载到内存中

        解释:进程在执行过程中需要另一个进程,那么调度程序就会检查内存中是否存在,如果不存在就会去磁盘中寻找对应的目标模块,并加载进内存

        举例:网页下载资源时,如果迅雷没有开启,那么浏览器会自动帮你打开迅雷,然后使用迅雷下载

      • 细节:内存的利用率会相对较高

        解释:软件开发中通常业务核心代码只占据 30% ~ 40%,剩余全是异常处理;显然在程序载入时将这些异常处理都载入进去是不合理的

  • 动态加载 & 动态链接 & 请求调页

    • 动态加载:是在需要某个 子进程 时将相应的子进程加载进入内存中:单位是程序(进程)

    • 动态链接:是在需要某个 库函数 时将相应的库函数链接到进程中去:单位是链接

    • 请求调页:是在需要进程的 某个页面 的时候将相应的页面加载进入内存中去:单位是页面

      注:动态加载更多是历史原因,在以前没有分页管理时,进程只能够被全部加载进去

      ​ 尽可能地节约内存就只能采用动态加载,暂时不用的子程序就放在磁盘中;不过现在采用分页管理了,动态加载也实际上就是请求调页了

  • 地址绑定

地址绑定

Author: Fuyusakaiori
Link: http://example.com/2021/09/18/os/process/进程加载/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.