【内存管理】

目录

什么是内存?

内存有何作用?

进程运行的基本原理

指令的运行原理

逻辑地址(相对地址)VS物理地址(绝对地址)

程序到进程

装入的三种方式

链接的三种方式

内存空间的分配与回收

内存空间的扩展

地址转换

内存保护


什么是内存?

我们平时买电脑和手机时,经常会挑选配置,那么手机的运行内存和电脑中的内存就是这一章介绍的内存的概念。内存越大,就可以运行越大越多的内存。

内存有何作用?

不管是电脑还是手机,平时下载的文件包括应用程序(各种APP)都是在手机的机身内存或者电脑的硬盘中(在机组中成为外存或辅存)存放着。而硬盘的特点是:造价低,读写速度慢。处理速度远远跟不上CPU,也就是说,从硬盘中加载了半天的数据,CPU立刻就处理完了。

为了保证CPU的利用率,解决CPU与硬盘的这种矛盾,内存应用而生。

内存和外存(硬盘)相比较而言:造价昂贵,读写速度快

内存作用:内存可以存放数据。进程执行前都需要先加载到内存中才能被CPU处理,可以缓和CPU与内存之间的矛盾。

进程运行的基本原理

指令的运行原理

代码 x = x + 1; 编译后为三条指令,指令1、指令2、指令3。

编译:将高级语言(程序员写的代码比如java、C++)翻译成机器语言(CPU能识别的指令)。

PS:程序段和数据段不懂的看我第二章 进程管理部分。

指令是由 操作码 + 若干参数组成,操作码告诉指令要做什么操作,而后面的参数就是指令要处理的数据。

比如指令1,第一个为操作码(红色部分),告诉指令要进行数据传送,而后面俩个参数就是分别是数据的目的地址数据原地址,那么指令1就会将01001111地址处的数据取出来存放至00000011处。同样指令2的操作码告诉指令要进行加法,指令就会将后面的数据相加,指令3与指令1类似...

可见,程序员编写的代码一般会被翻译成机器语言,这些指令会告诉CPU应该去内存的哪个地址取数据,对数据如何操作,将结果存放在哪里。在这个例子中,指令直接给出了x的实际物理地址,但一般来说,生成机器语言时,并不知道该进程的数据会存放在哪里,所以会使用逻辑地址

逻辑地址(相对地址)VS物理地址(绝对地址)

内存会将逻辑单元进行编号,从0开始。

物理地址就是进程的数据在内存中的实际存放地址。

逻辑地址就是相对于进程初始地址,该数据偏移了多少个位置。

假设一个进程被加载到内存中,在内存中的初始地址为100,而指令告诉CPU进程中的变量x地址在79处。很显然,进程的初始地址就为100,那么79这个地址肯定是另外一个进程的。实际上,指令告诉CPU的地址是相比较进程的初始地址100,在偏移79个,因此x变量的实际绝对地址为179,相对地址为79。

PS:绝对地址是相对于内存的0编号地址;而相对地址是相对于进程在内存中的初始地址。

如果一个进程在内存中的初始地址为0,那么相对地址等于绝对地址。

程序到进程

进程就是运行起来的程序。那么程序运行起来经历了什么?

编译:编译就是将高级语言程序翻译成机器语言。

链接:每一个源代码文件编译后都是一个独立的模块,这些程序之间又有某种联系(比如调用库函数),需要根据代码逻辑将这些模块组装成完整的装入模块。

装入:又装入程序将装入模块装入内存。

装入的三种方式

绝对装入:在编译时,如果知道程序将放到内存中的哪个位置,编译程序将产生绝对地址的目标代码。 装入程序按照装入模块中的地址,将程序和数据装入内存。

绝对装入只适用于单道程序环境

多道程序中,很难事先知道进程在内存中的地址。

不同机器的内存编码方式可能不同。

静态重定位:又称可重定位装入。编译、链接后的地址都是从0开始的,指令中使用的地址、数据存放地址都是逻辑地址。可根据内存情况,将装入模块中的地址换成绝对地址进行装入。

特性:作业在装入内存是,需要一次性分配全部内存,一旦装入后,不可更改,也不可再次申请内存。

动态重定位:又称为动态运行时装入。编译、链接后的地址都是从0开始的,装入模块时,并不会立即更改地址,而是等程序真正要运行起来时,才会更改。因此,装入内存后模块中的地址依然是逻辑地址,这种方式需要重定位寄存器的支持,用来记录进程的起始地址。

优点:1.允许程序在内存中移动(由重定位寄存器记录位置);

           2.可将程序分配在不连续的空间内;

           3.在程序运行前,可以只将其部分代码加载到内存中,在运行过程中,可以动态的分配内存。

           4.便于程序段的共享,可以向用户提供一个存储空间较大的地址。

链接的三种方式

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

之后不再拆开。

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

运行时动态链接:在程序执行中需要该目标模块时,才对它进行链接。

优点是便于修改和更新,便于实现对目标模块的共享。

内存空间的分配与回收

内存空间的扩展

地址转换

为了使编程更方便,程序员写程序时,只需要关注指令、数据的逻辑地址,而逻辑地址到物理地址的转换是有操作系统转化的。

逻辑地址到物理地址的转化就是由操作系统负责,通过装入的三种方式实现。现在的操作系统都采用(动态重定位)动态运行时装入方式

内存保护

操作系统需要提供内存保护,保证进程之间的独立运行、互不干扰。(进程的独立性)

这也就造成操作系统要额外实现进程通信。

方法:

方法一:在CPU中设置一对上、下限寄存器,分别来记录进程的起始地址和结束地址,当进程需要访问内存时,则需要检查访问地址是否属于该进程。

方法二:采用重定位寄存器界地址寄存器,进行越界检查。

重定位寄存器:在装入的第三种方式动态重定位中介绍过,用来记录进程的起始地址。

界地址寄存器:记录进程的最大逻辑地址。也就是进程的末地址相对进程的起始地址的偏移量。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值