22-内存的基础知识

内存

什么是内存#

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

存储单元#

内存中有存储单元,类似于一个个的小房间,这些小房间叫做内存地址,从0开始,每个地址对应一个存储单元。

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

计量单位#

一台电脑4GB内存是指内存中可以存放4x230个字节,如果字节编制的话,也就是232个小房间。

指令#

计算机语言经过编译后将原有的代码翻译成机器可以看出来的指令
一般来说,指令存放在程序段,变量存放在数据段。

进程运行的基本原理#

地址#

变量X的实际存放地址(物理地址)[绝对位置]
编译生成的指令地址(逻辑地址)[相对位置]
指令在编译的时候只关心相对地址,在放入内存的时候在想办法根据起始地址得到绝对地址。

从写程序到程序运行#

程序员可以编写代码源文件,经过编译器编译后可以获得一些目标模块。
编译:由编译程序将用户源代码编译成若干个目标模块,编译就是把高级语言翻译成机器语言。
链接:由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完成的装入模块.
装入:由装入程序装入内存运行

装入的三种方式#

绝对装入#

  1. 绝对装入[单道程序阶段,无操作系统]
    在编译时,如果知道程序将放到内存的哪个位置,编译程序将产生绝对地址的目标代码
    绝对装入只适用于单道程序环境
    程序中使用的绝对地址,可在编译或汇编时给出,也可由程序员直接赋予。
    通常情况下都是编译或汇编时再转换为绝对地址。

静态重定位#

  1. 静态重定位[早期多道批处理阶段]
    又称为可重定位装入.编译、链接后的装入模块的地址都是从0开始的,指令中使用的地址、数据存放的地址都是相对于起始地址而言的逻辑地址。可根据内存的当前情况,将装入模块装入道内存的适当位置。装入时对地址进行"重定位",将逻辑地址变换为物理地址(地址变换是在装入时一次完成的)。
    静态重定位的特点是一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入作业。

动态重定位#

  1. 动态重定位[现代操作系统]
    又称动态运行时装入。编译、链接后的装入模块的地址都是从0开始的。装入程序把装入模块装入内存后,并不会立即把逻辑地址转换为物理地址,而是把地址转换推迟到程序真正要执行时才进行。因此装入内存后所有的地址仍然是逻辑地址,这样方式需要一个重定位寄存器的支持。
    采用动态重定位时允许程序在内存中发生移动。
    并且可将程序分配到不连续的存储区中,在程序运行前只需装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存,便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。

链接的三种方法#

静态链接#

在程序运行之前先将各目标模块及它们所需的库函数链接成一个完整的可执行文件(装入模块),之后不再拆开。

装入时动态链接#

将各目标模块装入内存时,边装入边链接的链接方式

运行时动态链接#

在程序执行中需要该目标模块时,才对它进行链接。其优点是便于修改和更新,便于实现对目标模块的共享。

posted @   nliuc  阅读(207)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示