マルチスレッドの重要な部分を学んでいます。私は一般的な声明を持っています:
シングル CPU システムでは、割り込みをディセーブルにすることが競合状態の解決策です。
しかし、他のウェブサイトでも学びました。
スレッドは通常、お互いに干渉しません。
では、競合状態を防ぐために割り込みをどのようにディセーブルにしますか?これをLinuxの観点から説明できますか?
ベストアンサー1
最初の説明は正確ですが、Linuxや他のシステムでは意味がありません。これは、ほとんどのドライバまたはハードウェア処理が割り込みを介して実行され、これを異なる方法で実行することは不可能であるためです。たとえば、ネットワークからパケットが到着すると、CPUはネットワークカードによって開始された割り込みを介してこれを学習します。
ただし、これらの割り込みはユーザー空間プロセスには見えず、影響を与えません。
まれで一般的な組み込みシナリオを除いて、Linuxは割り込みなしで動作します。
競合状態を引き起こす可能性があるのは、カーネルがあるプロセスからCPUを取得して別のプロセスに提供する場合のコンテキスト切り替えです。通常、タイマ割り込みによって発生します。 1つのプロセスのみが実行されている場合、またはスケジューラ全体が何らかの方法でシャットダウンされた場合(一部の組み込み環境では可能性がありますが非常に珍しい)、これは発生せず、DOSなどの単一のプロセスシステムを持つことになります。実際にマルチタスクがないため、競合状態は不可能です。
マルチCPUシステムでは、アクティブスケジューラがなくても複数のスレッドを同時に実行できるため、複数のCPUが同時にアクティブになると競合状態が発生する可能性があります。この状況は、Linux(または組み込まれていないオペレーティングシステム)にも非常に不均一です。
2番目の文章「スレッドはお互いを邪魔しません」はほとんど真実です。スレッドは本質的にプロセスであり、同じアドレス空間を使用します。複数のスレッドは通常、お互いを邪魔しません。たぶん彼らはお互いに信号を送るかもしれませんが、それはすべてです。このステートメントは以前のステートメントとは無関係です。