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
的 inode 默认使用 12 个直接块指针和 1 个间接块指针(指向一个存储着块指针的数据块),所以xv6
支持的最大文件尺寸是12 + 1*256=268
个 block。我们需要将一个直接块指针修改为双重间接块指针(执行一个存储着间接块指针的数据块),将xv6
的最大文件尺寸扩展到11 + 1*256 + 1*256*256= 65803
个 block。
在本实验室中,将重新设计代码以提高并行性。在多核机器上,并行性差的一个常见症状是高强度的锁竞争。提高并行性通常需要改变数据结构和加锁策略,以减少争用。您将对 xv6 内存分配器和文件块缓存进行改进。
本实验室将让你熟悉多线程。您将在用户级线程包中实现线程切换;使用多线程来加快程序的速度;并实现一个barrier
。
这次 lab 只有一关,那就是为xv6
实现copy on write
。
xv6
中的fork()
系统调用将父进程的用户内存全部复制到子进程中。如果父进程内存占用很大,复制可能需要很长的时间。更糟糕的是,通常来说,这个复制在很大程度上是浪费的;例如,在子进程中,fork()
之后的exec()
调用会导致子进程丢弃复制的内存,可能大部分内存都没有来得及使用。另一方面,如果父子双方都使用一个page
,并且其中一方或双方需要写这个page
,那么确实需要复制。