問題タブ [preemption]

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.

0 投票する
3 に答える
347 参照

multithreading - 基本的なマルチスレッド

次のインタビューの質問があります。

foo メソッドを介して実行される 2 つの並列スレッドがあります。最後の sum の値は 100 から 200 まで変化します。問題はその理由です。私が理解しているように、1 つのスレッドのみが CPU を取得し、スレッドは実行中にプリエンプトされます。外乱によって合計が 200 にならないのはどの時点ですか?

0 投票する
2 に答える
4802 参照

linux - 「カーネルプリエンプション」と「割り込み」に違いはありますか?

私はちょうど言う記事を読んでいます:

割り込みシステムを制御する理由は、一般的に同期を提供する必要があるということです。割り込みを無効にすることで、割り込みハンドラーが現在のコードをプリエンプトしないことを保証できます。さらに、割り込みを無効にすると、カーネルプリエンプションも無効になりますただし、割り込み配信を無効にすることも、カーネルプリエンプションを無効にすることも、別のプロセッサからの同時アクセスからの保護を提供しません。

だから私はただ割り込みとカーネルプリエンプションの違いを疑問に思います。

または、カーネルプリエンプションを無効にすると割り込みも無効になると言えますか?

0 投票する
1 に答える
5310 参照

c++ - ユーザーモードでスレッドのプリエンプションを回避するにはどうすればよいですか

13 の機械語命令だけで完了する単純な決定論的な作業があります。最初の命令は自家製のセマフォ (スピンロック) を取得し、最後の命令はそれを解放するため、他のコアで実行されている他のすべてのスレッドが同じセマフォを取得および提供しようとしているのを防ぐことができます。

この問題は、スレッドが「クリティカル セクション」を終了する前に、セマフォを保持しているスレッドに割り込むと発生します。最悪の場合、セマフォを保持している間に割り込みによってスレッドが強制終了されるか、通常はセマフォをめぐって競合するスレッドの 1 つがコードに分岐し、割り込みを生成してデッドロックが発生する可能性があります。

私が制御できないコードの部分に分岐するときに、これらの他のスレッドと同期する方法がありません。カーネル モードで実行していた昔の VxWorks 時代に行っていたように、割り込みを無効にする必要があると思います。常に 13 の命令であり、割り込みを受け入れる前に 13 の命令すべてを完了できれば、私は常に完全に安全です。ああ、それはすべて私自身の内部データであり、自家製のセマフォが他のものをロックするものは何もないことを除いて.

私は近いと思ういくつかの答えを読みました。ほとんどの場合、Windows API でのクリティカル セクションの呼び出しに関係しています (OS は間違っていますが、概念は正しいかもしれません)。間違った解決策のほとんどは、pthread ライブラリで作成したミューテックスを使用して、問題のあるすべてのスレッドを取得できると想定しています。

Linux および Solaris 上の C/C++ でこのソリューションが必要です。

Johnny Crash の質問は非常に近いもの で、Linux スレッドがスケジューラによって中断されるのを防ぎます

KermitG また 、重要なコードで Linux ユーザー空間の pthread が生成されるのを防ぐことはできますか?

ご検討いただきありがとうございます。

0 投票する
2 に答える
7374 参照

linux - Linuxでは、SCHED_FIFOスレッドはSCHED_OTHERスレッドによってプリエンプトされます

テストするためのテストプログラムを作成しましたSCHED_FIFO。スレッドSCHED_FIFOによってプリエンプションできないことを学びました。SCHED_OTHERしかし、同じプログラムを複数回実行した場合の結果を説明することはできませんでした。

複数の実行で予期しない結果が発生しました。スレッドSCHED_FIFOがプリエンプションされていSCHED_OTHERます。つまり、プログラムに従って、スレッド2はFIFOモードで、スレッド1はSCHED_OTHERモードです。thread2がthread1にプリエンプションされるのを何度も見ました。

誰かが問題を見つけるのを手伝ってくれますか?

0 投票する
1 に答える
735 参照

linux-kernel - Linux (2.6.32) でプリエンプタブルでないプロセス

プロセスをプリエンプタブルにしようとしています。スケジューラ ポリシーを に変更し、 99SCHED_FIFOに設定しrtprioました。IO 割り込みがない場合、プロセスが開始されるとすぐに、プロセスが他のプロセスによってプリエンプトされないという保証はありますか? rtprio=99 が最高の優先度ですか、それともより優先度の高いカーネルのプロセスがまだありますか? 最後に、プロセスが実行中にプリエンプトされたかどうかを知るにはどうすればよいでしょうか?

0 投票する
0 に答える
490 参照

android - Android でのプロセス コンテキストの切り替えの防止

これは少し極端に思えるかもしれません。アプリケーションのプロセスが Android OS によってプリエンプトされるのを防ぐ方法があるかどうか、興味があります。私は C++ でタイム クリティカルなテストを行っていますが、OS が別のプロセス (この場合は私の制御外のネイティブ プロセス) にコンテキストを与えるかどうかによって、結果が異なる可能性があります。

少なくとも一定期間、プロセス制御を保証する方法はありますか? (プロセスのタイムスライスを具体的に定義するなど)バックグラウンドプロセスの動的な優先度を制御することを示唆するドキュメントに出くわしましたが、これが保証された、および/または安全な方法であるかどうかはわかりません. threads.h 内の定義をオーバーライドする可能性があります

何か案は?クリエイティブなソリューションは大歓迎です。

0 投票する
2 に答える
527 参照

linux - Linux で preempt_notifier をユーザー プロセスにアタッチする

ユーザープロセスが何らかの形でプリエンプトされたかどうかを特定する必要があります.preempt.hとsched.cにフックがあり、プロセスが再スケジュールまたはプリエンプトされるたびにsched_in関数とsched_out関数を呼び出すことができるpreempt_notifiersを定義できることを理解しています.

しかし、通知機能をユーザー空間の特定のプロセスまたは pid にアタッチし、この特定のプロセスがプリエンプトされたかどうかを何らかの方法でログに記録する方法をまだ見つけることができません。そのためにはモジュールを作成する必要があると思いますが、pid を特定のノーティファイアーにアタッチするにはどうすればよいでしょうか?

0 投票する
2 に答える
2124 参照

x86 - x86アーキテクチャのプリエンプションはどのように機能しますか?

プリエンプションについて1つのことを理解するのに苦労しています。ウィキペディアの引用:

コンピューティングにおいて、プリエンプション(より正確にはプリエンプション)とは、コンピュータシステムによって実行されているタスクを、その協力を必要とせずに、後でタスクを再開することを目的として一時的に中断する行為です。このような変更は、コンテキストスイッチと呼ばれます。これは通常、特権タスクまたはプリエンプティブスケジューラと呼ばれるシステムの一部によって実行されます。プリエンプティブスケジューラは、システム内の他のタスクをプリエンプションまたは中断し、後で再開する機能を備えています。

したがって、基本的に、スケジューラーは現在実行中のタスクを中断できると彼らは言います。どうしてそれも可能ですか?CPUは現在、スケジューラのコードではなく、このタスクのコードを実行しています。では、スケジューラーはどのように何かを行うことができますか?

私の推測では、一定の時間が経過した後にCPUを物理的に中断し、スケジューラーに制御を戻す、ある種のハードウェアタイマーが必要です。これは正しいです?それについてもっと詳しく読むことができるドキュメントはありますか?

どんな答えでも大歓迎です。

0 投票する
1 に答える
1701 参照

linux - Linux HZ と公平なスケジュールのタイムスライス

そのsched_fair.c中には:

Linux の公正なタイムスライスは、nr_running とこの公正なタスクの相対的な重みによって異なることは理解していますが、コードを研究することで、タイムスライスを 1 ~ 5 ミリ秒に保つことが主なアイデアであることがわかりました。理解が間違っていたら訂正してください。私はここで間違っているに違いありませんが、方法がわかりません!

また、HZ、または 1 秒あたりのシステム ティック数、または 1 秒あたりのタイマー割り込み数は、通常、アーム マシン (およびほとんどの非デスクトップ マシンも) で 200 または 100 であり、5 ~ 10 ミリ秒のティックが得られます。レート。

set_next_entity()タイムスライスは、公平なタスクの実行がスケジュールされるたびに rq->hrtick_timer を開始しresched_task()、タイムアウト コールバック関数を呼び出すことによって動作しますhrtick()。このタイマーは、ティックごとにタイマー irq ハンドラーによって処理されるキューに入れられたタイマーの 1 つtimer_tick()ですrun_local_timer()。他に隠された秘密はないようです。

では、5 ミリ秒よりも短いタイムスライスを取得するにはどうすればよいでしょうか? これを理解するのを手伝ってください。どうもありがとうございました!

0 投票する
1 に答える
563 参照

hadoop - Hadoop ノードの一時停止 - バックグラウンド Hadoop クラスタ

「バックグラウンド」の Hadoop クラスターをインストールすることは可能でしょうか。つまり、結局のところ、ノードが利用できない、または遅い場合があることに対処できるようにするためのものです。

したがって、ある大学にコンピューター室があると仮定します。たとえば、100 台のボックスにはすべて、高級デスクトップ ハードウェア、ギガビット イーサナー、おそらく同一のソフトウェア インストールが含まれています。ここでも Linux は非常に人気があります。

ただし、これらの 100 ボックスはもちろん、学生向けのデスクトップ システムを対象としています。ラボがいっぱいになる時もありますが、ラボが空になる時もあります。ユーザー データは主に中央ストレージ (NFS など) に保存されるため、ローカル ディスクはあまり使用されません。

アイドル時間にシステムを Hadoop クラスターとして使用することは、私には良い考えのように思えます。もちろん、最も単純なセットアップは、cron ジョブでクラスターを夜間に開始し、朝にシャットダウンすることです。ただし、日中も多くのコンピュータが使用されません。

しかし、Hadoop は、ユーザーがログインしたときにノードがシャットダウンされた場合などにどのように反応するのでしょうか? Hadoop でノードを簡単に「一時停止」(プリエンプト!) し、必要に応じてノードを移動してスワップすることは可能ですか? 理想的には、Hadoop に、タスクを一時停止する前に (メモリを解放するためにも) 計算を取り除く機会を与えます。このような設定を行うにはどうすればよいでしょうか。ノードが一時停止されることを Hadoop に通知する方法はありますか?

私が知る限り、データノードは停止すべきではなく、3 つ以上のコピーを持つようにレプリケーションを増やす必要があるかもしれません。YARN では、タスクトラッカーを任意のノードに移動することによって、ある時点で中断されるノードになる可能性があるという問題もあるかもしれません。しかし、常にオンになっており、タスク トラッカーを実行する少数のノード セットがあることを制御できる場合があります。

または を送信するだけstopで適切ですか(その後、 で再開します)? 1 つ目はおそらく Hadoop に反応する機会を与え、2 つ目はユーザーがすぐにログアウトすると (ジョブが続行できるため) より速く続行します。ヤーンはどうですか?tasktrackerSIGSTOPSIGCONT