Skip to content

Update lec 8 spoc discussion #37

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 58 additions & 10 deletions all/04-1-spoc-discussion.md
Original file line number Diff line number Diff line change
Expand Up @@ -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%}

## 个人思考题

Expand Down Expand Up @@ -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%}

### 虚拟页式存储的地址转换

Expand Down Expand Up @@ -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
Expand All @@ -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
```
Expand Down