4096バイトのデータをファイルに保存したいとしましょう。正確に1ページを占有し、一度だけ更新する必要があります。ただし、カーネルへの複数の呼び出しを使用してこれを実行すると(つまり、1つずつ書き込む)、カーネルは書き込みを中断して現在のコンテンツをディスクにフラッシュし、書き込みが完了すると再び更新されます。したがって、フラッシュを無駄にしないようにカーネルを一度だけ呼び出すだけです。それになりますwrite
。一度使用すると、write
ページが一度だけダーティで表示されるという保証はありますか?
man
Pagesは、いくつかの事前に作成されたページをファイルにマップし、ファイルに書き込むために使用できるMAP_UNINITIALIZED
いくつかの機能を提供しますが、組み込みデバイスでのみ機能するという。MAP_FIXED
msync
カーネルソースコードは、これがいくつかのレジスタを埋めて行を作成するアセンブリコードを持つマクロであることをwrite
示しています。私の質問に対する答えを見つけるためにソースコードをもっと詳しく調べる方法がわかりません。sys_write
my_syscall3
"syscall\n"
編集:今誤解がありました。私がフラッシュと言うとき、私は(間違って)フラッシュを意味しません。カーネルキャッシュをフラッシュするという意味です。カーネルが更新するページを選択する場所です。つまり、ページをダーティで一度だけ表示したいのです。これがまさに私が望むものです。ページをダーティとしてマークし、カーネルを更新し、ページをダーティではないように設定してから、もっと書き込んでダーティとして表示したくありません。原子的にしたいですwrite
。write
ダーティページについてアトミックですか?
ベストアンサー1
同じマニュアルページ:
write() の成功した戻り値は、データがディスクにコミットされたことを保証しません。
必ずしも一度フラッシュする必要はなく、ユーザー領域プロセスとしてストレージシステムの必須事項(ハードドライブの512Bブロック、ファイルを継続的に書き込むがディスクのもう一方の端への断片化のためネットワークファイル)を知ることはできません。タイムアウトしたシステム? 256個のディスクにわたって複製されたLVM?記録されたデータをストレージにコミットするために必要なストレージメディアとの物理的な対話の数を評価します。
保証される唯一のことは、ファイルシステムがPOSIXを保証する場合(したがってXFS、NFSなどの「UNIXy」ファイルシステム)、戻り時に記録されたwrite
データを後続の読み取りで表示する必要があることです。
なぜ尋ねるのか分からないまま:フラッシュを避けることを心配する理由がわかりません。明示的に指示しない限り、ファイルシステムはデータをディスクにフラッシュするのではなく、常にキャッシュしますが、効率的に実行します。一括更新。したがって、メディアがアクティブであるがアイドル状態でない限り、4KB以下の書き込み操作が直ちに書き込みを開始しない可能性が高い。