暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

程序的装入和连接

别动我的月亮啊 2020-12-08
629


  • 概要

  • 程序的装入

    • 绝对装入方式

    • 可重定位装入方式

    • 动态运行时的装入方式

  • 程序的连接

    • 静态连接方式

    • 装入时动态连接

    • 运行时动态链接

  • 连续分配存储管理方式

    • 单一连续分配

    • 固定分区分配

    • 动态分区分配

    • 基于顺序的动态分区分配算法


概要

🔺:本章需要对计算机存储器结构有一定了解

用户程序要在系统中运行,必须将它们先转入内存,然后再将其转变为一个可以执行的程序,通常都要经过以下几个步骤:

  1. 编译:由编译程序(Compiler)对用户源程序进行编译,形成若干个目标模块
  2. 链接:由链接程序(Linker)将编译后形成的一组目标模块以及它们所需要的库函数链接在一起,形成一个完整的装入模块(Load Module)
  3. 装入:由装入程序(Loader)将装入模块装入内存。
对用户程序的处理步骤

程序的装入

在这里先介绍一下无需进行连接的单个目标模块的装入过程 。该目标模块也就是装入模块。在将一个装入模块装入内存时,可以有如下三种装入方式:

绝对装入方式

用户程序经编译后,将产生的绝对地址的目标代码,程序中所使用的绝对地址可以再编译或汇编时给出,也可由程序员直接赋予。例如事先已知用户程序驻留在R处开始的位置,则编译程序所产生的目标模块便可从R处向上扩展。

可重定位装入方式

在多道程序环境下,编程程序不可能预知目标模块应放在内存的何处。此时不可能再用绝对装入方式,而应采用可重定位装入方式,它可以根据内存的具体情况将装入模块装入到内存的适当位置。使用这种方式会使装入模块中的所有逻辑地址和实际装入内存后的物理地址不同,在装入过程中一次性将所有地址替换成物理地址

动态运行时的装入方式

与上面的方式不同,装入模块装入内存后,并不立即把装入模块的逻辑地址转换为物理地址,而是把这种地址转换推迟到程序真正要运行时才进行。为使地址转换不影响指令的执行速度,这种方式需要一个 重定位寄存器的支持

程序的连接

源程序经过编译后,可得到一组目标模块。连接程序的功能是将这组目标模块以及它们所需要的库函数装配成一个完整的装入模块。根据**进行连接的时间不同**,可把连接分为如下几种:

静态连接方式

程序运行之前,先将各目标模块以及他们所需的库函数连接成一个完整的装配模块,以后不再拆开。这种事先进行连接的方式称为静态连接方式。一般需要解决下面两个问题:

  1. 对相对地址进行修改
  2. 变换外部调用符号。将每个模块中所用外部调用符号也都变换为相对地址
程序的连接

装入时动态连接

将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边连接的连接方式。即在装入一个目标模块时,若发生一个外部模块调用事件,将引起装入程序去找出相应的外部目标模块,并将它装入内存。这种方式有以下优点:

  1. 便于修改和更新。
  2. 便于实现对目标模块的共享。

运行时动态链接

由于应用程序在运行时需要将所有可能需要用到的模块都装入内存,但是有些模块很有可能不用用到。这种方式将某些模块的连接推迟到程序执行时才进行。

连续分配存储管理方式

为了能将用户程序装入内存,必须为它分配一定大小的内存空间。连续分配方式是最早出现的一种存储器分配方式。该分配方式为一个用户程序分配一个连续的内存空间,即程序中或数据的逻辑地址相邻,体现在内存空间分配时物理地址的相邻。连续分配方式可分为四类:单一连续分配
固定分区分配
动态分区分配
动态可重定位分区分配算法

单一连续分配

在单道程序环境下,当时的存储器管理方式是把内存分为系统区和用户区两部分,系统区仅提供给OS使用,通常放在内存的低址部分

固定分区分配

为了能在内存中装入多道程序,且使这些程序直接按又不会发生互相干扰,于是将整个用户空间划分为若干个固定大小的区域,在每个分区中只装入一道作业。

动态分区分配

动态分区分配又称为可变分区分配,根据进程的实际需要,动态地为之分配内存空间。在系统中配置相应的数据结构,用以描述空闲分区和已分配分区的情况,为分配提供依据。

基于顺序的动态分区分配算法

为了实现动态分区分配,通常是将系统中的空闲分区连接成一个链。所谓顺序搜索就是指依次搜索空闲分区链上的空闲分区。一般有如下四种:

首次适应算法(FF)

从链首开始顺序查找,直至找到一个大小能满足要求的空闲分区位置。优先从低址开始查找,从而保留了高址部分的大空闲区。这为以后到达的大作业分配大的内存空间创造条件。缺点是低址部分不断被划分,留下很多碎片

循环首次适应算法(NF)

为了避免低址部分留下许多很小的空闲分区,以及减少查找可用空闲分区的开销,循环首次适应算法在为进程分配内存空间时,不再是每次都从链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找

最佳适应算法

每次为作业分配内存时,总是把能满足要求、又是最小的空闲分区分配给作业,避免“大材小用”

最坏适应算法

总是挑一个最大的空闲区,从中分割一部分存储空间给作业使用


文章转载自别动我的月亮啊,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论