From 75ee132a2fe749b4d78108a17497b5fabc4b07a0 Mon Sep 17 00:00:00 2001 From: Youren Shen Date: Fri, 3 Mar 2017 21:18:23 +0800 Subject: [PATCH] Update lec 8 spoc discussion --- all/04-1-spoc-discussion.md | 68 +++++++++++++++++++++++++++++++------ 1 file changed, 58 insertions(+), 10 deletions(-) diff --git a/all/04-1-spoc-discussion.md b/all/04-1-spoc-discussion.md index 746f10bc2..198027c9b 100644 --- a/all/04-1-spoc-discussion.md +++ b/all/04-1-spoc-discussion.md @@ -20,45 +20,81 @@ re_os_lab, v9_cpu, os_course_spoc_exercises  in github repos。这样可以在 1. 寄存器、高速缓存、内存、外存的访问特征? * 位置、是否有软件参与访问、访问频率 - + {%s%} + 寄存器位于CPU芯片内部,由编译器或者程序指定其访问和使用,其使用频率最高。 + 高速缓存位于CPU的内部,具有多级缓存的多核CPU其L1,L2 级缓存由单核独享,L3级缓存由多核共享。其访问频率低于寄存器。当需要访问内存时,CPU会自动先在高速缓存中寻找相应的内容,如找不到再去内存中寻找,因此没有软件参与。 + 内存位于主板上,其访问频率低于高速缓存,由软件显式访问。 + 外存访问频率最低,由软件显式访问。 + {%ends%} 1. 在你写程序时遇到过内存不够的情况吗?尝试过什么解决方法? + {%s%} + 有。在Linux平台上,使用ulimit调整内存使用大小限制。{%ends%} ### 8.2 覆盖和交换 1. 什么是覆盖技术?使用覆盖技术的程序开发者的主要工作是什么? + {%s%}由于程序运行时并非任何时候都要访问程序及数据的各个部分(尤其是大程序),因此可以把用户空间分成一个固定区和若干个覆盖区。将经常活跃的部分放在固定区,其余部分按调用关系分段。首先将那些即将要访问的段放入覆盖区,其他段放在外存中,在需要调用前,系统再将其调入覆盖区,替换覆盖区中原有的段。 + 由上可知,开发者需要定义程序之间的调用关系。 +{%ends%} 1. 什么是交换技术?覆盖与交换有什么不同? + {%s%} 把处于等待状态(或在CPU调度原则下被剥夺运行权利) 的程序从内存移到辅存,把内存空间腾出来,这一过程又叫换出;把准备好竞争CPU运行的程序从辅存移到内存,这一过程又称为换入。 +覆盖技术对应的是一个程序,而交换技术是多个程序之间。覆盖掉的程序是不需要再运行的,同时也不需要再载入内存,而交换出去的程序就绪后就会被交换回来。{%ends%} + 1. 如何分析内核模块间的依赖关系? + {%s%} 在Linux中使用depmod。{%ends%} + 1. 如何内核模块间的函数调用列表? + {%s%} +在Linux中使用nm命令或利用kallsyms机制,查看内核所需要的所有函数。{%ends%} + ### 8.3 局部性原理 1. 什么是时间局部性、空间局部性和分支局部性? - + {%s%} +时间局部性:被引用过一次的存储器位置在未来会被多次引用. +空间局部性:如果一个存储器的位置被引用,那么将来他附近的位置也会被引用 +分支局部性:一个跳转指令的两次执行,很可能跳到相同的内存位置。{%ends%} 1. 如何提高程序执行时的局部性特征? - + {%s%} +根据程序的时间局部性和空间局部性,对相邻的数据的访问安排其在时间上相邻。 +根据分支局部性原理,可以使用编译器的一些扩展如likely和unlikely进行辅助。 +{%ends%} 1. 排序算法的局部性特征? * 参考:[九大排序算法再总结](http://blog.csdn.net/xiazdong/article/details/8462393) ### 8.4 虚拟存储概念 1. 什么是虚拟存储?它与覆盖和交换的区别是什么?它有什么好处和挑战? - - +{%s%} +虚拟存储就是将一个程序的不常用的部分内存块暂存到外存中。之后由处理器通知操作系统将相应的页面调入内存中。 +和覆盖交换相比其并不需要程序员介入。和交换相比,虚拟存储可以交换程序的一部分。 +虚拟存储的好处有:物理内存分配的空间不再需要连续,虚拟地址空间的使用也不需要连续。可以提供给用户大于实际物理内存的地址空间。同时支持部分程序的换入换出。 +{%ends%} ### 8.5 虚拟页式存储 1. 什么是虚拟页式存储?缺页中断处理的功能是什么? +{%s%} 将虚拟存储的单位设置为页即可。在页式存储的基础上添加请求调页和页面置换。 +缺页中断处理的功能是将对应的在外存中的页面调进内存中来。 +{%ends%} 1. 为了支持虚拟页式存储的实现,页表项有什么修改? - + {%s%} +需要添加一个驻留位,表示该表是否在物理内存中。修改位,表示页是否修改过。访问位,表示最近一段时间内该页是否被访问过。保护位,表示该页的访问权限。{%ends%} 2. 页式存储和虚拟页式存储的区别是什么? + {%s%} + 虚拟页式存储支持请求调页和页面置换。{%ends%} ### 8.6 缺页异常 1. 缺页异常的处理流程? + {%s%} +https://chyyuu.gitbooks.io/simple_os_book/content/zh/chapter-3/handle_pages_fault.html +{%ends%} ## 个人思考题 @@ -86,16 +122,28 @@ time ./goodlocality ``` 可以看到其执行时间。 +{%s%} +将最内层循环中的ij交换位置。 +{%ends%} + ## 小组思考题目 ---- ### 缺页异常嵌套 (1)缺页异常可用于虚拟内存管理中。如果在中断服务例程中进行缺页异常的处理时,再次出现缺页异常,这时计算机系统(软件或硬件)会如何处理?请给出你的合理设计和解释。 +{%s%} +对于计算机硬件来说,异常通常是不可屏蔽的。对于操作系统来说,需要将当前的执行上下文保存起来,去执行新的异常处理程序即可。 +https://www.safaribooksonline.com/library/view/understanding-the-linux/0596005652/ch04s03.html +{%ends%} ### 缺页中断次数计算 (2)如果80386机器的一条机器指令(指字长4个字节),其功能是把一个32位字的数据装入寄存器,指令本身包含了要装入的字所在的32位地址。这个过程最多会引起几次缺页中断? -> 提示:内存中的指令和数据的地址需要考虑地址对齐和不对齐两种情况。需要考虑页目录表项invalid、页表项invalid、TLB缺失等是否会产生中断? +{%s%} +> 提示:内存中的指令和数据的地址需要考虑地址对齐和不对齐两种情况。需要考虑页目录表项invalid、页表项invalid、TLB缺失等是否会产生中断? +在X86架构中,TLB不在内存中,因此不属于虚拟内存,TLB的缺失不会产生中断。 +加载指令过程。加载指令时,若该指令不对齐,且页目录表项,页表项都invalid,则加载半条指令会产生中断3次,整条指令产生中断6次。同理,加载装入的字页会产生6次中断,一共12次。 +{%ends%} ### 虚拟页式存储的地址转换 @@ -154,7 +202,7 @@ Virtual Address 0330(0 00000 11001 1_0000): page 6c: e1 b5 a1 c1 b3 e4 a6 bd 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f page 61: 7c 7f 7f 4e 4a 7f 3b 5a 2a be 7f 6d 7f 66 7f a7 - 69 96 7f c8 3a 7f a5 83 07 e3 7f 37 62 30 7f 3f + 69 96 7f c8 3a 7f a5 83 07 e3 7f 37 62 30 7f 3f --> pte index:0x19(11001) pte contents:(0xe3, 1 110_0011, valid 1, pfn 0x63) page 63: 16 00 0d 15 00 1c 1d 16 02 02 0b 00 0a 00 1e 19 02 1b 06 06 14 1d 03 00 0b 00 12 1a 05 03 0a 1d @@ -165,9 +213,9 @@ Virtual Address 1e6f(0 001_11 10_011 0_1111): page 6c: e1 b5 a1 c1 b3 e4 a6 bd 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f 7f page 3d: f6 7f 5d 4d 7f 04 29 7f 1e 7f ef 51 0c 1c 7f 7f - 7f 76 d1 16 7f 17 ab 55 9a 65 ba 7f 7f 0b 7f 7f + 7f 76 d1 16 7f 17 ab 55 9a 65 ba 7f 7f 0b 7f 7f --> pte index:0x13 pte contents:(0x16, valid 0, pfn 0x16) - disk 16: 00 0a 15 1a 03 00 09 13 1c 0a 18 03 13 07 17 1c + disk 16: 00 0a 15 1a 03 00 09 13 1c 0a 18 03 13 07 17 1c 0d 15 0a 1a 0c 12 1e 11 0e 02 1d 10 15 14 07 13 --> To Disk Sector Address 0x2cf(0001011001111) --> Value: 1c ```