内存和内存管理的概念

2020-09-30  本文已影响0人  幺姨母

内存是什么

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

如果计算机按字节编址,则每个存储单元是一个字节,8bits
如果计算机按字编址,则每个存储单元是一个字长,字长看具体的情况

几个常用的数量单位
2^{10} = 1K ,千
2^{20} = 1M ,兆,百万
2^{30} = 1G ,千兆,十亿

4GB内存
如果计算机按照字节编址,说明有 4*2^{30} 个字节,即 4*2^{30} 个存储单元
需要32个二进制位表示一个地址,所以地址长度是32 (0 ~ 2^{32} - 1)

进程的运行原理——指令

x=x+1

  1. 数据传送指令:00101100(操作码) 00000011 01001111
    将01001111地址处的值取出来放到00000011地址处(AX寄存器)
  2. 加法指令:10010010 00000011 00000001
    把00000011地址(AX寄存器)存放的值加00000001
  3. 数据传送指令:00101100 01001111 00000011
    将00000011地址处(AX寄存器)的值取出来放到01001111地址处

实际生成机器指令的时候并不知道该进程的数据会被放到什么地方,所以编译生成的指令中一般是用逻辑地址(相对地址)
编译时只需确定变量x存放的相对地址是100,CPU想要找到x在内存中的实际存放位置只需要用进程的起始地址+100

从写程序到程序运行

编译:有编译程序将用户源代码编译成若干个目标模块(将高级语言翻译成机器语言).c到.o
链接:由链接程序将编译后形成的一组目标模块,以及所需要的库函数链接在一起,形成一个完整的装入模块.exe
装入:由装入程序将装入模块装入内存运行(关心逻辑地址到物理地址的转换)

装入的三种方式

  1. 绝对装入
    在编译时,如果知道程序将放到内存中的哪个位置,编译程序将相对地址转化为绝对地址,装入程序按照装入模块中的地址,将程序和数据装入内存。只适用于单道程序环境
  2. 静态重定位
    编译和链接都是使用相对地址,在装入的时候,根据程序装入内存的绝对地址将相对地址都转化为绝对地址
    特点:一个作业在装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入作业。作业一旦装入内存后,运行期间不能移动,也不能再申请内存空间
  3. 动态重定位:
    编译链接都是使用相对地址,从0开始,装入程序把程序装入后,不会立即把逻辑地址转化为物理地址,而是把地址转换推迟到程序真正要执行的时候。需要一个重定位寄存器支持
    允许程序在内存中发生移动
    可以将程序分配到不连续的存储区中
    在程序运行前只需要装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存
    便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间

链接的三种方式

  1. 静态链接
    在程序运行之前,先将各目标模块及他们所需的库函数链接成一个完整的可执行文件(装入模块),之后不再拆开
  2. 装入时动态链接
    将各目标模块装入内存时,边装入边链接
  3. 运行时动态链接
    在程序执行中需要该目标模块时,才对他进行链接
    优点是便于修改和更新,便于实现对目标模块的共享

内存管理的概念

  1. 内存空间的分配与回收
  2. 从逻辑上对内存空间进行扩充
  3. 提供地址转换功能,负责程序的逻辑地址与物理地址的转换(装入方式)
  4. 内存保护,保证各个程序不会互相干扰

内存保护的方法

  1. 在CPU中设置一对上、下限寄存器,存放进程的上下限地址,进程的指令要访问某个地址时,CPU检查是否越界
  2. 采用重定位寄存器(基址寄存器)和界地址寄存器(限长寄存器)进行越界检查。界地址寄存器中存放的是进程的最大逻辑地址
上一篇 下一篇

猜你喜欢

热点阅读