6.S081 lab10 mmap
mmap
和munmap
系统调用允许UNIX程序对其地址空间进行更为细致的控制。它们可用于在进程间共享内存,将文件映射到进程地址空间,并作为用户级page fault
方案的一部分。在本实验室中,我们将在xv6
中添加mmap
和munmap
系统调用,重点是memory-mapped files
。
mmap
和munmap
系统调用允许UNIX程序对其地址空间进行更为细致的控制。它们可用于在进程间共享内存,将文件映射到进程地址空间,并作为用户级page fault
方案的一部分。在本实验室中,我们将在xv6
中添加mmap
和munmap
系统调用,重点是memory-mapped files
。
本次试验中,将为xv6
添加大文件和符号链接的支持。
本关需要为xv6
添加对大文件的支持。xv6
的inode默认使用12个直接块指针和1个间接块指针(指向一个存储着块指针的数据块),所以xv6
支持的最大文件尺寸是12 + 1*256=268
个block。我们需要将一个直接块指针修改为双重间接块指针(执行一个存储着间接块指针的数据块),将xv6
的最大文件尺寸扩展到11 + 1*256 + 1*256*256= 65803
个block。
在本实验室中,将重新设计代码以提高并行性。在多核机器上,并行性差的一个常见症状是高强度的锁竞争。提高并行性通常需要改变数据结构和加锁策略,以减少争用。您将对xv6内存分配器和文件块缓存进行改进。
本实验室将让你熟悉多线程。您将在用户级线程包中实现线程切换;使用多线程来加快程序的速度;并实现一个barrier
。
实验代码中为我们提供了一个用户级别线程库,需要我们实现线程切换部分。我们需要给user/uthread.c
中的thread_create()
和thread_schedule()
,以及user/uthread_switch.S
中的thread_switch
添加代码。
这次lab只有一关,那就是为xv6
实现copy on write
。
xv6
中的fork()
系统调用将父进程的用户内存全部复制到子进程中。如果父进程内存占用很大,复制可能需要很长的时间。更糟糕的是,通常来说,这个复制在很大程度上是浪费的;例如,在子进程中,fork()
之后的exec()
调用会导致子进程丢弃复制的内存,可能大部分内存都没有来得及使用。另一方面,如果父子双方都使用一个page
,并且其中一方或双方需要写这个page
,那么确实需要复制。
前两个lab比较基础,就不写博客记录了,于是从lab3开始。
环境配置参考官网 。如果使用ubuntu20.04
的话,环境配置比较简单,只需要从qemu官网下载源码,手动build就完成了;或者使用archlinux
,一条命令便全部配置完成。笔者使用的平台是macOS 11.2.1
,使用homebrew
安装的qemu
在前两个lab没有问题,但是在第三个lab出现了crash,改为从源码手动编译安装qemu 5.1.0
解决了。
Update your browser to view this website correctly.&npsb;Update my browser now