プロセスとスレッドの技術的な違いは何ですか?
私は、「プロセス」のようなWordが使いすぎであり、ハードウェアとソフトウェアのスレッドもあると感じます。 Erlang のような言語の軽量プロセスはどうでしょうか。ある用語を他の用語に対して使用する明確な理由はありますか?
プロセスとスレッドはどちらも独立した実行シーケンスです。一般的な違いは、(同じプロセスの)スレッドは共有メモリ空間で実行され、プロセスは別々のメモリ空間で実行されることです。
「ハードウェア」スレッドと「ソフトウェア」スレッドのどちらを参照しているのかわかりません。スレッドは、CPU機能ではなく、オペレーティング環境の機能です(CPUには通常、スレッドを効率的にする操作があります)。
Erlangは共有メモリマルチプログラミングモデルを公開していないため、「プロセス」という用語を使用します。それらを「スレッド」と呼ぶことは、それらが共有メモリを持っていることを意味します。
プロセス
各プロセスは、プログラムの実行に必要なリソースを提供します。プロセスには、仮想アドレス空間、実行可能コード、システムオブジェクトへのオープンハンドル、セキュリティコンテキスト、一意のプロセス識別子、環境変数、優先度クラス、最小および最大作業セットサイズ、および少なくとも1つの実行スレッドがあります。各プロセスは、主スレッドと呼ばれることが多い単一のスレッドで開始されますが、その任意のスレッドから追加のスレッドを作成することができます。
スレッド
スレッドは、実行をスケジュールすることができるプロセス内のエンティティです。プロセスのすべてのスレッドは、その仮想アドレス空間とシステムリソースを共有します。さらに、各スレッドは、例外ハンドラ、スケジューリング優先順位、スレッドローカルストレージ、一意のスレッド識別子、およびスケジュールされるまでスレッドコンテキストを保存するためにシステムが使用する一連の構造を管理します。スレッドコンテキストには、スレッドのプロセスのアドレス空間に、スレッドのマシンレジスタのセット、カーネルスタック、スレッド環境ブロック、およびユーザースタックが含まれます。スレッドは独自のセキュリティコンテキストを持つこともでき、これはクライアントのなりすましに使用できます。
ここMSDNでこれを見つけた:
プロセスとスレッドについて
Microsoft Windowsはプリエンプティブマルチタスクをサポートしています。これは、複数のプロセスからの複数のスレッドの同時実行の効果を生み出します。マルチプロセッサコンピュータでは、システムはコンピュータ上のプロセッサと同じ数のスレッドを同時に実行できます。
プロセス:
スレッド:
まず、理論的側面を見てみましょう。プロセスとスレッドの違い、およびそれらの間で共有されていることを理解するには、プロセスが概念的にどのようなものであるかを理解する必要があります。
Tanenbaumによる Modern Operating Systems 3e のセクション 2.2.2古典的スレッドモデル には、次のものがあります。
プロセスモデルは、2つの独立した概念、つまりリソースグループ化と実行に基づいています。時々それらを分離するのが便利です; これはスレッドが入る場所です....
彼は続けます:
プロセスを見る1つの方法は、それが関連するリソースを一緒にグループ化する方法であるということです。プロセスには、プログラムテキストとデータ、およびその他のリソースを含むアドレススペースがあります。これらのリソースには、開いているファイル、子プロセス、保留中のアラーム、シグナルハンドラ、アカウンティング情報などが含まれます。それらをプロセスの形にまとめることによって、それらをより簡単に管理することができます。プロセスが持っているもう一つの概念は実行のスレッドです。 。スレッドは、次に実行する命令を追跡するプログラムカウンタを持っています。現在の作業変数を保持するレジスタを持っています。それは実行履歴を含むスタックを持ち、各プロシージャごとに1つのフレームが呼び出されますが、はまだ返されていません。スレッドはあるプロセスで実行されなければなりませんが、スレッドとそのプロセスは異なる概念であり、を別々に扱うことができます。プロセスはリソースをグループ化するために使用されます。 threads は、CPU上で実行がスケジュールされているエンティティです。
さらに彼は以下の表を提供する。
Per process items | Per thread items
------------------------------|-----------------
Address space | Program counter
Global variables | Registers
Open files | Stack
Child processes | State
Pending alarms |
Signals and signal handlers |
Accounting information |
ハードウェアマルチスレッド 問題を取り上げましょう。従来、CPUは単一の実行スレッドをサポートし、単一のプログラムカウンタと一連のレジスタを介してスレッドの状態を維持していました。しかし、キャッシュミスがあるとどうなりますか?メインメモリからデータを取得するには長い時間がかかります。その間、CPUはアイドル状態で待機しています。そのため、他のスレッドがメインメモリで待機している間に別のスレッド(おそらく同じプロセス内、または別のプロセス内)が作業を完了できるように、基本的に2組のスレッド状態(PC +レジスタ)を持つという考えがありました。この概念には、HyperThreadingや Simultaneous Multithreading (略してSMT)など、複数の名前と実装があります。
それではソフトウェア側を見てみましょう。ソフトウェア側でスレッドを実装する方法は、基本的に3つあります。
スレッドを実装するために必要なのは、CPU状態を保存し、複数のスタックを維持する機能だけです。これは、多くの場合、ユーザー空間で実行できます。ユーザー空間のスレッドの利点は、カーネルにトラップする必要がなく、スレッドを好きなようにスケジュールすることができるので、超高速のスレッド切り替えです。最大の欠点は、I/Oをブロックできないことです(これはプロセス全体とそのすべてのユーザースレッドをブロックします)。これは、スレッドを最初に使用する大きな理由の1つです。スレッドを使用してI/Oをブロックすると、多くの場合、プログラム設計が非常に簡単になります。
カーネルスレッドには、スケジューリングの問題をすべてOSに任せることに加えて、ブロッキングI/Oを使用できるという利点があります。しかし、各スレッドの切り替えにはカーネルへのトラップが必要であり、これは潜在的に比較的低速です。しかし、ブロックされたI/Oのためにスレッドを切り替えているのであれば、I/O操作によってすでにカーネルに閉じ込められている可能性があるため、これは実際には問題になりません。
もう1つの方法は、2つを組み合わせて、それぞれが複数のユーザースレッドを持つ複数のカーネルスレッドを使用することです。
用語の問題に戻って、プロセスと実行のスレッドは2つの異なる概念であり、どの用語を使用するかはあなたが話している内容によって異なります。 「軽量プロセス」という用語については、「実行のスレッド」という用語だけでなく現在行われていることを実際には伝えていないので、その点を私は個人的には見ていません。
並行プログラミングに関してさらに説明する
プロセスは自己完結型の実行環境を持ちます。プロセスは一般に、基本的なランタイムリソースの完全なプライベートセットを持っています。特に、各プロセスには独自のメモリスペースがあります。
スレッドはプロセス内に存在します - すべてのプロセスには少なくとも1つがあります。スレッドは、メモリや開いているファイルなど、プロセスのリソースを共有します。これは効率的ではあるが潜在的に問題のあるコミュニケーションを可能にします。
平均的な人を心に留めて、
コンピュータで、Microsoft WordとWebブラウザを開きます。これら2つのプロセスを プロセス と呼びます。
Microsoft Wordでは、何かを入力すると自動的に保存されます。これで、編集と保存が並行して行われていることがわかりました。一方のスレッドで編集し、もう一方のスレッドで保存します。
アプリケーションは1つ以上のプロセスで構成されています。プロセスは、最も簡単に言えば、実行中のプログラムです。 1つ以上のスレッドがプロセスのコンテキストで実行されます。スレッドは、オペレーティングシステムがプロセッサ時間を割り当てる基本単位です。スレッドは、現在別のスレッドによって実行されている部分を含め、プロセスコードの任意の部分を実行できます。ファイバーは、アプリケーションによって手動でスケジュールされる必要がある実行単位です。ファイバーはそれらをスケジュールするスレッドのコンテキストで実行されます。
ここ から盗まれた。
プロセスは、コード、メモリ、データ、およびその他のリソースの集まりです。スレッドは、プロセスの範囲内で実行される一連のコードです。 (通常)同じプロセス内で複数のスレッドを同時に実行することができます。
プロセス:
例:
たとえば、任意のブラウザ(mozilla、Chrome、IE)を開きます。この時点で、新しいプロセスが実行を開始します。
スレッド:
例:
ブラウザで複数のタブを開く
プロセスとスレッドはどちらも独立した実行シーケンスです。一般的な違いは、(同じプロセスの)スレッドは共有メモリ空間で実行され、プロセスは別々のメモリ空間で実行されることです。
プロセス
実行中のプログラムです。それはテキストセクション、すなわちプログラムコード、プログラムカウンタの値およびプロセッサレジスタの内容によって表される現在のアクティビティを有する。また、一時データ(関数パラメータ、リターンアドレス変数、ローカル変数など)を含むプロセススタック、およびグローバル変数を含むデータセクションも含まれます。プロセスには、プロセス実行時に動的に割り当てられるメモリであるヒープも含まれます。
Thread
スレッドはCPU使用率の基本単位です。スレッドID、プログラムカウンタ、レジスタセット、およびスタックで構成されています。同じプロセスに属する他のスレッドとコードセクション、データセクション、およびオープンファイルやシグナルなどの他のオペレーティングシステムリソースと共有していました。
- Galvinによるオペレーティングシステムからの引用
スレッドとプロセスはどちらもOSリソース割り当てのアトミック単位です(つまり、CPU時間がそれらの間でどのように分割されるかを記述する並行性モデルと、他のOSリソースを所有するモデルです)。違いがあります:
上のGreg HewgillはErlangのWordの「プロセス」の意味については正しかった、そして ここ なぜErlangがプロセスを軽量にできるのかという議論があります。
http://lkml.iu.edu/hypermail/linux/kernel/9608/0191.html
Linus Torvalds([email protected])
火、1996年8月6日12:47:31 +0300(EET DST)
メッセージのソート順:[日付] [スレッド] [件名] [著者]
次のメッセージ:Bernd P. Ziller: "Re:Oops in get_hash_table"
前のメッセージ:Linus Torvalds: "Re:I/O要求の順序付け"
1996年8月5日月曜日、ピーターP.アイザーローは次のように書いています。
スレッドの概念を明確にする必要があります。スレッドをプロセスと混同する人が多すぎるようです。以下の議論は、Linuxの現在の状態を反映するものではなく、高レベルの議論に留まる試みです。
いや!
「スレッド」と「プロセス」が別々のエンティティであると考える理由はありません。それが伝統的に行われている方法ですが、私は個人的にはそのように考えることは大きな間違いだと思います。そのように考える唯一の理由は、歴史的な荷物です。
スレッドとプロセスの両方は、実際には「実行のコンテキスト」です。さまざまなケースを人為的に区別しようとすることは、自己制限的です。
ここでCOEと呼ばれる「実行のコンテキスト」は、そのCOEのすべての状態の複合体です。その状態には、CPU状態(レジスタなど)、MMU状態(ページマッピング)、許可状態(uid、gid)、およびさまざまな「通信状態」(オープンファイル、シグナルハンドラなど)が含まれます。伝統的に、「スレッド」と「プロセス」の違いは、主にスレッドがCPU状態(+その他の最小状態)を持っているのに対し、他のすべてのコンテキストはプロセスに由来することです。ただし、それはone COEの合計状態を分割する方法であり、それが正しい方法であると言うものは何もありません。その種の画像に自分自身を制限することは、単なる愚かです。
Linuxがこれについて考える方法(および、私が物事を動作させたい方法)は、is「プロセス」や「スレッド」のようなものがないということです。 COEの全体(Linuxでは「タスク」と呼ばれる)のみがあります。異なるCOEはコンテキストの一部を相互に共有でき、その共有の1つsubsetは従来の「スレッド」/「プロセス」設定ですが、実際にはサブセットのみと見なされる必要があります(それは重要なサブセットですが、その重要性は設計からではなく、標準から来ています。Linuxの上でも標準に準拠したスレッドプログラムを実行したいのです。
要するに、スレッド/プロセスの考え方を中心に設計しないでください。カーネルはCOEの考え方に基づいて設計する必要があります。その後、pthread libraryは、COEの見方を使用したいユーザーに限定的なpthreadインターフェースをエクスポートできます。
スレッド/プロセスとは対照的にCOEを考えるときに可能になることの例として:
- UNIXおよび/またはプロセス/スレッドでは伝統的に不可能である外部の「cd」プログラムを実行できます(例は簡単ですが、アイデアは、従来のUNIXに限定されないこれらの種類の「モジュール」を持つことができるということです/ threads setup)。する:
clone(CLONE_VM | CLONE_FS);
子:execve( "external-cd");
/ * "execve()"はVMの関連付けを解除するため、CLONE_VMを使用した唯一の理由は、クローン作成を高速化することでした* /
- 自然に「vfork()」を実行できます(最小限のカーネルサポートを考慮していますが、そのサポートはCUAの考え方に完全に適合しています)。
clone(CLONE_VM);
子:実行を続け、最終的にexecve()
母:execveを待つ
- 外部の「IO deamons」を実行できます。
clone(CLONE_FILES);
子:オープンファイル記述子など
母:子が開いたvdのfdを使用します。
スレッド/プロセスの考え方に縛られていないため、上記のすべてが機能します。たとえば、CGIスクリプトが「実行のスレッド」として実行されるWebサーバーを考えてください。従来のスレッドは常にアドレス空間全体を共有する必要があるため、従来のスレッドではこれを行うことができません。したがって、Webサーバー自体でやりたいことすべてをリンクする必要があります(「スレッド」は実行できません)別の実行可能ファイル)。
これを代わりに「実行のコンテキスト」の問題と考えて、タスクは必要に応じて外部プログラム(=アドレススペースを親から分離する)などを実行することを選択できるようになりました。 exceptファイル記述子(サブ「スレッド」が多くのファイルを開くことができるように、親が心配する必要はありません。サブ「スレッド」が終了すると自動的に閉じます。親のfdを使い果たす)。
たとえば、スレッド化された「inetd」を考えてください。低オーバーヘッドのfork + execが必要なため、Linuxの方法では、「fork()」を使用する代わりに、各スレッドがCLONE_VMだけで作成されるマルチスレッドinetdを作成できます(アドレススペースを共有しますが、ファイルを共有しません記述子など)。その後、外部サービス(rlogindなど)であるか、または内部inetdサービス(echo、timeofday)のいずれかである場合、子は実行できます。
「thread」/「process」ではできません。
ライナス
プロセスはアプリケーションの実行インスタンスであり、スレッドはプロセス内の実行パスです。また、1つのプロセスに複数のスレッドを含めることもできます。スレッドが1つのプロセスでできることなら何でもできることに注意することが重要です。しかし、プロセスは複数のスレッドで構成されることがあるので、スレッドは「軽量」プロセスと見なすことができます。したがって、スレッドとプロセスの本質的な違いは、それぞれが達成するために使用される作業です。スレッドは小さなタスクに使用されますが、プロセスはより重いタスク、基本的にはアプリケーションの実行に使用されます。
スレッドとプロセスのもう1つの違いは、同じプロセス内のスレッドは同じアドレス空間を共有するのに対し、異なるプロセスは共有しないことです。これにより、スレッドは同じデータ構造と変数から読み書きでき、またスレッド間の通信も容易になります。プロセス間の通信 - IPCまたはプロセス間通信としても知られている - は、非常に困難でリソース集約的です。
スレッドとプロセスの違いの概要は次のとおりです。
スレッドは別のアドレス空間を必要としないため、スレッドはプロセスよりも作成が簡単です。
スレッドは一度に1つのスレッドによってのみ変更されるべきデータ構造を共有しているため、マルチスレッドでは慎重なプログラミングが必要です。スレッドとは異なり、プロセスは同じアドレス空間を共有しません。
スレッドはプロセスよりもはるかに少ないリソースしか使用しないため、軽量と見なされます。
プロセスは互いに独立しています。スレッドは同じアドレス空間を共有しているので相互に依存しているので、異なるスレッドが互いに踏み込まないように注意しなければなりません。
これは、上記の#2を述べる別の方法です。
プロセスは複数のスレッドで構成できます。
Javaの世界に関するこの質問に答えようとしています。
プロセスはプログラムの実行ですが、スレッドはプロセス内の単一の実行シーケンスです。プロセスは複数のスレッドを含むことができます。スレッドは時々 軽量プロセス と呼ばれます。
例えば:
例1: JVMは単一のプロセスで実行され、JVM内のスレッドはそのプロセスに属するヒープを共有します。そのため、複数のスレッドが同じオブジェクトにアクセスする可能性があります。スレッドはヒープを共有し、独自のスタックスペースを持ちます。これは、あるスレッドがメソッドとそのローカル変数を呼び出すことを他のスレッドから安全に守る方法です。しかし、ヒープはスレッドセーフではなく、スレッドセーフのために同期させる必要があります。
例2:プログラムはキーストロークを読み取って絵を描くことができないかもしれません。プログラムはキーボード入力に十分注意を払う必要があり、一度に複数のイベントを処理する機能が欠けていると問題が発生します。この問題に対する理想的な解決策は、プログラムの2つ以上のセクションを同時にシームレスに実行することです。スレッドはこれを可能にします。ここで描画画像は処理で、キー入力の読み取りはサブ処理(スレッド)です。
インタビュアーの観点から見ると、プロセスには複数のスレッドを含めることができるという明白なこと以外に、基本的に3つだけ聞きたいことがあります。
もっと望めば、Scott Langhamの返答はほとんどすべてを網羅している。これらはすべてオペレーティングシステムの観点からのものである。タスク、軽量スレッドなど、さまざまな言語でさまざまな概念を実装できますが、それらは(Windowsではファイバーの)スレッドを使用するための単なる方法です。ハードウェアおよびソフトウェアスレッドはありません。ハードウェアとソフトウェア 例外 と 割り込み 、またはユーザーモードとカーネル スレッド があります。
以下は、 The Code Project の記事の1つから得たものです。私はそれが必要なすべてを明確に説明していると思います。
スレッドは、ワークロードを別々の実行ストリームに分割するためのもう1つのメカニズムです。スレッドはプロセスよりも軽量です。これはつまり、本格的なプロセスよりも柔軟性が低いということですが、オペレーティングシステムのセットアップが少ないため、早く開始することができます。プログラムが2つ以上のスレッドで構成されている場合、すべてのスレッドが単一のメモリ空間を共有します。プロセスは別々のアドレス空間を与えられます。すべてのスレッドは単一のヒープを共有します。しかし、各スレッドには独自のスタックが与えられています。
プロセス :実行中のプログラムはプロセスと呼ばれます。
スレッド :スレッドは、「他のものと」という概念に基づいてプログラムの他の部分とともに実行される機能であるため、スレッドはプロセスの一部です。
組み込みの世界から来て、私はプロセスの概念がARMを持つ「大きな」プロセッサ(デスクトップCPU、MMU Cortex A-9)にのみ存在することを付け加えたいと思います。 (メモリ管理ユニット)、およびMMUの使用をサポートするオペレーティングシステム(Linuxなど)。小さい/古いプロセッサやマイクロコントローラ、そしてfreeRTOSのような小さいRTOSオペレーティングシステム(リアルタイムオペレーティングシステム)では、MMUサポートはなく、プロセスもなく、スレッドのみがあります。
スレッド お互いのメモリにアクセスできます。それらはOSによってインターリーブ方式でスケジュールされているため、並列に実行されているように見えます(またはマルチコアでは実際には並列に実行されます)。
プロセス 一方、MMUによって提供および保護されている、仮想メモリのプライベートサンドボックスに住んでいます。次のことが可能になるので便利です。
LinuxカーネルのOSビューから回答しようとしています
プログラムは、メモリに起動されるとプロセスになります。プロセスは、コンパイル済みコードを保存するための.textセグメント、初期化されていない静的またはグローバル変数を保存するための.bssなど、メモリ内にさまざまなセグメントを持つ独自のアドレス空間を持っています。各プロセスは独自のプログラムカウンターとuser-spcaestack。カーネル内では、各プロセスに独自のカーネルスタック(セキュリティ上の問題のためにユーザースペーススタックから分離されます)と、一般的にプロセス制御ブロックとして抽象化されるtask_struct
という名前の構造があり、優先度、状態、およびその他のチャンクとして。プロセスは、実行の複数のスレッドを持つことができます。
スレッドに来ると、それらはプロセス内に存在し、ファイルシステムリソース、保留中の信号の共有、データ(変数と命令)の共有などのスレッド作成中に渡すことができる他のリソースとともに親プロセスのアドレススペースを共有します。したがって、コンテキストの切り替えを高速化できます。カーネル内部では、各スレッドは、スレッドを定義するtask_struct
構造とともに独自のカーネルスタックを持っています。したがって、カーネルは同じプロセスのスレッドを異なるエンティティとみなし、それ自体でスケジュールを設定できます。同じプロセス内のスレッドは、スレッドグループid(tgid
)と呼ばれる共通のIDを共有し、プロセスID(pid
)と呼ばれる一意のIDも持っています。
視覚化による学習に慣れた人のために、プロセスとスレッドを説明するために私が作成した便利な図を示します。
MSDNの情報を使用しました - プロセスとスレッドについて
マルチスレッドを組み込んだPython(インタプリタ言語)でアルゴリズムを構築している間、以前に構築したシーケンシャルアルゴリズムと比較した場合、実行時間がそれほど良くないことに驚きました。この結果の理由を理解するために、私はいくつかの読書をしました、そして私が学んだことがマルチスレッドとマルチプロセスの違いをよりよく理解するためにそこから興味深い文脈を提供すると信じます。
マルチコアシステムは複数の実行スレッドを実行することがあるので、Pythonはマルチスレッドをサポートするべきです。しかし、Pythonはコンパイル言語ではなく、インタプリタ言語です。1。つまり、プログラムは実行するために解釈される必要があり、インタプリタはプログラムが実行を開始する前にそのプログラムを認識しません。しかし、それが知っているのはPythonの規則であり、それからそれらの規則を動的に適用します。 Pythonでの最適化は、主にインタプリタ自体の最適化であり、実行されるコードではありません。これはC++などのコンパイルされた言語とは対照的であり、Pythonでのマルチスレッドに影響します。具体的には、Pythonはグローバルインタープリタロックを使用してマルチスレッドを管理します。
一方、コンパイルされた言語は、よくコンパイルされています。プログラムは「完全に」処理されます。最初に構文定義に従って解釈され、次に言語にとらわれない中間表現にマップされ、最後に実行可能コードにリンクされます。このプロセスでは、コンパイル時にすべてのコードが利用可能であるため、コードを高度に最適化することができます。実行可能プログラムが作成された時点で、さまざまなプログラムの相互作用および関係が定義され、最適化に関する確固たる決定を下すことができます。
現代の環境では、Pythonのインタプリタはマルチスレッドを許可しなければなりません、そしてこれは安全で効率的でなければなりません。これが、インタプリタ言語とコンパイル言語の違いが理解されるところです。インタプリタは、計算のためのプロセッサの使用を最適化しながら、異なるスレッドからの内部共有データを乱してはいけません。
前の記事で述べたように、プロセスとスレッドは独立した順次実行であり、主な違いはプロセスの複数のスレッド間でメモリが共有されるのに対し、プロセスはそれらのメモリ空間を分離することです。
Pythonでは、データはGlobal Interpreter Lockによって異なるスレッドによる同時アクセスから保護されています。どのPythonプログラムでも、一度に実行できるスレッドは1つだけである必要があります。一方、各プロセスのメモリは他のプロセスから分離されており、プロセスは複数のコアで実行できるため、複数のプロセスを実行することが可能です。
1 Donald Knuthは、「The Art of Computer Programming:基本的なアルゴリズム」の中の解釈ルーチンについてよく説明しています。
同じプロセス内のスレッドはメモリを共有しますが、各スレッドは独自のスタックとレジスタを持ち、スレッド固有のデータをヒープに格納します。スレッドは独立して実行されることはないので、スレッド間通信はプロセス間通信に比べてはるかに高速です。
プロセスが同じメモリを共有することはありません。子プロセスが作成されると、親プロセスのメモリ位置が複製されます。プロセス通信は、パイプ、共有メモリ、およびメッセージ解析を使用して行われます。スレッド間のコンテキスト切り替えは非常に遅いです。
ベストアンサー
プロセス:
プロセスは基本的に実行中のプログラムです。これはアクティブなエンティティです。一部のオペレーティングシステムは、実行中のプログラムを指すために「タスク」という用語を使用します。プロセスは、常にメインメモリとも呼ばれるメインメモリに格納されます。したがって、プロセスはアクティブなエンティティと呼ばれます。マシンを再起動すると消えます。複数のプロセスが同じプログラムに関連付けられている可能性があります。マルチプロセッサシステムでは、複数のプロセスを並列に実行できます。プロセッサシステムでは、真の並列処理は実現されませんが、プロセススケジューリングアルゴリズムが適用され、プロセッサは各プロセスを一度に1つずつ実行するようにスケジュールされ、並行性の錯覚が生じます。プログラム。各インスタンスはプロセスと呼ばれます。
スレッド:
スレッドはプロセスのサブセットです。実際のプロセスに似ていますが、プロセスのコンテキスト内で実行され、プロセスに割り当てられた同じリソースを共有するため、「軽量プロセス」と呼ばれます。通常、プロセスには制御スレッドが1つしかありません - 一度に実行されるマシン命令のセットは1つですプロセスは、同時に命令を実行する複数の実行スレッドで構成されることもあります。マルチプロセッサシステムで可能な真の並列処理を利用することができる。ユニプロセッサシステムでは、スレッドスケジューリングアルゴリズムが適用され、プロセッサは各スレッドを1つずつ実行するようにスケジュールされる。プロセス内で実行されているすべてのスレッドは、同じアドレス空間、ファイル記述子、スタック、および他のプロセス関連の属性を共有しています。プロセス内の共有データがかつてないインポートを獲得アンセ。
ref - https://practice.geeksforgeeks.org/problems/difference-between-process-and-thread
ほとんど同じですが、コンテキストの切り替えや作業負荷などの点で、スレッドが軽量でプロセスが重いという点が重要です。
プロセスとスレッドの違いは以下のとおりです。
私がこれまでに見つけた最良の答えは Michael Kerriskの 'The Linux Programming Interface' :
最近のUNIX実装では、各プロセスは実行の複数のスレッドを持つことができる。スレッドを想定する1つの方法は、同じ仮想メモリを共有する一連のプロセス、およびその他のさまざまな属性です。各スレッドは同じプログラムコードを実行しており、同じデータ領域とヒープを共有している。ただし、各スレッドには、ローカル変数と関数呼び出しリンケージ情報を含む独自のスタックがあります。 [LPI 2.12]
この本は非常に明確な情報源です。 Julia Evansさんは、 この記事 でLinuxグループが実際にどのように機能するのかを明確にするのに役立つと述べました。
例1:JVMは単一プロセス内で実行され、JVM内のスレッドはそのプロセスに属するヒープを共有します。そのため、複数のスレッドが同じオブジェクトにアクセスする可能性があります。スレッドはヒープを共有し、独自のスタックスペースを持ちます。これは、あるスレッドがメソッドとそのローカル変数を呼び出すことを他のスレッドから安全に守る方法です。しかし、ヒープはスレッドセーフではなく、スレッドセーフのために同期させる必要があります。
所有単位やタスクに必要なリソースなどのプロセスを検討します。プロセスは、メモリ空間、特定の入出力、特定のファイル、優先順位などのリソースを持つことができます。
スレッドとは、ディスパッチ可能な実行単位、つまり簡単な言葉で言えば、一連の命令による進行のことです
残念ながら、OSコースを受講する学部生として、ほとんどすべての回答を熟読しました。2つの概念を完全に理解することはできません。私は、ほとんどの人がいくつかのOSの本から違いを読んだことを意味します。つまり、スレッドはプロセスのアドレス空間を利用するので、トランザクション単位内のグローバル変数にアクセスできるということです。それでも、プロセスがあるのはなぜかという新たな疑問が生じます。認識しているところでは、スレッドはプロセスに対してより軽量です。 から抜粋した画像を使用して、次の例を見てみましょう 、
Word文書に対して同時に3つのスレッドが動作します。 リブレオフィス 。最初の単語はスペルミスのスペルチェックです。 2番目はキーボードから文字を受け取って印刷します。そして最後の作業は、何か問題が発生した場合に作業していた文書を失うことのないように短時間で文書を保存します。 この場合、3つのスレッドはプロセスのアドレス空間である共通メモリを共有しているため、3つのスレッドを3つのプロセスにすることはできません。 それで、道はスレッドである2つのブルドーザーと共にWord文書です、それらのうちの1つはイメージに欠けています。
Erlang Programming(2009)より:Erlangの並行性は高速でスケーラブルです。 Erlang仮想マシンが作成されたすべてのプロセスに対してOSスレッドを作成するわけではないという点で、そのプロセスは軽量です。それらは、基盤となるオペレーティングシステムとは無関係に、VM内で作成、スケジュール、および処理されます。
Erlangはプリエンプティブスケジューラを実装しています。プリエンプティブスケジューラを使うと、システムスレッドをあまり長くブロックせずに各プロセスを一定時間実行できるため、各プロセスに実行時間がかかります。システムスレッドの数は、私が間違えていなければコアの数に依存します。負荷が不均等になった場合は、プロセスをあるスレッドから削除して別のスレッドに移動できます。これはすべてErlangスケジューラによって処理されます。