• ベストアンサー

プロセスとスレッドはどう違いますか?教えて下さい。

Xavalの回答

  • ベストアンサー
  • Xaval
  • ベストアンサー率58% (61/105)
回答No.4

プログラムを起動すると、32ビットアプリなら、メモリのアドレスとして、000 ... 000 ~ 1111 ... 111 (ともに32桁)、すなわち4GBの「仮想」メモリ空間を持ちます。 プログラムは、この32桁のアドレスを使って、メモリに展開したデータにアクセスします。 (変数aには「0000..0001」変数bには「000 ... 0100」など。) この4GBの自由に使ってもいい仮想的なメモリ空間を割り当てられる単位が、「1プロセス」です。 スレッドは、このプロセス内で更に分けられる単位です。 たとえば、インターネットブラウザのソースコードにネットワークからページを読み込む部分があると、取得開始から取得終了までの数秒間はそこでプログラムがブロックされてしまいますが、「スレッド」なる支流を作ってあげてそこで読み込みをさせると本流はブロックされません(だからその間にキャンセルボタンで命令だってできる)。 同一プロセス内の各スレッドは、アドレス空間が共有できるため、ネットワークからの読み込みデータを本流(メインスレッドという)で参照することもできます。 (↑重要!プロセス間では参照できませんよね?上のアドレス空間を見れば、000...000 ~ 111...111までどれを見ても自分の管理する世界しか指さないので) まとめると、 プロセスはOSが管理するメモリ割り当て単位。 スレッドはアプリケーションが管理する、 同一アプリケーション内の並列処理の単位です。 複雑なことは本格的に勉強するといいでしょう。

Lucifer55
質問者

お礼

ありがとうございます。分かりやすいです。スレッドは、アプリケーション内部のものなんですね。勉強してみたいと思います。 ありがとうございました。

関連するQ&A

  • スレッドとプロセスの違い

    今晩は。 早速ですが、javaのプログラムを勉強中です、スレッドとプロセスどう違うのでしょうか。 本などを読んでいろいろと調べましたが良く分かりません、宜しくお願いします。

    • ベストアンサー
    • Java
  • スレッドとプロセスについて

    こんにちわ。 Windowsにあるスレッドとプロセスという機能についてお聞きしたいと思います。 いろいろ調べてはみたんですが、いまいち具体性がなくてわからないのです。 両方とも抽象的な概念なのでしょうか?専門的かつわかりやすく教えていただけないでしょうか。 それと、調べていて疑問に思ったことがあります。 例えばWebサーバなどで、外部からの攻撃で落とすことができるようなセキュリティホールがあった場合、落ちる単位がプロセスなら、負荷攻撃で済み、スレッド化しているとサーバ自体がダウンしてしまうことになる。 というふうに書いてありました。なぜでしょうか。 よろしくお願い致します。

  • アプリケーションによるスレッドの利用

    タスクマネージャを使って実行中のアプリケーションやプロセス、スレッドの情報について知ることができますが、アプリケーションがスレッドを使用しているかどうかを知るにはどうしたらよいでしょうか。説明おねがいします。

  • 既存プロセスからプロセスのプライマリースレッドIDの取得方法

    いつもお世話になってます。 プロセスに関することで分からないことがあるため、どなたか御教授して下さい。 只今、VC++で開発を行っているのですが、CreateProcess関数を使用して開始したプロセスの情報が、引数で指定したPROCESS_INFORMATIONにプライマリースレッドのハンドルやIDが設定されるのは知っているのですが、現在動作中のプロセスからそのプロセスのプライマリースレッドのIDを取得することは可能でしょうか? 具体的には、動作中のプロセスIDを指定するとそのプロセスのプライマリースレッドに対してPostThreadMessageで任意のメッセージが送れるという仕様です。 対象のプロセスがウィンドウを持っていれば、EnumWindows関数を使用してウィンドウに対してPostMessageができるというのは分かったのですが、今回対象のプロセスがウィンドウを持たない為、上記のようにスレッドに対してメッセージを送るようになっています。 CreateProcess呼び出し時にはスレッドIDが取得できることから、プロセスID、または、プロセスハンドルからスレッドIDが取得できるのではないかなと考えられるんですが。。。。

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

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

  • tomcat psコマンドでスレッドのプロセスが見れません。。

    はじめまして。 JDK1.4.2-13 + tomcat5.0.28 + RHEL3でWEBアプリ環境を 構築しています。 Linux上ではJavaの1スレッドが1プロセスとして 実行されていると思いますが、この1スレッドをpsコマンドが 見た時になぜか表示されません。tomcat本体のjavaプロセスは 確認できるのですがスレッドに当たるプロセスが見えません。 topコマンドでは処理させた時にjavaというプロセスが 処理に応じて上位に表示されるのですが、この時に、 ps -ef | grep java でJavaプロセスを確認しようとしてもどうしても 見ることができません。。 linux上でtopコマンドとpsコマンドでは表示されるプロセス に違いがあるのでしょうか? WEBで調べてみてもみなさんpsコマンドでtomcatのJavaスレッド プロセスが確認できているようなので質問させて頂きました。 宜しくお願いします。

    • ベストアンサー
    • Java
  • タスクやプロセス管理について

    このカテゴリでよいか迷ったのですが質問させていただきます。 私は今までの仕事で、某セキュリティ会社の防犯監視システム開発、某携帯電話開発(UI)に携わってきました。 そこではリアルタイムOSマルチタスク環境でのプログラム開発だったのですが、マルチタスクといっても当然タスク毎に"実行可能状態"、"待ち状態"、"実行中状態"等(その他いろいろ)、各種状態を持ち、タスクプライオリティに従いOSがタスクのスケジューリングを行い順次タスクが切り替わって制御されているという感じだったのですが(何が言いたいかというと優先順位の違う複数のタスクが並列で動くことはないですよね?と言いたいのですが)、 今回LinuxOS(MontaVista)でのプログラム開発を行ってみて違いに戸惑いを感じました。(マルチ)プロセスとは何ぞや?から始まり、さらにそのプロセス内で作成されるスレッド、そのプロセス・スレッドは他のプロセス・スレッドと並列で動く等等。(正確にはあたかも同時に動作しているかのように見えるってことですよね?) 前半の"タスク"と後半の"プロセス"とはこのように別物なのですよね? 今までの経験では並列動作という概念が無かったもので、どうもしっくりこなく意見をあおぐ為投稿させていただきました。 かなり漠然としたことで恐縮なのですが、今まで述べたことでなにか勘違いしているんじゃないかとか間違えていることとかありますか? 長文となり申し訳ありません。

  • プロセスとスレッドの違いについて(Cプログラミングの観点から)

    プロセスとスレッドの違いがしっくりきません。 <プロセス> (1)プログラムの実行単位。Windows や Linux などの汎用 OS 上のアプリケーションは一般にプロセスとして動作している。プロセスは1つ以上のスレッドと、ファイル、ヒープメモリなどのリソースで構成される (2)起動や切り替えのオーバーヘッドが大きい <スレッド> (1)同一プロセス内の複数スレッドを同一メモリ空間上で実行でき、メモリ消費量などが軽減できる。 (2)マルチスレッド処理のプログラミングにおいては、同じデータを複数のスレッドが同時に書き換えることによる不整合に注意し、排他制御を行う必要がある。 等はwiki等調べて理解しています。 何が疑問なのかと申し上げますと、具体的にプログラミングする際に (1)マルチプロセスとマルチスレッド方式では、ソースにどのような違いが出てくるか (2)マルチプロセスとマルチスレッド方式では実行時間がどれだけ変化するか がわからないのです。お仕事で並列処理等について担当されている方などおられましたら、お手数ですがご教授ください。 なお、わかりやすい書籍、webサイト等ありましたらそれも併せて教えていただけると助かります。よろしくお願いします。ちなみに、環境はWindowsXP,VisualC++ExpressEdition2005を使っていますので、UNIXよりはWindowsかつCで動くプログラム例で教えていただけると大変助かります。しかし、当方Javaも多少であれば組めますのでJavaでも構いません。 何卒、よろしくお願い致します。

  • プロセスグループについて

    スレッドで起動されたプロセスは親プロセスをリーダとするプロセスグループを形成するというのは、シグナル処理で理にかなっていると理解しているのですが、シェルからパイプで繋いで起動してプロセスもプロセスグループを形成する。とある本に書いてありました。セッションとのからみかな。と漠然と思ったりしているのですが、パイプで繋いだプロセスが何故プロセスグループを形成する必要があるのか見えてきません。パイプで繋いだプロセスは、何故シェルを親とするプロセスグループ形成する必要があるのでしうか?

  • スレッドが作れない

    VC9SDKで、スレッドを作る時_beginthreadexの第3引数の型でエラーが出てしまいます。 ・・・main(・・・){ HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, &Process, NULL, 0, ID_PROCESS); } int __stdcall Process(){ } これはどう書けば解決するんでしょうか? お願いします。