Linuxの場合。散布/収集 IO (readv, writev) と fread によるラージバッファをいつ使うか
2023-08-21 12:56:54
質問
で
散布
と
集める
(すなわち
readv
と
writev
など)、Linuxは複数のバッファに読み込み、複数のバッファから書き込みを行います。
例えば、3つのバッファからなるベクターがあるとすると、そのベクターに対して
readv
を使うこともできますし、3 つのバッファを結合した単一のバッファを使って
fread
.
それゆえ、私は混乱しています。どのような場合に scatter/gather を使用し、どのような場合に単一の大きなバッファを使用する必要があるのでしょうか。
どのように解決するのですか?
が提供する主な利便性は
readv
,
writev
は
- 連続しないデータブロックを扱うことができます。つまり、バッファには ではなく は配列の一部である必要はなく、別々に割り当てられるのです。
-
I/Oは「アトミック」です。
writev
を実行すると、ベクター内の全ての要素は一つの連続した操作で書き込まれ、 他のプロセスによって行われた書き込みはその間に発生しません。
例えば、データが自然に分割され、異なるソースから来たとします。
struct foo *my_foo;
struct bar *my_bar;
struct baz *my_baz;
my_foo = get_my_foo();
my_bar = get_my_bar();
my_baz = get_my_baz();
さて、3つの「バッファ」はすべて ではなく でなく、1 つの大きな連続したブロックです。しかし、何らかの理由 (たとえば、ファイル形式のファイル ヘッダーのフィールドであるなど) で、それらをファイルに連続的に書き込みたい場合です。
もしあなたが
write
のどちらかを選択しなければならない。
-
を使用して、それらをメモリの 1 つのブロックにコピーする。
memcpy
(オーバーヘッド) を使い、その後に単一のwrite
を呼び出します。その後、書き込みはアトミックになります。 -
3つの別々の呼び出しを行うことで
write
(を呼び出すこと(オーバーヘッド)。またwrite
の呼び出しがこれらの書き込みの間に挟まる可能性があります (アトミックではありません)。
もしあなたが
writev
を使えば、すべてうまくいきます。
-
正確に1つのシステムコールを行い
memcpy
の 3 つから 1 つのバッファを作成します。 - つまり、他のプロセスも書き込みを行う場合、これらの書き込みが 3 つのベクターの書き込みの間に入ることはありません。
だから、次のようなことをするのです。
struct iovec iov[3];
iov[0].iov_base = my_foo;
iov[0].iov_len = sizeof (struct foo);
iov[1].iov_base = my_bar;
iov[1].iov_len = sizeof (struct bar);
iov[2].iov_base = my_baz;
iov[2].iov_len = sizeof (struct baz);
bytes_written = writev (fd, iov, 3);
ソースはこちら
関連
-
Linux ddコマンド詳細説明:データのバックアップ、およびバックアッププロセスでのフォーマット変換のケース
-
中国版「浮世」を含むUbuntu 20.04.2リリース
-
deepin20ターミナルでサーバーをリモート管理する方法
-
deepin20の不正確な時刻表示を調整する方法は?Deepinの時刻補正方法
-
deepin20のソフトをアンインストールする方法を教えてください。deepinのアプリケーションをアンインストールする2つの方法
-
Apache の一般的な設定エラー
-
[解決済み] Bashシェルスクリプト - フラグをチェックし、その値を取得します。
-
[解決済み] Bashでファイルの中身をループする
-
[解決済み] 複数のPDFファイルを1つのPDFに結合/変換する【終了】。
-
[解決済み] Unix/Linuxで、ファイルのあるフォルダを別のフォルダにコピーするにはどうしたらいいですか?[クローズド]
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Linux ddコマンド詳細説明:データのバックアップ、およびバックアッププロセスでのフォーマット変換のケース
-
Manjaro linuxでマウスの速度を設定する方法は?Manjaroのマウスのカーソル速度を設定する方法に関するヒント
-
Kali Linuxのマウスを左利き用に設定する方法は?Linuxマウス左利き操作選択方法
-
deepin20のデスクトップアイコンのスタイルを変更する方法は?deepinのアイコンテーマを変更するためのヒント
-
2020年deepin Deep OS V20のアップデートによる更新情報
-
[解決済み] cronは内部でどのようにジョブをスケジューリングしているのですか?
-
[解決済み] mkdirのオプションが明確でない
-
[解決済み] 複数のPDFファイルを1つのPDFに結合/変換する【終了】。
-
[解決済み] ディレクトリへのシンボリックリンクを削除する
-
[解決済み] Linuxで特定のポートで動作しているプロセスを停止させる方法は?