オルタナティブ・ブログ > プログラマー社長のブログ >

プログラミングでメシが食えるか!?

ファイルのロックは意外と悩むもの

»

システム開発をしていて、ファイルの排他を行う必要があることは良くあるのですが、何を使ってロックするかは意外と悩むものです。UNIX系ですと、

・lockf(),fcntl()
・flock()
・open()のO_EXCL
・スレッドのmutex
・セマフォ

このくらいでしょうか。

まずは、プロセス間での排他で良いのか、あるいはスレッド間の排他までなのか、あるいはNFSにも対応する必要があるか、など様々な観点から選択することになります。

lockf(),fcntl()はNFSでも使えて便利そうなのですが、プロセス単位での排他ですので、1プロセスないのスレッド間では排他されません。flock()はスレッド間でも排他されますが、NFSに対応していません。open()のO_EXCLはファイル作成を利用したもので汎用性が高そうですが、実際にファイルを作るという余計な処理が必要になることが多いため、リソース負荷が高くなります。1プロセス内ならmutexだけで排他することもできます。セマフォも汎用的ですが、後始末などが面倒です。

高負荷状態で動くシステムではリソース負荷もバカになりません。先日紹介したようにHDDへの書き込みオーバーヘッドはかなりあり、OSがバッファ・キャッシュ処理を行うのが追いつかなくなると、メモリーをどんどん食いつぶしていきます。なかなか悩ましい問題です。

排他はあまり複雑にしすぎるとデッドロックの心配もあるので、できればシンプルに作りたいところです。いくつかの手段を組み合わせるとそれだけデッドロックへの配慮も大変になります。

個人的には、1プロセス内ならmutex、プロセス間ならlockf(),fcntl()ですが、今回はたまたまプロセス間に加えてスレッド間も排他しなければならず、NFSは使わないので、mutexとlockf(),fcntl()を組み合わせるくらいなら、flock()だけの方がシンプルと考え、珍しくfclock()を使ってみました。

ファイルのロックだけでも結構悩むものです。。

Comment(0)