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

目录

一、什么是内存

二、有何作用

三、常用数量单位

四、指令的工作原理

五、装入方式

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、运行时动态链接

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

八、总结

相关推荐
忒可君21 分钟前
C# winform 报错:类型“System.Int32”的对象无法转换为类型“System.Int16”。
java·开发语言
GuYue.bing32 分钟前
网络下载ts流媒体
开发语言·python
斌斌_____37 分钟前
Spring Boot 配置文件的加载顺序
java·spring boot·后端
StringerChen39 分钟前
Qt ui提升窗口的头文件找不到
开发语言·qt
路在脚下@1 小时前
Spring如何处理循环依赖
java·后端·spring
数据小爬虫@1 小时前
如何利用PHP爬虫获取速卖通(AliExpress)商品评论
开发语言·爬虫·php
一个不秃头的 程序员1 小时前
代码加入SFTP JAVA ---(小白篇3)
java·python·github
丁总学Java1 小时前
--spring.profiles.active=prod
java·spring
上等猿1 小时前
集合stream
java
java1234_小锋2 小时前
MyBatis如何处理延迟加载?
java·开发语言