読者です 読者をやめる 読者になる 読者になる

Let's Enjoy it !

もなねこのプログラミング記録や意見など

Linuxにおけるプロセスについて(forkシステムコール,execファミリ,ゾンビ状態)

Programming linux

Linuxの入門書を読んだのでLinuxのプロセスについてまとめます。


参考書はこちら

Linuxにおけるプロセス

Linuxのルールは「すべてのプログラムがプロセスとして走る」ということ。つまりどんなプログラムにおいてもLinuxではプロセスを考えるということです。

forkシステムコールとは

親プロセスから子プロセスを生成することで処理を分割して行える。そこで使うのがforkシステムコールです。

if(fork() == 0){
  処理
}
else{
  wait();
}

とすればいい。
親プロセスはwaitで子プロセスの処理が終わるまで待機します。

execファミリ

forkだけでは同じプログラムを複数同時に動かすことしかできないため、1つのプログラムから別のプログラムを実行させるためにはどうするか。

if(fork() == 0){
    if(execl(commmand,command,NULL) < 0){
        exit(EXIT_FAILURE);
    }
}
else{
    wait();
}

先ほど述べたようにforkシステムコールカーネルコール)は子プロセスを生成する。今回は入力された一行(command)をコマンドとして実行します。

execlはexecファミリの一つで、呼び出すプログラムに渡す引数をリストにして順に指定している。execlの他にはexecvやexecvpなどがありますが、これらは引数の指定方法が異なります。

例えば/bin/lsと入力すると以下のようになる。

execl("/bin/ls/","/bin/ls","-l",NULL);

カーネルモード

forkやexecファミリによって複数のプロセスが同時に動作する。しかしこれらは実は「見かけ上」の話であって、実際には高速でプロセスの切り替えが行われているだけ。

実行中のプロセスにはカーネルモードとユーザモードの2つがあり、システムコールの割り込みなどはカーネルモードで実行される。

execファミリで実行をに終了するとゾンビ状態になる。このゾンビ状態とはプロセスが終了しているが、プロセステーブルが解放されていない(消滅していない)状態のことを指す。ゾンビ状態の子プロセスが消滅するには、親プロセスにてwaitシステムコールを実行する必要がある。

つまり上記で行ったwaitの処理は子プロセスの処理を待機しているだけではなく、ゾンビ状態を消滅するという役割を持っているのです。

用語

以下は参考にした入門書には書かれていない内容です。

スケジューリング

優先度付きキューで割り当てられたプロセスを制御する方法。

スケジューリング方式には以下があります。
①先着順
②処理時間順
ラウンドロビン方式
  タイムスライスを使ったら後ろへ。TSS。
④プライオリティ方式
  リアルタイムシステム。飢餓状態になる可能性。
⑤MLF(マルチレベルフィードバック)
  ラウンドロビン+プライオリティ方式。

ディスパッチ

プロセスやタスクに対して計算能力を振り分けること。タスクという単位で管理。

カーネル→割り込み処理→スケジューラー→ディスパッチャー→プロセスを実行→カーネル

プリエンプション

横どり。無限ループを防ぐためにプリエンプションされる。

コンテクストスイッチ

実行している処理の流れを中断してプロセスを切り替える。

まとめ

forkとexecで見かけ上複数のプロセスを実行。
waitによってゾンビ状態を開放。

続き
mo7.hatenablog.jp

広告を非表示にする