質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

3回答

4174閲覧

fcntlのflock構造体の性能差

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2016/01/24 13:26

編集2022/01/12 10:55

[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のどういったところで時間がかかっているのかをもう少し踏み込んで
知りたいと考えていますので、お知恵を拝借したいと思います。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

以下の通りflockを宣言する。

これはどういうことでしょうか?struct flockはアーキテクチャに応じてライブラリで宣言されており、勝手に宣言することは出来ません。
ライブラリを使わずに勝手に違う構造を宣言してfcntlを呼び出すと意図しない動作になるでしょう。

あと、fcntlによるロックは、「ファイルのロック」ではなくて「ファイルの中の〇バイト目から〇バイト目に対してのロック」ですが、そのあたりの勘違いはないでしょうか?
(ファイルデータ全体をロックするには、開始位置を先頭にして、長さにゼロを指定)

投稿2016/01/24 15:14

otn

総合スコア84423

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/02/08 14:37

コメントありがとうございます! 全体的に情報が少なくてうまく伝えられていなかったです。 ソースの概要を追記しましたので、もしよろしければご確認いただければと思います!
guest

0

書き込まれた概要が正しいのであれば、2. はアンロックする前に fflush しているので、それに時間がかかっているのではないですか?

投稿2016/02/15 14:33

yuki23

総合スコア1448

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

以下の通りflockを宣言する

これは抜粋の事かなと思います。
再定義すると、コンパイル通るのかなとは思いますし。

詳しいことは知りませんが、
Linuxのスケジューリングは公平に行われる為、
複数プロセス/スレッドで排他制御をすると時間はかかるかと思います。
flock構造体の使い方で変化が出るかどうかについては分かりません。

システムコールのソースコードを見たわけではありませんが、
知っている限りで関係ありそうな事を。
I/Oは時間がかかる為、時間を使い果たして他のプロセス/スレッドに切り替わったりして
システムコール内でコンテキスト切り替えが発生したり、
カーネル内プリエンプションが起こったりという可能性は考えられないでしょうか。
プロセス切り替えが発生しても、ファイル所有権は明示的に解放しないと大抵そのままかと思います。
プロセスAが所有権持って休止し、プロセスBが復帰したときに所有権を獲得できない場合は、アプリの処理内容にもよりますが待たされるだけかと思います。
※スレッドだとコンテキスト切り替えが少なくて済むでしょう。

投稿2016/01/24 21:06

編集2016/01/24 21:12
mao999

総合スコア111

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/02/08 14:46 編集

コメントありがとうございます! なるほど、タスクの切り替えによってオーバーヘッド的なものが 発生している可能性があるということですね。 この辺って目に見えないから確認が大変ですよね…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問