内存的基础知识(常用数量单位、进程运行原理、存储单元、内存地址、绝对装入、静态重定位、动态重定位、静态链接、动态链接等)

前言

此篇文章是我在B站学习时所做的笔记,大部分图片都是课件老师的PPT,方便复习用。此篇文章仅供学习参考。


提示:以下是本篇文章正文内容

知识总览

在这里插入图片描述

什么是内存?有何作用?

内存是用于存放数据的硬件。程序执行前需要先放到内存中才能被CPU处理
在这里插入图片描述

在多道程序环境下,系统中会有多个程序并发执行,也就是说会有多个程序的数据需要同时放到内存中。

几个常用的数量单位

1B= 1字节= 0.5个字
210= 1K(千)
220=1M(兆,百万)
230= 1G(十亿,千兆)

:一台手机/电脑有4GB内存,是什么意思?
:是指该内存中可以存放4*230个字节。如果是按字节编址的话,也就是有4*230 = 232个“小房间”

注:有的题目会告诉我们内存的大小,让我们确定地址长度应该是多少(即要多少个二进制位才能表示相应数目的存储单元)
如:这么多“小房间”,需要232个地址才能一一标识,所以地址需要用32个二进制位来表示(0~232-1)

进程的运行原理——指令

在这里插入图片描述
解说
我们用高级语言写的这些代码经过编译之后,会形成与它的对等的一系列的机器指令,这些指令使用机器语言二进制来写的,可以被CPU识别,那么CPU会根据我们的这些指令做出一系列的事情,用来完成我们指定的这个操作。假设我们的变量x是存放在这个地址(01001111)对应的内存单元里吧,当然这个地址是用二进制数表示的,那么一般来说像变量这些数据都是存放在所谓的数据段里,而指令是存放在程序段里,还记得程序段和数据段的概念吗?咱们在进程那个章节学过,每个进程在逻辑上有三个部分组成,程序段,数据段,还有PCB(也就是进程控制块),那么CPU会根据进程的程序段里的这些指令来执行一系列的操作,他会依次执行这些指令,比如说此时执行到了指令1,也就是一个数据传送指令,CPU首先会根据这个指令前面的这几位(00101100)来判断此时这个指令到底是让她干些什么事情,这几位(00101100)叫做操作码,这个操作码就是指明让CPU进行数据的传送,后面的这两组数据其实就是两个参数,就是让CPU把内存单元为(01001111)的数据取出来,放到地址为(00000011)的寄存器当中,所以CPU根据这条指令会把x的值传送到寄存器10(外边的10)。那接下来,会执行第二条指令,是让CPU执行加法操作,就是把00000011的寄存器当中的数据+1,于是寄存器中的内容变成11,接下来执行完第二条指令后,执行第三条指令,第三条指令同样是数据传送指令,不过和刚才的传送方向相反,这次是让CPU把00000011地址的寄存器当中的数据传送到内存的01001111地址当中,所以CPU会把寄存器11的数据传送回变量x存放的地方,这样变量x就实现了x=x+1这样的操作。

总之,每个指令都会有一个操作码告诉CPU此时它要做的是什么事情,并且不同的指令可能会对应一系列参数,那么CPU会根据这些参数和指令的操作码来执行最后具体的操作,CPU会根据地址参数来决定到底要去内存的哪个地方去存/取数据。

  • 可见,我们写的代码要翻译成CPU能识别的指令。这些指令会告诉CPU应该去内存的哪个地址存/取数据,这个数据应该做什么样的处理。在这个例子中,指令中直接给出了变量x的实际存放地址(物理地址)。但实际在生成机器指令的时候并不知道该进程的数据会被放到什么位置。所以编译生成的指令中一般是使用逻辑地址(相对地址)

逻辑地址vs物理地址

宿舍四个人一起出去旅行,四个人的学号尾号分别是0、1、2、3。
住酒店时酒店给你们安排了4个房号相连的房间。四个人按学号递增次序入住房间。比如0、1、2、3号同学分别入住了5、6、7、8号房间。
四个人的编号0、1、2、3其实是一个“相对位置”,而各自入住的房间号是一个“绝对位置”。只要知道0号同学住的是房号为N的房间,那么M号同学的房号一定是N+M。
也就是说,只要知道各个同学的“相对位置”和“起始房号”,就一定可以算出所有同学的“绝对位置”
在这里插入图片描述

相对地址又称逻辑地址绝对地址又称物理地址

进程运行的基本原理

在这里插入图片描述

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

装入模块装入内存

在这里插入图片描述
在这里插入图片描述

装入的三种方式

1、绝对装入

在这里插入图片描述
使用绝对装入的方式的话,我们需要保证在编译的时候就能知道这个装入模块最后会被放入什么位置,并且装入程序也需要遵照之前的约定,把装入模块放入之前约定的位置去。

绝对装入只适用于单道程序环境
灵活性低,因为在单道程序下,内存当中同一时刻只会有一个程序正在运行,所以每个程序要从什么位置开始存放,那我们可以刚开始就约定好,那在程序当中使用的绝对地址可以在编译或汇编的时候给出,也可以由程序员直接赋予,一般来说都是在编译的时候才会产生最终的这个绝对地址

2、静态重定位

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

补充:装入程序负责把所有指令当中涉及到的地址都进行+100的操作,这样就完成了从逻辑地址到物理地址的转变,所以采用静态重定位这种方式使逻辑地址到物理地址的转变是由装入程序负责进行的。
在这里插入图片描述

静态重定位,必须分配作业要求的全部内存空间,在运行期间就不能再移动

3、动态重定位

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

采用动态重定位时允许程序在内存中发生移动

链接的三种方式

  1. 静态链接:在程序运行之前先将各目标模块及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开。
    在这里插入图片描述
  2. 装入时动态链接:将各目标模块装入内存时,边装入边链接的链接方式。
    在这里插入图片描述
  3. 运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接。其优点是便于修改和更新,便于实现对目标模块的共享。在这里插入图片描述

知识回顾与重要考点

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蜗牛_Chenpangzi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值