質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

Q&A

解決済

3回答

1669閲覧

I/Oでの長い待ち時間では、何が起こっているのでしょうか?プロセスは何も処理していないですよね?

asapan

総合スコア60

ファイルI/O

ファイルI/Oは、コンピューターにおけるファイルの入出力です。これは生成/削除やファイルを読み込んだり、出力をファイルに書き込むようなディレクトリやファイルの運用を含みます。

0グッド

2クリップ

投稿2022/05/20 06:07

編集2022/05/21 12:59

具体的ではなく、一般的な話になりますが、I/Oで待ち時間が勿体無いから非同期にして待機時間で別の処理をするなどの話がよくあります。例えばCPUが1コアしかない場合、アプリケーションの処理の途中にファイルIOの処理が入っているとき、非同期にすれば待ち時間に別の処理ができたりします。もしI/Oに関する処理でCPUを使っている場合は、CPU1コアをそれで使っているので、待ち時間に別の処理はできないはずです。しかし、一般には別の処理ができているので気になっています。

これはつまり、同期処理の場合で考えれば、I/Oでの待ち時間では、アプリもOSもCPUを使っていない(プロセスを実行していない、停止している)、ということですよね。

この認識であっていますか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

fana

2022/05/20 06:24

CPUが本当にIO処理にかかりっきりであれば,他のことはできないでしょう. つまり,「かかりっきり」にならないように頑張ってるって話です. 複数の作業がCPUを時分割で使えば見た目には並列に動いてるように見えるでしょう. あと,何かしら物理的な装置が動く場合(ファイルIOならそういうことが生じるよねきっと),CPUはその動作完了をただただ待つ必要も無いもないでしょうから,別のことをさせれば良いのではないですか?
maisumakun

2022/05/20 06:30

> この待ち時間に、I/Oに関する処理がある場合は、CPU1コアをそれで使っているので、待ち時間に別の処理はできないはずです。 どうしてそう考えましたか?
dodox86

2022/05/20 06:39

OSもリアルタイムモニターも無いようなシングルタスクの組み込み系のプログラムと、マルチユーザー、マルチプロセスのOSで事情は異なりますね。ただ、いずれも「割り込み」と言う外部イベントがあり、それを契機に動くことができるし、できるように作ります。アプリケーションの同期・非同期はかなり上位のレベルのお話です。
asapan

2022/05/20 06:59 編集

回答になっていなかったら申し訳ないのですが、この疑問の発端は、並行処理のことを調べていたときにでてきました。1つのコアしか持たないCPUの場合は、並列処理はできないので、並行処理しかできないですよね。並行処理は、短い時間でさまざまなアプリケーションの処理を、コンテキストスイッチを切り替えることで同時に処理しているように見せるという、あくまで”見せかけ”だと認識しています。 そこで、I/Oに関することを調べていたら疑問が沸いたのです。「I/Oの待ち時間は、非同期処理を行えば別の処理ができる」という部分です。例えばファイルの読み込みをしている間の時間を別の処理に使えるということは、1コアのCPUを別の処理に充てている間、ファイルの読み込みに関しては何も処理していない(もう使えるCPUのコアがありませんから。)ということです。この考えがあっているかはわからないですが、もしあっているなら読み込みが完了するまでの間一体何が起こっているのかと疑問に思いました。 例えばファイルのI/Oなら、ストレージも自分でCPU的な処理できる機構を持っていて、OSからの命令でそのCPU的なもので読み込み処理をストレージ自身で行い、その間OSの方は別の処理に充てられる、という感じならすっと理解できると思ったのですが、そうではないですよね...
asapan

2022/05/20 11:44

ほんとですね、ありがとうございます!
退会済みユーザー

退会済みユーザー

2022/05/21 01:13

どのレイヤーの話なのかをまず最初に書いてもらう必要があったようです。 質問に書いてある「非同期にして待機時間で別の処理をする」とか 2022/05/20 15:59 のコメントに書いてある「短い時間でさまざまなアプリケーションの処理を・・・」というアプリケーションレイヤーの話であれば私が回答に書いたようなことです。それよりはるか下のハードに近いレイヤーの話であれば DMA とかが出てくると思いますが。
asapan

2022/05/21 03:18

@SurferOnWww >どのレイヤーの話なのかをまず最初に書いてもらう必要があったようです。 確かに仰る通りで、レイヤーによって話が違うということを完全に分かっておりませんでした。質問が明確ではなかったこと、大変申し訳ありません。 今回理解したことを整理すると、 ファイルI/Oでの非同期処理:ハードに付属のDMAがファイル転送を処理している間の話 ネットワークI/Oでの非同期処理:ほかのサーバーが処理している間の話 と確かに何が処理しているかは全く違いましたね...。 しかし丁度WebサーバーのノンブロッキングI/Oに関しても調べていたので仕組みを理解するのに大いに役立ちました。ありがとうございます。
guest

回答3

0

ベストアンサー

ストレージも自分でCPU的な処理できる機構を持っていて、OSからの命令でそのCPU的なもので読み込み処理をストレージ自身で行い

はい、DMAといってメモリ⇔ストレージデバイスの転送をCPU無しで行う機構は、昔から存在します。

投稿2022/05/20 07:03

maisumakun

総合スコア145123

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asapan

2022/05/20 07:09

DMAを知りませんでした。一番自分の疑問に近い回答でした。ありがとうございました。
dodox86

2022/05/20 07:12

@質問者 asapanさん 昔話ですが、昨今のDMA転送(転送要求をOSが出して、転送終了が割り込みで通知される)の前はPIOと言ってCPU自身が転送する、すなわちCPUを占有してしまう方式がありました。IDEとか昔のインターフェースの歴史を見ると分かります。これは本当に遅くなります。シングルCPU、シングルタスク、シングルユーザーのOSだからそれで済んだ。
asapan

2022/05/20 07:14

@dodox86 さん なるほど...歴史のことまでありがとうございます。 調べて理解を深めたいと思います。
otn

2022/05/20 11:12

DMAの無い時代であっても、「HDDの磁気円盤の回転待ち」とか「HDDの読み取りヘッドの半径方向の移動待ち」とかの待ちがミリ秒単位(DMAの無い時代だと数十ミリ秒かも)でありますので、PIO転送でもCPUが何もしていない時間は十分あります。
dodox86

2022/05/21 00:23

@otnさん、補足と訂正どうもありがとうございます。 確かにPIO転送について改めて確認してみると、ディスク側のレジスタ操作で各種の変化待ちもあり、それだけでもCPU側の空き時間がたくさんありそうでした。
退会済みユーザー

退会済みユーザー

2022/05/21 01:17 編集

どのレイヤーの話なのかをまず最初に書いてもらう必要があったようです。 質問に書いてある「非同期にして待機時間で別の処理をする」とか質問欄の下の 2022/05/20 15:59 の質問者さんのコメントに書いてある「短い時間でさまざまなアプリケーションの処理を・・・」というアプリケーションレイヤーの話であれば私が回答に書いたようなことです。それよりはるか下のハードに近いレイヤーの話であれば DMA とかが出てくると思いますが。
maisumakun

2022/05/21 01:21

パソコン用の現代OSでは、たとえ1コアでもプリエンプティブなマルチタスクは当たり前に実装されているので、こういうことを気にするからにはもっと低層レイヤの話だろう、と判断して回答しました。
guest

0

一般にはいろいろあるでしょうから一般の話はできませんが、.NET の GUI アプリ (Windows Forms とか WPF) と Web アプリ(ASP.NET とか) の話をすると・・・

I/Oで待ち時間が勿体無いから非同期にして待機時間で別の処理をするなどの話がよくあります。例えばCPUが1コアしかない場合、アプリケーションの処理の途中にファイルIOの処理が入っているとき、非同期にすれば待ち時間に別の処理ができたりします。もしこの待ち時間に、I/Oに関する処理がある場合は、CPU1コアをそれで使っているので、待ち時間に別の処理はできないはずです。しかし、一般には別の処理ができているので気になっています。

以下の記事の「■マルチスレッドの動作原理」のセクションの図を見てください。これを説明に使います。

第1回 マルチスレッドはこんなときに使う
https://atmarkit.itmedia.co.jp/ait/articles/0503/12/news025.html

(1) GUI アプリ (Windows Forms とか WPF) の場合

GUI アプリでマルチスレッドにする理由は UI の応答性を高めるためです。

例えば上の記事の ① の図のように同期処理の場合(プログラムに書いてある順番に一つのスレッドで順次処理を行う場合)、「処理A」が UI 処理で「処理B」が I/O を含めた時間のかかる処理だとすると、「処理B」が始まると終わるまでユーザーのマウス操作などはキューに溜るばかりでフリーズしたようになってしまいます。

非同期というのは、② の図のように「処理A」と「処理B」を別のスレッドで行うことです。その場合は記事に書いてあるように「1つのCPUが1秒間に数百回という速さで、複数の処理を切り替えながら動作し、疑似的に複数のCPUがあるように振る舞う」ということで UI 応答性は保たれます。

(2) Web アプリ(ASP.NET とか) の場合

目的は (1) とは異なりスループットを向上させ、クライアントからの同時要求が多くなっても Server too busy となることを減らすためです。

ASP.NET Web アプリは、要求を受けるとスレッドプールからスレッドを取得して処理を行います。I/O バウンドの処理(DB Server とか Web API を使うなど)がある場合、一旦スレッドはスレッドプールに戻し、I/O バウンドの処理が終わったらまたスレッドプールからスレッドを取得して処理を続ければ、スレッドプールのスレッドが有効活用できる=スループットが向上することになります。

ASP.NET Web アプリの場合は I/O バウンドの処理でなければ意味がない(CPU バウンドの処理は非同期にすると逆効果)というところが (1) とは違います。

投稿2022/05/20 06:54

編集2022/05/20 06:59
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asapan

2022/05/20 07:10 編集

勉強になります。ありがとうございます。
退会済みユーザー

退会済みユーザー

2022/05/21 03:59 編集

理由も書かずにマイナス評価をつけた卑怯者は誰だ?
guest

0

ファイルIOに時間がかかるため、その終了を待っているのです

投稿2022/05/20 06:36

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/05/20 06:55

点数乞食は止めましょう。
y_waiwai

2022/05/20 07:07

え、時間がかからないと思ってらっしゃるんですか。。なんとまあ。
Zuishin

2022/05/20 07:10 編集

小泉進次郎かな? Q) (ファイル IO を待つ)長い待ち時間では、何が起こっているのでしょうか? A) ファイルIOに時間がかかるため、その終了を待っているのです
y_waiwai

2022/05/20 07:16

まあ、人それぞれの考え方次第でしょうから、そうじゃないと思うなら別にそれはそれでいいじゃないかと思いますが、 それにしてもねえ。
Zuishin

2022/05/20 07:20

人それぞれねえ。何も知らなくても質問者の言うことを繰り返せばスコアが増えるという利己的な考えで四六時中ゴミを撒いてるのはあなた一人でしょう。 指摘されたらすぐ煽って誤魔化すのもやめた方がいいと思います。
y_waiwai

2022/05/20 07:23

煽ってるのはどっちなのか冷静に見てみては。
Zuishin

2022/05/20 07:25

> え、時間がかからないと思ってらっしゃるんですか。。なんとまあ。
y_waiwai

2022/05/20 07:32

> 人それぞれねえ。何も知らなくても質問者の言うことを繰り返せばスコアが増えるという利己的な考えで四六時中ゴミを撒いてるのはあなた一人でしょう。
Zuishin

2022/05/20 07:35 編集

ああ、あなたの基準から言うと、質問者の書いたことを繰り返しただけのこの回答はゴミではないんですね。
y_waiwai

2022/05/20 07:39

> まあ、人それぞれの考え方次第でしょうから、そうじゃないと思うなら別にそれはそれでいいじゃないかと思いますが、 それにしてもねえ。
y_waiwai

2022/05/20 07:40

まあ、そう思いたいならそう思っておいてください。 それについてはなにも言いませんからw
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問