内存可存放数据。程序执行前需要先放到内存中才能被CPU处理--->缓和CPU与硬盘之前的速度矛盾
内存的存放类似于酒店,给内存的每个存储单元都编号。(在多道程序环境下,系统中会有很多个程序并发执行,也就是说会有多个程序的数据需要同时放到内存中,所以要给内存的存储单元编址:如果每个计算机“按字节编址”,则每个存储单元大小为1字节,即1B,即8个二进制位;如果字长为16为16位的计算机“按字编址”,则每个存储单元大小为1个字,每个字的大小为16个二进制位)
补充1:计算机的字长
计算机字长就是计算机中CPU在一次操作中能处理的单位字的长度,即运算器能够并行处理和存储器每次读写操作时能包含的二进制码的位数。
计算机字长的介绍:
计算机字长是直接用二进制代码指令表达的计算机语言,指令是用0和1组成的一串代码,它们有一定的位数,并分成若干字长段,各段的编码表示不同的含义。
例如某台计算机字长为16位,即有16个二进制数合成一条指令或其它信息。16个0和1可组成各种排列组合,通过线路变成电信号,让计算机执行各种不同的操作。
补充2:几个常用的数量单位
G只是表示个数量而已,B有实际意义,是一个数据,指的是字节(Byte),小写的b是bit,是一个比特位,一个二进制位,1Byte = 8 bit。
补充3:
bit是位,在计算机中bit也就是比特,是最小的数据单位。
位:
位英语是bit,表示计算机内部最小数据存储单位,表示二进制。
字节:
字节也就是Byte,简称为B,是计算机处理数据的基本单位。
补充4:指令的工作原理
下面举C语言语句x = x + 1在计算机是怎么运作的例子:
计算机会先编译x = x + 1此语句,编译完成之后,生成一些指令,然后计算机依次执行这些指令
当这个C语言程序运行的时候,系统会为它建立相应的进程,一个进程在内存当中占有一片区域,叫程序段(用于存放与进程相关的代码、指令),另外改进程还有一个部分,叫做数据段,用于放置该程序所要处理的一些变量之类的一些数据(例如x变量就存放在数据段里),下面介绍上边的三个指令:
CPU在执行这三个指令的时候,首先它取出了指令1(由这三个部分组成,第一个部分叫做操作码,指明了这条指令要干一件什么事情, 指令1是数据传送指令,后面两个码是干这个操作必要的参数
例如,指令1就是让CPU从内存地址01001111(对应十进制为79)内存单元中存放的数据取到00000011(对应十进制为3)编号为3的寄存器当中)
可以看出,我们写的代码要翻译成CPU能识别的指令。这些指令会告诉CPU应该去内存的哪个地址读/写数据,这个数据应该做什么样的处理。在这个例子中,我们默认这个进程的相关内容从地址#0开始连续存放,指令的地址参数直接给出了变量x的实际存放地址(物理地址)。
综上可以看出,指令的工作是基于“地址”的,每个地址对应一个数据的存储单元。
课程的引入:(引入装入的三种方式)
基址 + 偏移
(1)绝对装入(从根本上解决问题,暴力办法)
绝对装入:在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。装入程序按照装入模块中的地址,将程序和数据装入内存。
(2)可重定位装入
静态重定位:又称可重定位装入。编译、链接后的装入模块的地址都是从0开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,将装入模块装入到内存的适当位置。装入时对地址进行“重定位”,将逻辑地址变换为物理地址(地址变换是在装入时一次完成的)。
(3)动态运行时装入
动态重定位:又称动态运行时装入。编译、链接后的装入模块的地址都是从0开始的。装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址依然是逻辑地址。这种方式需要一个重定位寄存器的支持。
4、从写程序到程序运行
写在前面:
内存中的块叫做页框,进程中的块叫做页面,内存中每个页面对应的物理块号叫做页表,页表由页表项组成。