OS
プログラム →(コンパイル)→ バイナリデータ → 割り当て ⇔ プロセス ←OS
プロセス
はい、エントリファイルから複数のファイルを読み込んでバイナリデータが生成される場合でも、通常は OS から割り当てられるプロセスは 1 つです。
具体的な流れ:
- エントリファイルの実行
- 例えば、C や C++のプログラムであれば、関数がエントリポイントとして指定されます。このエントリファイルをコンパイルすると、最終的に実行可能なバイナリファイル(例:
main()
やa.out
)が生成されます。program.exe
- 例えば、C や C++のプログラムであれば、
- 複数ファイルの読み込み
- 実際には、エントリファイル以外にもプログラムに必要なライブラリファイルや他のモジュールファイルがリンクされ、1 つの実行可能なバイナリになります。リンク時に、複数のオブジェクトファイル(や
.o
)やライブラリが結合されて 1 つのバイナリファイルにまとめられます。.obj
- これらのファイルは、リンク時に結合され、最終的な実行可能バイナリに組み込まれます。
- 実際には、エントリファイル以外にもプログラムに必要なライブラリファイルや他のモジュールファイルがリンクされ、1 つの実行可能なバイナリになります。リンク時に、複数のオブジェクトファイル(
- プロセスの生成
- このバイナリファイルが実行されると、OS は 1 つのプロセスを生成します。このプロセスは、バイナリ内の複数のファイル(コードやデータ)をメモリ上に読み込み、実行します。
- OS は、1 つのプロセスとしてメモリ空間を割り当て、すべてのコードやデータをそのプロセス内で管理します。
なぜ 1 つのプロセスか
- プロセスとは、1 つの実行単位であり、その中で実行されるプログラムはメモリ空間を共有します。たとえ複数のオブジェクトファイルやライブラリがリンクされていても、実行可能なバイナリファイルとして最終的に 1 つのプロセスが生成され、バイナリ内のすべてのコードとデータはそのプロセスのメモリ空間内で実行されます。
- コードとデータの管理: バイナリファイルが複数の部分から構成されていても、これらはすべて 1 つのプロセス内で実行され、そのプロセスがシステムによって管理されます。プロセスが起動する際に、必要なコードやデータがメモリにロードされ、プロセス内で利用されます。
例
例えば、C 言語のプログラムが次のような構成であるとします:
- main.c: エントリポイントとなるソースファイル。
- utils.c: ユーティリティ関数を含むソースファイル。
- libmath.a: 数学的な操作を含むライブラリ。
これらのソースコードはコンパイルされ、リンクされて 1 つの実行可能なバイナリファイル(例えば、
program.exe
main.c
utils.c
libmath.a
まとめ
- 複数のソースファイルやライブラリがあっても、それらは最終的に 1 つの実行可能バイナリファイルにまとめられます。
- この実行可能ファイルを実行することで、OS は1 つのプロセスを生成し、そのプロセス内でバイナリデータ(コードやデータ)が実行されます。
もし異なるシナリオ(例: 複数のプロセスが必要なケース)についても知りたい場合は、さらに詳しく説明できますので教えてください!
スレッド
プロセスの中にあるもの