6.9 练习

  1. 注释掉在kalloc中对acquirerelease的调用。这似乎会给调用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上并行运行。想出一个正确处理线程发出阻塞系统调用并改变其共享地址空间的方案。