コンテキストスイッチ時間は純粋なオーバーヘッドであり、使用できません。私はどのようにしてコンテキスト切り替え時間を短縮できますか?もっと多くのレジスタを使用していますか?コンテキストスイッチ時間をどのように減らすのですか
答えて
はオペレーティングシステムですか?コンテキスト切り替え時間は、保存/復元する必要のあるレジスタに依存します。時間を節約できる方法の1つは、新しいプロセッサー上のAVX拡張機能を使用することです。これにより、すべてのレジスターを1つのメモリーブロックに保存/リストアすることができます。
いいえ私はオペレーティングシステムを書いていません。これは、インタビューで尋ねられました –
コンテキスト切り替え時間を直接変更することはできません。コンテキストスイッチで時間を費やすことを避ける唯一の方法は、CPUよりもアクティブなスレッドの割り当てを避け、スレッドをブロックしないことです(つまり、スリープまたはクリティカルセクション経由で) –
コンテキストサイズを最小化したり、コンテキストスイッチを回避したりしないでください。どのように正確に行うのかは、コンテキスト(あなたが切り替えるコンテキストではなく、問題のコンテキスト、CPU、OSなど)によって異なります。
x86 CPUでは、浮動小数点ユニットの状態が変わらない場合に不要な保存と復元を避けることができます。これは、コンテキスト切り替え中にCR0
のtask switched
ビットを1に設定し、次に新しいスレッドの最初のFPU命令から発生する特別なCPU例外を待つことによって行われます。それが発生すると、古いスレッドのFPU状態を保存し、現在のスレッドのFPU状態をロードし、CR0.TS
をリセットして、そのFPU命令で実行を再開します。スレッドが出て行っても例外は発生しない場合は、スレッドがFPU作業をしておらず、フルコンテキストスイッチを実行していないことを意味します。
真ですが、最新のプロセッサ[TSフラグ](http://stackoverflow.com/questions/2711044/why-doesnt-linux-use-the-hardware-context-switch-via-the-tss) – doug65536
ロック競合を最小限に抑えるスレッド化ポリシー、同期メカニズム、およびデータ構造を実装することは、プログラマに任されます。あるスレッドが別のスレッドによって既に獲得されているロックを取得しようとすると、それは非常に短時間で解放されることを望んで、何度かポーリングしてコンテキストスイッチを放棄して実行することを望んでいます。
この質問がLinux管理者の観点からのものだった場合、最小タイムスライス(sched_latency_nsとsched_min_granularity_nsを参照)を増やすか、プロセッサーの需要が利用可能なプロセッサの数余分なプロセッサーを使用するとコンテキストスイッチ率が大幅に低下します。既存のプロセッサーを「切り替える」必要はなく、アイドル状態のプロセッサーを使用できます。
私は[this](http://stackoverflow.com/questions/8868135/how-do-we-reduce-context-switch-time#comment11081651_8868147)に答えました。 – doug65536
コンテキストの切り替えが役に立たないとは言いません。あらゆる種類の「マルチタスク」システムを実装することが基本です。コンテキストスイッチがかかる時間が純粋なオーバーヘッドであると言うと、IMHOは過度の単純化です。追加を行う時間がオーバーヘッドであると言っているようなものです。物理マシン内での処理には時間がかかります。また、使用可能なレジスタの数は、命令セットとABIの規則によって定義されます。 –
Valid Point @BasileStarynkevitch、私はこの質問にもっと注意を払うべきでした。 –
「もっと登録しているのは私たちがそうするのを助けていますか? – Mikhail