Linuxのシステムプログラミング - 第4章高度なファイルIO

読み出し動作または書き込みするための単一のシステム・コール、均一な凝集IO操作用の異なるデータ構造で同時に複数のバッファ:スキャッタ/ IOを集めます。

epoll:プログラム内の世論調査()とselect()の改良版は、便利なファイルディスクリプタの数百に対処します

メモリマップドファイルIO:ファイルをメモリにマッピングすると、ファイルは単純なメモリ管理を処理することができ

IOヒントファイル:プロセスがカーネルファイルIOを使用していくつかのヒントを提供します許可し、IOは、パフォーマンスを向上させることができます

状況はIOの重い負荷を処理スレッドを使用せずにケースに該当する、複数のIO要求を発行するためのプロセスを許可し、その完了を待たずに非同期IO

 

散布/ IO(ベクトルIO)を収集します。

#include <sys/uio.h>
struct iovec {
void *iov_base;
size_t iov_len;
};
ssize_t readv (int fd, const struct iovec *iov, int count);
ssize_t writev (int fd, const struct iovec *iov, int count);

機能説明:順次読み取りまたは書き込み各セグメントの(IOVEC構造を示す)、及び読み取りまたは全体に書き込まれたバイト数を返します。

 

イベントポーリングインターフェース:

https://blog.csdn.net/weixin_38812277/article/details/90634146

メモリマップ:

メモリマップされたファイル:

データファイルは、すでに通常のファイルの一部にマッピングされたキャッシュ線形領域へのメモリマッピング、すなわちによってマッピングすることができるカーネルのページキャッシュファイルに存在しています。そして、マッピング用の透明メカニズムを介して、メモリを書く直接線形領域を介してメモリアクセスデータのファイルにアクセスできるユーザー・プロセス[キャッシュファイルがファイルに書き込まれるように書かれていないときにマップされていない変更を同期するために)(MSYNCを使用しなければならないので、この操作は、カーネルをバイパス]

(MAP_SHARED)共有:マッピング領域のプロセスを変更する場合の動作の線形領域上の任意のファイルは、ディスクが変更されます、他のプロセスがファイルにマップされ表示されています。

プライベートタイプ(MAP_PRIVATE):一般的にマップがちょうどこのマップを使用して、ファイルを読み取るために作成されました。書き込み操作のこのマッピングは、ディスクファイルは変更されませんが、新しいページに再マップ、および他のプロセスには見えない、ファイル内のマップページを停止しました。

#include <sys/mman.h>
void * mmap (void *addr, size_t len, int prot, int flags, int fd, off_t offset);
int munmap (void *addr, size_t len);

int mprotect (const void *addr, size_t len, int prot);
int msync (void *addr, size_t len, int flags);
int madvise (void *addr, size_t len, int advice);/给内核提供mmap的实现建议,实现优化/

[注]ページには、異なる権限と振る舞いを持つメモリ中国の最小単位です。

 

匿名ファイルマッピング:(大きなメモリ割り当てのために、ヒープが、匿名のメモリマッピングの使用を使用しないでください)

メモリの大きなブロックを使用したことを除いて、匿名のメモリマッピングは、ユーザーのために、0に初期化されています。別のヒープ割り当てと使用時間のためではなく、ヒープとして考え、そのためヒープ内の破片を生成しません。

長所:匿名マッピングのサイズを変更することができ、あなたが権限を設定することができ、断片化を心配する必要はありません、あなたは、通常のマップなどの提案を受け入れることができ、それぞれの分布は、別々のメモリ・マップに存在します。

欠点(それを積みに対して):倍の証明書のページでは、廃棄物があり、相対的なヒープから割り当てられたが、より複雑です。

glibcのmalloc関数は、(システムを使用してsbrkの又はBRKコール)、匿名のメモリマッピングの使用は、大きなメモリアロケーション(MMAP)を満たすために、小さなメモリの割り当てを満たすためにヒープを使用します。

実装の1使用MAP_ANONYMOUSロゴ

p= mmap (NULL, /* do not care where */
512 * 1024, /* 512 KB */
PROT_READ | PROT_WRITE, /* read/write */
MAP_ANONYMOUS | MAP_PRIVATE, /*anonymous, private */
-1, /* fd (ignored) */
0); /* offset (ignored) */

ret = munmap (p, 512 * 1024);

匿名マッピングによって割り当てられた利点の一つは、すべてのページは、(メモリ・ブロックは、「ファイル」すべてがファイルであるとみなすことができる)0で初期化されているであるため、すべて0にマッピングされたメモリへの書き込み時にカーネルが使用するレプリケーションメカニズムにページ上で、このように追加のオーバーヘッドの使用を避けます同時に、メモリの初期化を取得するためにmemsetを使用する必要はありません。mallocの再利用のmemset効果の良い理由を使用するよりも事実のcallocで。

実装2:は/ dev /ゼロファイルにマッピングされた(このファイル装置と同じ匿名メモリセマンティクスを提供)されています

fd = open (”/dev/zero”, O_RDWR);
p = mmap (NULL, /* do not care where */
getpagesize (), /* map one page */
PROT_READ | PROT_WRITE, /* map read/write */
MAP_PRIVATE, /* private mapping */
fd, /* map /dev/zero */
0); /* no offset */

[マップ(FD)、匿名のメモリがマップされ、彼の息子のプロセス間通信を提供するために使用することができる近くなるFD後にオフにすることができます]

簡易ファイルIOのヒント:

 

非同期IO:ユーザー、直接のリターンによって開始IO操作は、カーネルはユーザメモリ、および通知プロセスにデータをコピーする責任があります。

カーネルの基礎となる非同期IOのサポートニーズを実行します。

 

おすすめ

転載: blog.csdn.net/weixin_38812277/article/details/93318049