セマフォ、ロックの実装について
解決済
回答 2
投稿
- 評価
- クリップ 1
- VIEW 4,903
カーネル内の実装について、普段プログラマはセマフォやロックを用いて排他制御を行うと思うのですが、これらのセマフォやロックの実装について勉強致しました。
その結果、スピンロックという手法が取られていることがわかりました。ビジーウエイトによる実装ということがわかりました。そこで二つほど疑問ができました。
こちらのサイトを見る限りだと、そもそもカーネルの割り込みをさせないことが前提になっています。
つまりこれらの処理は単一プロセサに対しては割り込みさせないという処理が大前提になっているのでしょうか?
またスピンロックはあくまでロックの獲得の1手法であり、スピンロックのみ使えばロックが安全に取れる(マルチプロセサ環境で)ということはありませんよね?
よろしくお願いいたします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
こんにちは。
こちらのサイトを見る限りだと、そもそもカーネルの割り込みをさせないことが前提になっています。
つまりこれらの処理は単一プロセサに対しては割り込みさせないという処理が大前提になっているのでしょうか?
アトミック命令を使ってロックを取得できるので、別に割り込みを禁止する必要はないと思います。アトミック命令実行中に割り込みはかかりませんから。
実際の実装を見たことはないですが、恐らくアトミック命令を使えるプロセッサでは態々割り込み禁止していない筈です。
昔は、ロック取得に使えるようなアトミック命令がないシングル・プロセッサが主流でしたので、割り込み禁止して対応してました。
あと、リンク先の図9は一見アトミック命令でロック確保できるまでビジー・ウェイトするようにも読み取れますが、書きにくかったのだろうと思います。
そのような実装は非常に危険(ロック解放されなければCPUはアトミック命令から抜け出せない)なので、実際に使われるケースはあまりない筈です。
- ロック変数をチェックしてアンロックならロックする
- ロックを取得できなかったら、1.をリトライする
1.がアトミック命令で実行され、2.の処理は別の命令に分かれていると思います。
またスピンロックはあくまでロックの獲得の1手法であり、スピンロックのみ使えばロックが安全に取れる(マルチプロセサ環境で)ということはありませんよね?
ロックを取得する方法とロック取得のリトライ操作は分けて考えた方が良いです。
ロックを取得できなかった場合、ロック取得をリトライする場合が多いですが、その時、直ぐにリトライするのがスピン・ロックですね。CPUを無駄に消費するのであまり使われないと思います。
一定時間スリープしてリトライすることも考えられます。ポーリングと呼ばれます。応答時間とCPU消費のトレード・オフになりますが、デッドロックを避けやすいです。(待ちの間に処理を挟めますので。)
そして、他のイベントの発生によりリトライする方法が最も良く使われます。例えば、ミューテックスの場合はミューテックス解放イベントによりロック取得をリトライします。CPUを無駄に消費しないので効率的です。しかし、待っている間何もできないため、デッドロックを避けるのが結構たいへんです。
【スピンロック補足】
もしかすると、セマフォやミューテックスを実装する際に使われている場合もあるかも知れません。
セマフォやミューテックス自身がアトミックにアクセスできないくらい多くのメモリを使うような場合、それらを一旦ロックする必要があります。使うメモリが多少多めとは言え、数命令でアクセスが完了する筈なので一旦CPUを解放するより、ビジー・ウェイトした方が効率が良い場合がありますので。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
単一プロセッサで割り込みを禁止するのは、そのほうが楽だからです。マルチプロセッサと同様な方法でロックを獲得することも可能ではありますが、シングルプロセッサの場合は割り込みを止めれば途中に別な書き換えが起きるようなことはありませんので、それで必要十分です。
マルチプロセッサの場合、「テスト・アンド・セット」「コンペアアンドスワップ」というような、既存の値のチェックと、新しい値への書き換えをアトミックに行う命令があって、そのような命令を使ってロックを構築していきます。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.10%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/02/05 14:46
補足について疑問なのですが、セマフォやミューテックスの実装にスピンロックが使われているのならば結局ロック獲得のリトライにビジーウェイトが使われるのだから、セマフォも元をたどればスピンロックとパフォーマンスが変わらないので意味がな区なるように思うのですがどうなのでしょうか?
2017/02/05 15:24
そして、セマフォやミューテックスの内部変数を操作するための時間は数命令程度で済むことが事前にわかっているのでスピンロックを使うことも有りえます。
それに対して、セマフォやミューテックスが排他制御する資源のロック期間はアプリケーション側の決定事項ですので事前に分かりません。数秒間ロックしっぱなしもあります。それをスピンロックで待つのは正直なところナンセンスな話です。
2020/06/02 14:20
>アトミック命令を使ってロックを取得できるので
ここでいうところのロックとはバスロックのことですか?
intelアーキテクチャーマニュアル 7.1.2.2
https://www.intel.co.jp/content/dam/www/public/ijkk/jp/ja/documents/developer/IA32_Arh_Dev_Man_Vol3_i.pdf
inc,decなどの命令にLOCKプリフィックスをつけることでバスロックをかけてアトミックス性を保証している。。。みたいに書かれていますが
2020/06/09 14:33
何でもないです。
このバスロックと言うのはキャッシュ関係であり
アトミック操作とは直接的な関係はありませんね