# 6.9 练习

1. 注释掉在`kalloc`中对`acquire`和`release`的调用。这似乎会给调用`kalloc`的内核代码带来问题；你希望看到什么症状？当你运行xv6时，你看到这些症状了吗？运行`usertests`时呢？如果你没有看到问题是为什么呢？看看你是否可以通过在`kalloc`的临界区域插入虚拟循环来引发问题。
2. 假设您将`kfree`中的锁注释掉（在`kalloc`中恢复锁之后）。现在可能会出什么问题？`kfree`中缺少锁比`kalloc`中缺少锁的危害小吗？
3. 如果两个CPU同时调用`kalloc`，则其中一个不得不等待另一个，这对性能不利。修改***kalloc.c***以具有更多的并行性，这样不同CPU对`kalloc`的同时调用就可以进行，而不需要相互等待。
4. 使用POSIX线程编写一个并行程序，大多数操作系统都支持这种程序。例如，实现一个并行哈希表，并测量puts/gets的数量是否随着内核数量的增加而缩放。
5. 在xv6中实现Pthread的一个子集。也就是说，实现一个用户级线程库，这样一个用户进程可以有1个以上的线程，并安排这些线程可以在不同的CPU上并行运行。想出一个正确处理线程发出阻塞系统调用并改变其共享地址空间的方案。

