导图社区 操作系统的内存管理
操作系统的内存管理,整理了两天,希望能给大家带来帮助。【由于没会员主题数量受限,后面直接不分主题了】
社区模板帮助中心,点此进入>>
互联网9大思维
组织架构-单商户商城webAPP 思维导图。
域控上线
python思维导图
css
CSS
计算机操作系统思维导图
计算机组成原理
IMX6UL(A7)
考试学情分析系统
内存管理
简介
单道程序设计
内存两部分
供操作系统使用(驻留监控程序、内核)
供当前正在执行的程序使用
多道程序设计
内存中细分出“用户”部分,以满足多个进程要求
细分任务由操作系统动态完成,叫内存管理
结构
内存
页框
内存中固定长度的块
二级存储器
页
定长数据块,可临时复制到内存的页框中
段
变长数据块
(分段)整个段可临时复制到内存可用区域
(分段与分页相结合)一个段分许多页,每页单独复制到内存中
内存管理的需求
重定位
程序换出到磁盘后,再换入时要放到与换出前相同内存区域很难,所以要重定位到不同区域
寻址
操作系统要知道进程控制信息、执行栈位置、进程开始执行程序入口
处理器硬件和操作系统软件把代码的内存访问转换为物理内存地址,反应程序在内存中的位置
保护
该进程外的其他进程中的程序不能未经授权访问该进程的内存单元
运行时检查进程产生的所有内存访问,确保它们只访问分配给该进程的内存空间
内存保护必须由处理器(硬件)而不是操作系统(软件)来满足
共享
多个进程在执行同一个程序时允许每个进程访问该程序的同一个副本,允许对内存共享区域的受控访问
逻辑组织
内存被组织成线性(或一维)的地址空间,地址空间由一系列字节或字组成
外部存储器在物理层上也是类似方式组织
大多数程序被组织成模块,某些模块不可修改,某些包含可修改数据
操作系统和硬件处理模块形式的用户程序与数据的好处:
1、可独立编写和编译模块
2、为不同模块提供不同保护级别
3、引入某机制使模块被多进程共享
物理组织
两级存储器
内存:快速访问、成本高、易失性、不提供永久存储
外存:慢、便宜、非易失
大容量外存用于长期存储程序和数据,小内存用于保存当前使用的程序和数据,系统关注内外存间信息流组织。
两级方案不合要求:
1、供程序和数据使用的内存可能不足。于是必须用覆盖技术:不同模块被分配到内存同一区域,主程序在需要时换入换出模块
2、在多道程序设计环境,编写代码时不知道可用空间大小
内存分区
固定分区
分区大小
大小相等分区
1、程序太大不能放到一个分区。用覆盖技术,任何时候程序只有一部分在内存,需要模块不在时,用户程序把模块装入程序分区,覆盖分区中任何程序和数据
2、内存利用率低。小程序占完整分区,数据块小于分区造成空间浪费,称内存碎片
大小不等分区
可缓解前两个问题但不完全解决
放置算法
有可用就进,用哪个都一样;所有分区被不可运行状态的进程占据,这些进程必须换出一个
1、每个进程分配到能容纳它的最小分区,每个分区维护一个调度队列,用于保存换出的进程
优点:每个分区内部浪费空间(内部碎片)最少
缺点:单分区最优,系统不最优
2、所有进程只提供一个队列,装进程时选择最小可用分区,所有分区被占则必须交换,优先换出容纳新进程的最小分区中的进程,或考虑优先级,或换出阻塞而不是就绪进程
优点:灵活性,相对简单,很少的系统软件和处理开销
缺点:
1、分区数量在系统生成阶段已确定,限制系统中活动(未挂起)进程数量
2、分区大小在系统生成阶段先设置,小作业不能有效利用分区空间
动态分区
分区长度数量可变,进程装入时分配与其容量完全相等的内存空间,当内存中无就绪进程就换出换入
最终在内存中形成许多小空洞,时间一长内存碎片越来越多,内存利用率降低,叫外部碎片;克服方法:压缩技术,系统不时移动进程,使进程占的空间连续,使空闲空间连成一片。困难之处:耗时,浪费处理器时间;需要动态重定位能力
最佳适配:选择与要求大小最接近的块
性能最差,使内存很快形成小到无法满足任何内存分配请求的小块,需要更频繁的内存压缩
首次适配:从头扫描,选择大小足够的第一块
最简单,通常最快和最好,,但使前端出现很多小空闲分区,每次查找都要经过它们
下次适配:从上次放置的位置开始扫描,选择下一个大小足够的块
比首次适配差,常在内存末尾分配,导致末尾最大空闲存储块很快分裂为小碎片,需要更多次数的压缩
置换算法:当内存中所有进程都处于阻塞态,压缩后也无足够空间,为避免等待解除阻塞,换出一个阻塞进程,给新进程和就绪挂起进程让空间
伙伴系统
固定分区:限制活动进程数,内存利用率低;动态分区:难维护,压缩开销大
记可分配内存总大小为2^U;记最小内存分配单元为2^L 伙伴系统中可用内存块大小为2^i,L≤i≤U 对一个大小为k的块请求,找到i满足2^i−1<k≤2^i 然后找到一个大小为2^i的空洞; 建议看PPT
伙伴系统分配情况的二叉树 ,特点:不存节点与其兄弟节点都是未分配。若存在,则应合并为一个大的块
固定分区方案,一个进程总可以指定到同一个分区,换出又换入仍用它。用简单重定位加载器;在大小相等分区和只有一个队列的大小不等分区,进程在不同生命周期可占不同分区。换出换入后改变。
动态分区也可改变。换出换入和压缩,使进程访问(指令和数据单元)位置不固定。
三种地址
物理地址(或绝对地址):数据在内存中的实际位置
逻辑地址:是指当前数据在内存中的物理分配地址无关的访问地址
相对地址:逻辑地址的一个特例,它是相对于某些已知点(通常是程序的开始处)的存储单元
过程
基址寄存器:程序在内存中的起始地址。
界限寄存器:程序在内存中的终止位置
进程执行过程中,遇到的相对地址,加上基址寄存器地址产生一个绝对地址,将其与界限寄存器的值比较。 在界限范围内则执行, 否则向OS发出中断信号
分页
思想:光对内存划分不够,进程也划分 分页技术: 内存被划分成固定等大小的小块(称为页框) 进程被划分成同样大小的块(称为页) OS维护内存中空闲的页框 进程按页装入内存,一页装入一页框,无需连续页框 须记录每个进程页的位置(称为进程的页表)
分页:页大小规定是2的幂。 分页优势:每个进程最多有一个页有内部碎片。即每个进程的内部碎片大小不会超过一个页 相对地址:直接用其二进制值表示,不够位数前面补0 逻辑地址: 1.必须知道页大小,根据页大小,计算偏移量的位数,剩下位数为页号位数。 2. 页号=整数值/页大小;偏移量=整数值%页大小; 3. 将页号和偏移量转为二进制。 规定页大小二进制的好处:页号=1502/1024=10111011110>>10=1; 偏移量1502%1024=10111011110 & 1111111111=0111011110。 分页的逻辑地址-->物理地址 页号-->页框号 偏移量不变
分段
把程序和数据划分到几个段中 不要求段长度相等 分段的逻辑地址:段号和偏移量 大小不等的段,类似动态分区 同动态分区,无内部碎片,有外部碎片 不同动态分区的是,程序有好几段(动态分区,程序就一段) 分段逻辑地址-->物理地址: 1、找到段表里对应段号的行,读取段长度和基(段的起始物理地址) 2、若偏移量大于段长度,则地址无效 3、返回 物理地址=基+偏移量