内存的基础知识
廖家龙 用心听,不照做

什么是内存,有何作用

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

在多道程序环境下,系统中会有多个程序并发执行,也就是说会有多个程序的数据需要同时放到内存中。那么,如何区分各个程序的数据是放在什么地方的呢?

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

内存中有一个一个的“小房间”,每个小房间就是一个存储单元,内存地址从0开始,每个地址对应一个存储单元

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

1B = 8bit;1KB = 2^10^B;1M = 2^10^KB;1GB = 2^10^MB

一台手机有4GB内存,是指该内存中可以存放(4 * 2^30^)个字节,如果是按字节编址的话,也就是有2^32^个“小房间”,所以地址需要用32个二进制位

进程运行的基本原理

指令的工作原理(逻辑地址 VS 物理地址)

指令的工作基于“地址”,每个地址对应一个数据的存储单元

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

如果这个进程不是从地址#0开始存放的,会影响指令的正常执行吗?

如何实现地址转换

如何将指令中的逻辑地址转换为物理地址?

三种装入方式:

  1. 绝对装入(换个电脑装入模块就作废了)(编译时)(单道程序阶段,此时还没产生操作系统,由编译器实现)

  2. 可重定位装入(静态重定位)(装入内存时)(用于早期的多道批处理)

  3. 动态运行时装入(动态重定位)(程序运行时)(现代)

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

链接的三种方式:

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