内存的基础知识

本文详细介绍了内存的作用,包括内存如何存储数据以及CPU如何通过内存地址读取数据。阐述了进程运行的原理,包括指令、逻辑地址与物理地址的区别,以及程序装入内存的三种方式:绝对装入、静态重定位装入和动态重定位装入。此外,还探讨了链接的三种方式:静态链接、装入时动态链接和运行时动态链接。这些概念对于理解计算机系统的运作至关重要。
摘要由CSDN通过智能技术生成

内存的基本概念

1、内存的概念与作用

内存是存放数据的硬件,程序中的数据需要被存入内存中才能被CPU处理。因为CPU的处理速度是很快的,而数据从硬盘读取写入的速度很慢,如果CPU直接和硬盘进行数据的交互,那么由于二者速度的不匹配,使得整体的速度会很忙。现代操作系统都是支持并发,也就是多道程序可以同时执行,那么为了区分不同程序的数据,就需要将内存划分为一个个小的单元,对每个单元进行编址。这每一个存储单元,就对应一个内存地址。如果计算机按照字节编址,那么每一个存储单元大小就是1个字节,即8个二进制位;如果计算机按照字长编址,每一个存储单元对应1个字,具体的大小要视计算机位数决定,16位的计算机,其每一个存储单元就对应16个二进制位。

2、进程的运行原理

2.1 指令

我们的程序是用高级语言(例如C语言)编写的,需要经过编译,“翻译”成机器可以“看得懂”的二进制语言,这种机器语言就是指令,可以指导进程运行。如下图所示:

我们用高级语言写出x = x + 1,经过编译后会形成3条指令。上图所举的例子中,指令1标红的部分(即00101100这8位)叫做操作码,表明这条指令的类型是数据传送,后面两个8位数是两个参数,表示把数据从01001111的存放地址(即变量x在内存中的地址),移动到CPU中地址为00000011的寄存器AX中。指令3也是如此,只不过后面两个8位数反过来了,表明是把处理过的数据(加1)从寄存器传送到内存中。指令2的类型表示这是一条加法指令,把地址为00000011中的数据加1。

2.2 逻辑地址与物理地址

从上面的例子可以看出,机器指令可以指示CPU从某一地址单元中存取和处理数据,这一地址单元一般是逻辑地址,即相对地址。与逻辑地址对应的是物理地址,即数据在内存中实际存放的地址。举例说明,假设内存的绝对地址是从0到99(只是举例,实际内存用16进制编址),一共100个存储单元。有4个字节,分别连续地存放到了50到53地址当中,就可以说它们的绝对地址是50到53。但在这4个字节中,我们可以把起始字节的逻辑地址设为0,那后面3个字节的逻辑地址就是1、2和3,只要知道了起始字节的绝对地址50,那么就可以推算出后面3个字节的在内存中的绝对地址了。
在实际生成机器指令的时候,往往不知道数据会存放到哪一个具体的地址,因此需要一个从逻辑地址到物理地址的转换过程,这就设计到程序从编写到运行的一系列过程。

2.3 程序的运行过程——装入

以C语言为例,从编写程序到程序运行,分为编译、链接和装入3个步骤。编译器将源程序翻译成机器语言的过程就称为编译,它可以将一个个的源文件(即.c文件)分别编译成一个个的目标模块(.o文件),每个目标模块有各自的逻辑地址。链接就是将一个个的目标模块,和库函数链接在一起,形成一个完整的装入模块(即可执行文件),这个模块有完整的逻辑地址。最后,再由装入程序将装入模块装入内存中运行,它拥有完整的物理地址,这个物理地址和装入模块中的逻辑地址是不同的。装入过程如下图所示。
在这里插入图片描述

上图是所的例子中,在装入模块,变量a的逻辑地址是80,但它在内存中的绝对地址是180,故指令1如果从内存中地址为80的存储单元写入1就会出错,因此装入的时候,需要完成从逻辑地址到物理地址的转换,主要有3种方式:绝对转入、静态重定位和动态重定位。

2.3.1 绝对装入

绝对装入指的是在编译和链接后就完成了地址的转换,产生的目标模块使用的就是绝对地址,这个绝对地址可以是程序员手动给出的,也可以是编译器转换的,总之,它需要知道这个程序中的数据在内存中的起始绝对地址,故一般只适用于单道程序。

2.3.2 静态重定位装入

静态重定位装入又称可重定位装入,指的是在编译链接后得到的装入模块使用的仍然是逻辑地址。装入程序将装入模块装入内存时进行地址“重定位”,即根据程序在内存中的起始地址,将程序中所有逻辑地址就加上起始地址,就得到了所有数据在内存中的物理地址。这种方式的特点是必须为程序分配一整块连续的内存空间,如果内存空间不够,就不能够将其装入内存,而且一旦装入内存,程序就不能够再移动位置。

2.3.3 动态重定位装入

动态重定位装入又称动态运行时装入,指的是装入模块使用逻辑地址,而且在装入内存时并不立即进行地址转换,而是在程序真正要执行时才进行地址转换,这就需要一个重定位寄存器的支持。在CPU中有一个重定位寄存器,它可以存放装入模块的起始地址,而且它是可变的。这样,需要进行地址转换的部分程序可以将逻辑地址加上重定位寄存器当中的地址,就得到其物理地址。而当另外的程序加载进不同起始地址的内存空间或者原来程序的起始地址发生改变时,只需要相应地改变寄存器当中的地址,仍然可以顺利进行地址的转换而不会出错。这种方式不但可以动态分配内存,而且便于程序段的共享,可以将有限的内存空间,存储比内存空间还大的程序。

绝对装入是在单道程序运行时使用的,那时候还没有产生操作系统。静态重定位装入适用于早期多道批处理系统,而现代操作系统使用的一般都是动态重定位装入。

2.4 程序的运行过程——链接

链接有三种方式,分别是静态链接、装入时动态链接和运行时动态链接。

2.4.1 静态链接

静态链接指的是在程序运行之前,将各个目标模块和库函数连接在一起,形成一个完整的装入模块(即可执行文件),之后不在拆开。

2.4.2 装入时动态链接

装入时动态链接指的是将各个目标模块装入内存时,边装入边链接的过程。

2.4.3 运行时动态链接

运行时动态链接指的是在程序运行时才将需要的目标模块链接并装入内存,不需要用到的目标模块则不装入。其优点是便于修改和更新,便于实现对目标模块的共享。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值