静态重定位和动态重定位

程序执行时,必须将地址空间变为绝对地址才能访问系统分配的内存

地址重定位:操作系统把用户程序指令中的相对地址变换成为所在存储中的绝对地址的过程

地址重定位实现了:从逻辑地址到物理地址的转换


1. 地址的静态重定位

定义:在程序运行之前,为用户程序实行了地址重定位工作

一般由操作系统中的重定位装入程序完成

重定位装入程序的输入:用户把自己的作业链接装配成一个相对于 0 编址的目标程序

过程:

重定位装入程序根据当前内存的分配情况,按照分配区域的起始地址逐一调整目标程序指令中的地址部分。目标程序在经过重定位装入程序加工之后,不仅进入到分配给自己的绝对地址空间中,而且程序指令中的地址部分全部进行了修正,反映出了自己正确的存储位置,保证了程序的正确运行

特点:

在装入前实现调整

地址要有标识

每次装入都要进行定位

装入后地址不再改变(静态)

2. 地址的动态重定位

定义:在程序执行寻址时进行重定位,访问地址时,通过地址变换机构改变为内存地址

用户程序原封不动的装入内存,运行时再完成地址的定位工作

动态重定位需要硬件的支持,要求系统中配备定位寄存器加法器

特点:

程序可装入任意内存区域(不要求占用连续的内存区)

只装入部分程序代码即可运行

改变系统时不需要改变程序(程序占用的内存空间动态可变,只需要改变定位寄存器中的值即可)

程序可方便共享




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

你可能感兴趣的:(Java)