この記事を読めば、プロセス生成とプロセス間のメモリ共有に関してなんとなく理解できます。
ググると、様々な記事に”プロセス”っていう用語を目にします。
「プロセス確認してくれる?」「プロセス落ちてない?」・・・・・「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が管理する動作中のプログラム単位ですね。
プロセスの生成
皆さんが良く使うls・cdコマンドも実行すれば、プロセスが生成されます。
私が良く使うrm -rfも同様です。
OSは各プロセスに独立したメモリ領域を割り当てます。
(正確には仮想アドレス空間です)
自プロセスが使ってるメモリ領域を他プロセスが書き込んだりできません。
このことをメモリを共有しないと言います。
この仕組みのおかげで、こんなことが起きません。
裏アカでツイート中の内容が、インスタの入力欄に表示される・・・・・
恐ッッ!!
想像だけで震えます。
このような現象が起きないのもOSが各プロセスに専用のメモリ領域を割り当てているおかげです。
同一OS内のすべてのプロセスは同一サイズの仮想アドレス空間を持ちます。
C言語でプロセスを生成する
C言語でプロセスを生成します。
合わせて、”メモリを共有しない”ことも確認します。
他のプロセスから起動されたプロセスを子プロセスと呼びます。
起動したプロセスを親プロセスと呼びます。
戻り値 | 説明 |
---|---|
正の値 | 子プロセスのプロセスID(forkに成功し、親プロセスに返される) |
0 | forkに成功し、子プロセスとして動く |
-1 | エラーが発生 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
#include <stdio.h> #include <unistd.h> #include <sys/wait.h> int main(void) { int n = 1; int status; pid_t pid; // 親プロセス10秒停止 sleep(10); pid = fork(); // forkに成功し、子プロセスとして動く if(pid == 0) { printf("child n[%p]=%d\n", &n, n); // 子プロセス10秒停止 sleep(10); n++; printf("child n[%p]=%d\n", &n, n); return 0; } // forkに成功し、親プロセスに返される else if(pid > 0) { printf("parent n[%p]=%d\n", &n, n); wait(&status); n++; printf("parent n[%p]=%d\n", &n, n); return 0; } // エラー発生 else { perror("fork"); return 0; } } |
2 変数(n)に1を代入
3 10秒スリープ
4 子プロセス生成
・ 子プロセスの処理
変数(n)をインクリメント
watchコマンドでプロセスを監視しましょう。
プログラム実行前
watchコマンドが起動しています。
プログラム実行直後
親プロセスが実行しています。
子プロセス生成
プロセスが2つ起動しています。子プロセスと親プロセスが確認できます。
メモリの確認
変数nを追ってみます。
parentが親プロセス、childが子プロセスです。
子プロセスで変数nを2にインクリメントしているにも関わらず、親プロセスのインクリメントの値が3ではなく2です。
これは、子プロセスは親プロセスのメモリを共有しないからです。
最後までお読みいただきありがとうございました。