内存概念,进程运行的基本原理(指令,逻辑地址与物理地址的转换,程序运行的过程)

1.内存

内存可存放数据。
程序执行前需要先放到内存中才能被CPU处理:缓和cPU与硬盘之间的速度矛盾。

1.内存地址

内存地址从0开始,每个地址对应个存储单元。

2.存储单元

内存中也有一个一个的“小房间”,每个小房间就是一个“存储单元”。

  • 如果计算机“按字节编址”则每个存储单元大小为1字节,即1B,即8个二进制位。
  • 如果字长为16位的计算机“按字编址”,则每个存储单元大小为1个字;每字的大小为16个二进制位。

3.数量单位

一个字节等于八个比特位。
1 B = 8 b 1B=8b 1B=8b
2 10 = 1 K ( 千 ) 2^{10} = 1K(千) 210=1K()
2 20 = 1 M ( 兆,百万 ) 2^{20} = 1M(兆,百万) 220=1M(兆,百万)
2 30 = 1 G ( 十亿,千兆 ) 2^{30} = 1G(十亿,千兆) 230=1G(十亿,千兆)

2.进程运行的基本原理

1.指令的工作原理

操作码+若干参数(可能包含地址参数)
内存概念,进程运行的基本原理(指令,逻辑地址与物理地址的转换,程序运行的过程)_第1张图片
指令的工作基于“地址”,每个地址对应一个数据的存储单元。

可见,我们写的代码要翻译成CPU能识别的指令。
这些指令会告诉CPU应该去内存的哪个地址读/写数据,
这个数据应该做什么样的处理。
在这个例子中,我们默认让这个进程的相关内容从地址#0开始连续存放,指令中的地址参数直接给出了变量x的实际存放地址(物理地址)。

2.逻辑地址(相对地址)vs物理地址(绝对地址)

程序经过编译、链接后生成的指令中指明的是逻辑地址(相对地址),
即:相对于进程的起始地址而言的地址。

3. 如何实现地址转换(三种装入方式)

1.绝对装入

绝对装入:
在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。
装入程序按照装入模块中的地址,将程序和数据装入内存。

内存概念,进程运行的基本原理(指令,逻辑地址与物理地址的转换,程序运行的过程)_第2张图片
编译、链接后得到的装入模块的指令直接就使用了绝对地址.
绝对装入只适用于单道程序环境

2.可重定位装入(静态重定位)

静态重定位:又称可重定位装入。
编译、链接后的装入模块的地址都是从0开始的,
指令中便用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。
可根据内存的当前情况,将装入模块装入到内存的适当位置。
装入时对地址进行“重定位”,将逻辑地址变换为物理地址(地址变换是在装入时一次完成的)。
内存概念,进程运行的基本原理(指令,逻辑地址与物理地址的转换,程序运行的过程)_第3张图片

静态重定位的特点是在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。
作业一旦进入内存后,在运行期间就不能再移动,也不能再申请内存空间。

3.动态运行时装入(动态重定位)

动态重定位:
又称动态运行时装入。
编译、链接后的装入模块的地址都是从开始的。
装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行。
因此装入内存后所有的地址依然是逻辑地址。
这种方式需要一个重定位寄存器的支持。

内存概念,进程运行的基本原理(指令,逻辑地址与物理地址的转换,程序运行的过程)_第4张图片

4.从写程序到程序运行的过程

内存概念,进程运行的基本原理(指令,逻辑地址与物理地址的转换,程序运行的过程)_第5张图片

  • 编译:由编译程序将用户源代码编译成若干个目标模块(编译就是把高级语言翻译为机器语言)
  • 链接:由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块。
  • 装入(装载):由装入程序将装入模块装入内存运行。

5.三种链接方式

1.静态链接:

在程序运行之前,先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。

2.装入时动态链接:

将各目标模块装入内存时,边装入边链接的链接方式。

3.运行时动态链接:

在程序执行中需要该目标模块时,才对它进行链接。
其优点是便于修改和更新,便于实现对目标模块的共享。

你可能感兴趣的:(操作系统,服务器,运维,linux)