什么是内存和进程的运行原理

什么是内存

image-20221030163508838

  • 内存是一种硬件,我们的程序必须进入内存,才能被CPU执行,我们的CPU只能跟内存交互

存储单元

在这里插入图片描述

  • 为了知道我们的数据存储在什么地方,那么就需要给我们的内存进行分区 编号,比如我们的酒店,就分为一间间客房,然后给客房编号,我们的住户就知道应该住在酒店的什么区域
  • 我们的内存中将这种小房间称为存储单元
    • 如果计算机按照字节编址(一个房间的大小为一个字节)
    • 如果按字编制,那么每个存储单元的大小为一个字,如果计算机的字长是16位,那么每个存储单位的大小位16位

数量单位和内存地址

在这里插入图片描述

进程运行的基本原理

指令就是操作码和若干参数(包括地址码)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 因为这种特性,所以造成我们的代码中的原子性的问题
  • 因为要获得数据,所以我们必须要得到数据的地址,在上面的例子中,指令中给的变量x的实际地址(物理地址),但是在实际生成机器指令的适合并不知道该进程的数据会被放到什么位置,所以在编译生成的指令一般是使用逻辑地址

逻辑地址和物理地址

image-20221030171301019

从写程序到程序运行—编译、链接、装入

在这里插入图片描述

  • 编译:就是将我们的高级语言编程成机器语言
  • 链接:由链接程序将编译后形成一组目标模块以及将所需的库函数链接在一起,形成一个完成的的装入模块
  • 装入:也就是将装入模块装入内存运行

装入的三种方式

绝对装入

在这里插入图片描述

  • 这种方式只适合我们的单道程序环境 也就是我们程序中的地址必须是物理地址,不然就会出错
  • 可以由我们的程序员直接赋予,但是一般是在编译或者汇编的时候给出

静态重定位

在这里插入图片描述

  • 我们的装入模块的地址加上物理上的初始地址,然后在装入内存
  • 这种需要在装入内存的时候,必须要分配其要求的全部内存空间,而且这种方式一旦进入了内存,在运行期间就不能在移动,也不能再神奇内存空间

动态重定位

在这里插入图片描述

  • 编译,链接后的装入模块的地址是我们的逻辑地址,装入内存后也还是我们的逻辑地址

在这里插入图片描述

  • 当我们的程序真正要执行的时候,才会利用重定位寄存器来得到真正的物理地址
  • 好处就是
    • 我们允许我们的程序在内存中发生移动
    • 并且可以将程序分配到不连续的存储区,我们在程序允许的时候装入它的部分代码就可以进行运行,然后再程序运行期间根据需求动态申请分配内存(这样可以想用户提供一个比存储空间更大的地址空间)

三种链接方式

静态链接

在这里插入图片描述

  • 在程序运行之前,就是还没有装入内存就将各目标模块以及它们所需的库函数连接成一个完整的可执行文件(装入模块),之后不再拆开

装入时动态链接

在这里插入图片描述

  • 在装入的时候动态链接,各目标模块装入内存的时候,边装入边链接的链接方式

在这里插入图片描述

  • 也就是在程序执行的时候当需要该目标模块的时候,才对它进行链接
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

库里不会投三分

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值