具体的ではなく、一般的な話になりますが、I/Oで待ち時間が勿体無いから非同期にして待機時間で別の処理をするなどの話がよくあります。例えばCPUが1コアしかない場合、アプリケーションの処理の途中にファイルIOの処理が入っているとき、非同期にすれば待ち時間に別の処理ができたりします。もしI/Oに関する処理でCPUを使っている場合は、CPU1コアをそれで使っているので、待ち時間に別の処理はできないはずです。しかし、一般には別の処理ができているので気になっています。
これはつまり、同期処理の場合で考えれば、I/Oでの待ち時間では、アプリもOSもCPUを使っていない(プロセスを実行していない、停止している)、ということですよね。
この認識であっていますか?
CPUが本当にIO処理にかかりっきりであれば,他のことはできないでしょう.
つまり,「かかりっきり」にならないように頑張ってるって話です.
複数の作業がCPUを時分割で使えば見た目には並列に動いてるように見えるでしょう.
あと,何かしら物理的な装置が動く場合(ファイルIOならそういうことが生じるよねきっと),CPUはその動作完了をただただ待つ必要も無いもないでしょうから,別のことをさせれば良いのではないですか?
> この待ち時間に、I/Oに関する処理がある場合は、CPU1コアをそれで使っているので、待ち時間に別の処理はできないはずです。
どうしてそう考えましたか?
OSもリアルタイムモニターも無いようなシングルタスクの組み込み系のプログラムと、マルチユーザー、マルチプロセスのOSで事情は異なりますね。ただ、いずれも「割り込み」と言う外部イベントがあり、それを契機に動くことができるし、できるように作ります。アプリケーションの同期・非同期はかなり上位のレベルのお話です。
回答になっていなかったら申し訳ないのですが、この疑問の発端は、並行処理のことを調べていたときにでてきました。1つのコアしか持たないCPUの場合は、並列処理はできないので、並行処理しかできないですよね。並行処理は、短い時間でさまざまなアプリケーションの処理を、コンテキストスイッチを切り替えることで同時に処理しているように見せるという、あくまで”見せかけ”だと認識しています。
そこで、I/Oに関することを調べていたら疑問が沸いたのです。「I/Oの待ち時間は、非同期処理を行えば別の処理ができる」という部分です。例えばファイルの読み込みをしている間の時間を別の処理に使えるということは、1コアのCPUを別の処理に充てている間、ファイルの読み込みに関しては何も処理していない(もう使えるCPUのコアがありませんから。)ということです。この考えがあっているかはわからないですが、もしあっているなら読み込みが完了するまでの間一体何が起こっているのかと疑問に思いました。
例えばファイルのI/Oなら、ストレージも自分でCPU的な処理できる機構を持っていて、OSからの命令でそのCPU的なもので読み込み処理をストレージ自身で行い、その間OSの方は別の処理に充てられる、という感じならすっと理解できると思ったのですが、そうではないですよね...
https://teratail.com/questions/332107
こちらの過去の回答のほうがわかりやすいかと思いました。
ほんとですね、ありがとうございます!
どのレイヤーの話なのかをまず最初に書いてもらう必要があったようです。 質問に書いてある「非同期にして待機時間で別の処理をする」とか 2022/05/20 15:59 のコメントに書いてある「短い時間でさまざまなアプリケーションの処理を・・・」というアプリケーションレイヤーの話であれば私が回答に書いたようなことです。それよりはるか下のハードに近いレイヤーの話であれば DMA とかが出てくると思いますが。
@SurferOnWww
>どのレイヤーの話なのかをまず最初に書いてもらう必要があったようです。
確かに仰る通りで、レイヤーによって話が違うということを完全に分かっておりませんでした。質問が明確ではなかったこと、大変申し訳ありません。
今回理解したことを整理すると、
ファイルI/Oでの非同期処理:ハードに付属のDMAがファイル転送を処理している間の話
ネットワークI/Oでの非同期処理:ほかのサーバーが処理している間の話
と確かに何が処理しているかは全く違いましたね...。
しかし丁度WebサーバーのノンブロッキングI/Oに関しても調べていたので仕組みを理解するのに大いに役立ちました。ありがとうございます。
回答3件
あなたの回答
tips
プレビュー