《操作系统概念-第七版》概念复习笔记第8章

  1. 内存是现代计算机运行的中心
  2. 内存由很大的一组字或字节组成,每个字或字节都有自己的地址
  3. CPU根据程序计数器的值从内存中提取指令,这些指令可能会引起进一步对特定内存地址的读取和写入
  4. 内存单元只能看到地址流,而并不知道这些地址是怎么产生的或它们是什么地址(指令或数据)
  5. CPU能直接访问的存储器只有内存和处理器内的寄存器
  6. 机器指令可以用内存地址作为参数,但是不能用磁盘地址; 因此,执行指令以及指令使用的数据必须在这些直接可访问的存储设备上,如果数据不在内存中,那么在CPU使用之前必须把数据移到内存中
  7. 要确保操作系统不被用户进程所访问,以及用户进程不被其他用户进程访问;
    首先要确保每个用户进程都有自己的独立的内存空间,并确保进程只访问其合法地址
    【基地址寄存器】:含有最小的合法物理内存地址
    【界限地址寄存器】:决定范围的大小
    只有操作系统可以通过特权指令来加载基地址寄存器和界限地址寄存器,并做出修改,不允许用户修改
  8. 操作系统在内核模式下执行可以无限制地访问操作系统和用户的内存
  9. 通常,程序以二进制可执行文件的形式存储在磁盘上; 为了执行,程序被调入内存空间
  10. 【输入队列】:在磁盘上等待调入内存以便执行的进程队列
  11. 【地址绑定】:源程序中的地址通常是用符号来表示的(如:count),编译器通常将这些符号地址绑定在可重定位的地址(如:从本模块开始的第14字节),链接程序或加载程序再将这些可重定位的地址绑定成绝对地址; 每次绑定都是从一个地址空间到另一个地址空间的映射
  12. 将指令和数据绑定到内存地址上有几种情况:
    1、编译时:在编译时就知道进程将在内存中的驻留地址,那么就可以生成绝对代码; 如果将来开始地址发生了改变,那么必须重新编译代码(MS-DOS的.COM格式程序就是这种情况)
    2、加载时:在编译时不知道具体在内存中的地址,这时,编译器必须生成可重定位代码; 如果开始地址发生变化,只需要重新加载用户代码以引入新的地址值
    3、执行时:如果进程在执行时可以从一个内存段移到另一个内存段,就属于这种情况; 这种情况需要特定的硬件,绝大多数计算机操作系统采用这种办法
  13. CPU所生成的地址通常称为【逻辑地址】,而内存单元所看到的地址(即加载到内存地址寄存器中的地址)通常称为【物理地址】
  14. 在编译事和加载时的地址绑定方法生成相同的逻辑地址和物理地址,但是在执行时绑定的是两者不一样的,通常称逻辑地址为【虚拟地址】
  15. 由程序所生成的所有逻辑地址的集合称为【逻辑地址空间】,相应的有【物理地址空间】
  16. 运行时从虚拟地址到物理地址的映射是有被称为【内存管理单元MMU】的硬件设备来完成的
    一种实现映射的方案:使用【重定位寄存器】,其实是前面所讲的基地址寄存器;用户进程所生成的地址在送交内存之前,都将加上重定位寄存器的值; 例如:逻辑地址为346,重定位寄存器的值是10000,则将映射到地址10346
  17. 用户程序绝不会看到真正的物理地址
  18. 【动态加载】:对于一个进程的子程序只有在被调用时才被加载,所有子程序都以可重定位的形式保存在磁盘上; 主程序装入内存并运行,当一个子程序需要调用到另一个子程序时,调用子程序首先检查另一个子程序是否已被加载,如果没有,【可重定位的链接程序】将用来加载所需要的子程序,并更新程序的地址表以反映这一变化,接着,控制传递给新加载的子程序
  19. 动态加载不需要操作系统提供特别的支持
  20. 【存根】是一小段代码,用来指出如何定位适当的内存驻留库程序,或者是如果该程序不在内存时应该如何装入库; 不管如何,存根会用子程序地址来替换自己,并开始执行子程序
  21. 【动态链接】:概念与动态加载相似,只是这里不是将加载延迟到运行时,而是将链接延迟到运行时; 这一特点通常用于系统库,如语言子程序库;若没有这一点,则每个程序都必须要有一份语言库的副本,这浪费了磁盘空间和内存空间; 
    动态链接也可以使用于库的更新; 动态链接需要操作系统的帮助;
  22. 【交换】:进程被换出(滚出)内存或换入(滚入)内存
  23. 通常一个交换出的进程需要回到它原来所占有的空间
  24. 交换需要【备份存储】,是快速磁盘,这必须足够大,以便容纳所有用户的内存镜像副本
  25. 具有动态内存需求的进程需要通过系统调用(请求内存和释放内存)来通知操作系统其内存需求变化情况
  26. **************以下讨论是基于操作系统放在低内存**************************
  27. 【连续内存分配】:每一个进程位于一个连续的内存区域
  28. MMU动态地将逻辑地址加上重定位寄存器的值后映射成物理地址,再将之送往内存单元
  29. 【多分区方法】:将内存分为多个固定大小的分区; 每个分区只能容纳一个进程; 因此多道程序的程度会受分区数所限制
  30. 在【可变分区】方案里,操作系统有一个表,用于记录哪些内存可用和哪些内存已被占用
    在一开始,所有的内存都可用于用户进程,因此可以作为一大块可用内存,称为【孔】; 当有新进程需要内存的时候,就为该进程查找足够大的孔, 如果找到,可以在孔内为该进程分配所需的内存,未分配的内存下次可以使用
  31. 内存不断的分配给进程,直到下一个进程的内存需求不能满足为止,这时没有足够大的可用孔来装入进程; 操作系统可以等到有足够的空间或者是往下扫描输入队列以确定是否有其他内存需求较小的进程可以被满足
  32. 当进程释放空间时,将所占有的孔与相邻的孔合并成大孔
  33. 从一组可用孔中选择一个孔的方法:(首次适应较佳)
    1、首次适应:分配第一个足够大的孔,就可停止
    2、最佳适应:分配最小的足够大的孔,必须查找整个表;可以产生最小的剩余孔
    3、最差适应:分配最大的孔,必须查找整个表;可以产生最大的剩余孔
  34. 【碎片】:内存之中的小空间,但已经不足以分配给进程使用了;
    首次适应和最佳适应方法都会有【外部碎片】
  35. 【50%规则】:假定有N个可分配块,那么可能有0.5N个块是外部碎片,即1/3的内存不能使用
  36. 通常将内存以固定大小的块为单元来分配,但若按这种方案,进程所分配的内存可能比所要的要大,这两个数字之差称为【内部碎片】
  37. 【紧缩】:解决外部碎片的问题;移动内存内容,以使所有空闲空间合并成一整块;(紧缩仅在重定位是动态并在运行时可采用)
  38. 【分页】:允许进程的物理地址空间可以是非连续的;(传统上,分页是由硬件支持的)
  39. 分页避免了将不同大小的内存块匹配到交换空间上的麻烦;
  40. 实现分页的基本方法涉及将物理内存分为固定大小的块,称为【帧】;而将逻辑内存也分为同样大小的块,称为【页】;
    当需要执行进程时,其页从备份存储中调入到可用的内存帧中; 备份存储也分为固定大小的块
  41. 由CPU生成的地址分为两部分:页号(P)和页偏移(d),页号作为页表(【页表】包含每页所在物理内存的基地址)的索引,基地址与页偏移组合成了物理地址,就可送交物理单元了
  42. 分页不会产生外部碎片,但是仍然有内部碎片;
  43. 分页的一个重要特点是用户视角的内存和实际的物理内存的分离
  44. 【帧表】:每一个条目对应着一个帧,以表示该帧是空闲还是已占用,如果占用,是被哪个占用
  45. 绝大多数的操作系统都为每个进程分配一个页表,页表的指针与其他寄存器的值(如指令计数器)一起存入进程控制块中,当调度程序需要启动一个进程时,它必须首先装入用户寄存器,并根据所保存的用户页表来定义正确的硬件页表值
  46. 【页表基寄存器PTBR】:指向存在内存中的页表
  47. 【转换表缓冲区TLB】:是关联的快速内存; 由键(标签)和值组成; 当关联内存根据给定定值查找时,它会同时与所有键进行比较
    TLB只包含页表中的一小部分条目,当CPU产生逻辑地址后,其页号提交给TLB,如果找到了页号就找到了帧号,并可用来访问内存; 如果页码不在TLB中(TLB失效),那么就需要访问页表,寻找到后将之放入TLB中,如有必要,置换出一个
  48. 有的TLB在每个条目中还保存地址空间标识符(ASID),可用来唯一标识进程,并为进程提供地址空间保护
  49. 【页表长度寄存器PTLR】:表示页表的大小; 可用于检查每个逻辑地址以验证其是否位于进程的有效范围
  50. 分页的优点之一在于可以【共享公共代码
  51. 【可重入代码】、【纯代码】:可以共享,不能自我修改的代码,它从不会在执行期间改变

  52. 【向前映射页表】:地址转换由外向内(在两级或多级页表结构中,从外部页表到内部页表)
  53. 【哈希页表】:处理超过32位地址空间的常用方法是使用哈希页表,并以虚拟页码作为哈希值;
    哈希页表的每一条目都包括一个链表的元素,每个元素包括:(1)虚拟页码;(2)所映射的帧号;(3)指向链表中下一个元素的指针;
    算法工作:虚拟地址中的虚拟页号转换到哈希表中,用虚拟页号与链表中的每一个元素的第一个域相比,如果匹配(不匹配就比下一个),那么相应的帧号(第二个域)就用来形成物理地址
  54. 【群集页表】:类似于哈希页表,但是每一个条目不只包括一页信息,包括多页; 因此一个页表条目可以存储多个物理页帧的映射,对于稀疏地址空间特别有用;
  55. 【反向页表】:对于每个真正的内存页或帧才有一个条目; 每个条目包含保存在真正内存位置的页的虚拟地址以及拥有该页的进程的信息;
    整个系统只有一个;

  56. 【分段】:逻辑地址空间是由一组段组成的; 每个段都有名称和长度,地址指定了段名称和段内偏移;因此,用户可以通过段名称和偏移两个量来指定地址
  57. 【段表】:段表的每个条目都有段基地址和段界限(段的长度)
  58. 段表的使用:一个逻辑地址由:(1)段号(段名称)和(2)段内偏移;
    如果偏移合法,那么就与段基地址相加而得到所需字节在物理内存的地址; 如果不合法,会陷入操作系统

  59. 在pentium系统中,CPU产生逻辑地址,它被赋给分段单元; 分段单元为每个逻辑地址生成线性地址,然后线性地址交给分页单元,它接下来生成内存中的物理地址;(分段单元和分页单元相当于内存管理单元MMU)
  60. 进程的逻辑空间被分成两部分:第一部分最多由8K个段组成,这部分为私有,存于【本地描述符表LDT】; 第二部分最多由8K个段组成,这部分为所有进程所共享,存于【全局描述符表GDT】;
    LDT, GDT的每个条目为8B,包括一个段的详细信息,如基位置和段界限等;
    逻辑地址是由一对(选择器,偏移)组成的,
    其中选择器是16位的数:s 表示段号(13位), g 表示是在GDT还是LDT(1位),p是保护信息
    偏移是一个32位的数,用来表示字节(或字)在段内的位置
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值