- ベストアンサー
いまだに基本が理解できずに困っています。
プログラミング暦は数年になりますが、OSの基本が分かっていないので、APIの解説書を読んでると頭がこんがらがってしまいます。基本的すぎて解説書で解説されてないのですが、どなたか教えていただけないでしょうか? それぞれの意味はなんとなく分かったつもりでいたのですがですが・・・ (1)スレッド・タスク・プロセス の相違点 (2)インスタンス・ハンドル の相違点 できれば、各単語の意味も、分かりやすく解説おねがいします。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
私もちゃんとわかっているわけではないので、正しいかどうかは分かりませんが、私の理解を書きます。 (1)スレッド・タスク・プロセス プロセス WindowsNT系のOS場合、ユーザーが作成したプログラムは、搭載しているメモリの一部をOSに割り当ててもらって、そのメモリの中だけで実行されます。ですから、他のユーザープログラム、OSの使っているメモリの内容、または、プログラムを直接呼び出すことができません。これにより、たとえユーザープログラムがハングアップしても、OSから、割り当てたメモリ領域を開放すれば元どうりになります。 この割り当てられたメモリ空間で動いているプログラムのことをプロセスと呼びます。(ただこれでは、便利なプログラムができないので、さまざまな情報をやり取りする手段をOSが用意しています。これが、APIです) タスク 1つのコンピューターで、1つのプログラムしか動かすことができなければ、上記のようなプロセスという考え方は、いらないのですが、実際は、OS、複数のユーザープログラムを、見た目上同時に動かしたいことがあります。このとき上記のようなプロセスなどの方法で、複数のメモリ空間を割り当て、プロセスごとにCPUの実行時間を割り当て、見た目上、複数のプログラムが動いているように見せます。 実際は、プロセスで実行指定プログラムを、細かい時間で区切り、CPUの割り当てをOSが切り替えを担当して実現しています。この細切れの実行のことをタスクと呼びます。 スレッド ユーザープログラムは、1つの割り当てられたメモリ空間の中で実行するのですが、だんだんと、1つのプログラムが大きくなり、1度に作成するのが難しくなってきました。(経緯は勝手な思い込みです)そのため、1つのプロセスの中でもプログラムを分割して、複数のプログラムを動かすようになってきました。これがスレッドです。当初は、スレッドは単にサブルーチンのようになっていましたが、各スレッドをタスクのように時間で分割し、複数のスレッドを動かす方法が考えられるようになってきました。これがマルチスレッドです。ただし、プロセスと違い、あるスレッドがハングアップすると、その部分のメモリはそのプロセス内のどのメモリをアクセス中とかの内容はわかりませんから、スレッドを止めても、そのプロセス自身にどのような影響があるかは、やってみなくては分かりません。 (2)インスタンス・ハンドル ハンドル コンピュータはデータを扱うときは、必ずそのデータを保存しておく場所をメモリ上に用意します。そのときに、メモリのどの部分に保存したかが分かれば、そのデータを扱うことができます。これがハンドルです。ここでは、変数のような言い方をしましたが、サブルーチンでも何でも、メモリのどこに存在しているかがわかれば使えますので、サブルーチンなどの保存している場所(を保存している変数?)のこともハンドルと呼ぶようです。 インスタンス クラス関係のことですよね。 まず、コンピュータは、データを保存し何らかの加工を行います。そのとき保存するのが変数で、加工を行うのがサブルーチン(構造化プログラミング以前は、きっちりしてませんが)です。 クラス導入以前は、上記のハンドルの件から、変数、サブルーチンはそれぞれインスタンスを持ち、ばらばらに管理しなくてはなりませんでした。(プログラムが大きくなってくると管理が大変ですね) そこで、考え出されたのがオブジェクト指向です。あるデータは、必ず加工されるわけですが、その加工内容は、データによって決まっているはずです。また、データも1つのデータだけでなく、複数のデータでまとめて分類することができます。(たとえば、「注文」に関するデータ、商品名・注文数・単価はひとまとめに扱ったほうが分かりやすいですね。また、データの加工内容としては、「小計を計算する」なんてことが考えられると思います。)このように、複数のデータと処理内容の方法を記述したものがクラスです。 実際には、そのクラスをメモリの展開し、その場所を表すハンドルでそのクラスを使うことができます。そのメモリに展開されたものをインスタンスといいます。 つまり、クラスはいくつでもメモリ上に展開できるのです。(またそうでなければ、クラスを使ってプログラムする優位性も減ってしまいます。)ですから、クラスは必ずインスタンスを作ってそのハンドルを変数に入れて使用し、いらなくなったら破棄しなくてはならないのです。(VBでは、VB側である程度破棄してくれます) 長々と書きましたが、うまく説明できているかは自信ありません。申し訳ありません
お礼
大変わかりやすく丁寧な解答ありがとうございました。目の前が開けたようです。おかげさまで、再びAPIに挑戦する気力が湧いてきました。