C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[55]: ディレクトリの排他アクセス


(過去ログ 40 を表示中)

[トピック内 142 記事 (1 - 20 表示)]  << 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 >>

■19998 / inTopicNo.1)  ディレクトリの排他アクセス
  
□投稿者/ れい (588回)-(2008/06/04(Wed) 05:54:58)

分類:[Windows 全般] 

2008/06/04(Wed) 05:55:16 編集(投稿者)

基本的なことで、しかも古い話ですが。

Windowsでファイルを開くとき、共有モードやアクセス権を設定して開きます。
共有しないと設定してファイルを開けば、
他のプロセスからファイルが削除されたり変更されたりすることがないという前提でプログラムを作れます。

ですが、ディレクトリを扱う場合はこれができません。
FindFirstなどで調べるときも、
同時アクセスがあるとどんなエントリが返ってくるのか分かりません。

なぜ、APIには排他的にディレクトリを開く方法が用意されていないのでしょうか?

「OSとしてできないように作られている」というわけではないようです。
NtCreateFileで無理やり操作すると、ディレクトリを排他で開くことができます。

「パフォーマンス」というのはありそうですが、それならファイルも同じです。

作ろうと思えば作れたのに作らなかったわけですし、
opendir/readdirという形が当時主流だったはずで、
FindXXXFileはそれとも違う方法というのも不思議です。
それなりに理由があるはずなのですが…。

嘘でもいいのでなにか合理的な理由を教えてください。
引用返信 編集キー/
■20004 / inTopicNo.2)  Re[1]: ディレクトリの排他アクセス
□投稿者/ 774RR (186回)-(2008/06/04(Wed) 10:35:44)
opendir/closedir はそもそも unix で使われていた。
だがファイルの列挙には readdir を繰り返し呼ぶことが必要であり
opendir しただけでディレクトリにロックがかかるわけではない
(したがって列挙中にファイルが増減したら・・・問題は存在する)

CP/M ではファイルの列挙に FindFirst/Next が使われていた
MS-DOS のファイルシステムは CP/M+unix のあいのこなので
・ディレクトリという概念は存在するけど
・その中のファイルの列挙は FindFirst/Next で実装されていた
Win3.1 は MS-DOS [snip] Win32 は Win3.1 [snip] っつーことであろうかと。

NFS のかなたにあるサーバー上のディレクトリをロックできてしまうと、
ロックした特定一人には都合が良くても他のすべてのユーザに不都合が出るわけで、
その辺を嫌ったのではないかな。
そもそもファイルの生成・削除はアトミック操作ということになっているし。
1つのファイルの内容をロックしても他の人はそんなに困らないわけで。
引用返信 編集キー/
■20005 / inTopicNo.3)  Re[1]: ディレクトリの排他アクセス
□投稿者/ NyaRuRu (43回)-(2008/06/04(Wed) 10:38:42)
No19998 (れい さん) に返信
> FindFirstなどで調べるときも、
> 同時アクセスがあるとどんなエントリが返ってくるのか分かりません。

FindFirstFileTransacted で何とかなりませんか?
引用返信 編集キー/
■20009 / inTopicNo.4)  Re[2]: ディレクトリの排他アクセス
□投稿者/ れい (590回)-(2008/06/04(Wed) 11:12:12)
No20004 (774RR さん) に返信
> opendir/closedir はそもそも unix で使われていた。
> だがファイルの列挙には readdir を繰り返し呼ぶことが必要であり
> opendir しただけでディレクトリにロックがかかるわけではない
> (したがって列挙中にファイルが増減したら・・・問題は存在する)

unixやposixにはadvisory lockしかなく、
CP/Mの時点でmandatory lockになったのだと思いますが、
だとするとdirectoryに対してmandatory lockを導入しなかった理由がわかりません。
fileに対してはmandatory lockを導入したのに。

> CP/M ではファイルの列挙に FindFirst/Next が使われていた
> MS-DOS のファイルシステムは CP/M+unix のあいのこなので
> ・ディレクトリという概念は存在するけど
> ・その中のファイルの列挙は FindFirst/Next で実装されていた
> Win3.1 は MS-DOS [snip] Win32 は Win3.1 [snip] っつーことであろうかと。

では、CP/MでFindXXXFileを採用した理由は何でしょう?
CP/Mはきちんと触ったことがないのですが…
手元の資料を眺めたかぎりではNTとたいして変わりません。

当時すでにUNIXはあったはずで、
特に思想的理由が無ければ、現行の製品を真似るのが妥当です。
しかし真似なかったということは、そこに意思があったと思うのです。

政治的な理由であえて同じにしなかったとか、
何も参考にせずに作った偶然の産物とかでしょうか?

> NFS のかなたにあるサーバー上のディレクトリをロックできてしまうと、
> ロックした特定一人には都合が良くても他のすべてのユーザに不都合が出るわけで、
> その辺を嫌ったのではないかな。
> そもそもファイルの生成・削除はアトミック操作ということになっているし。
> 1つのファイルの内容をロックしても他の人はそんなに困らないわけで。

ディレクトリロックもファイルロックも、
他人が困るという点では同じに思えますが…。
そうでもないのかしら。

No20005 (NyaRuRu さん) に返信
> ■No19998 (れい さん) に返信
>>FindFirstなどで調べるときも、
>>同時アクセスがあるとどんなエントリが返ってくるのか分かりません。
>
> FindFirstFileTransacted で何とかなりませんか?

TxFですね。情報どうもです。
ですが、「何とかしたい」というわけではないのです。
純粋に理由を、設計思想を知りたいのです。

引用返信 編集キー/
■20012 / inTopicNo.5)  Re[3]: ディレクトリの排他アクセス
□投稿者/ PATIO (76回)-(2008/06/04(Wed) 11:22:44)
No20009 (れい さん) に返信

>>そもそもファイルの生成・削除はアトミック操作ということになっているし。
>>1つのファイルの内容をロックしても他の人はそんなに困らないわけで。
>
> ディレクトリロックもファイルロックも、
> 他人が困るという点では同じに思えますが…。
> そうでもないのかしら。

うーん、一本のファイルをロックした時と一つのディレクトリをロックした時で
どっちの方が困る確率が高いかという事かなぁ。
ディレクトリロックが出来ると上位のディレクトリがロックされてしまうと
その配下も丸ごとロックされてしまうのですよねぇ。
そうなるとロック対象が広範囲になるから困る人が出る確立は大きくなりそうな気がするけれど。

引用返信 編集キー/
■20021 / inTopicNo.6)  Re[3]: ディレクトリの排他アクセス
□投稿者/ 774RR (187回)-(2008/06/04(Wed) 11:57:55)
ファイルを1つ(読み取りに対して)ロックしたら当該ファイル1つが読み取れないだけ に対して
ディレクトリを(読み取りに対して)ロックしたら、
そのディレクトリ以下に存在するすべてのファイル+ディレクトリがアクセスできなくなる
んではないかなーと。

かぶっているっぽいので追加

書き込みロックなら出来ても良かったのかも新米、には有る意味で御意なんだけど

unix に話を限定
unix のファイルシステムだと誰かが読み取りオープン済みファイルを他人が unlink することができる。
このときディレクトリエントリ上では削除されるけど inode は使用済みのままになっているわけで
自分が今使っているファイルを他人に削除されても、とりあえず両者とも困んない。
# 自分が close(2) した時点で inode の被参照回数=0になるので inode が解放される
# すなわちファイル実体が削除されファイル実体が使っていたディスク空間も未使用に戻る

(NFS 上でも)同一ディレクトリに対して2つ以上のプロセス(同一マシン上または異なるクライアント上の)が
同時に同一ファイル名で creat(2) しようとすると、 atomic 性が保証されているので、
どっちか片方だけが成功してもう片方は失敗することになっている

という仕様2つがあるので、俺的にはディレクトリ自体をロックできる必然ってのが感じ取れないんだけど。
# っていうか「unix はディレクトリのロックをしたくないのでこういう仕様2つを盛り込んだ」というべきか?
このへん Windows でもあまり状況は違わないはず (俺は unix+組み込み屋なので Windows のこの辺の詳細は良く知らない)

逆にれいさん的には「設計思想として(特にリモートの)ディレクトリがロックできる必然」をどの辺に感じます?
ディレクトリがロックできたらどの辺がおいしいと思います?
引用返信 編集キー/
■20022 / inTopicNo.7)  Re[4]: ディレクトリの排他アクセス
□投稿者/ れい (591回)-(2008/06/04(Wed) 11:58:00)
No20012 (PATIO さん) に返信
> ディレクトリロックが出来ると上位のディレクトリがロックされてしまうと
> その配下も丸ごとロックされてしまうのですよねぇ。
> そうなるとロック対象が広範囲になるから困る人が出る確立は大きくなりそうな気がするけれど。

「直下のみ変更不可」という実装だとか
「エントリを追加・削除できないだけ」という実装も可能なはずで、
設計者は考えてみたと思うのです。

共有モードでREADを指定するのをマナーとする、
という手もあります。

notepad.exeを排他READで開いたら、いろいろ困りそうですよね。
でも、実際は書き込み禁止になっているので、排他READは意味無く、問題なくnotepadを実行できます。
同じように、OSとして問題あるディレクトリは書き込み禁止にすれば問題ないと思うのですが。
TRAVERSEアクセス権というのもありますし。

「ディレクトリロックできると影響が大きい」というのは
私にはあまり妥当な理由には思えませんが…。
調査が必要かなぁ。
引用返信 編集キー/
■20023 / inTopicNo.8)  Re[5]: ディレクトリの排他アクセス
□投稿者/ PATIO (79回)-(2008/06/04(Wed) 12:04:28)
No20022 (れい さん) に返信
> ■No20012 (PATIO さん) に返信
>>ディレクトリロックが出来ると上位のディレクトリがロックされてしまうと
>>その配下も丸ごとロックされてしまうのですよねぇ。
>>そうなるとロック対象が広範囲になるから困る人が出る確立は大きくなりそうな気がするけれど。
>
> 「直下のみ変更不可」という実装だとか
> 「エントリを追加・削除できないだけ」という実装も可能なはずで、
> 設計者は考えてみたと思うのです。
>
> 共有モードでREADを指定するのをマナーとする、
> という手もあります。
>
> notepad.exeを排他READで開いたら、いろいろ困りそうですよね。
> でも、実際は書き込み禁止になっているので、排他READは意味無く、問題なくnotepadを実行できます。
> 同じように、OSとして問題あるディレクトリは書き込み禁止にすれば問題ないと思うのですが。
> TRAVERSEアクセス権というのもありますし。
>
> 「ディレクトリロックできると影響が大きい」というのは
> 私にはあまり妥当な理由には思えませんが…。

あげられている話って結局は単純な実装だと拙いから色々仕掛けを施すって話ですよね。
なるほど、仕様を検討する時点であればそういうのも織り込む事は可能なんだから
何でも有りな気はしますけれど。

そこまでやるのが面倒だったからとかは駄目ですか?
って、駄目でしょうねぇ。
お手上げです。

引用返信 編集キー/
■20025 / inTopicNo.9)  Re[5]: ディレクトリの排他アクセス
□投稿者/ とっちゃん (306回)-(2008/06/04(Wed) 12:27:38)
とっちゃん さんの Web サイト
No20022 (れい さん) に返信

最初のほうに出てますが、一番大きいのは歴史的経緯だと思います。
そもそも排他制御などの考えが必要になるのは、同時に複数動くという前提条件が必要です。
そしてこれがMS製OSに持ち込まれてくるのは Windows を待たねばなりません。
が、そもそも192Kとか256Kしかないメモリで動かすという制約を課されていた環境で
あまりメモリリソースをとるような仕組みというのは実装できなかったというのが
あると思います。

実際、ファイルの排他制御がまともに使えるようになるのは、Windows2.xの乗るOS(すなわちDOS3.x)からですし
それもオプション...w

でもってそれ突っ込むだけで、かなりシステムにしわ寄せが来ていたわけで(今のVistaと同じです)
この辺りが日本でWindowsがいま一つだった理由でもあるわけですが...

そういった歴史的なしがらみがあって、というのはかなり大きなウェイトを占めてると思います。
実際、Win32 は Win16 の様々な制約を持ち込んでますし...

ある一定以上の互換性を維持するという方針を打ち出した時点で
ディレクトリエントリのロックは必然的に排除にならざるを得ないのではないかと。

これが、まっさらな状況から作り上げるとなると話は別でしょうけど...

引用返信 編集キー/
■20027 / inTopicNo.10)  Re[4]: ディレクトリの排他アクセス
□投稿者/ れい (592回)-(2008/06/04(Wed) 12:37:28)
No20021 (774RR さん) に返信
> という仕様2つがあるので、俺的にはディレクトリ自体をロックできる必然ってのが感じ取れないんだけど。

ええ。
普通にアプリケーションを組んでるときには必要でありません。
なので、いままで「そーゆーもの」と思ってたのですが。

複数のファイルで整合性を取りたい要望もあるので、TxFなどができたわけですが、
なくてもまぁ、なんとかなるといえば、なる。

これはunixもwindowsも同じです。

#unixのファイルシステムに関しては、「しょぼすぎ」ていろいろ文句はあるわけですが。

> 逆にれいさん的には「設計思想として(特にリモートの)ディレクトリがロックできる必然」をどの辺に感じます?
> ディレクトリがロックできたらどの辺がおいしいと思います?

おいしいところは…
今のところどうにかなってるので、最初に挙げた程度でしょうか。

あとは
FindXXXFileは使い勝手が悪いなぁとか、
ファイルとディレクトリと、同等に扱えなくてめんどくさいなぁとか、
ハンドルを開くときにBACKUP属性つけたりするのは覚えづらいなぁとか、
その程度の消極的理由しかありません。

ただ、「自分だったらどう作るか」を考えたみたのです。
そうして考えてみたら、私が思い描く仕組みと、Windowsの仕組みがだいぶ違ったのです。
一方、linuxやunixの仕組みは、前提を考慮すると私には思い描く事が可能でした。

ディレクトリロックは、Windowsのファイルシステムの仕様上は明らかに可能です。
というか、それは要求仕様で、
ディレクトリのロックができないファイルシステムはWindowsではありえません。
#SMBもCIFSも、「ディレクトリのロック」を使います。ですので、たまに…

なのに、APIではわざわざ一枚FindXXXFileという皮をかぶせて、無効にしてるのです。

ファイルシステムレベルでは、ほぼ同等に「ファイル」と「ディレクトリ」とを扱えるので、
私ならなるべくそのまま、ほぼ同等に扱えるようにシステムを作ります。

しかし実際はそうなっていない。
私の考えるシステムのほうが優れていると思えるほど私は厚顔ではありませんし、
ただの偶然と思えるほど楽観的でもありません。
差があったときには私の重い至らない事情があるのだろうと、懸念します。

現実的な理由か、歴史的事情か(だとしてもそこには当時の現実的理由があるはず)、
なにかあるはずだと、思うわけです。
設計者の意図を汲み取れなければ、ちゃんとしたものは作れませんよね。

で、1ヶ月くらい考えたのですが、思い至らない…。
皆さんの知識と知恵と想像力をお借りしたく。
納得できればでっち上げでもOKです。
引用返信 編集キー/
■20030 / inTopicNo.11)  Re[4]: ディレクトリの排他アクセス
□投稿者/ シャノン (456回)-(2008/06/04(Wed) 12:49:24)
No20021 (774RR さん) に返信
> ファイルを1つ(読み取りに対して)ロックしたら当該ファイル1つが読み取れないだけ に対して
> ディレクトリを(読み取りに対して)ロックしたら、
> そのディレクトリ以下に存在するすべてのファイル+ディレクトリがアクセスできなくなる
> んではないかなーと。

あるディレクトリをロックする際、「配下の全ディレクトリに至る再帰的ロック」というオプションが選択可能だとすると、ロック関数の実行にものすごい時間がかかるし、かつ、それをアトミックに実行できないとロックの意味がないから、パフォーマンス的にかなーりしんどいものになりそう。
あるいは、ディレクトリは1つだけロックして、実際にファイル操作をする段階でロックを確認するという実装にすると、階層の深ーいところにファイルを1つ書き込むのに、最悪の場合はルートまで全ての親を辿って、ロックされているかどうかを調べなければならんので、これもものすごい時間がかかりそう。

「再帰的ロックはサポートしません」というなら別だけどね。
引用返信 編集キー/
■20034 / inTopicNo.12)  Re[6]: ディレクトリの排他アクセス
□投稿者/ れい (593回)-(2008/06/04(Wed) 14:02:41)
No20025 (とっちゃん さん) に返信
> ■No20022 (れい さん) に返信
>
> 最初のほうに出てますが、一番大きいのは歴史的経緯だと思います。
> そもそも排他制御などの考えが必要になるのは、同時に複数動くという前提条件が必要です。
> そしてこれがMS製OSに持ち込まれてくるのは Windows を待たねばなりません。
> が、そもそも192Kとか256Kしかないメモリで動かすという制約を課されていた環境で
> あまりメモリリソースをとるような仕組みというのは実装できなかったというのが
> あると思います。
>
> 実際、ファイルの排他制御がまともに使えるようになるのは、Windows2.xの乗るOS(すなわちDOS3.x)からですし
> それもオプション...w

MS-DOSってVer. 2で「階層的ファイルシステム」、
Ver. 3で「共有モード」
をサポートしたのでしたよね?

もうよく覚えてませんが…

確かディレクトリもファイルも同様にInt21hで開くことができた、と記憶しています。
その際、ディレクトリに対しても共有モードの指定が可能だった、と思うのですが。

その辺ごにょごにょして遊んだ記憶があります。

それが正しいなら、
MS-DOS Ver3の時代から、ディレクトリのロックは内部的に可能で、
WinAPIで外され、新たにFindXXXFileが作られたことになります。

変だとは思いませんか?
引用返信 編集キー/
■20040 / inTopicNo.13)  Re[7]: ディレクトリの排他アクセス
□投稿者/ とっちゃん (307回)-(2008/06/04(Wed) 14:51:00)
とっちゃん さんの Web サイト
No20034 (れい さん) に返信

> MS-DOSってVer. 2で「階層的ファイルシステム」、
> Ver. 3で「共有モード」
> をサポートしたのでしたよね?
>
DOS3 の共有モードってオプションモジュールがいるんじゃありませんでしたっけ?
あれは、マシン間共有だったっけか?

覚えてないや...orz


> それが正しいなら、
> MS-DOS Ver3の時代から、ディレクトリのロックは内部的に可能で、
> WinAPIで外され、新たにFindXXXFileが作られたことになります。
>
んと、Int21 で開くは、Win32でいえば、CreateFile に相当する仕組みです。
FindFirst/Next は、エントリーリストを列挙するだけで
排他も共有もなく...今ある状態をあるがままに...
で処理してたと記憶しておるのですが...もしかして勘違いしてる?


その流れでいえば、現状のWin32(もちろんNT系)も同じと思うんですけど?

引用返信 編集キー/
■20042 / inTopicNo.14)  Re[8]: ディレクトリの排他アクセス
□投稿者/ れい (595回)-(2008/06/04(Wed) 15:50:04)
No20040 (とっちゃん さん) に返信
> 覚えてないや...orz

私もなかなか…思い出せない。
記録に残しておかないとだめですね。

と思って、
当時のFDDを探してきたのですが、
手元にドライブが無くて読めません…

> んと、Int21 で開くは、Win32でいえば、CreateFile に相当する仕組みです。
> FindFirst/Next は、エントリーリストを列挙するだけで
> 排他も共有もなく...今ある状態をあるがままに...
> で処理してたと記憶しておるのですが...もしかして勘違いしてる?

勘違いしてません。
FindFirstFileは、内部でディレクトリを開いて、列挙して、閉じます。
FindNextFileも同様です。

FindFirstFileとFindNextFileの間で、ディレクトリハンドルが閉じられるので
間でCreateFileとか入る余地があるので、
ファイルが列挙されなかったり、2重に取得できてしまったり、
変な結果が返ってくる可能性があります。

> その流れでいえば、現状のWin32(もちろんNT系)も同じと思うんですけど?

MS-DOSって、Int21hでディレクトリハンドルを開いて、
その後そのハンドルを指定して、別のコマンドでエントリを検索するのではありませんでしたっけ?

------

と思って、調べてみたら違いました…(記憶ってあてにならないなぁ
記憶を捏造していたようです。

DOS時代からディレクトリエントリの列挙はファイル名指定だったのですね。
で、列挙中はロックされない。

ということは、
Windows2.x辺りでファイルのロックは導入されたが、
ディレクトリエントリの列挙は用が足りていたのでそれっきりになったということですかね?

XPとかVistaとかのOS内部では使いまくってるので、
NTかOS/2で導入されたのでしょうか。
内部では使うけど、互換性を維持するためにAPIとして公開するのはFindXXXFileのみ。

FCBへのアクセスをやめ、ファイルハンドルを導入した辺りや、
階層的ディレクトリを導入した辺りに根源がありそうですね。

ファイルハンドルと同様にディレクトリハンドルも導入していれば、
ファイルもディレクトリも同等に扱うAPIになっていたかもしれない。

パス文字列を指定してエントリを取得する、というシステムコールではなく、
ハンドルを指定してエントリを取得する、というシステムコールになっていればロックがあったかもしれない。

ということでいいのかな?

#歴史的事情ならしょうがないですが。
#やっぱりディレクトリとファイルの扱いが違いすぎるのは私には残念です。
#デバイスドライバレベルでは十分に対応可能というのが悔しい。
#TxFを導入するなら、その辺綺麗にしてほしかったのですが。
#その点ではlinuxは綺麗ですね。シンプル且つ単純。

DOSやWin3.1以前は記憶があいまいなこともあり、あまり考慮してませんでした。
おかげでだいぶスッキリしました。

ありがとうございました。>all
解決済み
引用返信 編集キー/
■20064 / inTopicNo.15)  Re[9]: ディレクトリの排他アクセス
□投稿者/ y4yama (70回)-(2008/06/05(Thu) 09:08:19)
No20042 (れい さん) に返信
> ファイルハンドルと同様にも導入していれば、
> ファイルもディレクトリも同等に扱うAPIになっていたかもしれない。
手元に1997年のwin32 APIオフィシャルリファレンスがあって、CreateFileを何気なく見たら
ディレクトリハンドルを返すことが記載されています。(1997では、NTに限るとあるような、?)

ht://d.hatena.ne.jp/NyaRuRu/mobile?date=20070808
さまからのリンクでもMSDNに記載がありました [CreateFile Function]
どうも、95,98では欠如してて、NT,2000以降では同等に扱うAPIに(現在)なっている・・という
解釈はできないでしょうか? (私が、変な勘違いをしておりましたら、お許しください)

解決済み
引用返信 編集キー/
■20068 / inTopicNo.16)  Re[9]: ディレクトリの排他アクセス
□投稿者/ す (10回)-(2008/06/05(Thu) 10:07:40)
普通に考えてディレクトリロックなんて傍迷惑な機能はないほうがよいのでは?
アプリが簡単になるのはそのひとだけで、他のひとはエラー対処で大変なことに。
再試行、ウェイトやデッドロックの検出、等、考えたくないなぁ。
引用返信 編集キー/
■20105 / inTopicNo.17)  Re[10]: ディレクトリの排他アクセス
□投稿者/ れい (596回)-(2008/06/05(Thu) 18:57:25)
No20064 (y4yama さん) に返信
> ■No20042 (れい さん) に返信
>>ファイルハンドルと同様にも導入していれば、
>>ファイルもディレクトリも同等に扱うAPIになっていたかもしれない。
> 手元に1997年のwin32 APIオフィシャルリファレンスがあって、CreateFileを何気なく見たら
> ディレクトリハンドルを返すことが記載されています。(1997では、NTに限るとあるような、?)

はい。
ディレクトリハンドルを取得することは可能です。排他で開くことも可能です。
ですが、そこからエントリのリストを得るのはめんどくさい方法しかありません。

> どうも、95,98では欠如してて、NT,2000以降では同等に扱うAPIに(現在)なっている・・という
> 解釈はできないでしょうか? (私が、変な勘違いをしておりましたら、お許しください)

はい。
NT系では内部でほぼ同等に扱っています。
95系はよくわかりません。

私はユーザーモードアプリケーションが通常使うであろうAPIで同等になっていない、
ということを問題にしています。

ディレクトリ内のファイルリストを得るのに、今はFindXXXFike系のAPIを使います。
しかし私は、
CreateFileでディレクトリハンドルを開きそのハンドルを指定してFindFirstFileを呼ぶ、
というような実装の方が綺麗で分かりやすいと思うのです。

No20068 (す さん) に返信
>普通に考えてディレクトリロックなんて傍迷惑な機能はないほうがよいのでは?

その考えは全然「普通」ではないと私は思っています。

まず、ディレクトリを排他で開く機能は「すでにあります」。
OSは利用しています。
必要ないから実装してないということにはなりません。

また、ファイルIOはいつ失敗するか分かりませんので、
ディレクトリのエントリ列挙をするときには例外がおきたときの処理を入れる必要があります。
この処理が適切に入っていれば、ディレクトリの排他ロックがあっても問題なく動作します。
「他のひとはエラー対処で大変なことに」というのは間違いです。

同様に、再試行もデッドロックの検出も、今でも行わなければいけない事項です。

つまり、今現在適切にファイルIOを処理をしているプログラムにとっては、
ディレクトリの排他ロックが可能であってもコード量は変化しません。
大変なことにはなりません。

ですので、私は、「普通に考えて」ディレクトリを排他で開けるOSの方がよいと思ったわけです。

問題になるとするなら、774RRさんやPATIOさんの言うように、
共有違反やアクセス違反が頻発してしまってファイルIOに不具合が生じたり、パフォーマンスが悪くなる、
という点です。

どの程度悪くなるのかは実際にやってみないとわかりません。
OS作成者がどう判断してもおかしくありませんが、
私はあまり問題にならないと予想しています。

y4yamaさんのリンク先、NyaRuRuさんの記事でも述べられていますが、
ディレクトリが開かれているためにフォルダが削除できなくなることは現在でもありますが、
あまり問題になっていません。
ファイルを排他で開いても、それほど問題になりません。
ですので、孫子まで自動でロックするような実装にならない限り、
それほど大きな問題にはならないと思います。

ちなみに、NTFSでディレクトリハンドルを排他で開いても、サブディレクトリはロックされません。
引用返信 編集キー/
■20131 / inTopicNo.18)  Re[10]: ディレクトリの排他アクセス
□投稿者/ ネタ好き (376回)-(2008/06/06(Fri) 12:26:18)
>嘘でもいいのでなにか合理的な理由を教えてください。
「ユーザがしないとマイクロソフトが判断したから」
身も蓋も無い言葉ですが、それが真実なような気がします。
恐らくマイクロソフト自身が必要性を感じなかったのでしょう。
ディレクトリは共有すると言う発想が根底にあるのでしょうね。
引用返信 編集キー/
■20135 / inTopicNo.19)  Re[11]: ディレクトリの排他アクセス
□投稿者/ れい (597回)-(2008/06/06(Fri) 13:14:51)
No20131 (ネタ好き さん) に返信
> 恐らくマイクロソフト自身が必要性を感じなかったのでしょう。

上に書いてますが、OSは積極的に利用しています。
無いとシステムが作れません。
なのでMSが必要性を感じなかったわけではないと思うのです。

「ユーザーが使わないと判断した」というのも、
私にはわざわざFindXXXFileを作るほうがよっぽどめんどくさいように思います。

いろいろ資料を探してるのですが、
なにぶん昔の話なのでなかなかいい物は見つかりません。

でも、とっちゃんさんの言う「歴史的事情」に狙いを絞ると
なんとなくサポートするような資料が見つかってきました。

非階層FSを階層FSにした際のシステムコールの仕様が根源的原因のようです。
DOSの遺産であろう、というのが私の今のところの結論です。

長々とありがとうございました。
解決済み
引用返信 編集キー/
■20137 / inTopicNo.20)  Re[11]: ディレクトリの排他アクセス
 
□投稿者/ す (11回)-(2008/06/06(Fri) 14:25:25)
No20105 (れい さん) に返信
> つまり、今現在適切にファイルIOを処理をしているプログラムにとっては、
> ディレクトリの排他ロックが可能であってもコード量は変化しません。
> 大変なことにはなりません。

そんなことはありません。エラーの発生状況や頻度が変われば、
対処も変えなければなりません。

> どの程度悪くなるのかは実際にやってみないとわかりません。
> OS作成者がどう判断してもおかしくありませんが、
> 私はあまり問題にならないと予想しています。

そんなことはないと思います。同時実行性が相当損なわれると思います。

> まず、ディレクトリを排他で開く機能は「すでにあります」。
> OSは利用しています。

なら、予想より実際に試してみたほうが早いのでは?
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 >>

管理者用

- Child Tree -