質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.53%

  • Linux

    3756questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • OS

    207questions

    OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

  • マルチスレッド

    52questions

    マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

  • 排他制御

    9questions

    排他制御とは、特定のファイル・データへのアクセスや更新を制御することです。特にファイルやデータベースへ書き込みを行う際、データの整合性を保つため別のプログラムによる書き込みを一時的に制御することを指します。

  • セマフォ

    1questions

    セマフォは、並行プログラミングにおいて同期のサポートを行うための機構。また、それによりプロセス間で交換される信号を指します。複数のプロセスでファイルなどを共有している際の同時アクセスによる破壊や不整合を防ぐことが可能です。

セマフォ、ロックの実装について

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 1,830

kkkmokotan

score 37

カーネル内の実装について、普段プログラマはセマフォやロックを用いて排他制御を行うと思うのですが、これらのセマフォやロックの実装について勉強致しました。
その結果、スピンロックという手法が取られていることがわかりました。ビジーウエイトによる実装ということがわかりました。そこで二つほど疑問ができました。

こちらのサイトを見る限りだと、そもそもカーネルの割り込みをさせないことが前提になっています。
つまりこれらの処理は単一プロセサに対しては割り込みさせないという処理が大前提になっているのでしょうか?

またスピンロックはあくまでロックの獲得の1手法であり、スピンロックのみ使えばロックが安全に取れる(マルチプロセサ環境で)ということはありませんよね?

よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

こんにちは。

こちらのサイトを見る限りだと、そもそもカーネルの割り込みをさせないことが前提になっています。 
つまりこれらの処理は単一プロセサに対しては割り込みさせないという処理が大前提になっているのでしょうか?

アトミック命令を使ってロックを取得できるので、別に割り込みを禁止する必要はないと思います。アトミック命令実行中に割り込みはかかりませんから。
実際の実装を見たことはないですが、恐らくアトミック命令を使えるプロセッサでは態々割り込み禁止していない筈です。
昔は、ロック取得に使えるようなアトミック命令がないシングル・プロセッサが主流でしたので、割り込み禁止して対応してました。

あと、リンク先の図9は一見アトミック命令でロック確保できるまでビジー・ウェイトするようにも読み取れますが、書きにくかったのだろうと思います。
そのような実装は非常に危険(ロック解放されなければCPUはアトミック命令から抜け出せない)なので、実際に使われるケースはあまりない筈です。

  1. ロック変数をチェックしてアンロックならロックする
  2. ロックを取得できなかったら、1.をリトライする

1.がアトミック命令で実行され、2.の処理は別の命令に分かれていると思います。

またスピンロックはあくまでロックの獲得の1手法であり、スピンロックのみ使えばロックが安全に取れる(マルチプロセサ環境で)ということはありませんよね?

ロックを取得する方法とロック取得のリトライ操作は分けて考えた方が良いです。
ロックを取得できなかった場合、ロック取得をリトライする場合が多いですが、その時、直ぐにリトライするのがスピン・ロックですね。CPUを無駄に消費するのであまり使われないと思います。
一定時間スリープしてリトライすることも考えられます。ポーリングと呼ばれます。応答時間とCPU消費のトレード・オフになりますが、デッドロックを避けやすいです。(待ちの間に処理を挟めますので。)
そして、他のイベントの発生によりリトライする方法が最も良く使われます。例えば、ミューテックスの場合はミューテックス解放イベントによりロック取得をリトライします。CPUを無駄に消費しないので効率的です。しかし、待っている間何もできないため、デッドロックを避けるのが結構たいへんです。


【スピンロック補足】
もしかすると、セマフォやミューテックスを実装する際に使われている場合もあるかも知れません。
セマフォやミューテックス自身がアトミックにアクセスできないくらい多くのメモリを使うような場合、それらを一旦ロックする必要があります。使うメモリが多少多めとは言え、数命令でアクセスが完了する筈なので一旦CPUを解放するより、ビジー・ウェイトした方が効率が良い場合がありますので。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/05 14:46

    回答ありがとうございます!
    補足について疑問なのですが、セマフォやミューテックスの実装にスピンロックが使われているのならば結局ロック獲得のリトライにビジーウェイトが使われるのだから、セマフォも元をたどればスピンロックとパフォーマンスが変わらないので意味がな区なるように思うのですがどうなのでしょうか?

    キャンセル

  • 2017/02/05 15:24

    問題はロックを獲得できるまでの時間です。それが非常に短い(数命令程度)であれはsleep()処理の負荷の方が大きいので、sleep()するよりビジー・ウェイトの方が効率があがります。

    そして、セマフォやミューテックスの内部変数を操作するための時間は数命令程度で済むことが事前にわかっているのでスピンロックを使うことも有りえます。
    それに対して、セマフォやミューテックスが排他制御する資源のロック期間はアプリケーション側の決定事項ですので事前に分かりません。数秒間ロックしっぱなしもあります。それをスピンロックで待つのは正直なところナンセンスな話です。

    キャンセル

0

単一プロセッサで割り込みを禁止するのは、そのほうが楽だからです。マルチプロセッサと同様な方法でロックを獲得することも可能ではありますが、シングルプロセッサの場合は割り込みを止めれば途中に別な書き換えが起きるようなことはありませんので、それで必要十分です。

マルチプロセッサの場合、「テスト・アンド・セット」「コンペアアンドスワップ」というような、既存の値のチェックと、新しい値への書き換えをアトミックに行う命令があって、そのような命令を使ってロックを構築していきます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Linux

    3756questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

  • OS

    207questions

    OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

  • マルチスレッド

    52questions

    マルチスレッドは、どのように機能がコンピュータによって実行したのかを、(一般的にはスレッドとして参照される)実行の複合的な共同作用するストリームへ区分することが出来ます。

  • 排他制御

    9questions

    排他制御とは、特定のファイル・データへのアクセスや更新を制御することです。特にファイルやデータベースへ書き込みを行う際、データの整合性を保つため別のプログラムによる書き込みを一時的に制御することを指します。

  • セマフォ

    1questions

    セマフォは、並行プログラミングにおいて同期のサポートを行うための機構。また、それによりプロセス間で交換される信号を指します。複数のプロセスでファイルなどを共有している際の同時アクセスによる破壊や不整合を防ぐことが可能です。