問題タブ [context-switching]

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 投票する
2 に答える
1058 参照

c++ - Boost インタープロセス コードを使用する場合の高い CSwitch (「コンテキスト スイッチ」) (Windows、Win32 上)

マルチスレッドアプリを書いています。

boost::interprocess クラスを使用していました (バージョン 1.36.0)

基本的に、私は作業が可能になったときに通知する必要があるワーカー スレッドを持っています。

「セマフォ」と「条件」の両方のアプローチを試しました。

どちらの場合も、ワーカー スレッドの CSwitch (コンテキスト スイッチ) は、1 秒あたり 600 回の切り替えなど、非常に高いように見えました。

私はコードを見て、(アトミックにミューテックスを使用して) フラグをチェックし、次に再試行する前にタイムスライスを生成するようです。

コードで WaitForSingleObject などを使用することを期待していました。

皮肉なことに、これはまさに私が「適切に」実行して Boost を使用することを決定する前に行っていた方法でした! (つまり、mutex を使用してフラグの状態を定期的にチェックします)。唯一の違いは、私のアプローチでは、チェックの間に 50 ミリ秒ほど寝ていたので、高い CSwitch の問題はありませんでした (そして、50 ミリ秒まで作業が開始されないことは問題ありません)。

いくつかの質問:

  1. この「高い」CSwitch 値は重要ですか?
  2. ブースト ライブラリがセマフォの代わりに CRITICAL_SECTIONS を使用していた場合、これは発生しますか (プロセス間の同期は気にしません - すべてのスレッドが同じプロセスにあります)。
  3. ブーストが WaitForSingleObject を使用していた場合、これは発生しますか?
  4. Boost ライブラリには、前述の Win32 待機メソッド (WaitForXXX) を使用する別のアプローチがありますが、これはこの CSwitch の問題に悩まされることはないと思います。

更新:これは疑似コード サンプルです。少し複雑になるため、実際のコードを追加することはできません。しかし、これは私がやっていることのほとんどです。これは、1 回限りの非同期アクティビティを実行するスレッドを開始するだけです。

注:これらは単なるイラストです。このサンプルには負荷がありません。たとえば、スレッドが「待機」に達する前に injectWork() を呼び出した場合、機能しません。ブーストの使い方を説明したかっただけです。

使用法は次のようなものです。

これはブーストを使用した例です。

そして、これが私の「素朴な」ポーリングコードです。

乾杯、

ジョン

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

java - 不要なJavaコンテキストスイッチ

WindowsXPで実行されている固定容量チャネルを介して通信するJavaスレッド(フローベースプログラミング)のネットワークがあります。「グリーン」スレッド(プリエンプティブではない)の経験に基づいて私たちが期待したのは、チャネルが大きくなった場合、スレッドがコンテキストを切り替える頻度が少なくなる(したがってCPU時間が短縮される)ということです。ただし、チャネルサイズを増やしても、実行時間に違いはないことがわかりました。起こっているように見えるのは、チャネルがいっぱいまたは空ではない場合でも(つまり、スレッドを一時停止する必要がない場合でも)Javaがスレッドを切り替えることを決定することです。これは、明らかな利点がないためにCPU時間を消費します。また、スレッドの優先順位を変更しても、目に見える違いはありません。

私の質問は、不要なコンテキストスイッチを作成しないようにJavaを説得する方法があるかどうかですが、スレッドを切り替えることが本当に必要になるまで切り替えを延期します-Javaのディスパッチングロジックを変更する方法はありますか?それとも、私が注意を払っていなかった何かに反応しているのでしょうか?!または、他の非同期メカニズム、たとえばスレッドファクトリ、Runnable(s)、デーモン(!)もあります。これまでのところ、私の特派員の誰も答えを思い付いていないので、答えは自明ではないようです(最近の2人のCS教授を含む)。あるいは、私がそれを知らないことを人々が想像できないほど明白な何かを見逃しているのかもしれません...

ここに送信コードと受信コードを追加しました-あまりエレガントではありませんが、機能しているようです...;-)疑問に思われるかもしれませんが、「送信」のgoLockロジックが問題の原因である可能性があると思いましたが、削除しました一時的に何の違いもありませんでした。送受信用のコードを追加しました...

public synchronized Packet receive() {

}

synchronized boolean send(final Packet packet, final OutputPort op) {

}


質問してくれてありがとう!私はSunフォーラムで同じ質問について話し合っていますが、これがそのフォーラムでの最後の投稿です。

現時点での最善の推測は、この効果はWindowsのスケジューリングロジックに起因するということです。

Microsoftは、UMSを導入しているため、この領域を改善する必要があることを認めているようです。「UMSは、マルチプロセッサまたはマルチコアシステムで多数のスレッドを同時に効率的に実行する必要がある高性能要件のあるアプリケーションに推奨されます。...UMSが利用可能です。 64ビットバージョンのWindows7およびWindowsServer2008 R2以降。この機能は、32ビットバージョンのWindowsでは使用できません。」うまくいけば、Javaはいくつかの後のリリースでUMSを利用するでしょう。

ご協力いただきありがとうございます!

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

multithreading - Windows でのコンテキスト スイッチ間のタイム フレームはどれくらいですか?

C# 2.0 経由で CLR を読み取る (現時点では 3.0 を持っていません)

これはまだですか:

コンピューターに CPU が 1 つしかない場合、一度に実行できるスレッドは 1 つだけです。Windows は、スレッド オブジェクトを追跡する必要があり、Windows は、次に CPU に行くためにどのスレッドをスケジュールするかを決定する必要があります。これは、20 ミリ秒ごとに実行する必要がある追加のコードです。Windows が CPU に 1 つのスレッドのコードの実行を停止させ、別のスレッドのコードの実行を開始させるとき、これをコンテキスト スイッチと呼びます。コンテキスト スイッチは、オペレーティング システムが次のことを行う必要があるため、かなりコストがかかります。

したがって、C# 2.0 経由の CLR については、Pentium 4 2.4 GHz 1 コア、非 HT、XP を使用しているとします。20ミリ秒ごと?CLR スレッドまたは Java スレッドが OS スレッドにマップされている場合、1 秒あたり最大 50 スレッドしか実行できない可能性がありますか?

ここSOではコンテキスト切り替えがミリ秒単位で非常に高速であると読んだことがありますが、5年ほど前のサーバーWindows 2003 Pentium XeonシングルコアがOSにコンテキスト切り替えの機会を与える頻度はどれくらいですか? 右の領域で 20 ミリ秒?

正確な数値は必要ありませんが、それが適切な領域にあることを確認したいだけです。私にはかなり長いようです。

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

iphone - iOS4-高速コンテキストスイッチング

アプリケーションがバックグラウンド実行状態に入ると、ダーティメモリの使用量を増やすことができます。アップルのビデオでは、ダーティメモリを可能な限り減らす必要があると述べられています。

しかし、私のアプリでは、ナビゲーションコントローラーを使用してビューをプッシュおよびポップしています。約20の異なるページから移動した後、ダーティメモリの使用量は30MB程度に達します。

また、「dismissModalViewControllerAnimated」および「popViewControllerAnimated」では、deallocは呼び出されません。

私には2つの疑問があります:

  1. どのくらいのダーティメモリがライブになるのに許容されますか?
  2. 戻るボタンをサポートするナビゲーションコントローラーの代替手段は何ですか?

前もって感謝します。

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

multithreading - マルチコアプロセッサでスレッドのコンテキスト切り替えはどのように行われますか?

シングルコアプロセッサでコンテキスト切り替えを行う場合、責任のあるコードは、スレッドの切り替えを処理する唯一のCPUで実行されます。

しかし、複数のCPUがある場合、これはどのように行われますか?すべてのスレーブCPUのすべてのコンテキストスイッチングを行うマスターCPUはありますか?各CPUは、独自のコンテキストスイッチングを担当していますか?もしそうなら、2つのCPUが同じスレッドを実行しないように、スイッチングはどのように同期されますか?または、他のメカニズムがありますか?

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

multithreading - 最大の制限。マルチスレッドで作成できるスレッド

複数のスレッドが、たとえば他のいくつかのプロセスによって同時に呼び出されています。一般的に最大の経験則です。プロセッサがパフォーマンス効率を向上させるために開始できるスレッドの数はありません。スレッド数 = いいえ。プロセッサー数 + 1 (確かではありません)。最新のアプリケーションはすべてスレッドプールを維持し、特定のインスタンスでスレッドを再利用し続けます。

これによりパフォーマンスが低下しないようにするにはどうすればよいでしょうか。制限を超えると、スレッドはコンテキストの切り替えを続け、特定の時点でコードのクリティカル セクションを実行するスレッドがなくなるためです。

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

java - スレッドでコンテキスト切り替えを行っている OS をキャッチできますか?

Java で Context Switch によって中断されているスレッドをキャッチする方法を知りたいです。2 つのスレッドが並行して実行されており、どちらも同じ int を上下に変更しています。レポートのために、スイッチをキャッチして何かを行う方法を知りたいと思います。(例えば、それが起こったときに単純な System.out を作成します) ありがとう!

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

linux - スレッドがシステムコールを呼び出すときのコンテキスト切り替え

複数のスレッドを持つプロセスがあります。スレッドの1つがのようなシステムコールを呼び出す場合gettimeofday()、カーネルはそのスレッドをコンテキスト外に切り替えてシステムコールを処理するだけですか、それともプロセス全体(および他のすべてのスレッド)をコンテキスト外に切り替えますか?

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

php - PHPコンテキストスイッチング

クラシックASPの世界からは、コンテキスト切り替えの問題がありました。コンテキストの切り替えとは、PHPタグを開き、phpコードを少し記述してから、タグを閉じ、HTMLを少し続けて、PHPに戻り、これらの切り替えを頻繁に行うことです。ASPでは、このスタイルのプログラミングは推奨されていません。可能な限り最小化することをお勧めします。

言い換えれば、ASPでこのようなコードを書く代わりに

My name is <%response.write myName %> and I am <%response.write myage %> years of age.

次のようにコードを書くことをお勧めします。

<%response.write "My name is " & myName & " and I am " & myage & " years of age."%>

後者の場合、ASP.DLLはスクリプトの解析に費やす時間が少なくなります。

私の質問は、この概念/問題/心配はPHPの世界に当てはまるかどうかです。

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

java - ObjectOutput / InputStream のコンテキスト切り替え

開いている ObjectOutputStream は最初に特定のオブジェクトを送信し、補完する ObjectInputStream はそれを正常に逆シリアル化します。この OIS は、別のスレッド クラスのコンストラクタに渡されます。これは、さらに (更新された) オブジェクトをシームレスに read() し続けるために必要です。この部分は起こっていません。ここでストリームが「コンテキスト切り替え」を行うときの要件について、私を逃れているものはありますか? どうもありがとう。