プロセスの実行
複数のプロセスを同時に実行できるOSをマルチタスクと呼ぶ。
それぞれのプロセスにはメモリ領域が割り当てられ、その内部構造は
次のようになっている。
プログラムコードが格納されている。
大域変数やmallocで確保したデータが格納される。
局所変数やサブルーチンの戻りアドレスが格納される。
プロセスの並列動作
OSは極めて短い時間でプロセスを切り替えながら動作する。
ユーザーから見ればプロセスが同時に実行されているように見える。
これを擬似並列という。なお、複数のプロセスが同時に動作しているように見えることを並行実行(concurrent)。実際に動作していることを並列実行(parallel)という。
プロセスの生成
OSがプロセスを生成する。プロセスはOSに対してプロセスの生成を依頼することができる。unixではforkシステムコールを用いて行う。
プロセスの終了
プロセスの終了状態は次の3つに分類できる。
プロセスがOSに処理の終了を通知してプロセスが終了する。unixではexitシステムコール
異常により実行を続けられなくなって終了する。
killなど
プロセスの切り替え
プロセスの切り替えを行うことをコンテキスト・スイッチと呼ぶ。
PCやSPなどレジスタの値を切り替えることでスイッチする。
プロセスの実装
カーネル内部ではプロセスのための情報を格納するためのデータ構造が存在し、プロセステーブルと呼ばれる。プロセスを追加するとここにエントリが追加される。エントリはunixでは構造体で表現されstruct task_struct として定義されている。中身としては
- プロセスの管理情報
- レジスタの退避領域
- プロセスの属性(PIDなど)
- 統計情報
- メモリ管理情報
- ファイル管理情報
カーネルの保護
カーネルもプロセスと同様にメモリ上に存在するため、適切な保護が必要になる。
CPUの動作モード、特権命令
CPUにはカーネルモードとユーザーモードが存在する。特権モードを
カーネルモード、非特権モードをユーザーモードと呼ぶ。
次のような違いがある。
特権モードではすべての命令を実行できるが、非特権モードには実行
できない命令が存在する。
特権モードではすべての領域にアクセスできるが、非特権モードではアクセスできない領域が存在する。
スーパーバイザコール
ユーザープログラムがカーネルモードの動作をさせるために明示的に割り込みを発生させることができる。これをスーパーバイザコールと呼ぶ。
システムコール
システムコールはOSの提供する機能のうち、プロセスから明示的に呼び出して利用する機能のことを言う。システムコール呼び出しはスーパーバイザコールを利用して実装されている。
例:Linuxの場合
1レジスタにシステムコール番号を代入
2決められたレジスタに引数を代入
3スーパーバイザコールを行う。システムコール用の割り込みハンドラが呼ばれて適切な処理を行う。
最終更新:2009年07月06日 23:46