add a picture to lab3_report.md

This commit is contained in:
Shine wOng
2019-09-02 20:30:57 +08:00
parent 5a89fe54c5
commit 636f1624d3
2 changed files with 4 additions and 3 deletions

BIN
thu_os/images/vm2pm.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

View File

@@ -69,7 +69,9 @@ struct mm_struct {
};
```
可以看到,`mm_struct`维护了一个页目录表`mm_struct::pgdir`,它是当前进程的页目录表,将当前进程的虚拟地址映射到物理地址上。此外,`mm_struct::mmap_list`其实是`vma_struct`的链表的头节点,通过这个`mmap_list`可以将当前进程的各个虚拟地址空间连接起来,并且用`map_count`来指示这些虚拟地址空间的数量。
可以看到,`mm_struct`维护了一个页目录表`mm_struct::pgdir`,它是当前进程的页目录表,将当前进程的虚拟地址映射到物理地址上。此外,`mm_struct::mmap_list`其实是`vma_struct`的链表的头节点,通过这个`mmap_list`可以将当前进程的各个虚拟地址空间连接起来,并且用`map_count`来指示这些虚拟地址空间的数量。通过这两个数据结构,就可以实现进程的虚拟地址空间向物理地址空间的映射,如图图所示:
![virt_memory2phy_memory](images/vm2pm.png)
此外,需要注意的是,`mm_struct`还维护了一个`mmap_cache`变量,这其实保存的是当前进程上一次访问的连续虚拟地址空间。根据局部性原理,该进程接下来极有可能再次访问该虚拟地址空间,从而可以在下次访问它时,可以直接获得对应的`vma_struct`,而不需要遍历`vma_struct`链表来找到它。
@@ -269,7 +271,7 @@ make qemu
- 在ucore中如何判断具有这样特征的页
- 何时进行换入和换出操作?
###`FIFO`算法的实现
### `FIFO`算法的实现
`FIFO`算法其实就维护一个按页面在内存中的驻留时间排序的队列。在未出现缺页异常的页面访问时,`FIFO`算法不需要做任何操作,因为此时访问的页面必然早就进入了内存,并且早就被添加到页面队列了。因此,只有在产生页面异常时,`FIFO`算法才具有实质性的操作,包括首先将队列头取出,它代表了驻留内存时间最长的页面,对应于`swap_out_victim`函数,将其换出到外存当中;继而将新进入的页面添加到队列尾,对应于`map_swappable`函数。
@@ -370,4 +372,3 @@ _fifo_swap_out_victim(struct mm_struct *mm, struct Page ** ptr_page, int in_tick
```
这里并没有显式地调用`swap_out`函数来将某一页面换出,这是因为在`swap_in`函数的实现中,是首先调用了前面提到的`alloc_pages`函数,在物理内存不够时,通过这个函数来调用`swap_out`以将某个页面换出。由此也可以看出,我们采用的是消极的页面换出机制,即只有在内存空间不足时,才执行页面的换出;在还有剩余的内存空间时,直接给要换入的页面分配新的内存空间,并不执行换出操作。