背後にある主な理由は、通常のことです。I/ OはCPU / RAMよりもはるかに低速です。I / O操作を実行するプロセスがDMAを使用する(CPUの負荷を軽減する)場合でも、ある時点で、要求の完了を待機する必要がある可能性があります。
HDDの最も一般的なケースでは、ドライブに散らばっているファイルにアクセスしようとするいくつかのアプリケーションを追加するだけで、コーヒー(紅茶など)を作ることができます。SSDを使用すると状況は改善されますが、SSDでも、SATAで数百MB / sのスループットが測定され(スピンプレートHDDの数十MB / sと比較して)、シーク時間はごくわずかです(ミリ秒と比較して)スピンプレート)-ボトルネックになる可能性があります。
私が理解している問題は、データ転送自体にあるだけでなく、必要なオーバーヘッドにもあります。I/ Oはカーネルによって制御されますが、ユーザースペースなしではめったに起こりません。したがって、何かが起こっているかどうかのI / Oチェックを待機しているアプリケーションから(もちろん、実装によって異なります)、コンテキストの切り替えが多数発生する可能性があります。ディスク転送の場合、リソースまたはビジー待機を競合するいくつかのカーネルスレッドが存在する可能性があります(これは適切な戦略になる場合があります)。たとえば、あるパーティションから別のパーティションにデータをコピーするには、最新のファイルシステムが必要です。ソースデータの場所を見つけ、それを読み取り、ターゲットファイルシステムにスペースを割り当て、メタデータを書き込み、データを書き込み、完了するまで繰り返します。
そして、ある時点でシステムがスワッピングを開始すると(通常は通常のI / Oよりも優先度が高くなります)、障害が確定します。
編集:一部のLinuxカーネル開発者と話した後、状況は少し明確になりました。主な問題はI / Oスケジューラーであり、どのI / Oを優先するかについてあまり考えていません。したがって、ユーザー入力とそれに続くグラフィック出力は、ディスク/ネットワークアクティビティとキューを共有しています。その結果として、他のI / Oでページキャッシュをより効果的に使用できると判断したときに、キャッシュされたプロセスデータをページキャッシュ(ロードされたライブラリなど)から破棄する場合もあります。もちろん、そのコードを再度実行する必要がある場合は、再度フェッチする必要があります。つまり、すでに高負荷になっている可能性があるディスクを形成します。
これまでのLinuxカーネルが行くように、これらの問題の多くは4.4.xからまたは4.5.xのが言うので、(問題が知られている)、最近修正されてきたように、言ったはずです、一般的に(それがために使用し、問題が報告されるべきであることをよりよく振る舞いますカーネルの人々は、誰かがバグの報告とテストを手伝いたいと思ったときに満足しています。