Linuxは、仮想メモリのスワップ/ディスクパーティションへの「同時」書き込みをどのように管理しますか?

Linuxは、仮想メモリのスワップ/ディスクパーティションへの「同時」書き込みをどのように管理しますか?

私は現在、Pintosという教育用オペレーティングシステムを開発しています。仮想メモリの実装中に遭遇した問題の1つは、ファイルシステムからデータを読み取ってスワップするためにデータを書き込むときに発生するページフォールトでした。

問題は、スワップパーティションとファイルシステムパーティションが同じコントローラを使用するため、一度に1つしかアクセスできないことです。ファイルシステムの読み取りによって発生したページエラーを交換するためにページを削除しようとすると、デッドロックが発生します(各デバイスは他のデバイスが利用可能になるのを待っているため、どちらも進行できません)。

実際のオペレーティングシステム(Linuxなど)がこの問題をどのように解決するかを知りたいです。私が考えている1つの解決策は、最初にスワップされたページをカーネルメモリに書き込み、それをキューで管理し、後でデバイスが利用可能になったときに書き込みストレージをスワップするようにスケジュールすることです。ただし、書き込みを2回完了する必要があるため、費用がかかります。また、実際のメモリよりも使用可能なスワップ領域がはるかに多いため、RAMが不足する可能性が高くなります。

ページの不在時にデバイスをアイドル状態に「強制」する別のソリューションは何ですか?私は、デバイスコントローラがデバイスの状態を決定するためにいくつかのビット(BSYとDRQ)を使用することを知っています。ただし、これは実装によって異なる可能性が高く、ハードウェアによって設定される可能性があるため、これらのビットに触れる必要があるかどうかはわかりません。

どんなアドバイスも本当にありがとうございます。

答え1

まあ…簡単です。キューです。ディスク:キュー。 2つの操作が1つのパーティション内の異なるファイルにアクセスしようとしているのか、2つの異なるパーティション内の異なるファイルにアクセスしようとしているのかは重要ではありません。両方の要求はキューに格納され、ディスクドライバは一度に1つずつその要求を処理します。

関連情報