xv6-riscv 第7 ~ 8章のまとめ
引き続き7と8章をやってます
7章 Multithreading
課題
switching between threads (moderate)
スレッドの切り替え処理を書いてみようという課題でした。
ほぼ処理は実装済みで、スレッド作成時context->ra
に関数のアドレス渡したり、切替時にはレジスタの中身を切り替えたりするだけで終わりでした。
Using threads (moderate)
xv6から離れてロックの使い方を学ぼうという課題でした。
元々のコードは、CPU分だけLinkedHashMapが存在し10000個の値を並列でLinkedHashMapに追加していきますが、追加時にロックをしてないため、タイミングによっては追加されない(きれいに列にならない)ので、ロックをかけようというものです。
課題の後半では、CPUごとに別のロックを用意すると高速化できるよねという課題でした。
あと、実装では読み取りの時にもロックかけているけど、全く意味ないなとブログ書いてて気づきました。
Barrier (moderate)
xv6から離れてロックの使い方を学ぼうというものでBarrier (computer science) - Wikipediaを作ろうという課題。
複数スレッドでの待ち合わせをどう実装するかというものと言う理解です。
pthread_cond_wait
やpthread_cond_broadcast
の使い方がわかればすぐ終わりました。
8章 locks
Memory allocator (moderate)
kalloc, kfreeを高速化しようという課題。
元々のコードでは全CPU共通で空きメモリの管理を行っており、メモリ取得/開放時のロックも全CPU共通のため、待ち時間が多いです。 今回の課題は、CPUごとに空きメモリとロックを管理することで待ち時間を減らすという修正を行っていきました。
特殊な実装としては、自分の空きメモリはなくなった場合でも他のCPU用の空きメモリが残っている可能性がありますので、 その時は他からメモリを使わせてもらうといった実装が必要でした。
Buffer cache (hard)
難しくて手を出せてないです。 ファイルシステムのBuffer cacheで、メモリ上にデータを持っていたらいちいちディスクまでデータを読みにいかないとかその類だと思います。 面白そうなので、先に課題が終わったら戻ってやる予定です。
次はファイルシステムなんですが、全体的に難しいので時間をかけて進めていきたいと思っています。