- ベストアンサー
fork()について
>fork()によって生成されたプロセスが元のプロセスの>ファイルの参照関係を継承してその参照数を増やすも>のである fork()について、ちょっと調べてみたのですが、上のように書かれていました。継承して参照数を増やすとはどういったことなのでしょうか? もしよろしかったら、ご教授お願いします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
まず, fork を使うとプロセスが複製されるのですが, 基本的に「fork を実行したときと同じ状態」のプロセスが新しく作られることになるため, fork を実行する前にファイルをオープンしていたら fork によって作られる新しいプロセスも同じファイルをオープンしていることになります. これが「参照関係を継承する」という話. 一方, 参照数 の方は Unix におけるファイルの管理方法と関係します. Unix では, あるプロセスがファイルをオープンしている場合にはそのファイルを削除しても実体がただちに消滅するとは限りません. ディレクトリエントリからは消えますので他からは見えなくなりますが, そのファイルをオープンしているプロセスは自分が持っているファイルハンドルを使って削除されたはずのファイルにアクセスすることができます. その結果「ファイルを削除してもディスクの空き容量が減らない」ということもありうる (あるプロセスがオープンしていればファイルの実体は消えないので) のですが, その一方で一時ファイルの管理が簡単になります. つまり, 一度ファイルを作成してオープンしたあとすぐに削除すれば「当該プロセスからはアクセスできるが他のプロセスからはアクセスできない」ファイルになります. このような処理をうまく行うために Unix では参照数を使っています. 簡単には, 次のような処理を行います: まず, ファイルを作成するときにはそのファイルに対するディレクトリエントリを作るのですが, このときにそのファイルの参照数を 1 とします. それ以降は ・プロセスがファイルをオープンしたら参照数を 1 増やす ・クローズしたら参照数を 1 減らす ・ハードリンクを作ったら参照数を 1 増やす ・ファイルを削除したら参照数を 1 減らす のように操作していきます. このようにしておけば, 「参照数が 0 であるファイル」=「どこからも参照されていないファイル」=「不要となっているので使っていた領域を再利用してかまわないファイル」ということになります. なお, 参照数を使っているため基本的にディレクトリに対するハードリンクは特定の操作 (mkdir) でしか作ることができません. ディレクトリに対して自由にハードリンクを作ることができるようにするとループができてしまい, 管理上大きな問題になってしまいます. 参照数とその問題点についてはプログラムにおけるメモリ管理, 特にガベージコレクション (garbage collection, GC) という文脈でも出てきますので可能であればそちらも参考にしてはどうでしょうか.
お礼
なるほど、詳しくありがとうございます。 いつも「おしえてgoo」のみなさんには、お世話になってます。 自分でも他の人に教えてやれるようになりたいのですが、他の人の質問と回答を読むのでやっとです。(^^;;)