linuxマルチプロセスプローブ
1.linuxの次のプロセスは、「コードセグメント」、「スタックセグメント」、「データセグメント」の3つの部分のデータをメモリに格納します.
>コードセグメント:プログラムコードのデータを格納します.
>スタックセグメント:サブルーチンの戻りアドレス、サブルーチンのパラメータ、およびプログラムのローカル変数を格納します.
>データセグメント:プログラムのグローバル変数、定数、および動的データ割り当てのデータ空間を格納します.システムは、同じプログラムを複数同時に実行すると、同じスタックセグメントとデータセグメントの間で使用できません.
2.従来のunix環境では、fork()とexec()を使用してプロセスを作成および変更します.
>fork()は、現在のプロセスのほぼ完全なコピーである新しいプロセスを作成するために使用されます.
>exec()は、現在実行されているプロセスの代わりに別のプロセスを開始するために使用されます.vfork()とfork()のunixでの差はしばらく考慮されない.
3.一般的なCPUは「ページ」で構成されており、その1ページは一般的に4086バイトサイズであり、データセグメントでもスタックセグメントでも多くのページで構成されている.
fork関数はこの2つのセグメントをコピーし、「論理」上のものであり、「物理」上のものではない.すなわち、forkを実際に実行すると、物理空間上の2つのプロセスのデータセグメントとスタックセグメントが共有されます.
あるプロセスがデータを書いたとき、2つのプロセス間のデータが区別され、システムは区別された「ページ」を物理的に分離します.システムの空間的なオーバーヘッドを最小限に抑えることができます.
4.プロセス間通信:
>無名パイプ:
>有名なパイプは、次の2つの方法で作成できます.
>>mkfifo("myfifo","rw");
>>mknod myfifo p
有名なパイプを生成すると、open,read,closeなどのI/O関数で操作できるようになります.
これはくどくない・・・
>メッセージキュー、同じマシン上のプロセス間通信に適用され、無視することを推奨されます......(まだ使用しているようです)
—————————次の次は———————————
>共有メモリ
>シグナル
>ソケット
>コードセグメント:プログラムコードのデータを格納します.
>スタックセグメント:サブルーチンの戻りアドレス、サブルーチンのパラメータ、およびプログラムのローカル変数を格納します.
>データセグメント:プログラムのグローバル変数、定数、および動的データ割り当てのデータ空間を格納します.システムは、同じプログラムを複数同時に実行すると、同じスタックセグメントとデータセグメントの間で使用できません.
2.従来のunix環境では、fork()とexec()を使用してプロセスを作成および変更します.
>fork()は、現在のプロセスのほぼ完全なコピーである新しいプロセスを作成するために使用されます.
>exec()は、現在実行されているプロセスの代わりに別のプロセスを開始するために使用されます.vfork()とfork()のunixでの差はしばらく考慮されない.
3.一般的なCPUは「ページ」で構成されており、その1ページは一般的に4086バイトサイズであり、データセグメントでもスタックセグメントでも多くのページで構成されている.
fork関数はこの2つのセグメントをコピーし、「論理」上のものであり、「物理」上のものではない.すなわち、forkを実際に実行すると、物理空間上の2つのプロセスのデータセグメントとスタックセグメントが共有されます.
あるプロセスがデータを書いたとき、2つのプロセス間のデータが区別され、システムは区別された「ページ」を物理的に分離します.システムの空間的なオーバーヘッドを最小限に抑えることができます.
4.プロセス間通信:
>無名パイプ:
- #define INPUT 0
- #define OUTPUT 1
- int main(int argc,char** argv)
- {
- int file_descriptors[2];
- pid_t pid;
- char buf[256];
- int returned_count;
- pipe(file_descriptors);
- if( (pid = fork()) == -1) {
- printf("Error in fork
");
- exit(1);
- }
- if(pid == 0) {
- printf("in the spawned (child) process...
");
- close(file_descriptors[INPUT]);
- write(file_descriptors[OUTPUT],"test data",strlen("test data"));
- exit(0);
- } else {
- printf("in the spawning (parent) process...
");
- close(file_descriptors[OUTPUT]);
- returned_count = read(file_descriptors[INPUT],buf,sizeof(buf));
- printf("%d bytes of data received from spawned process:%s
",returned_count,buf);
- }
- retrun 0;
- }
>有名なパイプは、次の2つの方法で作成できます.
>>mkfifo("myfifo","rw");
>>mknod myfifo p
有名なパイプを生成すると、open,read,closeなどのI/O関数で操作できるようになります.
これはくどくない・・・
>メッセージキュー、同じマシン上のプロセス間通信に適用され、無視することを推奨されます......(まだ使用しているようです)
—————————次の次は———————————
>共有メモリ
>シグナル
>ソケット