68user's page 掲示板

Prev< No. 77〜78> Next  [最新発言に戻る] [過去ログ一覧]
No. 77 # mm [URL] 1999/01/15 (金) 21:43
こちらでは、はじめまして。
「ネットワークプログラミングの基礎知識」を読ませて頂きました。
で、本題の方は、向こうで話題にしてしまったので(^^;
ちょっとズレた質問で申し訳ないのですが、「inetdの役割」で
「UNIXでは現在実行中のプログラムのことをプロセスといいます」
という定義がありますよね。
この「プロセス」というものがもう一つよく分からないのです
(inetdの説明上では理解できるんですが…)。

「実行中」というのは、1つのプロセスのプログラムがexecで
切り替わった場合も、プロセスとしては同じだという意味で
受け取っていいのでしょうか?
また、プロセスというのは、カーネルがスケジュールに従って
実行時間を割り当てる単位と考えてもいいのでしょうか?

それから、UNIXではプロセスを生成できるのはforkだけだと聞きますが、
forkって親プロセスのメモリイメージとレジスタを丸ごとコピーする
んですよね。この場合、子プロセスが直ぐにexecでプログラムを切り替えても、
メモリ上には親プロセスのコピーがそのまま残るんでしょうか?
(execで切り替わったプログラムが終了しても、子プロセスがまだ
実行を続けるかも知れないので、こんなコピーの残骸で一杯になりそうな
気がするのです…)

それと、マルチプロセスと関連のありそうな言葉として、タスク、スレッド、
コンカレント、コルーチンなどとの相違も教えて頂ければうれしいです。
スレッドは、プロセス内プロセスみたいなもの…?
コルーチンは、Windowsの3.1以前のアプリケーションみたいなもの…?

なんか、ネットワークとぜんぜん関係ないなぁ…すいませんです(^^;

No. 78 # 68user 1999/01/16 (土) 07:41
mmさん、はじめまして(とか言ってみたりして(笑))

> execで切り替わった場合も、
> プロセスとしては同じだという意味で
> 受け取っていいのでしょうか?

#!/usr/local/bin/perl
if ( $pid = fork ){
    print "子プロセスは$pidです。\n";
    sleep 2;
    system("ps aux|grep $ENV{USER}|grep perl");
    print "\n";
    sleep 4;
    system("ps aux|grep $ENV{USER}|grep -E '(perl|sleep)'");
    wait;
} else {
    sleep 4;
    exec("sleep 5");
}
# fork、ps、子プロセスがexec(sleep)、psという順番で動くように、
# ところどころにsleepを入れてます。

を実行したところ、
    子プロセスは714です。
    zxr400 713 0.8 1.6 712 988 p2 S+ 7:25AM 0:00.02 perl fork (perl5.00404)
    zxr400 714 0.0 1.5 648 956 p2 S+ 7:25AM 0:00.00 perl fork (perl5.00404)

    zxr400 713 0.0 1.5 712 944 p2 S+ 7:25AM 0:00.02 perl fork (perl5.00404)
    zxr400 714 0.0 0.1 172 60 p2 S+ 7:25AM 0:00.00 sleep 5
となります。プロセス番号714の子プロセスが、exec sleep 5しても
やはりプロセス番号は714のまま、ということだと思います。

> また、プロセスというのは、カーネルがスケジュールに従って
> 実行時間を割り当てる単位と考えてもいいのでしょうか?

僕もそういうふうに理解しています。

> execで切り替わったプログラムが終了しても、子プロセスがまだ
> 実行を続けるかも知れないので、こんなコピーの残骸で一杯になりそうな
> 気がするのです…

execが戻ってくるのはexecに失敗したときだけで、execの実行に成功すると
絶対に戻って来ません。だから元のプロセスのイメージを保持しておく
必要はないですから、OSが掃除してくれるんじゃないでしょうか。

> タスク、スレッド、コンカレント、コルーチン

うーん、僕もよく知らないんですが…。スレッドに関しては、

> スレッドは、プロセス内プロセスみたいなもの…?

でいいのかなぁ。

Javaではスレッドを使うことでプロセスの中で並列実行ができます
よね。一方「マルチスレッド版echoサーバ」というのは、ただ単に
「並列処理ができるよ」くらいの意味ですが、別にスレッドを
使っているわけではなく、forkで実現しています。
また、FreeBSDではスレッドへの対応が進み、スレッドセーフな
OSになりつつあるようです。

というわけで、「スレッド」という言葉はどの環境を指して
使うかで結構意味に違いがあるんじゃないかと思うんですが…。

あと、「タスク」はUNIXの用語でしたっけ。多分Winの用語かな
と思うんですが、結局ここらへんはプロセスと呼ぶかタスクと
呼ぶかの違い、単純に呼称の違いではないかと思ってるんですが…。

コンカレント・コルーチンは初めて聞きました(^^;

Prev< No. 77〜78> Next  [最新発言に戻る] [過去ログ一覧]