[2/8追記]
ソースの差分の概要を以下に追記しました。
★部が性能差分の肝になると思っております。
1.と2.は以前の質問の番号に対応しています。
1.flockを1つのみ宣言する場合
struct flock f;
f.l_whence = SEEK_SET;
f.l_start = 0;
f.l_len = 0;
f.l_pid = 0;
=== 10万回ループ ここから ===
ファイルオープン
f.l_type = F_WRLCK;★
fcntlで&fを引数にしてファイルロック★
fputsでファイル書き込み
f.l_type = F_UNLCK;★
fcntlで&fを引数にしてファイルロック解除★
fflush
ファイルクローズ
=== 10万回ループ ここまで ===
2.ロック用とロック解除用別々のflockを宣言する場合
struct flock f;
f.l_type = F_WRLCK;
f.l_whence = SEEK_SET;
f.l_start = 0;
f.l_len = 0;
f.l_pid = 0;
struct flock uf;
uf.l_type = F_UNLCK;
uf.l_whence = SEEK_SET;
uf.l_start = 0;
uf.l_len = 0;
uf.l_pid = 0;
=== 10万回ループ ここから ===
ファイルオープン
fcntlで&fを引数にしてファイルロック★
fputsでファイル書き込み
fflush
fcntlで&ufを引数にしてファイルロック解除★
ファイルクローズ
=== 10万回ループ ここまで ===
何度も恐縮ですが、お知恵を拝借できればと思います。
よろしくお願いします。
//////////////////////////////////////////////////////////////
[初回投稿]
初めて質問させていただきます。よろしくお願いします。
Cでfcntlでファイル制御を行う時のflock構造体の宣言の仕方で
性能差が出る事象について質問させていただきます。
ファイルIOを行う際にfcntlでロックと解除を行う際、
flock構造体の宣言方法によって性能に差が出ました。
また、複数プロセスで実施した際に顕著に差がありました。
具体的には以下の通りです。
・前提
OSはCentOS6.5(64bit)。
以下の通りflockを宣言する。
※ロック、ロック解除のみ対象のため、それ以外は考慮しない。
struct flock {
short l_type;
};
1.flockを1つのみ宣言する場合
ファイルロック前にflock.l_typeにF_WRLCKを代入し、
ロック解除時にflock.l_typeにF_UNLCKを代入する。
2.ロック用とロック解除用別々のflockを宣言する場合
ファイルロック用に宣言したflockにflock.l_typeにF_WRLCKを代入する。
ロック解除用に宣言したflock.l_typeにF_UNLCKを代入する。
ファイルロック、ロック解除時それぞれに上記を使用する。
1.と2.でそれぞれ、
・fcntlでファイルロック
・fputsでファイル書き込み(10文字程度)
・fcntlでファイルロック解除
を10万回程度連続して行い、straceで各システムコールの
処理時間を確認したところ、各処理にかかるシステムコールの時間が
2.よりも1.の方が早い結果になりました。
特に複数プロセスを立てて実施した際には、2.で呼ばれるシステムコールは
それぞれ1.のおおよそ2倍程度でした。
ざっと各システムコールの処理で時間がかかっていることは分かりましたが、
具体的に1.と2のどういったところで時間がかかっているのかをもう少し踏み込んで
知りたいと考えていますので、お知恵を拝借したいと思います。
よろしくお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2016/02/08 14:37