首页 > 试题广场 >

静态重定位的时机是().

[单选题]
静态重定位的时机是().
  • 程序编译时
  • 程序链接时
  • 程序装入时
  • 程序运行时
静态重定位是:装入时进行定位。
动态重定位是:程序执行过程中,用到了在进行定位。
发表于 2020-03-28 13:41:25 回复(0)

答案:C
对程序进行重定位的技术按重定位的时机可分为两种:静态重定位动态重定位
静态重定位:是在目标程序装入内存时,由装入程序对目标程序中的指令和数据的地址进行修改,即把程序的逻辑地址都改成实际的地址。对每个程序来说,这种地址变换只是在装入时一次完成,在程序运行期间不再进行重定位。
优点:是无需增加硬件地址转换机构,便于实现程序的静态连接。在早期计算机系统中大多采用这种方案。
缺点:(1)程序的存储空间只能是连续的一片区域,而且在重定位之后就不能再移动。这不利于内存空间的有效使用。(2)各个用户进程很难共享内存中的同一程序的副本。
动态重定位:是在程序执行期间每次访问内存之前进行重定位。这种变换是靠硬件地址变换机构实现的。通常采用一个重定位寄存器,其中放有当前正在执行的程序在内存空间中的起始地址,而地址空间中的代码在装入过程中不发生变化。
优点:(1)程序占用的内存空间动态可变,不必连续存放在一处。(2)比较容易实现几个进程对同一程序副本的共享使用。
缺点:是需要附加的硬件支持,增加了机器成本,而且实现存储管理的软件算法比较复杂。
现在一般计算机系统中都采用动态重定位方法。
发表于 2015-08-08 08:54:59 回复(0)

的确,答案翻译成加载应该更为合适

前面对地址绑定的介绍只是为了更好的理解本题,要看本题的解析的话直接翻到最后

地址绑定

链接器和加载器:将更抽象的名字与更底层的名字绑定起来,好让程序员使用更抽象的名字编写代码。

总结就是完成地址绑定。

  • 然后我们看地址绑定的发展:

在操作系统出现之前,重定位和库查询都是由链接器实现的,而随着操作系统的出现,可重定位的加载器就从链接器和库中分离出来了。

这是为什么呢?

因为没有操作系统的时候,程序是可以随意支配计算机里面的内存的,正因为它知道所有的内存,所以往往我们的程序都是以固定的内存地址来汇编和链接的。

但是有了操作系统之后,程序就必须和操作系统甚至其他的程序一起共享计算机的内存。这意味着操作系统在程序加载到内存之前是无法确定其运行的确切地址,并将最终的地址绑定从链接时推延到了加载时。

因此,链接器对每一个程序的部分地址进行绑定并分配相对地址,加载器完成最后的重定位步骤并分配实际地址。

不过值得一提的是,由于链接器和加载器相当多的功能重叠,所以他们都能进行重定位。

  • 接着我们看地址绑定的进一步发展:

随着硬件重定位和虚拟内存的出现,每一个程序可以再次拥有整个地址空间,因此连接器和加载器变得不那么复杂了。

硬件重定位:和软件重定位的区别在于,程序可以按照被加载到固定地址的方式来链接。

但是当我们在具有硬件重定位功能的计算机上运行多个程序的时候,会有公共的代码,这就诞生了我们的共享库。

静态共享库:每个库在创建时会被绑定到特定的地址,链接器在链接时将程序中引用的库例程绑定到这些特定的地址。

动态共享库:程序在开始运行之前不会将所用库中的段和符号绑定到确切的地址上。有时这种绑定还会更为延迟。在程序运行过程中也可以加载库进行绑定。Windows最喜欢用的DLL就是动态共享库。


重定位

重定位:为程序不同部分分配加载地址,调整程序中的数据和代码以反映所分配地址的过程。

理解了重定位之后,静态重定位和动态重定位就好理解了。

静态重定位:当这个把用户程序加载到内存中的时候,一次性的把所有的逻辑地址转换为物理地址。

动态重定位:程序加载到内存的时候,不改变任何的地址,在程序执行过程当中再进行地址的变换,每执行一条指令就做相应的地址转换工作,程序起始的地址被送入重定位寄存器,CPU在执行的时候把取到的逻辑地址送到MMU(内存管理单元)部件把逻辑地址转换到物理地址。

发表于 2017-06-09 12:30:10 回复(1)
我就不信只有我一个人看过csapp和程序员的自我修养。这题应该选B,我不相信百度百科,也不相信国内的计算机书籍,更没有听说过"装入"这个词。
发表于 2016-09-02 20:35:39 回复(4)

编译

将高级语言翻译为机器语言

链接

形成逻辑地址

静态链接

程序运行之前,链接为一个完整的可执行程序,以后不再拆开

 

装入时动态链接

在装入内存时,采用边装入边链接的方式

 

运行时动态链接

在运行中,需要该模块时进行链接,用不到的模块不需要链接

装入

形成物理地址

绝对装入

编译时就有了物理地址。逻辑地址与物理地址相同,不需要对程序和数据进行修改,绝对装入只适用于单道程序。绝对地址可由编译时给,或由程序员给出。

 

静态重定位

可重定位装入

 

装入时,逻辑地址转为物理地址,装入后不能移动,也不能再申请空间。若没有足够的空间,则不能装入该作业

重定位:装入时对目标程序中指令和数据的修改称为重定位。

 

动态重定位

可重定位装入

执行时,辑地址转为物理地址,装入后的所有地址均为相对地址,装入后可能会被换出(移动),物理地址可能改变。

动态重定位可以将程序分配到不连续的存储区,程序执行之前可以只装入部分代码即可投入运行。向用户提供比存储空间大得多的地址空间。

编辑于 2021-10-22 13:25:50 回复(0)

考察重定位

重定位,通常来说把在装入时对目标程序中指令和数据地址修改的过程称为重定位。
而静态重定位就是,在逻辑地址转换为物理地址的过程中,地址变换是在进程装入时一次完成的,以后不再改变。
优点:是无需增加硬件地址转换机构,便于实现程序的静态连接。在早期计算机系统中大多采用这种方案。
缺点:内存空间不能移动;各个用户进程很难共享内存中同一程序的副本
动态重定位:动态运行的装入程序把转入模块装入内存之后,并不立即把装入模块的逻辑地址进行转换,而是把这
种地址转换推迟到程序执行时才进行,装入内存后的所有地址都仍是逻辑地址。这种方式需要寄存器的支持,其中
放有当前正在执行的程序在内存空间中的起始地址。
优点:内存空间可以移动;各个用户进程可以共享内存中同一程序的副本。
缺点:增加了机器成本,而且实现存储管理的软件算法比较复杂。
转载自https://blog.csdn.net/sunjinbat/article/details/80571241

发表于 2021-06-08 21:39:45 回复(0)
在将一个装入模块装入内存时,可以有绝对装入方式、可重定位装入方式和动态运行时装入方式。不同装入方式决定内存位置是绝对的还是相对的,或者说是静态的还是动态的。
发表于 2022-11-09 11:05:23 回复(0)
装入时对目标程序中的数据和指令的修改称为重定位
发表于 2022-03-09 15:36:54 回复(0)
重定位,程序装入时
发表于 2020-05-10 22:14:15 回复(0)
答案:C 对程序进行重定位的技术按重定位的时机可分为两种:静态重定位和动态重定位。 静态重定位:是在目标程序装入内存时,由装入程序对目标程序中的指令和数据的地址进行修改,即把程序的逻辑地址都改成实际的地址。对每个程序来说,这种地址变换只是在装入时一次完成,在程序运行期间不再进行重定位。 优点:是无需增加硬件地址转换机构,便于实现程序的静态连接。在早期计算机系统中大多采用这种方案。 缺点:(1)程序的存储空间只能是连续的一片区域,而且在重定位之后就不能再移动。这不利于内存空间的有效使用。(2)各个用户进程很难共享内存中的同一程序的副本。 动态重定位:是在程序执行期间每次访问内存之前进行重定位。这种变换是靠硬件地址变换机构实现的。通常采用一个重定位寄存器,其中放有当前正在执行的程序在内存空间中的起始地址,而地址空间中的代码在装入过程中不发生变化。 优点:(1)程序占用的内存空间动态可变,不必连续存放在一处。(2)比较容易实现几个进程对同一程序副本的共享使用。 缺点:是需要附加的硬件支持,增加了机器成本,而且实现存储管理的软件算法比较复杂。 现在一般计算机系统中都采用动态重定位方法。
发表于 2016-03-11 16:10:18 回复(0)
对程序进行重定位的技术按重定位的时机可分为两种:静态重定位动态重定位
静态重定位:是在目标程序装入内存时,由装入程序对目标程序中的指令和数据的地址进行修改,即把程序的逻辑地址都改成实际的地址。对每个程序来说,这种地址变换只是在装入时一次完成,在程序运行期间不再进行重定位。  
优点:是无需增加硬件地址转换机构,便于实现程序的静态连接。在早期计算机系统中大多采用这种方案。  
缺点:(1)程序的存储空间只能是连续的一片区域,而且在重定位之后就不能再移动。这不利于内存空间的有效使用。(2)各个用户进程很难共享内存中的同一程序的副本。  
动态重定位:是在程序执行期间每次访问内存之前进行重定位。这种变换是靠硬件地址变换机构实现的。通常采用一个重定位寄存器,其中放有当前正在执行的程序在内存空间中的起始地址,而地址空间中的代码在装入过程中不发生变化。  
优点:(1)程序占用的内存空间动态可变,不必连续存放在一处。(2)比较容易实现几个进程对同一程序副本的共享使用。  
缺点:是需要附加的硬件支持,增加了机器成本,而且实现存储管理的软件算法比较复杂。  
发表于 2016-03-07 10:55:57 回复(0)