スレッド

linuxでは、実行の単位となるプロセスとスレッドは全く同一のものとして実現されている。(プロセスを拡張することにより、スレッドを実現したようだ)

スレッドがプロセスと異なっている点は、プロセスが保有するカーネル内各種資源を共有している点のみである。以下に、forkにより新しいプロセスが生まれた場合のデータ構造と、cloneにより新しいスレッドが生まれた場合のデータ構造を示す。

forkにより新しいプロセスが生まれた場合、全て資源のコピーを行う。ただし、メモリはCopy-On-Writeとし、次に書き込みアクセスがあるときまでコピー処理を送らせている。ファイルに関してはファイルディスクリプタのコピーのみを行いfile構造体は共有する。この仕組みのお蔭でshellから起動されたコマンドが何も考えずに、そのまま標準入出力を利用したり、またパイプやリダイレクションを利用したりすることができる。

img2.gif

一方cloneによるスレッド生成の場合は、下図のようにそれら資源のコピーを全く行わない。両方のコンテキストから全くおなじ資源が参照できる。しかし、それ以外の点ではまったくプロセスと同等である。

当然スケジューラからもプロセスとスレッドを全く区別せずに扱われる。おなじ空間を共有するスレッド(同一のプロセス内のスレッド)であっても、マルチプロセッサシステムの場合、別々のCPU上で同時実行されることもありうる。

img12.gif

(NIS)HirokazuTakahashi
2000年12月09日 (土) 23時55分06秒 JST
1