問題タブ [context-switch]
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.
operating-system - カーネルモードからユーザーモードに戻る
Unixカーネルのモードスイッチの理解について少し混乱しています。私はここで私の理解を与え、議論/修正のためにそれを開きます。
ユーザーモードからカーネルモードに移行している間、プロセッサはプロセスごとのユーザースタックとプロセスごとのカーネルスタックを切り替えます。次に、プロセスごとのユーザースタックセグメントセレクターとスタックポインターがカーネルスタックに格納され、eip
命令ポインター(ユーザーモードでのリターンアドレス)とその他のハードウェアレジスタがカーネルスタックにプッシュされます。
カーネルがユーザーモードに戻る必要がある場合、trapret
コードはカーネルスタックに格納されているすべての値をハードウェアレジスタにポップバックします。
ただしiret
、カーネルスタックからeipをポップする場合、実行する必要がある次の命令は、ユーザーモードのリターンアドレスです。
これは、カーネルスタックの他の値を完全にポップすることなく発生します。
残りの値()はどのよう%cs, %eflags, %esp, %ss
に復元されますか?
カーネルスタックに存在するuser-stack-pointerはどのように%espにポップバックされますか?
operating-system - カーネルが ISR ルーチンを実行している間の制限事項
カーネル モードと ISR Routine 内で重要なすべきこととすべきでないことは何ですか? 例えば -
- 割り込みハンドラ実行中のコンテキスト切り替えは無効ですか?
- プロセスがクリティカル
セクション内にある場合、コンテキスト スイッチは発生しますか? - カーネル モード内のどのような状況で、それ以上の割り込みを無効にする価値がありますか?
プロセス切り替えは、プロセスがディスクからデータをフェッチするページフォールトで発生する可能性がありますが、他の割り込みの発生時には発生しません。実行可能パスが中断/再スケジュール/プリエンプトされる可能性があるかどうかをどのように分類しますか?
プロセスがカーネル モードにあるとき、または ISR ルーチンを処理するときに覚えておく必要がある他のことは何ですか?
performance - LinuxでCプログラムキャッシュのヒット/ミスとCPU時間を測定する最も簡単なツールは?
C で小さなプログラムを書いていますが、そのパフォーマンスを測定したいと考えています。
プロセッサでの実行時間と、キャッシュ ヒット + ミスの回数を確認したいと考えています。コンテキスト スイッチとメモリ使用量に関する情報もあると便利です。
プログラムの実行には 1 秒もかかりません。
/proc/[pid]/stat の情報は気に入っていますが、プログラムが終了した/終了した後にそれを確認する方法がわかりません。
何か案は?
編集: Valgrind は多くのオーバーヘッドを追加すると思います。そのため、/proc/[pid]/stat のような、常にそこにあるシンプルなツールが必要でした。
c - CPU の丸めモードはいつ変更できますか?
かなりの数の記事で、fistp
float->integer を高速に変換するための命令を使用することを提案しています。これは、CPU の現在の丸めモードに依存するため、設定する必要があります。
しかし、この丸めモードは、プログラムの実行中に他のプログラムによって変更される可能性がありますか? OSによる?
さらに悪いことに、これは可能なシナリオ (疑似コード) ですか?
x86 - (カーネルの作成) 割り込み記述子テーブルを変更するにはどうすればよいですか?
低レベルのものを少しいじるために、小さなカーネルを書いています。現在、Virtual Box で起動し、画面にテキストを表示したり、メモリを割り当てたり、その他の非常に基本的なことを行うことができます。C++ と少しの asm で書かれています。
私が探求したかったことの 1 つは、マルチタスクの背後にあるメカニズムでした。私が理解しているように、それは次のようになります。
- カーネルは、割り込み記述子テーブルを初期化して、割り込みが定期的に (ミリ秒単位など) 発行されるようにし、カーネルで定義されたルーチンを呼び出します。
- ルーチンが呼び出されると、コード/データ セグメントとスタック ポインタを別のプログラムのコンテキスト (「コンテキスト スイッチ」) のセグメントに設定することができます。
ですから、コンセプトは単純に見えましたが、詳細はもっと複雑になることはわかっていました. オンラインでいくつかのものを見つけましたが、用語は大きく異なり、例は私が持っていないコンテキスト (Linux カーネル内など) からのもののようです。
ただし、記述子テーブルを設定する方法は次のようです。
- いくつかのデータを PIC (およびその他) に送信
outb
して初期化します。 - 必要なルーチンへの関数ポインターを使用して、メモリ内に割り込みテーブルを準備します。関数がシグナル ハンドラーになることができるように注意してください。
- でテーブルをロードします
lidt
。
ただし、これらのことを具体的に行うこと、またはこれが正しいかどうかについては、あまりわかりません。当惑したカーネルライターのためのリソースを持っている人はいますか?
windows - 各スレッドが CPU レジスタを持つ方法
私が読んだいくつかの場所で、
各スレッドには、独自の CPU レジスタ セットと独自のスタックがあります。
ここで、スタックについて理解できます。これはデータ構造です。しかし、スレッドが独自の CPU レジスタを持つことができる方法。それらは数が固定されており、システムで実行されているスレッドの数は無制限です。
よろしく
c - プロセスが切り替えられるたびに kernel/sched.c/context_switch() が呼び出されることが保証されていますか?
Linuxカーネルを変更して、現在のPIDが変更されるたびに、つまり新しいプロセスが切り替えられるたびに、いくつかの診断コードが実行されるようにしたいと考えています(興味がある場合は、以下の詳細な説明)。いろいろ調べてみたところ、スケジューラーが新しいプロセスを選択するたびに関数context_switch()
が呼び出されるようです。これは理にかなっています (これはsched.c/schedule()
.
問題は、Linux スケジューラーが今の私にとって基本的にブラック マジックなので、その仮定が正しいかどうか知りたいということです。CPU で時間を取得するために新しいプロセスが選択されるたびに、context_switch() 関数が呼び出されることが保証されていますか? または、他の状況でスケジューリングを処理できるカーネル ソース内の他の場所はありますか? (または、私はこれらすべてを完全に誤解していますか?)
いくつかのコンテキストを提供するために、私は MARSS x86 シミュレーターを使用して、特定のプログラムの計測と測定を実行しようとしています。問題は、データの誤解を避けるために、特定のコード イベントがどの実行プロセスに対応するかをインストルメンテーションが知る必要があることです。MARSS に組み込みのメッセージ パッシング システムを使用して、すべてのコンテキスト スイッチで新しいプロセスの PID を渡し、現在実行中の PID を常に認識できるようにするという考え方です。誰かがそれを達成するためのより簡単な方法を考えることができれば、それも大歓迎です.
operating-system - FreeRTOS コンテキスト切り替え中に MSP430 CRC レジスタを保存できますか?
MSP430F5418 と FreeRTOS 7 をミディアム データ モデルで使用しています。
FreeRTOS コンテキスト スイッチで MSP CRC レジスタを保存したいと考えています。porttext.s43 を次のように編集しました。
セーブ コンテキスト マクロで、15 個のレジスタをスタックにプッシュした後、CRC レジスタをプッシュします。(CRCDI は保存する MSP レジスタです)
復元コンテキスト マクロでは、15 個のレジスタをポップする直前に CRC をポップしました。
機能しているはずですが、そうではありません。プログラム制御は場所を認識しません。
誰にもアイデアはありますか?
.net - コンテキスト切り替え時間はスレッドのクォンタム時間に含まれますか?
つまり、スレッドのクォンタム時間が 20 ミリ秒の場合、20 時間の一部 (15 ミリ秒) がコンテキスト スイッチに費やされ、他の時間 (5 ミリ秒) が実行に費やされるのでしょうか?
linux - ここで sys time が 0 になっているのはなぜですか?
私がするとき$(time sleep 1)
、私は得ました:
sys
時間が 0 だった理由がわからないのでnanosleep
、ユーザー空間から呼び出されますか?
また、リアルタイムはコンテキスト切り替え時間 + 実際のスリープ時間 (1 秒) と同じですか?