問題タブ [spinlock]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 変数に代入せずにカーネル内で非 void 関数を呼び出しても安全ですか?
システムをクラッシュさせている「アトミックでのスケジューリング」のため、カーネルコードをデバッグしようとしています。実際のカーネルモジュールのある時点で、別のカーネルモジュールで定義された関数を呼び出すための行を追加しました (これは私が作成したものです)。呼び出しは次のとおりです。
関数mycallback()
は を返しますint
。だから私は2つの質問があります:
結果を変数に代入せずに、カーネル内で非 void 関数を呼び出すことは安全ですか?
呼び出されるコード
mycallback()
が spin_locked などである場合、安全でしょうか? それは spin_locked/atomic でしょうか、それともスリープしてカーネルを危険にさらす可能性がありますか?
c - このスピンロック関数のパフォーマンスを向上させる簡単な方法はありますか?
コードにスピンロックを実装しようとしていますが、ウィキペディアに基づいて実装したスピンロックにより、パフォーマンスが非常に低下します。
これを改善して高速化する方法はありますか?
ありがとう。
c++ - 最速のインラインアセンブリスピンロック
パフォーマンスが重要なC++でマルチスレッドアプリケーションを作成しています。スレッド間で小さな構造をコピーするときは、多くのロックを使用する必要があります。このため、スピンロックを使用することを選択しました。
私はこれについていくつかの調査と速度テストを行いましたが、ほとんどの実装はほぼ同じくらい高速であることがわかりました。
- SpinCountが1000に設定されたMicrosoftのCRITICAL_SECTIONは、約140時間単位をスコアリングします
- このアルゴリズムをMicrosoftのInterlockedCompareExchangeスコアで実装すると、約95時間単位になります。
- また、このコード
__asm {}
のようなものを使用してインラインアセンブリを使用しようとしましたが、スコアは約70時間単位ですが、適切なメモリバリアが作成されているかどうかはわかりません。
編集:ここに示されている時間は、2つのスレッドがスピンロックを1,000,000回ロックおよびロック解除するのにかかる時間です。
これは大きな違いではないことは知っていますが、スピンロックは頻繁に使用されるオブジェクトであるため、プログラマーはスピンロックを作成するための可能な限り最速の方法に同意したと思います。しかし、それをグーグルすると、多くの異なるアプローチにつながります。この前述の方法CMPXCHG8B
は、 32ビットレジスタを比較する代わりにインラインアセンブリと命令を使用して実装した場合に最速になると思います。さらに、メモリバリアを考慮に入れる必要があります。これは、コア間の共有メモリに対する「排他的権利」を保証するLOCK CMPXHG8B(私は思いますか?)によって行うことができます。ついに[いくつかの提案]忙しい待ち時間にはNOP:REPを伴うべきだとこれにより、ハイパースレッディングプロセッサが別のスレッドに切り替えることができるようになりますが、これが正しいかどうかはわかりません。
さまざまなスピンロックのパフォーマンステストから、大きな違いはないことがわかりますが、純粋に学術的な目的のために、どれが最も速いかを知りたいと思います。ただし、アセンブリ言語とメモリバリアの経験は非常に限られているため、次のテンプレートでLOCKCMPXCHG8Bと適切なメモリバリアを使用して提供した最後の例のアセンブリコードを誰かが記述できれば幸いです。
c - copy_to_user を呼び出す必要がある場合、スピン ロックを使用する方法は?
データを読み取ってユーザーに渡す小さなドライバーを作成しました。私のドライバーは複数のアプリケーションで使用できます。つまり、再入可能なドライバーであるため、スピン ロックを使用します。しかしcopy_to_user
、スピンロックを保持した状態で呼び出すべきではないことがわかりました。char_device_buf
次のコードは共有データです。私はそれを守らなければなりません。スピンロックを使用して使用するミューテックス以外のメカニズムはありますcopy_to_user
か?
c - Combination Semaphore and Spin Lock in C?
Is it possible to build a sort of combined semaphore/spin lock in C?
That is, I want a thread control structure which supports:
- Periodically waking up the thread to check the state of some variable. (like a spin lock)
- Automatically waking the thread early if the state of the structure is altered by another thread (like sem_wait/sem_post).
For example in a program like this:
Parent:
Child:
I would like the parent to unblock if the child fails to set parent_sem within 5 seconds, but also to unblock before 5 seconds have passed if the child has set parent_sem early, while minimizing the number of CPU cycles expended checking and re-checking the state of parent_sem over those 5 seconds. I know I can do this with a spin lock, but setting the waiting period to be high (i.e. 1 second) means wasting almost 1 second most of the time. Setting it to be low (e.g. 100ms) means doing 50 checks in the event the child times out. Neither of these is a nice solution.
c++ - キューに入れられたスピンロック
私はたまたま Queued Spinlock に出くわし、C++ で実装したいと考えています。これに関する情報を少しグーグルで検索しましたが、適切なドキュメントを取得できませんでした。
ドキュメント/実装のヒントは大歓迎です。
前もって感謝します
マイケル・ブラウンが指摘したコードには、次の疑問があります
この実装は正しいですか? 私はそうは思わない!
parallel-processing - MCS アルゴリズムのロック
アプリケーションの 1 つに C++ でキュー ロックを実装したいと考えています。次の論文のアルゴリズムを調べていました: http://www.google.co.in/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCUQFjAA&url=http%3A%2F%2Fwww .cs.rice.edu%2F~johnmc%2Fpapers%2Ftocs91.pdf&ei=HpRfUKCZFsfWrQfpgIGACQ&usg=AFQjCNF_QamPWhJrq5dSjJjFjO7W3WzJ5Q&sig2=3TU1vo_aAYbM2fmLxeiZ0A
A & B は同じ変数 ( predecessor->next & I->next ) と C & D ( locked variable ) にアクセスしていますが、アクセスする前にロックされていません。ここで何か不足していますか?
linux - Linuxのraw_spin_lockはhrtimer割り込みを無効にしますか?
1つのプロセッサで、同じスレッドで、最初にraw_spin_lock()が呼び出され、次にhrtimerが開始され、再びraw_spin_lock()に戻ってそこでスピンします。hrtimer割り込みハンドラ関数では、raw_spin_unlock()が呼び出されます。
これによりデッドロックが発生しますか?raw_spin_lock()でスピンすると、割り込みが無効になりますか?
multithreading - pthread_cond_timedwait でオーバーフローする秒数
条件変数を取得し、一定の時間間隔の後にそれを解放するユースケースがあります (例: 時間順のイベントのキューがあり、指定された期間ブロックしたい .)
私はまさに私の目的を果たす次のものに出くわしました。
しかし、問題は timespec.sec が time_t (これは 32 符号付きの型) であり、オーバーフローすることです。これに対する回避策はありますか? より長い間ブロックする他の構成要素はありますか? Linux プラットフォームを使用しています。
linux - ユーザー空間プロセスと割り込みコンテキスト コード間の同期
最近、私はいくつかのインタビューに参加しました。尋ねられたすべてのカーネルの質問のうち、説得力のある答えを見つけることができなかった特定の質問が 1 つあります。
ユーザー空間プロセスと割り込みコンテキスト関数の間でデータを共有しながら、さまざまな同期手法をどのように使用しますか? 私の説得力のある答えは次のとおりです。
割り込みコンテキスト コード:
それから、これは説得力のある答えではありませんでした。データアクセスのすべてのインスタンスで行う必要がirqsave
ありますか?irqrestore