UNIX 6th code reading - ソフトウェア割り込み(シグナル)
はじめに
今回から13章を見ていきます。量が多いので数回に分けてメモを書いていくつもりです。
今回はソフトウェア割り込み(シグナル)の概要を確認します。
ソフトウェア割り込み(シグナル)とは
シグナルとは以下のようなことを実現する機構です。
- ユーザプロセスに割り込む
- ユーザプロセスの制御を奪う
- ユーザプロセスを終了させる
シグナルはソフトウェア割り込みと呼ばれ、以前扱った割り込み・トラップと区別されています。Lions本に従い、ソフトウェア割り込みという表現を使っていきます。
割り込み・トラップと違う点は、ハードウェア機構を用いない点です。ソフトウェア(OS)が定期的にソフトウェア割り込みが発生していないかをチェックし、発生していたら割り込み処理を開始します。
ソフトウェア割り込み処理が行われるタイミング
issig, psigでチェック&割り込みを実現しています。ソースコードを見ると、以下のポイントでチェック&割り込みをしているようです。
- sleepで寝る時&起きるとき(優先度が低いときのみ)
- trap(Cソース)時
- clock 割り込み時(1秒ごと)
ソフトウェア割り込み制御
プロセス固有データ領域(user構造体)にu.u_signalという配列があり、この値を設定することでソフトウェア割り込み発生時の動作(プロセスを止める, 無視するなど)を制御できます。
u.u_signal[n]のnはソフトウェア割り込みの種類を示します。nはNSIG(=20)種類あります(n=0-19)。n=0は割り込みなしを表します。また、n=9(SIGKIL)は特別なソフトウェア割り込みです(後述)。
manualには13種類の標準的な(?)ソフトウェア割り込みが書かれています。引用しておきます。
1 hangup
2 interrupt
3* quit
4* illegal instruction (not reset when caught)
5* trace trap (not reset when caught)
6* IOT instruction
7* EMT instruction
8* floating point exception
9 kill (cannot be caught or ignored)
10* bus error
11* segmentation violation
12* bad argument to system call
13 write on a pipe with no one to read it
u.signal[n]の値と、ソフトウェア割り込み#nが発生したときの動作の関係は以下です。
u.u_signal[n] | 動作 |
---|---|
0 | プロセスは自分自身を終了させる |
奇数 | プロセスは割り込みを無視する |
偶数 | プロセスは指定されているアドレスの手続きを実行する |
ただし、n=9のSIGKILだけは特別な扱いをされています。SIGKILが発生したときは必ずプロセスは自分自身を止めます。そのため、常にu.u_signal[9]には0が設定されます。
ソフトウェア割り込みの流れ
準備
signalシステムコールを使って、u.u_signal[n]を設定しておきます。つまりソフトウェア割り込み#nが起きたときの動作を設定しておきます。
割り込み
proc構造体のpsigをnに設定することでソフトウェア割り込み#nが発生します。
この機構の都合上、あるソフトウェア割り込みが未処理なまま新たなソフトウェア割り込みが発生した場合、最新のものだけが処理されます。上書きされたソフトウェア割り込みは無視されてしまいます。
ただしSIGKIL(N=9)だけは特別なので、後続のソフトウェア割り込みが発生した場合でも上書きされません。psignalのソースコードでそれが確認できます。
実行
clock割り込み時など定期的に、あるプロセス自身がissig( )を使って自身に対するソフトウェア割り込みが発生していないかチェックし、発生していた場合psig( )を使ってソフトウェア割り込み処理を実行します。
Cのソースで書くとこんな感じです。
if( issig( ) )
psig( ) ;
自分自身でソフトウェア割り込みのチェック&実行をするため、そのプロセスがアクティブでないと割り込み処理が行われません。
そのため、プロセスがスワップにいる場合など、ソフトウェア割り込みが発生してから処理されるまでに時間がかかることがあります。このあたりが割り込み・トラップと大きく違う特徴だと思います。
終わりに
今回はソフトウェア割り込みの概要を確認しました。次回からは数回にわけてソフトウェア割り込み周りのソースコードを見ていきます。内容はそこまで難しくなさそうですが、量が多いので大変そうです。