問題タブ [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.
file-io - クロスプラットフォームおよびクロスプロセスのatomicintによるファイルへの書き込み
私は、スレッドまたはプロセスのいずれかによって、アプリケーションへの多数の同時アクセスを処理できる必要があるアプリケーションを作成しています。したがって、これにミューテックスやロックを適用しないでください。
ロックの使用を最小限に抑えるために、ファイルを「追加専用」にするように設計しているため、すべてのデータが最初にディスクに追加され、次に更新された情報を指すアドレスが変更されます。新しいものを参照します。したがって、新しいアドレスを参照するようにこの1つのintを変更するためだけに、小さなロックシステムを実装する必要があります。それを行うための最良の方法はどうですか?
アドレスの前にフラグを付けることを考えていました。フラグが設定されると、リーダーは解放されるまでスピンロックを使用します。でも、アトミックではないのではないかと思いますね。例えば
- リーダーがフラグを読み取り、設定されていません
- 同時に、ライターはフラグを書き込み、intの値を変更します
- 読者は一貫性のない値を読み取る可能性があります!
私はロック技術を探していますが、私が見つけたのはスレッドロック技術か、フィールドではなくファイル全体をロックすることだけです。これを行うことはできませんか?追加専用データベースはこれをどのように処理しますか?
編集:私はappend-only db(couchDB)がそれをどのように行うかを見ていました、そして彼らはファイルへの書き込みをシリアル化するためだけにスレッドを使用しているようです。それは、ファイルシステムロックでファイル全体をロックせずに、sqliteのようにそれらを埋め込み可能にすることができないことを意味しますか?
ありがとう!カウエ
language-agnostic - スピンロックは内部でどのように実装されていますか?
これは、一度に 1 つの実行スレッドのみが保持できるロックです。別の実行スレッドがロックを取得しようとすると、ロックが解放されるまで後者がループします。
2 つのスレッドがまったく同時にロックを取得しようとした場合、どのように処理しますか?
この質問は、他のさまざまなミューテックス実装にも当てはまると思います。
multithreading - ロックを取得できない場合、C#4.0 BCL SpinLockのスピン/ブロックは実行されますか?
次のコードが与えられます:
取得中のロックでfalseを受信したためにEnterブロックが「失敗」した場合、現在のスレッドはスピンロックのようにスピンして取得できるようになるまで待機しますか、それともこのブロックが単にバイパスされてそのスレッドが失われますか?
ありがとう、
スコット
linux-kernel - スピンロックとCLIを一緒に使用する
最近、Linuxソースをhttp://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.34.1.tar.bz2からダウンロードしました。linux-2.6.34.1\Documentationフォルダーにあるspinlocks.txtというファイルで以下の段落に出くわしました。
「それは、あなたがそうするコードを持っているなら、それは意味します
そして、それを行う別のシーケンス
その場合、それらは相互に排他的ではなく、クリティカル領域は2つの異なるCPUで同時に発生する可能性があります。それ自体は問題ありませんが、クリティカル領域はさまざまなものに対してクリティカルである方がよいでしょう(つまり、互いに踏みつけることはできません)。「」
一部のコードがcli()/ sti()を使用していて、同じコードの他の部分がspin_lock_irqsave(flags)/ spin_unlock_irqrestore(flags)を使用している場合、どのように影響しますか?
locking - 非優先的なLinuxカーネルでのspin_lock
1つのCPUと非優先的なLinuxカーネル(2.6.x)を備えたシステムでは、spin_lock呼び出しは空の呼び出しと同等であるため、そのように実装されていることを読みました。
私はそれを理解できません:それはミューテックスでの睡眠に相当するべきではありませんか?非優先カーネルでも、たとえば割り込みハンドラーが実行されたり、元のスレッドをスリープ状態にする関数を呼び出したりする場合があります。したがって、空のspin_lock呼び出しが、ミューテックスとして実装された場合のように「安全」であるとは限りません。
わからないものはありますか?
linux-kernel - Linuxカーネル内のリストエントリでスピンロックを使用するにはどうすればよいですか?
Linuxカーネル用のパッチを開発しています。複数のリストを使用する必要があり、マルチコアマシンでの同時変更からそれらを保護する必要があります。この目標のためにスピンロックを使おうとしていますが、理解できないことがあります。リストのエントリをロックする必要があります(リンクリストのLinuxのデフォルト実装を使用しています)。プロセスがsyscallを呼び出して、リストの1つの要素を削除し、同じ要素が実際に変更されているためにロックされている場合があります。その上で作られています。リストエントリ内にスピンロックを挿入した場合、誰かがスピンロックしているときにプロセスがスピンロックを削除できたらどうなりますか?リスト全体をロックする必要がありますか?この状況を処理する方法を説明できるコードを探しています。
たとえば、このコードは機能しないはずです(コードの最後の行のコメントを参照)。
手伝って頂けますか??
semaphore - CMU: セマフォ
私のセマフォの理解を確認してください。
セマフォとバイナリセマフォのカウントの背後にある考え方を理解しています。ただし、signal() と wait() の種類で実装されたスピンロックとセマフォの違いは、私には混ざり合っています。
たとえば、スピンロックには基本的に 2 つの値があります (ロックされているかロックされていないかを表すバイナリの true/false)。したがって、スピンロックは基本的にバイナリ セマフォですよね?
別のプロセスが内部にあるときにクリティカル セクションに入ろうとするプロセスは、ロックされている間は入ることができず、スピンして、ロックが解除されるまでロック ステータスを継続的にチェックし、入ってロックできるようになります。
signal() および wait() 関数を使用するセマフォは、基本的に何らかの変数から値を加算または減算します。クリティカル セクションに関する制約があります。変数が何らかの値である場合にのみ開かれます。コンシューマ プロセスの実装例は、wait(full) で、いっぱいになると実行され、最後に signal(empty) になります。一方、プロデューサ プロセスは待機 (空) し、空が真の場合に実行され、終了するとシグナル (満杯) になります。
wait() と、本質的にループ内で「待機」しているスピンロックの違いは何ですか?
linux-kernel - スピンロックを保持している間のスリープの回避
私は最近、LDDv3 本のセクション5.5.2 (Spinlocks and Atomic Context) を読みました。
ロックを保持している間に睡眠を避けることは、より困難になる可能性があります。多くのカーネル関数がスリープする可能性があり、この動作は必ずしも十分に文書化されているとは限りません. ユーザー空間への、またはユーザー空間からのデータのコピーは明らかな例です。必要なユーザー空間ページは、コピーを続行する前にディスクからスワップインする必要がある場合があり、その操作には明らかにスリープが必要です。メモリを割り当てなければならないほぼすべての操作はスリープできます。kmalloc は、明示的に指示されない限り、プロセッサを放棄し、より多くのメモリが使用可能になるのを待つことを決定できます。睡眠は驚くべき場所で発生する可能性があります。スピンロック下で実行されるコードを記述するには、呼び出すすべての関数に注意を払う必要があります。
スピンロックを可能な限り最小限の時間保持する必要があることは明らかであり、正しいスピンロックを使用するコードを最初から書くのは比較的簡単だと思います。
ただし、スピンロックが広く使用されている大きなプロジェクトがあるとします。スピンロックで保護されたクリティカル セクションから呼び出された関数が決してスリープしないようにするにはどうすればよいでしょうか?
前もって感謝します!
windows - Windows で、カーネルとユーザー空間の間で共有されるメモリ アクセスを最適に同期する方法
Win32 Api でスピンロックを取得する関数が見つかりません。
理由はありますか?
スピンロックを使用する必要がある場合、どうすればよいですか?
CriticalSectionAndSpinCount 関数があることは知っています。
しかし、それは私が望むものではありません。
編集:
カーネル空間とユーザー空間の間で共有されるメモリを同期したい。-メモリがマップされます。
データ構造にアクセスするときにロックする必要があり、ロック時間は非常に短くなります。
データ構造 (キューであると仮定) は、相互に対話するイベント ハンドルを管理します。
どの同期メカニズムを使用すればよいですか?