目录
2.2 可重定装入(Relocatable Loading):
2.3 动态运行时装入(Dynamic Loading/Runtime Loading):
1 基本概念
内存,也称为随机存取存储器(RAM),是计算机系统中的一种重要硬件组件,用于临时存储和快速访问计算机程序和数据。内存是计算机系统的关键组成部分,它可以快速读写数据,与中央处理器(CPU)交换信息,以及临时存储正在执行的程序和数据。
内存的主要作用包括:
临时存储程序和数据:内存用于存储当前正在执行的程序和处理的数据。当程序运行时,它们需要在内存中加载和存储临时数据,如变量、函数、指令等。这使得计算机能够快速访问和处理这些数据。
提高计算机运行速度:内存的读写速度远远高于硬盘或固态硬盘(SSD)等存储设备,因此将数据存储在内存中可以显著提高计算机的运行速度。
缓解存储器层次结构的矛盾:内存作为快速访问的临时存储器,能够缓解CPU与慢速存储设备(如硬盘)之间的速度不匹配问题。CPU可以快速读取内存中的数据,而不必每次都从硬盘读取,从而加速计算过程。
支持多任务和多用户操作:内存允许计算机同时运行多个程序,支持多任务操作系统。不同程序可以在内存中同时运行,相互之间不干扰,这种并发性使计算机更加高效。
改善系统稳定性和用户体验:足够的内存可以减少系统崩溃或运行缓慢的可能性。它可以确保系统有足够的空间来运行应用程序,提供良好的用户体验。
2 装入的三种方式
2.1 绝对装入(Absolute Loading):
特点:绝对装入是一种最简单的装入方式,程序被加载到固定的内存位置,这个位置通常在程序编写和编译时已经确定好。
优点:这种方式操作简单,速度较快,因为不需要进行地址重定位。
缺点:程序只能加载到预定的内存位置,因此不支持多个程序同时运行,而且不灵活。
2.2 可重定装入(Relocatable Loading):
特点:可重定装入允许程序在加载时根据可用的内存空间进行地址重定位。程序中的地址引用被保存为相对地址,而不是绝对地址。
优点:这种方式可以在不同的内存地址加载多个程序,支持多道程序设计,提高了内存利用率。
缺点:需要进行地址重定位操作,可能稍微增加了加载时间和开销。
2.3 动态运行时装入(Dynamic Loading/Runtime Loading):
特点:动态运行时装入是一种更加灵活的装入方式,程序的一部分或全部在程序运行时才加载到内存中,而不是在程序启动时一次性加载。
优点:节省了内存空间,只有需要的部分被加载,可以支持更大的程序或更多的程序同时运行。
缺点:实现相对复杂,需要运行时的地址解析和加载操作,可能会引入一些性能开销。
动态重定位
动态重定位(Dynamic Relocation)是计算机操作系统中的一个重要概念,它指的是在程序运行时根据需要调整程序中的地址引用,以适应程序加载到内存的不同位置的过程。这个过程是为了解决在可重定装入或动态运行时装入等情况下,程序的地址如何在加载后正确映射到内存的问题。
3 链接的三种方式
3.1 静态链接
静态链接是一种在编译时将所有程序模块(如函数、库等)链接在一起形成可执行文件的方式。在静态链接中,所有的代码和数据都被复制到最终的可执行文件中,这意味着可执行文件是一个独立的、自包含的单元。当用户运行程序时,操作系统加载整个可执行文件到内存中,并执行其中的代码。
优点:
性能较好:因为所有代码和数据都在一个文件中,所以无需在运行时进行额外的链接操作,执行速度较快。
稳定性:由于程序依赖的库被静态链接到可执行文件中,所以不会受到外部库版本变化的影响。
缺点:
占用磁盘空间:每个可执行文件都包含所有的代码和数据,可能会占用大量磁盘空间。
难以更新:如果库或模块需要更新,必须重新编译和链接整个程序。
3.2 装入时动态链接
装入时动态链接是一种在程序加载到内存时将其依赖的库链接到程序的方式。在这种情况下,可执行文件包含了程序的代码和一些关于依赖库的信息,但实际的库代码在程序运行时才会被加载到内存中。
优点:
节省磁盘空间:可执行文件不包含所有库的副本,因此通常比静态链接生成的文件小。
易于更新:可以单独更新库,不需要重新编译整个程序。
缺点:
运行时开销:每次运行程序都需要在加载时进行链接操作,可能会稍微减慢启动速度。
依赖性管理:需要确保所需的库在运行时可用,否则程序将无法正常执行。
3.3 运行时动态链接
运行时动态链接是一种在程序运行时动态加载和链接库的方式。在这种情况下,可执行文件只包含程序的代码和少量与库相关的信息,而实际的库代码在程序需要时才会被加载到内存中。
优点:
最小化内存占用:只有在需要时才加载库,可以节省内存。
灵活性:可以动态加载不同版本的库,支持插件系统等。
缺点:
运行时开销:与装入时动态链接相比,运行时动态链接的启动速度可能更慢,因为需要在运行时加载和链接库。
复杂性:需要在程序中显式管理库的加载和卸载。