- Linuxにおいて、kernelはプログラムを"Process"という単位で扱う
- 複数のプログラム(=Process)を平行して同時に実行するために、kernelはProcessを切り替えながら処理を行う
- kernelは実行中のProcessを停止/開始するタイミングで、レジスタの内容を退避したり復元したりしながらProcessの実行管理を行う
- Processの管理のためには、対象のProcessが使用しているレジスタやメモリの情報を正しく記憶し、紐付けて管理する必要がある
- Process管理のためのテーブルを「Process構造体」と呼ぶ
- レジスタの内容を「コンテキスト」と呼ぶ
Process構造体に記録されている情報の一例
- Processが使用したCPU単位
- Processが使用しているメモリ空間のアドレス範囲
- Processが使用しているファイル
- Processが使用しているソケット/ポート番号
- Process構造体の記録に基づいて、kernelが持つSchedulerがProcessの実行管理を行う
Scheduler
- Processの切り替えを行うkernelの機能
- 非常に短時間に複数のProcessに処理を切り替えることにより、複数のProcessが「同時に処理されているかのように」見せかける
- Processの切り替えはProcessに対して設定されたプライオリティに基づいて実行される
- Schedulerは実行するProcessの切り替えとあわせてコンテキストの保存や呼び出しなどの処理を同時に行う
- Processの切り替えと同時に、新規に実行されるProcessが使用するレジスタ情報やメモリテーブル、ネットワークリソースなどがSchedulerにより用意される
Multi Processorと排他処理
- マルチプロセッサやマルチコアのCPUを使用する場合にはプロセッサ/コアの数のProcessを同時に実行することができる
- 複数のProcessが同時に実行できることは、同時に実行されるProcess間で排他処理が機能し、整合性が維持されることも同時に必要となる
- 過度な排他処理はパフォーマンスの低下に結びつくため、適切な並行性を維持するバランスが必要となる
- 特定のProcessがあるリソースを使用している場合、対象のリソース全体に対するアクセスを制限するのではなく、使用している部分のみに制限をかけることによって並行性が向上する
- たとえば、リソースが本であった場合、本全体に対する読み書きを制限するのではなく、使用しているページに対する読み書きのみを制限することによって、他のProcessが他のページにアクセスすることを制限しない
スレッド
- Processは継続的に実行され続ける用途に(一般的に)使用されるのに対して、スレッドは必要なときに一時的なものとして実行される
- スレッドは実行資源としてメモリやファイル、ネットワーク等を必要とせず、必要な分のCPUリソースのみで実行される
- スレッドは(一般的に)頻繁に生成/消滅するかたちで使用される