• ベストアンサー

いまだに基本が理解できずに困っています。

プログラミング暦は数年になりますが、OSの基本が分かっていないので、APIの解説書を読んでると頭がこんがらがってしまいます。基本的すぎて解説書で解説されてないのですが、どなたか教えていただけないでしょうか? それぞれの意味はなんとなく分かったつもりでいたのですがですが・・・ (1)スレッド・タスク・プロセス の相違点 (2)インスタンス・ハンドル の相違点 できれば、各単語の意味も、分かりやすく解説おねがいします。

質問者が選んだベストアンサー

  • ベストアンサー
  • msystem
  • ベストアンサー率42% (79/186)
回答No.1

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

yama0001
質問者

お礼

大変わかりやすく丁寧な解答ありがとうございました。目の前が開けたようです。おかげさまで、再びAPIに挑戦する気力が湧いてきました。

関連するQ&A

  • windowsのプロセスIDやスレッドIDの使い道

    win32APIで取得したプロセスIDやスレッドIDの使い道について教えてください。 CreateProcessなどで取得したプロセスのハンドルやスレッドのハンドルはwin32APIで使う場面がありますが、プロセスIDやスレッドIDの使い道がわかりません。 どのような場面でプロセスIDやスレッドIDを使うのでしょうか?具体的にこんな事をするときに使うよなどあれば教えていただきたいです。 プロセスIDやスレッドIDを引数にとるAPI関数などがあれば教えていただきたいです。

  • タスクマネージャ

    タスクマネージャのパフォーマンスのハンドル,スレッド,プロセスとコミットチャージ(合計,制限,最大値)の意味を教えてもらいたいのですが。よろしくお願いします。

  • WINのタスクマネージャの強制終了

    Windowsのプロセス関連のAPIを勉強中です。 タスクマネージャでアプリケーションを強制終了させようとすると、正常終了できるときはしようとしますよねぇ。 これはAPIのTerminateProcessでは決してできなそうなのですが、アプリケーションに正常終了を促すのはどうやればよろしいんでしょうか。 自分であれこれ考えた結果、CreateRemoteProcessでExitProcessを実行するスレッドを、対象のプロセスに植え付けるぐらいしか思いつかなかったのですが、これは正しいんでしょうか(試してません)。

  • インスタンスのハンドル

    Windowsプログラミングにおいて、 ウィンドウのハンドル等などはピンとくるのですがインスタンスのハンドルというのがいまいちピンときません。 いろいろ調べたのですが、インスタンスを「実体」と解説しているサイトが多かったのですが、(たとえばここ)http://ew.hitachi-system.co.jp/w/E382A4E383B3E382B9E382BFE383B3E382B9.html ただウィンドウを表示させるようなプログラムをつくったとき、何が「実体」で、インスタンスのハンドルとはどういった働きをするのでしょうか。。

  • タスクマネージャーのコミットチャージ等の意味

    WINDOWS XPのタスクマネージャー のパフォーマンスを見たところ コミットチャージ:396MB/1246MB CPU使用率 5% プロセス:30 コミットチャージの意味をおしえてください。 またハンドルの意味をおしえてください。 よろしくお願いします。 以下ある状態のデータ値 ーーーーーーーーーーーーーー 合計 ハンドル 6309 スレッド 294 プロセス 30 PF(ページファイル使用量)395MB 物理メモリ(KB) 522224 コミットチャージ(KB): 合計 405794 制限値 1276252 最大値 406616 となっていました 合計値の405794とかは絶えず値が変動

  • マルチスレッド間でデータ交換をする方法

    マルチスレッドの知識がないままに、プログラミングをする必要が出てしまったのですが、書籍などで調べても分からない部分があるため、質問いたします。 Win32APIを用いて(MFCは使用しない)、WindowsでVC7.0環境です。 やりたいことは、 スレッドAとスレッドBを生成し、 スレッドAの終了時点で、スレッドBがスレッドA内部で生成したクラスのインスタンスを取得するというものです。(もしくはその逆) スレッドAとB自体もクラスで構成しており、内部で生成されるインスタンスはグローバルではないため、スレッドBからスレッドAを見えるような仕組みが必要なのでしょうか?? まだイメージだけの段階で、ソースコードで表現できなくて申し訳ないのですが、簡単にご教授くださる方、もしくは参考になるサイトを教えてくださる方がいらっしゃいましたら、お願いいたします!

  • 応用プログラミングとシステムプログラミングの違い

    応用プログラミングとシステムプログラミングの相違点ってなんですか? 一つ一つの意味は分かっても、相違点っていわれると難しくて; システムプログラミングは「OSの機能を直接使ったプログラム作成」だと思うんですけど、 応用プログラミングはこれと何が違うのでしょうか? よろしくお願いします

  • Rubyで書かれたプログラムに、WinAPIを組み込みたいと思っていま

    Rubyで書かれたプログラムに、WinAPIを組み込みたいと思っています。 組み込む内容は、  「とある実行ファイル」に、割り当てられているCPUの数を1つにする事で、 APIに関しては、 -------------------------------------------------------- DWORD SetThreadIdealProcessor( HANDLE hThread, // スレッドのハンドル DWORD dwIdealProcessor // 理想的なプロセッサ番号 ); -------------------------------------------------------- これを組み込めば良いという事がわかりました。 しかし、分からない点が2箇所ありまして、  ・「スレッドのハンドル」  ・Rubyプログラムへの組み込み方 です。 どなたか、お分かりの方がいらっしゃいましたら、 ご教示お願いいたします。

  • タスクマネージャーの意味

    PF使用量  632MB 「合計」 ハンドル10868 スレッド  560 プロセス 41         コミットチャージ:632MB/4964MB これらはどういう意味なんですか?

  • Runnableのインスタンス化について

    下記のコードについてです。 Runnableがインスタンス化されていますが、 どうしてそれが可能なのかが分かりません。 分からない点は 1.Runnableはインタフェースであるから、本来、直接インスタンス化は不可能であるはず。 2.しかし、Runnableはクラスライブラリjava.langパッケージに含まれている。 だからインスタンス化は可能なのかもしれない。 3.あるいは、下記のコードではメソッド内の無名クラスであるから、「new Runnable(){」の 部分でスーパークラスとしてのRunnableを継承したサブクラスを生成しているのかもしれない。 アドバイスをよろしくお願い致します。 public class Main{ public static void main(String[]args){ Runnable task = new Runnable(){ public void run(){ System.out.println("run"); } }; Thread thread = new Thread(task){ public synchronized void start(){ System.out.println("start"); } }; thread.start(); } }

    • ベストアンサー
    • Java

専門家に質問してみよう