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

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

ただいまの
回答率

90.51%

  • C

    4534questions

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

  • C++

    4435questions

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

fcntlのflock構造体の性能差

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,855
退会済みユーザー

退会済みユーザー

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/08 23:37

    コメントありがとうございます!

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

    キャンセル

0

以下の通りflockを宣言する

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/08 23:35 編集

    コメントありがとうございます!

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C

    4534questions

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

  • C++

    4435questions

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