内存管理

操作系统对内存的划分和动态分配,就是内存管理的概念。有效的内存管理在多道程序设计中非常重要,不仅方便用户使用存储器、提高内存利用率,还可以通过虚拟技术从逻辑上扩充存储器。内存管理的功能有:

  • 内存空间的分配与回收

  • 地址转换:在多道程序环境下,程序中的逻辑地址与内存中的物理地址不可能一致,因此存储管理必须提供地址变换功能,把逻辑地址转换成相应的物理地址。

  • 内存空间的扩充:利用虚拟存储技术或自动覆盖技术,从逻辑上扩充内存。

  • 存储保护:保证各道作业在各自的存储空间内运行,互不干扰。

程序装入和链接

建进程首先要将程序和数据装入内存。将用户源程序变为可在内存中执行的程序,通常需要以下几个步骤:

  • 编译:由编译程序将用户源代码编译成若干个目标模块。
  • 链接:由链接程序将编译后形成的一组目标模块,以及所需库函数链接在一起,形成一个完整的装入模块。
  • 装入:由装入程序将装入模块装入内存运行。

程序的链接有以下三种方式:

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

模块在装入内存时,同样有以下三种方式:

  • 绝对装入。在编译时,如果知道程序将驻留在内存的某个位置,编译程序将产生绝对地址的目标代码。绝对装入程序按照装入模块中的地址,将程序和数据装入内存。由于程序中的逻辑地址与实际内存地址完全相同,故不需对程序和数据的地址进行修改。
  • 可重定位装入。在多道程序环境下,多个目标模块的起始地址通常都是从0开始,程序中的其他地址都是相对于起始地址的,此时应釆用可重定位装入方式。根据内存的当前情况,将装入模块装入到内存的适当位置。装入时对目标程序中指令和数据的修改过程称为重定位,地址变换通常是在装入时一次完成的,所以又称为静态重定位。静态重定位的特点是在一个作业装入内存时,必须分配其要求的全部内存空间,如果没有足够的内存,就不能装入该作业。此外,作业一旦进入内存后,在整个运行期间不能在内存中移动,也不能再申请内存空间。
  • 动态运行时装入,也称为动态重定位,程序在内存中如果发生移动,就需要釆用动态的装入方式。装入程序在把装入模块装入内存后,并不立即把装入模块中的相对地址转换为绝对地址,而是把这种地址转换推迟到程序真正要执行时才进行。因此,装入内存后的所有地址均为相对地址,这种方式需要一个重定位寄存器的支持。动态重定位的特点是可以将程序分配到不连续的存储区中;在程序运行之前可以只装入它的部分代码即可投入运行,然后在程序运行期间,根据需要动态申请分配内存;便于程序段的共享,可以向用户提供一个比存储空间大得多的地址空间。
内存保护

内存分配前,需要保护操作系统不受用户进程的影响,同时保护用户进程不受其他用户进程的影响。通过釆用重定位寄存器和界地址寄存器来实现这种保护。重定位寄存器含最小的物理地址值,界地址寄存器含逻辑地址值。每个逻辑地址值必须小于界地址寄存器;内存管理机构动态地将逻辑地址与界地址寄存器进行比较,如果未发生地址越界,则加上重定位寄存器的值后映射成物理地址,再送交内存单元。当CPU调度程序选择进程执行时,派遣程序会初始化重定位寄存器和界地址寄存器。每一个逻辑地址都需要与这两个寄存器进行核对,以保证操作系统和其他用户程序及数据不被该进程的运行所影响。

内存管理基本知识-大致相关推荐

  1. 操作系统之内存管理:1、内存管理基础知识(指令工作原理、地址转化、程序运行过程)

    1.内存管理基础知识(指令工作原理.地址转化.程序运行过程) 思维导图 什么是内存? 指令的工作原理 装入模块的三种实现 绝对装入 可重定位装入 动态重定位 程序的运行过程 链接的三种方式 思维导图 ...

  2. iOS内存管理的知识梳理

    从作用上来说,手机内存小,划分给每个App的内存有限,合理的进行内存管理,有利于提高软件的运行性能和用户体验: 另外,内存管理是一大理论知识块,对这块知识的理解程度也是考核面试者的重要标准. 内存管理 ...

  3. 操作系统 内存管理相关知识

    cpu执行程序的基本过程 译码器 输入为n管脚,输出为2^n根管脚,编号为从0到2^(n-1),用少的输入端控制更多的输出端 最常用的是三八译码器 AD(Address bus)地址总线: 选中一行数 ...

  4. 嵌入式linux学习笔记1—内存管理MMU之虚拟地址到物理地址的转化

    一.内存管理基本知识 1.S3C2440最多会用到两级页表:以段的方式进行转换时只用到一级页表,以页的方式进行转换时用到两级页表.页的大小有三种:大页(64KB),小页(4KB),极小页(1KB).条 ...

  5. 万字整理,图解Linux内存管理所有知识点

    Linux的内存管理可谓是学好Linux的必经之路,也是Linux的关键知识点,有人说打通了内存管理的知识,也就打通了Linux的任督二脉,这一点不夸张.有人问网上有很多Linux内存管理的内容,为什 ...

  6. Spark(二): 内存管理

    2019独角兽企业重金招聘Python工程师标准>>> Spark 作为一个以擅长内存计算为优势的计算引擎,内存管理方案是其非常重要的模块: Spark的内存可以大体归为两类:exe ...

  7. Linux内存管理:知识点总结(ARM64)

    https://mp.weixin.qq.com/s/7zFrBuJUK9JMQP4TmymGjA 目录 Linux内存管理之CPU访问内存的过程 虚拟地址转换为物理地址的本质 Linux内存初始化 ...

  8. Unity开发者的C#内存管理

    很多游戏时常崩溃,大多数情况下都是内存泄露导致的.这系列文章详细讲解了内存泄露的原因,如何找到泄露,又如何规避. 我要在开始这个帖子之前忏悔一下.虽然一直作为一个C / C++开发者,但是很长一段时间 ...

  9. 【JavaEE】简单了解操作系统、进程内存管理

    目录 前言: 一.操作系统: 操作系统的定位: 应用程序: 系统调用: 操作系统内核: 驱动程序: 硬件设备: 二.进程: 什么是进程? 进程的描述与组织: 描述: 组织: PCB中的 特征(属性) ...

最新文章

  1. matlab实现周期阶跃函数,连续时间信号傅利叶变换与MATLAB实现.doc
  2. 数据标注、模型调参debug...通通自动化!华为云AI开发集大成之作ModelArts 2.0发布...
  3. T-SQL的高级查询详解(一)--函数的综合应用
  4. 数据结构 树的遍历(递归遍历)
  5. javascript的self和this使用小结
  6. java计算时间跨度_请问如何使用Java计算时间跨度并格式化输出?
  7. 送出orkut邀请,当然如果需要gmail邀请,还有很多
  8. Effective Java之返回零长度的数组或者集合,而不是null(四十三)
  9. threadsafe_Agrona的Threadsafe堆缓冲区
  10. mysql 5.6 禁用 innodb_MYSQL 5.6中禁用INNODB引擎
  11. 大家一起讨论一下朋友网的人脉关系算法是怎么实现的
  12. Terraform 支持自动化开通阿里云产品
  13. 漂亮的消息通知html邮件模板,好看的邮件模板?
  14. 计算机协会素拓小游戏,计算机协会素质拓展策划书 (2)
  15. 管理打开的标签,减少Chrome95%内存 —OneTab
  16. java excel 导出数据文件格式无效
  17. CSP 201712 - 4 【行车路线】
  18. c语言中负数的读取和存储,C语言中负数的存储方式
  19. 陀螺专栏势力榜——月榜(5.1-5.31)
  20. 虚拟机文件无法正常打开的解决方法

热门文章

  1. 12张图带你彻底搞懂服务限流、熔断、降级、雪崩
  2. iOS 16 新 API 和功能
  3. int8_t、int16_t、int32_t、int64_t、uint8_t、size_t、ssize_t详解
  4. 索引顺序表查找算法(分块查找)
  5. JavaScript映射
  6. 纯 js 实现上传文件支持拖拽
  7. Java类中方法的加载顺序
  8. 测试生命周期、测试过程分为几个阶段,以及各阶段的含义?
  9. 老默我想吃鱼了(抽象艺术)
  10. 变量和变量的命名规则