MIT6.S081 lab6 Copy-on-Write Fork

There is a saying in computer systems that any systems problem can be solved with a level of indirection.

任何计算机系统的问题都可以通过增加一个中间层解决。

COW的思想就是fork时child的PTE指向parent的Physical Page,这样一个PP两个进程共同使用。等到真正要使用时,再拷贝一份出来,避免冲突。需要注意,fork可能在fork,于是一份物理页面可能不止两个进程共享,于是我们需要为每个物理页面额外维护一个引用计数。

阅读更多

MIT6.S081 lab9 locks

lab9以提高并行度的方式熟悉并行编程,第一个实验是多核并行,第二个实验是key级别的哈希表锁编程。

阅读更多

MIT6.S081 lab7 Multithreading

这个实验主要是熟悉多线程编程,比较容易。

第一个实验线程切换,这个只要理解xv6的线程调度就能解决,甚至代码都可以直接抄。

第二个实验哈希表加锁。关键代码量不到两行,甚至分桶加锁也是。

第三个实验同步屏障,这个还有意思一点。

阅读更多

MIT6.S081 lab5 lazy allocation

lab5是关于懒分配的实验。前言讲得很好,One of the many neat tricks an O/S can play with page table hardware is lazy allocation of user-space heap memory. LA是用户堆空间上的Trick。

Xv6 applications ask the kernel for heap memory using the sbrk() system call. 利用sbrk系统调用来增长或减少堆空间。

LA的原因,程序角度:

  • some programs allocate more memory than they actually use
  • some programs allocate memory well in advance of use

内核角度:

  • It can take a long time for a kernel to allocate and map memory for a large request

因此更好的做法是 That is, sbrk() doesn’t allocate physical memory, but just remembers which user addresses are allocated and marks those addresses as invalid in the user page table. When the process first tries to use any given page of lazily-allocated memory, the CPU generates a page fault, which the kernel handles by allocating physical memory, zeroing it, and mapping it

阅读更多

MIT6.S081 调试xv6

之前学了一些gdb的使用,但是总不能实际上手操作,不如终端IDE可视化调试。这次由于Docker配置环境,不想再折腾连接IDE调试,于是学习GDB。

阅读更多

MIT6.S081 lab1 utilities

实验一的目的是熟悉系统调用以及有限的C标准库使用,借此实现一些经典的unix命令。

在其中碰到了一些bug,大多与字符串解析有关。只记录了几个有意思点的实验。

搭建环境 : docker+目录映射

阅读更多