パソコン初心者のため、暖かい目で見ていただけると幸いです。
現在、UNIX V6のカーネルコードを読んで勉強しているのですが、その途中で疑問に思ったことがあったため、質問を投稿しました。
ブロックデバイスの同期読み込みについてなのですが、
以下の手順で実行されると認識しています。
1: getblk()を実行してバッファを取得、そのバッファにB_BUSYフラグを立てて、バッファが利用中であることを示す。
2: ブロックデバイスに対して、例えば以下のような命令を実行する
c
1//dmr/bio.cのbread()関数 2//※1 dev ... デバイス番号 3//※2 blkno ... ブロック番号 4//※3 rbp = getblk(dev, blkno) 5rbp->b_flags = BREAD; //ブロックデバイスからの読み込みをおこなう 6rbp->b_wcount = -256 //512バイトを示すらしい? 7(*bdevsw[dev.d_major].d_strategy)(rbp)
3: これにより、ブロックデバイスに対して読み込み要求を行ったことになる
4: iowait()を実行し、読み込みが終わるまで眠る
5 何かのプロセスに移り、データの読み出しをおこなう。
6: ブロックデバイスから割り込みが入り、割り込みハンドラがそれをハンドリング、iodone()を実行して何かのプロセスを起こす。
7: 何かのプロセスはバッファのB_DONEを立てて、ブロックデバイスの読み込みが完了するのを待っているプロセスを起こす。
8: brelse()を実行し、B_BUSYフラグを外す。
このような認識となります。
手順の中で親プロセスにあたるプロセス -> プロセスA
プロセスAがiowait()後、データ読み出しなどを行っていたプロセス -> プロセスB(何かのプロセスにあたります)
とします。
質問は2つになります。
1.これらの手順の認識は正しいのでしょうか?
2.プロセスBは一体何なのでしょうか?
プロセスAがiowait()を実行する前に実行していた、(*bdevsw[dev.d_major].d_strategy)(rbp)にあたるものなのでしょうか?(ですが、子プロセスを生成しているようには見えませんでした)
どなたかご教授いただけないでしょうか
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。