[C言語]プロセス生成とメモリの仕組み

 

2022年11月08日

[C言語]プロセス生成とメモリの仕組み






プロセスってなんだ?
この記事を読めば、プロセス生成とプロセス間のメモリ共有に関してなんとなく理解できます。
ググると、様々な記事に”プロセス”っていう用語を目にします。
「プロセス確認してくれる?」「プロセス落ちてない?」・・・・・「apacheとnginxの違いをプロセスっていう言葉を使って説明して?」などなど・・・

プロセスの定義

まずは英語で。 ←英語かい!

A process is an instance of a program running in a computer. It is close in meaning to task , a term used in some operating systems. In UNIX and some other operating systems, a process is started when a program is initiated

次に日本語で。

オペレーティングシステム(以降、OS)が動作中のプログラムを管理する基本単位

定義から、プロセスはOSが管理する動作中のプログラム単位ですね。

プロセスの生成

皆さんが良く使うlscdコマンドも実行すれば、プロセスが生成されます。
私が良く使うrm -rfも同様です。
OSは各プロセスに独立したメモリ領域を割り当てます。
(正確には仮想アドレス空間です)
自プロセスが使ってるメモリ領域を他プロセスが書き込んだりできません。
このことをメモリを共有しないと言います。
この仕組みのおかげで、こんなことが起きません。
裏アカでツイート中の内容が、インスタの入力欄に表示される・・・・・
恐ッッ!!
想像だけで震えます。
このような現象が起きないのもOSが各プロセスに専用のメモリ領域を割り当てているおかげです。

仮想アドレス空間とは
プロセスがメモリを使用すると宣言すると確保される領域。プロセス自体が物理メモリを直接参照しているわけではなく仮想アドレス空間という仕組みを通して物理メモリにアクセスされる。
同一OS内のすべてのプロセスは同一サイズの仮想アドレス空間を持ちます。

C言語でプロセスを生成する

C言語でプロセスを生成します。
合わせて、”メモリを共有しない”ことも確認します。
他のプロセスから起動されたプロセスを子プロセスと呼びます。
起動したプロセスを親プロセスと呼びます。

プロセス生成のメソッド
fork()

戻り値 説明
正の値 子プロセスのプロセスID(forkに成功し、親プロセスに返される)
0 forkに成功し、子プロセスとして動く
-1 エラーが発生
ソースコード

処理の流れ
1 プログラム実行
2 変数(n)に1を代入
3 10秒スリープ
4 子プロセス生成

・ 親プロセスの処理

変数(n)をインクリメント

・ 子プロセスの処理

10秒スリープ
変数(n)をインクリメント

watchコマンドでプロセスを監視しましょう。

プログラム実行前

watchコマンドが起動しています。

プログラム実行直後

親プロセスが実行しています。

子プロセス生成

プロセスが2つ起動しています。子プロセスと親プロセスが確認できます。

メモリの確認

変数nを追ってみます。
parentが親プロセス、childが子プロセスです。

子プロセスで変数nを2にインクリメントしているにも関わらず、親プロセスのインクリメントの値が3ではなく2です。
これは、子プロセスは親プロセスのメモリを共有しないからです。

変数nがなぜ子プロセスで宣言済みなの?
子プロセスは起動時に親プロセスのメモリ領域の内容を複製します。複製した内容を専用のメモリ領域に割り当て、起動後は独立して実行されます。

最後までお読みいただきありがとうございました。