プログラムとは、あらゆるプログラミング言語で書かれたプログラムを指します。 Java乗算を行うメソッドが1つしかないプログラムであり、メインメソッドがその乗算メソッドを実行します。または、Python =は同じことを行います。または、電子メールクライアント、Webブラウザ、チャットアプリケーションなどのアプリケーションプログラム、またはオンラインゲームクライアントでもかまいません。
主な質問が意味を成しているかどうかはわかりませんが、私は理解しようとしています:
上記のそれぞれがプログラムであると言うのは正しいですか、それともいくつかの本質的な違いがありますか?
プログラムを開始すると、オペレーティングシステムでプロセスが開始されますか?
プログラムは複数のプロセスを持つことができますか?
これらの用語について真実の根拠は1つではありませんが、プログラムとプロセスの根本的な違いについては同意できると思います。
プログラムは、目標を達成するための一連の指示です。 artifact です。
OSプロセスはプログラムの実行です:つまり、一連の命令だけでなく、また、プログラムの命令の実行フローと実行コンテキスト(スタック、変数の値、リソースなど)も含まれます。
いくつかの参考文献
C++ ISO標準:
§3.5:プログラムは、リンクされた1つ以上の翻訳単位で構成されます。
§2.1プログラムのテキストは、ソースファイル(...)と呼ばれる単位で保持されます。含まれているすべてのヘッダーとソースファイルを含むソースファイル(...)は、翻訳単位と呼ばれます
§1.9プログラムの実行[プロセスについては何も述べられていない。実装は目的に応じて自由に実行を編成できる]
第1.1章:
第12章では、プログラムの実行中に発生するアクティビティについて説明します。プログラムは通常、コンパイルされたクラスとインターフェースを表すバイナリファイルとして格納されます。これらのバイナリファイルは、Java仮想マシンにロードして、他のクラスやインターフェースにリンクし、初期化することができます。
POSIX仕様 :
3.300プログラム:定義されたタスクを実行するためにシステムに準備された一連の命令。 IEEE Std 1003.1-2001の「プログラム」という用語には、シェルコマンド言語、複雑なユーティリティ入力言語(...)、および高水準言語で記述されたアプリケーションが含まれます。
3.289プロセス:1つ以上のスレッドがそのアドレススペース内で実行されているアドレススペース、およびそれらのスレッドに必要なシステムリソース。
簡単に言えば、プログラムは実際には、通常、ディスク上にファイルとして存在する単なるデータの一部です。もちろん、そのデータには、データ(文字列リテラルなど)とともに、CPU命令の両方のエンコーディングが含まれています。
一方、プロセスはメモリにロードされたプログラムであり、通常は起動されています。プログラムをプロセスにロードすることは、通常、アドレススペースを割り当て、それ以外の場合はプロセスのコンテキストを作成し、コード(エンコードされた命令)とその他のデータをそのアドレススペースにロードして、プログラムのCPU時間をメインから開始することを意味します。
上記のそれぞれがプログラムであると言うのは正しいですか、それともそれらの間にいくつかの本質的な違いがありますか?
基本的にそうです。
プログラムを開始すると、オペレーティングシステムでプロセスが開始されますか?
はい。
プログラムは複数のプロセスを持つことができますか?
適用される定義に依存しますが、最近のプログラムは複数のスレッドを持つことができますが、必ずしもプロセスではありません。ただし、プログラムのグループを1つのプログラムと呼ぶことも珍しくありません。そのようなプログラムはいくつかのプロセスに分割されていると言えます(ただし、プログラムが複数のプログラム(ファイル)に分割されていることも意味します)。
オペレーティングシステムのプログラムとプロセスの関係は何ですか?
プログラムによって異なります。
オペレーティングシステムを必要としない低レベルのプログラムを作成できます。実際、それがオペレーティングシステムです。ハードウェアが必要なすべてをサポートしている場合、OSを見逃すことはありません。
ただし、ファイルをロードする必要があり、OSがなく、少し作業をしている場合。 OSは通常、私が通常考えたくないことを抽象化します。ドライブにはどのようなコントローラがありますか?データのアドレス指定に使用されるコマンドは何ですか?これは、ドライバーが実装する共通のインターフェイスを規定するOSなしでは容易ではないため、すべてのハードドライブコントローラーと同じ方法で通信できます。
数学に関しては、まあ今はALUと話していたのかもしれない。多分、CPUはこのハードウェアでネイティブにこれを行います。 OSが処理してくれないので、知っておくべきことはもっとあります。
プログラムがオペレーティングシステムを利用できることを期待する場合、関係はOSがハードウェアの詳細を抽象化し、プログラムが実行される時期(マルチスレッドOSかどうか)を決定することです。 OSはプログラムを停止することもできます。
プログラムがオペレーティングシステムを想定していない場合は、オペレーティングシステム自体である可能性があります。または、そのハードウェア専用のプログラムの場合もあります。
私たちがJavaについて話している場合、すべてのハードウェアとOSをプログラムに対して同じに見えるようにして、どのハードウェアとOSでも動作できるようにするこの仮想マシンがあります。これは詳細を抽象化するので、プログラムはそれが実行されているものを気にする必要はありません。
重要な関係は、プログラムが適切に機能するために、プログラムの外にあるものを必要とすることです。操作系もそういうものかもしれません。
質問に答えるには本全体が必要です。 オペレーティングシステム:3つの簡単な部分 をお読みください。
関連項目 オペレーティングシステム 、 プロセス 、 仮想アドレススペース 、 実行可能 、 スケジュール ウィキページ。
簡単に言うと、ソースプログラムは、実行可能ファイルにコンパイルされることがよくあります(これには、プロセッサが実行できる machine code と、その他の情報が含まれます。例 [〜#〜] elf [〜# 〜] )。プロセスは、実行可能ファイルの実行インスタンスです。それは独自の仮想アドレス空間を持っています(おそらく、そのプロセスのいくつかの スレッド の間でshared)。同じプログラムを実行している複数のプロセスを持つことができます(たとえば、私のLinux Shell zsh
がいくつかの端末で実行されています。make -j
を使用して大きなプログラムをコンパイルして並列ビルドを実行すると、いくつかのプロセスが実行されています。 cc1plus
によって開始された内部コンパイラプログラムg++
)。プロセスがオペレーティングシステムによって提供される操作を要求しています カーネル (たとえば、いくつかのファイルの読み取り)から システムコール まで。
最も一般的なオペレーティングシステム(Linux、Unix、MacOSX、Android、Windows)には、上記で説明したようなプロセスがあります。ただし、一部の奇妙なオペレーティングシステムでは、アプローチやデザインが異なります。 nikernels のような MirageOS 、または永続的なオペレーティングシステムのような Grasshopper 。時々、これらの奇妙なオペレーティングシステム(例 Singularity )はバロックプログラミング言語( 言語ベースのシステム であるため)および/または特定のハードウェア(クラッシュ- [〜#〜] safe [〜#〜] プロジェクト)。