人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile


●質問者: DQNEO
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 13/13件

▽最新の回答へ

11 ● morinatsu
●15ポイント

ファイル(ディスク上のものも仮想のものも)はメモリに読み込む必要があります。
そのメモリ上の場所を示すのがファイルポインタ(orハンドル)で、多くの言語ではファイルのオープン時に変数として割り当てられます。「この"text.txt"ってファイルを開いてよ」という依頼に対し、「じゃぁ、このfpっていう変数が指している場所に読み込んでやるよ」と教えてくれるわけです。

多くの場合、読み書きが終わるとファイルを読み込むためのメモリ領域が不要になりますし、(ディスクなど)アクセス競合の管理があるメディアの場合は「もう使わないよ」と宣言してもらう必要があったり、必要がないにしても、並行に実行されている他の処理がスムーズに進む場合があります。プログラム内でクローズするとそのようなことが(必要なら)行われます。

URLはダミーです。
http://ja.wikipedia.org/wiki/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0


12 ● sibazyun
●15ポイント

あえて、質問者の最初の問題提起にそって述べます。

・ファイル読み取りは、【ディスク内のデータ領域のある特定のアドレスの】これらの1,0の並びを認識すること
・ファイル書き込みは、【ディスク内のデータ領域のある特定のアドレスの】これらの並びを変更すること

ですが、では、そのアドレスはどうやってディスク装置が知ることができるか、です。なにしろ、ユーザはファイル名しか与えていないからです。

で、ディスク内には、ディレクトリ領域というのがあって、そこに「ファイル名とアドレスの対応表を格納することができます。まだ対応ができていない(新規書き込み)なら対応表を作ります。すでにあるときには、その対応表を読みます」。これは物理的には、ディレクトリ情報(ファイル名、アドレス、書き込み権利など)が、0,1で構成される文字情報、数字情報なので、それらの0,1情報を読んだり書いたりしています。つまりディスク本体では、オープンやクローズでは、ディレクトリ領域に対する読み書きが発生しています。

で、ディレクトリ領域がどこにあるかというと、それはいわゆるOSが知っているわけですが、そのOSというのも、ほとんどの場合Disk OSなので、ディスク内のOS領域に対して読み書きしています。

もちろん、オープン、クローズは主記憶内でもいろいろなことをやっていますが、ディスクへの物理的なアクセスは発生しています(それを仮想ディスクであるメモリ空間であるとか、細かくいえばありますが、おおざっぱな認識として)。

ダミー:http://q.hatena.ne.jp/answer

●追記: ついでにいうと、「ファイル削除」は、決して、「データ領域のビットを全て0で埋め尽くす」ということでなく、ディレクトリ領域の対応表を消すことです。したがって、実際のディスクのアドレスは、別のファイルによって再利用されるかもしれないし、再利用されないで、元のデータが残っているかもしれない、です。


DQNEOさんのコメント
ふむふむ。 オープン時のコンピュータ内の動きが少しイメージできました。 しかし、「プログラムからは、ディスク本体の動きは知ることはできない」という意見と対立しますね。 「ファイル名とアドレスの対応表」というのが鍵のようですね。 これが、ファイルシステムということなのでしょうか。

sibazyunさんのコメント
「プログラムからは、ディスク本体の動きは知ることはできない」ですが、 それが上位の、fopenを記してあるメイン・プログラムということなら、 ディスクの実アドレスは知りません。fopenの引数で実アドレスを 引いて、それをfwriteに渡してはいません。しかし、下位では知っています。 ちょうど、下記コメントに書いた社長(?)と秘書の文書格納の比ゆでいえば、 社長は文書が格納されている棚の書類ファイルのありかを知らない(関心がない) のと同じです。 なお、簡単のため、「ファイルの先頭アドレス」のように書きましたが、 長いデータは、ディスク上の連続したアドレスに格納されるとはかぎらず、 レコード単位に別々に格納されていますが、では、次のレコードはどこか、 といったことまでファイルシステムは管理しています。

13 ● らすかる
●15ポイント

既に色々な方の回答もありますので、ちょっと違う観点からの回答とします。
自分もC言語を勉強し始めの頃は、同じような疑問を持ちました。
自分の経験を踏まえて考えますと、コンピュータを勉強し始めの頃は、
シンプルなモデル上で、プログラムをイメージしていたように思います。
メモリ上には、自分のプログラムだけが配置され、入出力機能も独占しているような状態。
であれば、やりたい事が、ディスクへの書き込みであれば、
何故に、直接、ディスクへ書き込んでくれないの?といった感じです。
初期のコンピュータでは、きっと、直接書き込んでいたように思います。
でも、みなさんが説明して頂いているように、低レベルでの読み書きは、
実は、色々と面倒な手順を踏まないといけないんですね。
「こんなの毎回やってられね?よ。
ファイル名指定するだけで、後は書き込みたいデータだけ渡せば、
(もしくは読み込みたい領域を指定すれば)
面倒な事は代わりに誰かやってくれ?!!」
そんなこんなでOSが登場するわけです。
現在のOSは、色々と芸達者で、規模も大きくなっていますが、
ここでの説明では、便利なサブルーチンの集合とでも捉えて下さい。
で、まぁ、ディスク読み書き用のサブルーチンを用意してもらったので、
今までの面倒な作業をする代わりに、
読み書きする前にサブルーチン(f)openを呼び出すと、
OSは読み書きに必要な物をあれこれと用意してくれます。
ファイルポインタやファイルハンドルといった物は、
その必要な物のあれやこれやを参照する為の物です。
その後、(f)readや(f)writeなどで、好きに読み書きを依頼すれば、
OSが責任を持って面倒な作業を肩代わりしてくれます。
また、OSは、調停役であり監視役でもありますので、
他のプログラムとの兼ね合いやら権限のチェックやら、
もしくはシステム全体の効率なども踏まえて、
適切と思われるタイミングで物理的な読み書きを実行します。
そのような理由もあって、依頼した内容が、即反映されるとは限りませんが、
基本的にはOSが帳尻を合わせてくれます。(電源ぶち切りとかしなければ)
で、最後に、読み書きが終了した時点で、(f)closeを呼び出すと、
OSは、あれこれと用意した物を、綺麗に片付けます。
これを忘れると、OSは、まだ読み書きを続けるつもりで、
あれこれと必要な物を残したままにしておきます。
昔、新米プログラマの時、closeを忘れ、
メモリ不足でアプリが落ちた苦い経験がありますが、
きっと、多分、そのような経験を重ねる事で、
コンピュータの内部の動きが実感出来るような気もしますので、
たくさん書いて、たくさん動かしてみる、というのも大事かな、なんて思います。
http://d.hatena.ne.jp/rascal_k2/


DQNEOさんのコメント
なるほどなるほど! 「新米プログラマの時、closeを忘れ、 メモリ不足でアプリが落ちた苦い経験がありますが、 きっと、多分、そのような経験を重ねる事で、 コンピュータの内部の動きが実感出来る」 非常に実践的なアドバイスですね! 苦労する、痛い目を見る、というのがポイントですね。 すごく腑に落ちました。 ありがとうございます!

11-13件表示/13件
4.前5件|次の5件6.
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ