add a picture to lab3_report.md
This commit is contained in:
BIN
thu_os/images/vm2pm.png
Normal file
BIN
thu_os/images/vm2pm.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 109 KiB |
@@ -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`来指示这些虚拟地址空间的数量。通过这两个数据结构,就可以实现进程的虚拟地址空间向物理地址空间的映射,如图图所示:
|
||||
|
||||

|
||||
|
||||
此外,需要注意的是,`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`以将某个页面换出。由此也可以看出,我们采用的是消极的页面换出机制,即只有在内存空间不足时,才执行页面的换出;在还有剩余的内存空间时,直接给要换入的页面分配新的内存空间,并不执行换出操作。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user