• 1. 第六章 存储管理存储管理功能 内存资源管理 存储管理方式 外存空间管理 虚拟存储系统
    • 2. 6.1 存储管理功能存储分配和去配 分配去配对象 内存、外存(相同方法) 分配去配时刻 进程创建、撤销、交换、长度变化 存储共享 目的:节省内存、相互通讯 内容:代码、数据 存储保护 防止地址越界 防止操作越权
    • 3. 6.1 存储管理功能(Cont.)存储扩充 内存、外存结合,虚拟存储体系 速度接近内存,容量相当外存 地址映射 逻辑地址=>物理地址 硬件支持 基址寄存器(base)、限长寄存器(limit)、快表; 使用上述寄存器完成地址映射过程; 不能正常完成地址映射时产生中断。
    • 4. 6.2 内存资源管理6.2.1 内存分区 分区时刻 静态分区:系统初始化时分; 动态分区:申请时分。 分区大小 等长分区:2i 异长分区:依程序、程序单位、对象大小。 通常作法 静态+等长(页式、段页式) 动态+异长(段式、界地址)
    • 5. 6.2.2 内存分配 静态等长分区的分配 字位映象图 空闲页面表 空闲页面链 动态异长分区的分配 最先适应 (First Fit) 最佳适应 (Best Fit) 最坏适应 (Worst Fit)
    • 6. 字位映象图(bit map)1 0 0 … 1 ... 1 0第0 页第2 页第1 页第 k 页第 n 页......分配:自头寻找第一个为0的位,改为1,返回页号; 去配:页号对应的位(bit)置为0。用一个bit代表一页状态,0表空闲,1表占用。( 多单元)
    • 7. 空闲页面表首页号空页数............1204特点:可以分配连续页面。占用占用120页121页122页123页 ... ...
    • 8. 空闲页面链占用占用占用Head:优点:节省空间。 (不适合管理外存)
    • 9. 动态异长分区的分配空闲区首址空闲区长度............25001500数据结构:Criteria: 尽量使空闲区域连续。 初始时一个连续空闲区。 长度=0为表尾。
    • 10. 最先适应算法(First Fit)空闲区首址空闲区长度128641024256322560......空闲区:首址递增排列; 申请:取第一个可满足区域; 优点:尽量使用低地址空间, 高区保持大空闲区域。 缺点:可能分割大空闲区。 Eg. 申请32将分割第 一个区域。
    • 11. 最佳适应算法(Best Fit)空闲区:首址递增排列; 申请:取最小可满足区域; 优点:尽量使用小空闲区, 保持大空闲区。 缺点:可能形成碎片 (fragment)。 Eg. 申请30将留下长 度为2的空闲区。 空闲区首址空闲区长度128641024256322560......
    • 12. 最坏适应算法(Worst Fit)空闲区:首址递增排列; 申请:取最大可满足区域; 优点:防止形成碎片。 缺点:分割大空闲区域。 空闲区首址空闲区长度128641024256322560......
    • 13. UNIX存储分配--FFstruct map { char *m_size; char *m_addr; }; struct map coremap[CMAPSIZ]; struct map swapmap[SMAPSIZ]; define CMAPSIZ 100 define SMAPSIZ 100
    • 14. malloc(mp,size) struct map, *mp; { register int a; register struct map *bp; for(bp = mp; bp->m_size; bp++){ if (bp-m_size >= size) { a=bp->m_addr; bp->m_addr =+ size; if ((bp->m_size =- size) == 0) do { bp++; (bp-1)->m_addr = bp->m_addr; }while((bp-1)->m_size = bp->m_size); return(a); } } return(0); }
    • 15. mfree(mp,size,aa) struct map *map; { register struct map bp; register int t,a; a = aa; for(bp=mp; bp->m_addr<=a && bp->m_size !=0; bp++); if(bp>mp && (bp-1)->m_addr+(bp-1)->m_size == a) { //与前合并 (bp-1)->m_size =+ size; if (a+size == bp->m_addr){ //前后合并 (bp-1)->m_size =+ bp->m_size; while (bp->m_size) { bp++; (bp-1)->m_addr = bp->m_addr; (bp-1)->m_size = bp->m_size; } } }
    • 16. }else{ if (a+size == bp->m_addr && bp->m_size) { //与后合并 bp->m_addr =- size; bp->m_size =+ size; } else if (size) do { //无合并 t = bp->m_addr; bp->m_addr = a; a = t; t = bp->m_size; bp->m_size = size; bp++; }while (size = t); } }
    • 17. 6.2.3 碎片处理紧凑:移动占用区域,使所有空闲区域连成一片(开销很大)。 OS P1(248k) P2(250k) 8k 6k 4k256k:512k:768k:264k:518k: P1 OS P2256k:504k:754k:18k
    • 18. 6.3 存储管理方式界地址管理方式(一维地址) 页式管理方式(一维地址) 段式管理方式(二维地址) 段页式管理方式(二维地址)
    • 19. 6.3.1 界地址管理方式4.3.1.1 基本原理 1. 内存空间划分:动态异长; 2. 进程空间划分:一个进程一个区域,逻辑地址0l-1 3. 进程空间与内存空间对应关系(可以浮动):0:l-1:......b:lb+l-1:进程空间内存空间
    • 20. 6.3.1 界地址管理方式 4. 所需表目: (1)内存分配表--在PCB中; (2)空闲区域表:array of (addr,size)。 5. 所需寄存器: (1)基址寄存器; (2)限长寄存器。 6. 地址映射:
    • 21. 6.3.1 界地址管理方式0:l-1:......b:lb+l-1:lb逻辑地址CP+aa+b步骤:(1) 由程序确定逻辑地址a; (2) a与l比较判断是否越界, 不满足:0al-1,越界; (3) a与b相加得到物理地址。进程空间内存空间
    • 22. 6.3.1 界地址管理方式6.3.1.2 双对界 代码:一对界 数据:一对界 6.3.1.3 交换技术(swapping) 例:UNIX 交换进程sched (#0) 交换原则:外存 SRUN 状态进程内存 (1)内存有空间,直接移入; (2)内存空间不够,移出SWAIT, SSTOP状态进程; (3)如果还不够,移出SSLEEP, SRUN状态进程, 条件:在外时间3秒;在内时间2秒。 b1l1b2l2
    • 23. 6.3.2 分页式存储管理(paging)6.3.2.1 基本原理 1. 内存空间划分:静态等长,2i, 称为一个页架。 ......第0页第1页第k页第2n-i-1页2i02i:12i:k2i:(2n-i-1)2i:物理地址=页架首址+页内地址 =页架号 2i +页内地址 = 页架号 页内地址i位n-i位
    • 24. 6.3.2 分页式存储管理2. 进程空间划分:静态等长,2i, 称为一个页面。......第0页第1页第k页 第l-1页2i02i:12i:k2i: (l-1)2i:逻辑地址=逻辑页首址+页内地址 =逻辑页号 2i +页内地址 =逻辑页号 页内地址i位
    • 25. 3. 进程空间与内存空间对应关系...第0页第1页第2页第3页第16页第22页第32页第15页.........进程空间内存空间
    • 26. 4. 所需表目:(1)页表,每个进程一个物理页号逻辑页号:1522163201235. 所需寄存器(2)总页表:系统一个(1) 页表首址寄存器:bl(2) 页表长度寄存器:系统一个系统一个(3) 快表:系统一组:逻辑页号页架号............fp
    • 27. 逻辑地址(p,d)物理地址(f,d) (1) 由程序确定逻辑地址(p,d); (2) 由p查快表得页架号f; 如查不到: (a) 由p与l比较,判别是否越界: 不满足:0pl-1,越界; (b) 由p和b查页表得f, (p,f)快表,如满淘汰一个; (c) 转(2); (3) f与d合并得物理地址6. 地址映射 : (p,d)(f,d){}
    • 28. ...逻辑页号页架号............fplbbl......PCB页架号逻辑页号...f...p...f dp d+cp p f 物理地址逻辑地址b:...
    • 29. 6.3.2.2 多级页表提出背景 进程虚拟空间大幅度增加 单级页表需要很大连续内存空间 多线程设计导致进程虚拟空间不连续性 页表所占内存空间浪费 例如 32位进程地址空间,页长4k(占12位),页号20位,页表需要220个入口! 解决策略 二级或多级页表
    • 30. Two-Level Page-Table Scheme
    • 31. Two-Level Paging ExampleA logical address (on 32-bit machine with 4K page size) is divided into: a page number consisting of 20 bits. a page offset consisting of 12 bits. Since the page table is paged, the page number is further divided into: a 10-bit page number. a 10-bit page offset. Thus, a logical address is as follows: where pi is an index into the outer page table, and pj is the displacement within the page table.page numberpage offsetpipjd101012
    • 32. Address-Translation Scheme Address-translation scheme for a two-level 32-bit paging architecture Even though time needed for one memory access is quintupled, caching permits performance to remain reasonable  
    • 33. 6.3.2.3 反置页表(inverted page table)传统页表面向进程空间 每个进程逻辑页面有一表项 当进程空间很大时,页表很大 反置页表面向内存空间 每个内存页架一个表项 大小固定
    • 34. 反置页表--工作原理程序物理 内存……pidp……f dpid p df逻辑地址物理地址反置页表
    • 35. 速度问题反置页表查找 由表头起始,平均为表长度的一半 速度慢 解决方案 在反置页表前增加一级杂凑表 查找杂凑表与反置页表需要两次访问内存 为进一步提高速度,快表缓冲
    • 36. 1. 内存空间划分:动态异长,每区一段。段首址+段内地址物理地址=b’:l’b’+d6.3.3 分段式存储管理(segmentation)
    • 37. 2. 进程空间划分:若干段,每段一个程序单位。调用x段ef: 访问d段ae: 调用y段fmain(段号0)X(段号1)Y(段号2)D(段号3)a:0 … 80k-10 ... 40k-10 … 20k-10 … 60k-1逻辑地址= 段号 段内地址(二维地址)
    • 38. mainxyd3. 对应关系40k60k80k20k............进程空间内存空间100k:200k:300k:320k:
    • 39. 4. 所需表目(1) 段表:每进程一个段首址段长度100k40k80k60k段号 0: 1: 2: 3:20k200k320k300k(2) 空闲表:系统一个 array of (addr,size)
    • 40. 5. 所需寄存器(1) 段表首址寄存器:bl(2) 段表长度寄存器:系统一个系统一个(3) 快表:系统一组: 段号 段首址 段长度............l’s...b’...
    • 41. 6. 地址映射 : (s,d)(b’+d){} 逻辑地址(s,d)物理地址(b’+d) (1) 由程序确定逻辑地址(s,d); (2) 由s查快表得b’和l’ 如查不到: (a) 由s与l比较判断是否越界 不满足:0sl-1,越界; (b)由s和b查段表,得b’和l’ (s,b’,l’)快表, 如快表满淘汰一个; (c) 转(2) (3) 由d与l’比较,判断是否越界 不满足:0dl’-1,越界; (4) 由b’d得物理地址。
    • 42. 段号段长 段首址... … ... … ...... l’ b’slbbl......PCB段长 段首址段号… ... l’ b’...s...b’+d物理地址s d逻辑地址… ...cp+b:若快表查不到
    • 43. 段号段长 段首址... … ... … ...... l’ b’slbbl......PCB段长 段首址段号… ... l’ b’...s...b’+d物理地址s d逻辑地址… ... s l’ b’ cp+b:+cp
    • 44. 6.3.3.2 段的共享段长 段首址 … ... b’ l’ ... ...段号 … si ...P1段表:段长 段首址 … ... b’ l’ ... ...段号 … sj ...P2段表:共享段......b’:l’内存空间 如何实现? 共享段表
    • 45. 段名 共享记数 段长 段首址 其它 … … … … ... vi 3 35k 125k ?? … … … … ...共享段表:进程段表(n)共享段表(1)共享段(1)
    • 46. 例子:UNIX正文段(text段) struct text { int x_daddr; /*disk address int x_caddr; /*core address, if loaded int x_size; /*size(64) int *x_iptr; /*inode pointer char x_count; /*reference count char x_ccount; /*number of loaded reference; }text[NTEXT]; define NTEXT 40
    • 47. struct proc { …… int *p_textp; /*pointer to text structure; } struct user { …… int u_tsize; …… }
    • 48. 6.3.3.2 段的保护 (1) 段表的改进:段长 段首址 … … .. .. .. l’ b’ 1 0 1段号 … s ...访问权限 R W E … … .. .. .. 段号 段长 段首址 … … … .. .. .. s l’ b’ 1 0 1访问权限 R W E(2) 快表的改进: … … … .. .. ..
    • 49. 6.3.4 段页式存储管理(segmentation with paging)段式优于页式 便于共享和保护 页式由于段式 消除“碎片”问题 段页式:结合二者优点 每个进程包含若干段 每个段包含若干页
    • 50. 6.3.4.1 基本原理 1. 内存空间划分:(同页式) 静态等长,2i, 称为一页。 物理地址=(页架号,页内地址)=(f,d) 2. 进程空间划分: 一个进程若干个段 一个段若干个页 逻辑地址=(段号, 逻辑页号, 页内地址)=(s,p,d)
    • 51. 3. 对应关系:0页1页2页0页1页第1段:0页1页2页第0段:第2段:25页26页27页28页29页30页31页32页33页 ... ...内存空间进程空间
    • 52. 4. 所需表目 (1) 段表:每个进程一个页表首址 页表长度 … ... b’ l’ … ...段号 0 ... s ... l-1 (2)页表:每个段一个逻辑页号 0 … p … l’-1页架号...f...(3) 总页表:系统一个
    • 53. 5. 所需寄存器 (1)段表基址寄存器:保存正运行程度段表首址; (2)段表限长寄存器:保存正运行程序段表长度。 (3)快表:一组联想寄存器 (快段表+快页表) 段号 逻辑页号 页架号 … … ... s p f … … ...bl
    • 54. 6. 地址映射 (P.141) : (s,p,d)(f,d){} 逻辑地址(s,p,d)物理地址(f,d) (1) 由程序确定逻辑地址; (2) 由(s,p)查快表得f; 如找不到: (a) 由s与l比较判断是否越界: 不满足:0sl-1, 越界 (b) 由s和b查段表得页表(b’,l’) (c) 由p与l’比较判断是否越界: 不满足:0pl’-1, 越界 (d) 由b’与p查页表得f (s,p,f)快表,若快表已满,淘汰一个 (e) 转(2) (3) 由f与d合并得物理地址(f,d)