オペレーティングシステム from 詳解システム・パフォーマンス
3章 オペレーティングシステム
パフォーマンスに関わるOSの基本的な解説
スタック
スレッドが必要とする過去の実行情報が格納される
関数の呼び出し順序と命令レジスタ上の位置を保管
モジュールと関数の識別子、その関数がどこまで進行したかを示すバイトオフセットの組がスタックフレーム
avashe.icon知らんけど関数の一時的なデータレジスタも保管されると思う
プロセスのスレッドはユーザとカーネルレベル、2つのスタックを持ち、システムコール中はカーネルスタックに切り替わる
ブロックされたユーザレベルスタックはシステムコール中変化しない
シグナルハンドラは例外で、設定することでユーザレベルスタックを利用する
プロセス
ユーザレベルプログラムの実行環境
メモリアドレス空間、ファイル記述子、スレッドスタック、レジスタから構成
初期のコンピュータを仮想化したものと言える
スレッド
プロセスのアドレス空間、ファイル記述子の共有
スタック、レジスタ、プログラムカウンタから構成される実行コンテキスト
プロセスのライフサイクル
実行可能-処理中-スリープというライフサイクルは実際にはもう少し複雑
最近のマルチスレッドOSではスレッドを直接スケジュールしており、それをプロセスの状態にマッピングするから
linuxの実行単位としてはスレッドもプロセスもtask_struct構造体(task)という抽象化された環境として実装されている
Interrupt Service Routine, ISRはデバイスからの割り込み発生時に実行されるルーチン
実行中カーネルが止まるので、まとまった処理をしたりロックを取るなど、スケジューラに乗せたければそこから割り込みスレッドを作る
クリティカルな部分はISRを割り込み不可能で実行し、そっから割り込み可能な割り込みスレッドで走らせるのが基本
割り込みが到着してから処理されるまでの時間が割り込みレイテンシ(Interrupt latency)
Interrupt priority level (IPL)はISRの優先度
割り込み発生時にCPUによって読み込まれる
現在実行中のIPLを超えるレベルの割り込みしか実行できない
レベルは1-15まであり、1-10までは割り込みスレッドで実行される
11以上はカーネルを止めて実行される
シリアルIOは高いIPLを持つ
大抵ハードウェアバッファが小さく、オーバーフローを避けるために即座に実行すべきだから
avashe.icon輪講で話題に上げたところ
カーネルは、(中略) この時プロセスにとってハードウェアキャッシュが温まっている方、あるいはメモリの局所性がより優れている方を選んで、パフォーマンスを大きく上げることができる。
メモリの局所性の判別とは如何に?
カーネルにどういう仕組みがあるかはわからないけどNUMAやcgroupsみたいな話を想定してそう
プロセスのスケジューラが賢いのでそういう挙動をするらしい
割り込み処理におけるtop halfとbottom halfってなに
topはLSRと思っていい、クリティカルなところをプロセスなど使わず直接実行する
デバイスからハードウェア的にジャンプして実行される
スケジュールされないので最低限の仕事で終わらせる
必要な仕事を積んですぐexitとか
割り込まれもしない
bottomは残りの長い必要な仕事を積んでおき、後から良しなにスケジュール実行する
割りこまれてOKな処理はこっちでする
その仕組みとしてtaskletとwork queueがある
カーネルスレッド作って積んだ情報を受けとるのがwork queue
スリープもできる
taskletはソフトウェアから起動する割り込み
予め決められた(多分経験的に適当とされる)タイミングで起きて実行されるので、ハンドラを登録しておく
avashe.icon大体work queueが使われるらしいので気にしないことにした
詳細は以下
スケジューラがI/OバウンドなプロセスのNICEをCPUバウンドなプロセスより上げるのはなぜ
CPUの使用量がたかが知れているのでとっととCPU部分を終わらせて仕事をハードウェアに投げ、スリープさせたいから
IOが激しいことをどう判断してるの?
(少なくとも電力管理の仕組みでは)スリープの時間の割合をスケジューラが見てNICEを調整してる