天天看点

内存的基础知识

内存的基础知识

1.什么是内存,有何作用

内存是用于存放数据的硬件。程序执行前需要先放到内存中才能被CPU处理。

在多道程序环境下,系统中多个程序并发执行,如何区分各个程序的存放数据位置呢?

方案是:给内存的储存单元编写地址

(1)存储单元和内存地址

存储单元:就是存储空间,如果按字节编址,其空间大小就是8个bite位,可以存储0~256个数字,如果按字编址,就字的大小,字一般由若干个字节组成。

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

(2)按字节编址和按字编址

按字节编址和按字编址的方式,决定了存储单元的大小和内存地址的大小(结合总的内存位数,即内存大小)

补充:几个常用的数量单位:

1k=2^10B

1M=2^20B

1G=2^30B

1B=8bit

举个例子:

一台电脑有4GB的内存,如果按字编制,求其存储单元有多少,内存地址需要几位来表示?

4GB=4*2^30

=2^32 B

B=8bit 等于0-255个数字

所以有2^32个存储单元,地址需要32位来表示

每个进程在逻辑上由三个部分组成:

1.程序段

2.数据段

3.PCB块

2.进程运行的基本原理

(1)指令工作的步骤

CPU逐个读取程序段中的指令

内存的基础知识

指令由操作码和参数(地址或变量)组成。这些指令会告诉CPU应该去哪个地址进行存或取数据,然后问题就来了,在单道程序系统中,因为只有一个程序在执行,所以地址容易确定,而在多道程序中,由于程序大小,执行的先后,导致了内存地址中空闲地址的不确定,从而产生了逻辑地址和物理地址的区别。在我们程序员写完代码后,编译出的机器语言指令中的存取地址都是逻辑地址,即再从0开始写地址,到了真正运行的时候,再转化为实际内存的物理地址。

(2)逻辑地址和物理地址

逻辑地址=》相对地址 物理地址=》绝对地址

(3)从写程序到程序运行

内存的基础知识

源文件就是指c语言的 .c文件

目标模块就是编译生成的 .o文件

装入模块就是目标模块链接后的 .exe文件

1.编辑源码文件:

2.编译:由源码文件生成目标模块,由高级语言生成机器语言

由编译程序将用户的源代码编译成若干个目标模块(各个目标模块中都有着自己的逻辑地址,即从0开始)

3.链接:由目标模块生成装入模块,链接后生成完整的逻辑地址

由链接程序将编译后形成一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块,,由装入程序将装入模块装入内存中运行。(会将之前每个目标模块的逻辑地址再进行一次整合,形成一个新的逻辑地址,即从0开始)

4.装入:将装入模块装入内存,装入后生成物理地址

(4)三种链接方式

1.静态链接:装入前链接成一个完整装入模块

2.装入时动态链接:运行前 —边装入边链接

3.运行时动态链接:运行目标模块才装入并链接

(5)三种装入方式

1.绝对装入:编译时产生绝对地址(适合单道程序)

在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生的绝对地址的目标代码。装入程序安装装入模块中的地址,直接可以在内存中进行操作。

2.可重定位装入:装入时将逻辑地址转换为物理地址

静态重定位:又称可重定位装入,编译、链接后的装入模块的地址都是从0开始,指令中的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,将装入模块装入到内存的适当位置。装入时对地址进行重定位,将逻辑地址转化为物理地址(地址变换是在装入时一次完成的)

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

3.动态运行时装入:运行时将逻辑地址转换为物理地址,需设置重定位寄存器

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

有一个理解难点,就是链接和装入是怎么联合在一起的????

继续阅读