当前课程知识点:操作系统 > 第五讲 物理内存管理: 连续内存分配 > 5.4 碎片整理 > 5.4 碎片整理
接下来我们讨论碎片整理
碎片整理是想说
我们已经把内存分区分配给了进程
它们也已经占定了某一个位置
但是这个时候
我正在执行的应用进程
或者说新创建的进程需要内存空间
这个时候没有了
或者说这些都已经剩下小的碎片了
那我想要内存空间
这个时候怎么办
我们可以通过碎片整理
来获取更大的可用内存空间
以便于满足进程的应用空间需求
我们看碎片整理
碎片整理是指我们通过调整
已分配给进程的内存分区它的位置
来减少碎片的一种做法
这种做法有一个图示
说这里头这几个闪烁的地方
就在我们这里头是空闲的空间
但是假定说这里头最大是剩三块
但是现在我要分配一个连续四块
那就没有了
这个时候怎么办呢
我们希望通过碎片整理
我们把它压缩到一起
然后剩的这块就可以满足要求了
但是我要把正在内存当中的
这些进程的位置挪动
这个事是不可以随便弄的
原因在于我里头
可能有各种各样的地址引用
这种引用用的是绝对地址的话
那这个时候你挪了之后
它是没办法正确运行的
所以在这里头要进行碎片紧凑
它是需要一些条件
也就是说我所有这些进程
都是可以动态重定位的
只有做到这点之后
我这里程序才可以去搬它
当然这种搬也是有开销的
你不可以正在处于运行的状态去搬
通常情况下我们会在什么情况去搬
正常情况下 处于等待状态进程
我会对它进行搬动
然后再有一个
并不是说为了一小块区域
我要把整个内存当中的
很多进程都把它挪一遍
这个开销也是大的
我在这里头在什么情况下
我需要考虑到开销
然后进行这种紧凑
关于具体的做法
在大家需要相应的技术的时候
再仔细去看
我们在这就介绍到这种程度
第二种做法是分区对换
刚才我把内存里的这些分区
不管怎么挪
最后的结果它都是在内存里头
如果说这个时候仍然不能用
你还是没办法
所以在这里 内存分区对换
是指我把这种处于等待状态进程
它占用地址空间给它抢占了
然后把这个等待进程占用的数据
我总得找个地方存
我把它存到外存里头去
在这里就是对换到对换区
这时候我内存里的空间也就变大了
在这 我们也通过一个图示来看
在这个图示里
底下是内存和外存的状态
中间这个图实际上说的是
我们在系统里头
进程在执行过程当中
我们维护进程的状态信息
这个我们在后面讨论还会再说到
我们看每创建一个进程
创建的时候它在内存里要占一块区域
创建好之后 它数据结构都弄好
操作系统维护的数据建好
然后这个时候它可以投入到运行状态
它在运行的过程当中
可能会有另外一个进程要创建
它也需要在这里分配相应的存储区域
然后进到就绪状态
第一个还在继续运行
在这个过程当中我们继续可以进行下去
由于某种原因我P1处于等待状态
这个时候P2 P3又进内存里
来运行状态
那么在这种状态下
如果说我再有一个P4进来
它要的空间就不够了
这个时候怎么办呢
我们会把处于等待状这个搬到外存里头去
这样空出一块区域来
我把这个P4放在这里
这是我们就可以让它更多进程在系统里交替运行
使得我的可用空间能变大
在这里大家可以注意到
我们这有一个对换的名字
实际上大家如果注意的话
在你的Linux或者Unix系统里
它有一个分区 叫换区
实际上这个对换区在早期的时候
它就是一种充分利用内存的做法
那么在这张图里头我们可以看到
在早的时候 甚至在操作系统里头
只有一个应用进程可以在内存的状态下
它都可以用对换来实现多进程交替运行
在这是这样的
任何一个时候只有一个进程在内存当中运行
而处于暂停的 是把它放到外存里头
如果说当前进程主动让出处理机使用权限
这个时候做法 把它对换到外存当中
在把外存当中这个搬回去
这个时候我就可以继续运行下去了
用这种办法实际上在我们比较早的时候
内存很紧张的情况下
我们在系统里就可以实现
多进程的交替运行
当然在这里这个交替
它的开销是非常大的
原因在于内存和外存之间的速度差的很远
即使是这样 由于我们前面的系统
计算机系统它的成本非常高
所以这样做的开销 也是可以接受的
当然在这里头我在对换的时候
到底把谁对换出来
这个时候开销有多大
这个时候在系统里
你就得经过仔细的权衡
所以在前面做的时候
它花很大的精力会去解决
我到底是对换哪一个进程
这是我们在早期的时候
计算机系统里的多进程
通过对换区的方式来做的一种实现
-0.1 Piazza讨论区
--html
-0.2 在线实验平台
--实验平台使用帮助
--平台使用帮助
-0.2在线实验平台
--Raw HTML
-1.1 课程概述
--视频
-第一讲 操作系统概述--练习
-1.2 教学安排
--视频
-1.3 什么是操作系统
--Video
-1.4 为什么学习操作系统,如何学习操作系统
--Video
-1.5 操作系统实例
--视频
-1.6 操作系统的演变
--视频
-1.7 操作系统结构
--视频
-2.1 前言和国内外现状
-2.2 OS实验目标
-2.3 8个OS实验概述
-2.4 实验环境搭建
-2.5 x86-32硬件介绍
-2.6 ucore部分编程技巧
-2.7 演示实验操作过程
--Q6
--Q7
--Q10
-3.1 BIOS
--3.1 BIOS
-3.2 系统启动流程
-3.3 中断、异常和系统调用比较
-第三讲 启动、中断、异常和系统调用--3.3 中断、异常和系统调用比较
-3.4 系统调用
--3.4 系统调用
-第三讲 启动、中断、异常和系统调用--3.4 系统调用
-3.5 系统调用示例
-3.6 ucore+系统调用代码
-4.1 启动顺序
--4.1 启动顺序
-4.2 C函数调用的实现
-4.3 GCC内联汇编
-4.4 x86中断处理过程
-4.5 练习一
--4.5 练习一
-4.6 练习二
--4.6 练习二
-4.7 练习三
--4.7 练习三
-4.8 练习四 练习五
-4.9 练习六
--4.9 练习六
-5.1 计算机体系结构和内存层次
-5.2 地址空间和地址生成
-5.3 连续内存分配
-5.4 碎片整理
--5.4 碎片整理
-5.5 伙伴系统
--5.5 伙伴系统
-第五讲 物理内存管理: 连续内存分配--5.6 练习
-6.1 非连续内存分配的需求背景
-6.2 段式存储管理
-- 6.2 段式存储管理
-6.3 页式存储管理
-6.4 页表概述
--6.4 页表概述
-6.5 快表和多级页表
-6.6 反置页表
--6.6 反置页表
-6.7 段页式存储管理
-第六讲 物理内存管理: 非连续内存分配--6.8 练习
-7.1 了解x86保护模式中的特权级
-第七讲 实验二 物理内存管理--7.1 了解x86保护模式中的特权级
-7.2 了解特权级切换过程
-第七讲 实验二 物理内存管理--7.2 了解特权级切换过程
-7.3 了解段/页表
-第七讲 实验二 物理内存管理--7.3 了解段/页表
-7.4 了解UCORE建立段/页表
-第七讲 实验二 物理内存管理--7.4 了解UCORE建立段/页表
-7.5 演示lab2实验环节
-8.1 虚拟存储的需求背景
-8.2 覆盖和交换
-8.3 局部性原理
-8.4 虚拟存储概念
-8.5 虚拟页式存储
-8.6 缺页异常
--8.6 缺页异常
-9.1 页面置换算法的概念
-9.2 最优算法、先进先出算法和最近最久未使用算法
-第九讲 页面置换算法--9.2 最优算法、先进先出算法和最近最久未使用算法
-9.3 时钟置换算法和最不常用算法
-第九讲 页面置换算法--9.3 时钟置换算法和最不常用算法
-9.4 Belady现象和局部置换算法比较
-第九讲 页面置换算法--9.4 Belady现象和局部置换算法比较
-9.5 工作集置换算法
-第九讲 页面置换算法--9.5 工作集置换算法
-9.6 缺页率置换算法
-第九讲 页面置换算法--9.6 缺页率置换算法
-9.7 抖动和负载控制
-10.1 实验目标:虚存管理
-第十讲 实验三 虚拟内存管理--10.1 实验目标:虚存管理
-10.2 回顾历史和了解当下
-第十讲 实验三 虚拟内存管理--10.2 回顾历史和了解当下
-10.3 处理流程、关键数据结构和功能
-第十讲 实验三 虚拟内存管理--10.3 处理流程、关键数据结构和功能
-10.4 页访问异常
-第十讲 实验三 虚拟内存管理--10.4 页访问异常
-10.5 页换入换出机制
-第十讲 实验三 虚拟内存管理--10.5 页换入换出机制
-11.1 进程的概念
-第十一讲 进程和线程--11.1 进程的概念
-11.2 进程控制块
-第十一讲 进程和线程--11.2 进程控制块
-11.3 进程状态
-第十一讲 进程和线程--11.3 进程状态
-11.4 三状态进程模型
-11.5 挂起进程模型
-第十一讲 进程和线程--11.5 挂起进程模型
-11.6 线程的概念
-第十一讲 进程和线程--11.6 线程的概念
-11.7 用户线程
-第十一讲 进程和线程--11.7 用户线程
-11.8 内核线程
-第十一讲 进程和线程--11.8 内核线程
-12.1 进程切换
-第十二讲 进程控制--12.1 进程切换
-12.2 进程创建
-第十二讲 进程控制--12.2 进程创建
-12.3 进程加载
-第十二讲 进程控制--12.3 进程加载
-12.4 进程等待与退出
-第十二讲 进程控制--12.4 进程等待与退出
-13.1 总体介绍
-13.2 关键数据结构
-13.3 执行流程
-13.4 实际操作
-14.1 总体介绍
-14.2 进程的内存布局
-14.3 执行ELF格式的二进制代码-do_execve的实现
--14.3 执行ELF格式的二进制代码-do_execve的实现
-14.4 执行ELF格式的二进制代码-load_icode的实现
--14.4 执行ELF格式的二进制代码-load_icode的实现
-14.5 进程复制
-14.6 内存管理的copy-on-write机制
-15.1 处理机调度概念
-第十五讲 处理机调度--15.1 处理机调度概念
-15.2 调度准则
-15.3 先来先服务、短进程优先和最高响应比优先调度算法
--15.3 先来先服务、短进程优先和最高响应比优先调度算法
-第十五讲 处理机调度--15.3 先来先服务、短进程优先和最高响应比优先调度算法
-15.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架
--15.4 时间片轮转、多级反馈队列、公平共享调度算法和ucore调度框架
-第十五讲 处理机调度--15.4 时间片轮转、多级反馈队列、公平共享调度算法和uc
-15.5 实时调度和多处理器调度
-第十五讲 处理机调度--15.5 实时调度和多处理器调度
-15.6 优先级反置
-第十五讲 处理机调度--15.6 优先级反置
-16.1 总体介绍和调度过程
-16.2 调度算法支撑框架
-16.3 时间片轮转调度算法
-16.4 Stride调度算法
-17.1 背景
--17.1 背景
-17.2 现实生活中的同步问题
-第十七讲 同步互斥--17.2 现实生活中的同步问题
-17.3 临界区和禁用硬件中断同步方法
-第十七讲 同步互斥--17.3 临界区和禁用硬件中断同步方法
-17.4 基于软件的同步方法
-第十七讲 同步互斥--17.4 基于软件的同步方法
-17.5 高级抽象的同步方法
-第十七讲 同步互斥--17.5 高级抽象的同步方法
-18.1 信号量
--18.1 信号量
-第十八讲 信号量与管程--18.1 信号量
-18.2 信号量使用
-第十八讲 信号量与管程--18.2 信号量使用
-18.3 管程
--18.3 管程
-第十八讲 信号量与管程--18.3 管程
-18.4 哲学家就餐问题
-18.5 读者-写者问题
-19.1 总体介绍
-19.2 底层支撑
-第十九讲 实验七 同步互斥--19.2 底层支撑
-19.3 信号量设计实现
-第十九讲 实验七 同步互斥--19.3 信号量设计实现
-19.4 管程和条件变量设计实现
-第十九讲 实验七 同步互斥--19.4 管程和条件变量设计实现
-19.5 哲学家就餐问题
-20.1 死锁概念
-第二十讲 死锁和进程通信--20.1 死锁概念
-20.2 死锁处理方法
-第二十讲 死锁和进程通信--20.2 死锁处理方法
-20.3 银行家算法
-第二十讲 死锁和进程通信--20.3 银行家算法
-20.4 死锁检测
-第二十讲 死锁和进程通信--20.4 死锁检测
-20.5 进程通信概念
-第二十讲 死锁和进程通信--20.5 进程通信概念
-20.6 信号和管道
-第二十讲 死锁和进程通信--20.6 信号和管道
-20.7 消息队列和共享内存
-第二十讲 死锁和进程通信--20.7 消息队列和共享内存
-21.1 文件系统和文件
-第二十一讲 文件系统--21.1 文件系统和文件
-21.2 文件描述符
-第二十一讲 文件系统--21.2 文件描述符
-21.3 目录、文件别名和文件系统种类
-第二十一讲 文件系统--21.3 目录、文件别名和文件系统种类
-21.4 虚拟文件系统
-第二十一讲 文件系统--21.4 虚拟文件系统
-21.5 文件缓存和打开文件
-第二十一讲 文件系统--21.5 文件缓存和打开文件
-21.6 文件分配
-第二十一讲 文件系统--21.6 文件分配
-21.7 空闲空间管理和冗余磁盘阵列RAID
-第二十一讲 文件系统--21.7 空闲空间管理和冗余磁盘阵列RAID
-22.1 总体介绍
-第二十二讲 实验八 文件系统--22.1 总体介绍
-22.2 ucore 文件系统架构
-第二十二讲 实验八 文件系统--22.2 ucore 文件系统架构
-22.3 Simple File System分析
-第二十二讲 实验八 文件系统--22.3 Simple File System分析
-22.4 Virtual File System分析
-第二十二讲 实验八 文件系统--22.4 Virtual File System分
-22.5 I/O设备接口分析
-第二十二讲 实验八 文件系统--22.5 I/O设备接口分析
-22.6 执行流程分析
-23.1 I/O特点
--视频
-第二十三讲 I/O子系统--23.1 I/O特点
-23.2 I/O结构
--816C80A0F5E3B8809C33DC5901307461
-第二十三讲 I/O子系统--23.2 I/O结构
-23.3 I/O数据传输
--C58221E14388B9DB9C33DC5901307461
-第二十三讲 I/O子系统--23.3 I/O数据传输
-23.4 磁盘调度
--567A3F1FCBFB3F4C9C33DC5901307461
-第二十三讲 I/O子系统--23.4 磁盘调度
-23.5 磁盘缓存
--C327536B80D25CE79C33DC5901307461
-第二十三讲 I/O子系统--23.5 磁盘缓存
-html
--html