Appearance
练习
在
kalloc
中注释掉对acquire
和release
的调用。这似乎应该会给调用kalloc
的内核代码带来问题;你期望看到什么症状?当你运行 xv6 时,你看到了这些症状吗?运行usertests
时呢?如果你没有看到问题,为什么?看看你是否可以通过在kalloc
的临界区中插入虚拟循环来引发问题。假设你转而在
kfree
中注释掉了锁(在恢复kalloc
中的锁之后)。现在可能会出什么问题?kfree
中缺少锁是否比kalloc
中危害小?如果两个 CPU 同时调用
kalloc
,其中一个将不得不等待另一个,这对性能不利。修改kalloc.c
以具有更多的并行性,以便来自不同 CPU 的对kalloc
的同时调用可以继续进行而无需等待对方。使用 POSIX 线程编写一个并行程序,大多数操作系统都支持它。例如,实现一个并行哈希表并测量 puts/gets 的数量是否随着 CPU 数量的增加而扩展。
在 xv6 中实现 Pthreads 的一个子集。也就是说,实现一个用户级线程库,以便一个用户进程可以有多个线程,并安排这些线程可以在不同的 CPU 上并行运行。提出一个设计,正确处理一个线程进行阻塞系统调用和改变其共享地址空间的情况。