こんにちは😀
今回は、タスクの排他処理と同期制御をまとめました。
タスクとは、コンピュータで処理される作業の最小単位になります。
タスクが複数同時実行される場合、互いの干渉を避けるために排他制御が必要になります。
また協調動作のための同期制御も必要になります。
タスクは、その生成時に記憶領域を割り当てられて動作します。
この記憶領域は、タスク内で用いられる変数や関数呼び出しに必要な情報などを格納する「スタック領域」とメモリを確保する命令を用いることでその都度必要に応じて動的に確保する「ヒープ領域」とがあります。
排他制御とは
排他制御とは、例えば複数のタスクが共通の領域で処理を行う場合、先に参照するタスクがその領域にロックをかけて占有する状態を言います。
当然、処理が完了した後にそのタスクはロックを解除します。
一連の処理の中で、2つ以上のタスクが同時にリソースを奪い合うことで処理に不都合が生じる箇所を、クリティカルセクションと言います。
このクリティカルセクションに入る前後で、問題が生じないように行う処理が排他制御になります。
排他制御には、セマフォという概念があります。
セマフォ変数にリソースの共有状態を記録し、空いていない場合は待ち行列に並びます。
セマフォ変数の入力には、以下の専用の命令を使用します。
P操作
リソースをロックする手続きを行います。
セマフォ変数S(初期値は「1」になります)の値が「1」以上のとき、Sを1減算してタスクの実行を継続します。
セマフォ変数Sの値が「0」のとき、実行を中断して待ち行列に並びます。
V操作
資源のロックを解除します。
セマフォ変数Sの中身を「1」加算します。
待ち行列の先頭タスクを実行可能状態に遷移させます。
操作の例
以下に、タスクAとタスクBを走らせた場合の例を表にしました。
セマフォ変数 | タスクA | タスクB |
S=1(初期値) | ||
【P操作】を行う | ||
S=0になる(ロックが掛かる) | 処理を継続 | 【P操作】を行うもS=0のため処理を行えず、待ち行列に並ぶ |
処理終了 | ↓ | |
【V操作】を行う | ↓ | |
S=1になる(ロック解除) | ↓ | |
【P操作】を行う | ||
S=0になる(ロックが掛かる) | ロックに成功し、処理を継続する | |
処理終了 | ||
【V操作】を行う | ||
S=1になる(ロック解除) |
今回の一言・・・
プログラムやソフトウェアが同時に処理を行なっているように見えても、裏では複数のタスクがロックを掛けたり解除したり、待ち行列に並んだりで処理を行なっています。
排他制御もプログラムを効率よく動かす上で必要な考えなので、理解を深めておきたいと思います。
ここまで読んでくれてありがとう。
では、また次回。