内存管理的需求
重定位
- 程序执⾏时可能被交换到磁盘 并返回到位置不同的主存中 此时就需要重定位
- 将内存访问转换为实际的物理内存地址
保护
- 一个进程不能访问其他进程的内存空间和操作系统的其他部分
- 由硬件(处理器)检查而不是软件(操作系统) 硬件能获取所有出现的内存引用
共享
- 允许多个进程访问内存的同⼀部分
- 多个进程访问一个程序的同一副本
- 受控访问
逻辑组织
- 程序是⽤模块编写的 模块可以独⽴编写和编译
- 为模块提供不同程度的保护(只读、仅执⾏)
- 在进程之间共享模块
内存分区
内存是一组具有存储功能的单元 每个内存单元成为地址空间
每个内存单元通过内存地址(编号)来查找位置
分类
- 页框:内存中固定长度的块
- 页:固定长度的数据块
- 段:变长的数据块
- 分段分页的特点:
- 进程划分为多个块 执行时不需要连续位于内存中
- 内存访问使用逻辑地址 执行时动态转为物理地址
固定分区
内部碎片:装入的数据块小于分区大小 导致分区内部存在空间浪费
等大小 or 不等
等大小:程序太大放不下 ⇒ 覆盖技术:程序自己按逻辑分模块 不同时运行的共享一个空间
内存大小不等时 放置算法:
- 能够容纳的最⼩空间的分区中 每个分区都需要维护一个调度队列 ⇒ 内部碎片最少
- 所有进程一个调度队列 选择最⼩可⽤分区
缺点:
- 分区的数量在系统生成阶段己经确定 限制系统中活动进程的数量
- 小作业不能充分利用空间
动态分区
分区长度&数量可变
会产生外部碎片 ⇒ 可通过压缩技术克服外部碎片 但费时且需要动态重定位
放置算法:
- 最佳适配:选最接近的 ⇒ 性能差 且会产生大量非常小的分区 需要频繁压缩
- 首次适配:从头扫描 选择大小足够的第一个 ⇒ 快 但前端出现小分区
- 下次适配:从上一次放置的位置开始扫描 ⇒ 末尾大块很快被分割
无内部碎片 但要压缩外部碎片 处理器利用率低
伙伴系统
判断+二分
简单分页
将内存划分为大小相等的小块 并将每个进程划分为大小相同的块
- 类似固定分区 会产生内部碎片
- 进程的块 – 页
- 内存块 – 页框
- 每个进程维护一个页表
- 内存地址由页面内的页码和偏移量组成
逻辑地址:页号 偏移量 物理地址:页框号偏移量
给出逻辑地址后 处理器用页表转换产生物理地址
一个程序可以占据多个分区 并且这些分区不需要连续
内存可分成许多 大小相等且很小的页框 每个进程可划分成同样大小的页 较小的进程需要较少的页,较大的进程需要较多的页 装入一个进程时 其所有页都装入可用页框中 并建立一个页表
简单分段
- 类似动态分区 同样会产生外部碎片 但一个程序可以占多个分区 分区不需要连续
- 逻辑地址:段号 偏移量
- 会产生很小的外部碎片
- 段有最大长度限制 所有程序的所有段的长度不要求都相等
- 每个进程都有一个段表 系统也会维护一个内存中的空闲块列表
- 每个段表项给出相应段在内存中的起始地址,还必须指明段的长度,以确保不会使用无效地址
逻辑地址转换物理地址:
- 提取段号,即逻辑地址最左侧的n位
- 以这个段号为索引,查找进程段表中该段的起始物理地址
- 最右侧m位表示偏移量,偏移量和段长度进行比较,若偏移量大于段长度,则该地址无效
- 物理地址为该段的起始物理地址与偏移景之和
Show Comments