博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
计算机操作系统学习笔记——内存管理之基本原理和要求
阅读量:3932 次
发布时间:2019-05-23

本文共 2202 字,大约阅读时间需要 7 分钟。

基本原理和要求

一、基本原理

  • 内存管理(Memory Management)是操作系统设计种最重要和最复杂的内容之一。
  • 若不加控制和安排的将所有用户进程和系统所需的全部程序和数据放入主存,那么主存的容量需要几乎和辅存那么大,这是不现实的。因此操作系统必须对内存空间进行合理的划分和有效的动态分配。
  • 有效的内存管理在多道程序设计中非常重要,不仅可以方便用户使用存储器、提高内存利用率,还可以通过虚拟技术从逻辑上扩容存储器。
  • 内存管理的功能:
    内存空间的分配与回收由操作系统完成主储存器的分配和管理,减轻程序员的负担,提高编程效率。
    地址转换:在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致,因此存储管理必须提供地址变换功能,把逻辑地址转换成相应的物理地址。
    内存空间的扩充:利用虚存技术或自动覆盖技术,从逻辑上扩充内存。
    存储保护:保证各道作业在各自的存储空间内运行,互不干扰。

1、程序装入和链接

  • 创建进程首先需要将程序和数据装入内存将用户源程序变为可在内存中执行的程序,通常需要以下步骤:
    编译:由编译程序将用户源代码编译成若干目标模块
    链接:由链接程序将编译后形成的一组目标模块所需的函数链接在一起,形成一个完整的装入模块
    装入:由装入程序将装入模块装入内存运行
    在这里插入图片描述

1.1、链接方式

  • 程序的链接方式有静态链接、装入时动态链接和运行时动态链接
    静态链接:在程序运行之前,先将各目标模块及它们所需的库函数链接成一个完整的可执行程序,以后不再拆开。
    装入时动态链接:将用户源程序编译后所得到的一组目标模块,在装入内存时,采用边装入边链接的方式
    运行时动态链接:对某些目标模块的链接,是在程序执行中需要该目标模块时才进行的。其优点是便于修改和更新,便于实现对目标的共享。

1.2、内存装入模块装入方式

  • 内存的装入模块在装入内存时,有绝对装入、可重定位装入和动态运行时装入

1)绝对装入

  • 在编译时,若知道程序将驻留在内存的某个位置,则编译程序将产生绝对地址的目标代码。绝对装入程序按照装入模块中的地址,将程序和数据内存。由于程序的逻辑地址与实际内存地址完全相同,因此不需要对程序和数据的地址进行修改。
  • 绝对装入方式只适用于单道程序环境。程序中所用的绝对地址,可在编译或汇编时给出,也可由程序员直接赋予。而通常情况下在程序中采用的是符号地址,编译或汇编时再转换为绝对地址。

2)可重定位装入

  • 多道程序环境下,多个目标模块的起始地址——始址,通常都从 0 开始,程序中的其他地址都是相对于始址的,此时采用可重定位装入方式。根据内存的当前情况,将装入模块装入内存的适当位置。装入时对目标程序中的指令和数据的修改过程称为重定位地址变换通常是在转入时一次完成的,故又称稳态重定位
  • 特点:一个作业装入内存时,必须给它分配要求的全部内存空间,若没有足够的内存,则不能装入该作业。作业一旦进入内存,整个运行期间不能在中移动,也不能再申请内存空间

3)动态运行时装入

  • 也成为动态重定位,程序在内存中若发生移动,则需要采用动态的装入方式。装入程序把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址而是把这种地址转换推迟到程序真正要执行时才进行。此时装入内存后的所有地址均为相对地址,需要重定位寄存器的支持
  • 特点:可以将程序分配到不连续的存储区中;程序运行之前可以只装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。
    在这里插入图片描述

2、逻辑地址空间与物理地址空间

  • 编译后,每个目标模块从 0 号单元开始编址,这称为该目标模块的相对地址或逻辑地址
  • 当链接程序将各个模块连接成一个完整的可执行目标程序时链接程序顺序依次按各个模块的相对地址构成统一的从 0 号单元开始编址的逻辑地址空间
  • 物理地址空间是指内存中物理单元的集合,是地址转换的最终地址,进程在运行时执行指令和访问数据,最后都要通过物理地址从主存中存取。
  • 当装入程序将可执行代码装入内存时,必须通过地址转换将逻辑地址转换成物理地址,该过程称为地址重定位

3、内存保护

  • 指内存分配前需要保护操作系统不受用户进程影响、保护用户进程不受其他用户进程的影响。内存保护方法如下两种:
    1)在 CPU 中设置一堆上、下限寄存器,存放用户作业在主存种的下限和上限地址,每当 CPU 要访问一个地址时,分别和两个寄存器的值比较,判断有无越界
    2)采用重定位寄存器或基址寄存器,和界地址寄存器—限长寄存器—来实现保护机制重定位寄存器含最小的物理地址值,界地址寄存器含逻辑地址的最大值每个逻辑地址值必须小于界地址寄存器值。内存管理机构动态地将逻辑地址与界地址寄存器进行比较,若未发生越界,则加上重定位寄存器地的值映射成物理地址,再交送内存单元
    在这里插入图片描述
  • CPU 调度程序选择进程执行时,派遣程序会初始化重定位寄存器和界地址寄存器。每个逻辑地址都需要与这两个寄存器进行核对,以保证操作系统和其他用户程序及数据不被该进程运行影响
  • 重定位寄存器和界地址寄存器的区别:重定位寄存器是用来“加”的,逻辑地址加上重定位寄存器中的值形成物理地址;界地址寄存器是用来“比”的,通过比较界地址寄存器中的值与逻辑地址的值来判断是否越界。

转载地址:http://zqqgn.baihongyu.com/

你可能感兴趣的文章
Python杂谈 | (15) 使用Pycharm执行带命令行参数的脚本
查看>>
从源码分析:分析Java中的StringBuilder
查看>>
Linux(Ubuntu18)中启动ssh时的报错
查看>>
Java中的左移时的负数问题
查看>>
从数组形式创建一棵树(用于leetcode测试)
查看>>
线程进阶:多任务处理(17)——Java中的锁(Unsafe基础)
查看>>
Spring/Boot/Cloud系列知识(1)——开篇
查看>>
线程基础:多任务处理(15)——Fork/Join框架(要点2)
查看>>
线程基础:多任务处理(16)——Fork/Join框架(排序算法性能补充)
查看>>
线程基础:多任务处理(14)——Fork/Join框架(要点1)
查看>>
架构设计:系统存储(13)——MySQL横向拆分与业务透明化(1)
查看>>
架构设计:系统存储(14)——MySQL横向拆分与业务透明化(2)
查看>>
架构设计:系统存储(5)——MySQL数据库性能优化(1)
查看>>
架构设计:系统存储(2)——块存储方案(2)
查看>>
架构设计:系统间通信(45)——阶段性问题记录
查看>>
架构设计:系统间通信(44)——自己动手设计ESB(5)
查看>>
架构设计:系统存储(1)——块存储方案(1)
查看>>
架构设计:系统间通信(42)——自己动手设计ESB(3)
查看>>
在工作时走神的闪光
查看>>
Ajax使用注意事项
查看>>