質問: -256 //512バイトを示すらしい? (*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)にあたるものなのでしょうか?(ですが、子プロセスを生成しているようには見えませんでした) どなたかご教授いただけないでしょうか
回答: こんにちは。 Unixの内部構造は知らないので、一般論ですが回答してみます。 > > 5 何かのプロセスに移り、データの読み出しをおこなう。 > > > 多くのコンピュータは、DMA(Direct Memory Access)を制御するハードウェア(DMAコントローラ)を持っています。 5の位置では、そのDMAコントローラを設定しDMAを開始するケースが多いです。 そして、DMAコントローラは転送完了すると転送完了割り込みを発行し、そのハンドラーにて必要な処理を行ってからプロセスAへ転送完了を通知するケースが多いと思います。