第三章 内存管理 一、内存的基础知识

目录

一、什么是内存

二、有何作用

三、常用数量单位

四、指令的工作原理

五、装入方式

1、绝对装入

2、可重定位装入(静态重定位)

3、动态运行时装入(动态重定位)

六、从写程序到程序运行

七、链接的三种方式

1、静态链接

2、装入时动态链接

3、运行时动态链接

八、总结


一、什么是内存

  1. 内存可存放数据,程序执行前需要先放到内存中才能被CPU处理。
  2. 内存中也有一个一个的"小房间",每个小房间就是一个"存储单元"。
  3. 如果计算机"按字节编址"则每个存储单元大小为1字节,即1B,即8个二进制位。
  4. 如果字长为16位的计算机"按字编址",则每个存储单元大小为1个字;每个字的大小为16个二进制位。

二、有何作用

缓和CPU与硬盘之间的速度矛盾。

三、常用数量单位

四、指令的工作原理

指令是计算机执行某个特定任务的基本操作,也是计算机进行数据处理和控制的基本单位。指令的工作原理可以简单地概括为以下四步:

  1. 读取指令:计算机从内存中读取指令,并将指令存储到处理器中。

  2. 解析指令:计算机解析指令,确定需要执行的操作,并确定需要的数据和操作符。

  3. 执行指令:计算机执行指令所需的操作,并将结果存储到指定的位置。

  4. 更新程序计数器:计算机更新程序计数器中的指令地址,以便读取下一条指令。

简单来说,指令的工作原理就是根据特定的操作码和操作数,让计算机进行相应的运算和控制操作。在执行指令的过程中,计算机需要根据指令中给定的地址,从内存中读取数据,将其存储到寄存器中,并根据指令中给定的操作码进行相应的计算和输出。指令的工作原理包括多个步骤,但每个步骤都是计算机系统中必不可少的一部分。

五、装入方式

1、绝对装入

在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。

装入程序按照装入模块中的地址,将程序和数据装入内存。

2、可重定位装入(静态重定位)

静态重定位是指在程序编译或链接的过程中,将程序中的逻辑地址转换为物理地址,使程序能够在内存中正确地运行的过程。在静态重定位过程中,编译器或链接器将程序的逻辑地址转换成物理地址,并将转换后的地址写入程序中需要访问的内存地址中。

静态重定位通常在程序装载时进行,重定位的过程主要包括以下几个步骤:

  1. 编译器或链接器为程序中的每个变量、函数和常量分配逻辑地址。

  2. 在程序被装载到内存之前,重定位程序会将程序中的逻辑地址转换成物理地址。

  3. 重定位程序会在程序中插入符号表,用于记录程序中的符号地址和信息。

  4. 如果程序在运行过程中需要地址的修改,静态重定位就会被触发,重定位程序会将需要修改的地址重新计算并写入正确的物理地址。

静态重定位是计算机系统中重要的概念,它使得程序能够在内存中正确地运行,提高了计算机的可移植性和灵活性。

注意:静态重定位的特点是在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。作业一旦进入内存后,在运行期间就不能再移动,也不能再申请内存空间。

3、动态运行时装入(动态重定位)

动态重定位是指在程序运行时,将程序中的逻辑地址转换为物理地址的过程。

和静态重定位不同,动态重定位是在程序运行时根据实际情况进行地址转换的。

在动态重定位过程中,操作系统或库函数会在程序被装载进内存之后,根据程序运行时的情况动态地对程序中的地址进行转换。动态重定位通常发生在以下情况下:

  1. 程序中使用了动态链接库或共享库,需要在运行时进行地址转换。

  2. 程序在运行过程中需要动态分配内存,需要动态地调整程序中的地址。

动态重定位通常通过虚拟内存机制来实现,操作系统会将程序中的逻辑地址映射到物理地址上,当程序需要访问某个地址时,操作系统会根据映射关系将逻辑地址转换为物理地址。动态重定位使得程序能够更加灵活地运行,能够适应不同的运行环境和硬件平台。

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

六、从写程序到程序运行

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

七、链接的三种方式

1、静态链接

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

2、装入时动态链接

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

3、运行时动态链接

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

八、总结

相关推荐
2201_757830872 分钟前
SpringBoot
java·spring boot·后端
FAFU_kyp11 分钟前
Java基础与核心知识面试题逐字稿模板
java
程序员西西16 分钟前
深入剖析 Java 中的 ZGC 机制:原理、优势与实践
java·后端·算法
月明长歌17 分钟前
【码道初阶】Leetcode.189 轮转数组:不熟悉ArrayList时踩得坑,被Arraylist初始化骗了?
java·算法·leetcode·职场和发展
海上彼尚17 分钟前
Go之路 - 4.go的集合[完整版]
开发语言·后端·golang
BBB努力学习程序设计18 分钟前
Java设计模式实战指南:创建型模式深度解析
java
BBB努力学习程序设计20 分钟前
Java内存管理与JVM调优完全指南
java
coding随想24 分钟前
JavaScript Notifications API:告别alert弹窗,开启沉浸式用户体验革命!
开发语言·javascript·ux
阿海57424 分钟前
卸载php的shell脚本
开发语言·php
编程火箭车27 分钟前
【Java SE 基础学习打卡】22 分支结构 - if
java·流程控制·编程基础·if语句·分支结构·条件判断·新手避坑