目次
1 -- アトミック操作
アトミックオペレーション(Atomic Operation)とは、中断や失敗を伴わない相互排他を指し、一般的には、①オペレーションが正常に終了する、②オペレーションが全く実行されておらず、部分的な実行状況が見つからない、②オペレーションが実行されていない、の状態になります。
2 -- クリティカルセクション
クリティカルセクション(クリティカルセクション)とは、共有リソースにアクセスする必要があるプロセスに対応するプロセス内のコード領域を指し、対応するコード領域に別のプロセスが存在する場合、このコード領域は他のプロセスによって実行されません。
3- 相互排除
相互排他とは、あるプロセスがクリティカル セクションにあり、共有リソースにアクセスする場合、他のプロセスがクリティカル セクションにあり、同じ共有リソースにアクセスしないことを意味します。
4 -- デッドロック
ロック(lock)とは、データにアクセスできないように保護装置を追加することを指します。
ロック解除とは、データの保護を解除してアクセスできるようにすることを意味します。
デッドロック(デッドロック)とは、2つ以上のプロセスが互いに特定のタスクの完了を待っている場合、互いを待ち続けることによりそれぞれのタスクがスムーズに実行できなくなることを指します。
5 -- 飢え
スターベーションとは、実行可能なプロセスがスケジューラによって継続的に無視され、実行可能な状態にあるにもかかわらず実行されない状態を指します。
6--クリティカルセクションの設定
クリティカル セクションの基本プロパティ:
① 相互排他を実現します。クリティカルセクションには同時に最大 1 つのスレッドが存在します。
② 進行状況: スレッドがクリティカル エリアに入ろうとすれば成功します (つまり、クリティカル エリアに入ることができなければなりませんが、順序は存在します)。
③ 制限された待機: スレッドがクリティカル セクションの入り口にある場合、そのスレッドの要求が受け入れられるまでに、他のスレッドがクリティカル セクションに入る時間が制限されます (つまり、他のスレッドは無期限に待機することはなく、他のスレッドはクリティカルセクション地区へスムーズに進入します)
④ ビジー待機なし (オプション): プロセスがクリティカル セクションに入るのを待っている場合、入る前にプロセスを一時停止できます。
クリティカルセクションのコード保護を実装する 3 つの方法:
① ハードウェア割り込みを無効にします。
② ソフトウェアベースのソリューション。
③高度な抽象手法。
6-1--ハードウェア割り込みを無効にする
基本コンセプト:
クリティカルエリアに入るときは割り込みが無効になり、クリティカルエリアから出るときは割り込みが有効になります。
割り込みが無効になっているため、コンテキストの切り替えは行われず、同時実行性はありません。
欠陥:
割り込みが無効な場合、スレッドを停止できず、システム全体のスレッドが同時に停止し、他のスレッドが飢餓状態になる可能性があります。
ハードウェア割り込みの無効化はシングルコア CPU に限定されます。
6-2--ソフトウェアベースのソリューション
基本コンセプト:
スレッド間の相互排他は、Peterson、dekker、Bakery などのアルゴリズムを通じて実現されます。
欠陥:
ビジー待機を生成し、同時に CPU リソースを浪費します。
スレッド間でのデータ共有が必要です。
6-3--高度な抽象メソッド
基本コンセプト:
アトミック操作を使用してロックを実装します。たとえば、テスト アンド セットと交換の 2 つのアトミック操作 (コードは中断されず、正常に実行できるのは 1 回だけです) を使用してロックを構築します。
テスト アンド セット テストとセット:
メモリから値を読み出し、値が 1 であるかどうかを判断し、True または False を返し、最終的にメモリの値を 1 に設定します。
交換交換:
メモリ内の 2 つの値を交換します。
テスト アンド セットと交換の 2 つのアトミック操作を 使用して 、ロックを実装できます。
class Lock{
int value = 0;
}
// 如果锁被释放,则test-and-set读取0并将值设置为1,即锁被设置为忙并且需要等待完成
// 如果锁处于忙状态,则test-and-set读取1并将值设置为1,即不改变所得状态,自身不断循环(spin)
Lock::Acquire(){
while(test-and-set(value)); // spin
}
Lock::Release(){
value = 0; // 释放锁
}
int key;
do{
key = 1;
while(key == 1) exchange(lock, key); // 锁
critical section; // 临界区
lock = 0; // 退出临界区,解锁
remainder section;
}
相互排他を実装するロックの欠陥:
ビジー待機が発生し、プロセッサ時間が消費される可能性があります。
プロセスの枯渇は、プロセスがクリティカル セクションを離れ、複数のプロセスが待機しているときに発生します。