x86 コンピュータアーキテクチャでは、HLT(halt)は、次の外部割り込みが発生するまで中央処理装置(CPU)を停止するアセンブリ言語命令です。[1]割り込みは、ハードウェアデバイスからCPUに送信される信号であり、CPUが対応すべきイベントが発生したことを警告します。たとえば、ハードウェアタイマーは一定の間隔でCPUに割り込みを送信します。
ほとんどのオペレーティング システムHLTでは、すぐに実行すべき作業がないときに命令が実行され、プロセッサがアイドル状態になります。たとえば、Windows NTでは、この命令は「システム アイドル プロセス」で実行されます。x86 プロセッサでは、のオペコードHLTは です0xF4。
ARM プロセッサでは、同様の命令としてWFI(Wait For Interrupt) とWFE(Wait For Event) があります。
x86 の歴史
8086以降のすべてのx86プロセッサにはこのHLT命令がありましたが、6.0より前のMS-DOSでは使用されておらず[2] 、1994年にIntel DX4プロセッサがリリースされるまで、特に電力消費を削減するように設計されていませんでした。MS-DOS 6.0は、 CONFIG.SYSにインストールできるPOWER.EXEを提供し、Microsoftのテストでは5%の節約ができました。[3]最初の100MHz DXチップの一部にはバグのあるHLT状態があり、Linuxの開発者はそれらのチップで実行するときに使用する「no-hlt」オプションを実装するようになりましたが[4]、これは後のチップで修正されました。
Intel はその後、プロセッサを譲り渡す追加の命令を導入しました。これには次のものが含まれます。
PAUSESSE2ではスピン ループを対象としています。ユーザー空間 (低権限リング) で使用できます。MONITOR/ はスレッド同期用のSSE3MWAITです。TPAUSE(時間指定の一時停止) およびUMONITOR/UMWAIT(ユーザー空間モニター/mwait)。ユーザー空間で使用可能です。
プロセス
最近のプロセッサの命令セットのほとんどには、さらに作業が必要になるまでプロセッサを停止する命令またはスリープ モードが含まれています。割り込み駆動型プロセッサでは、この命令は外部割り込みを受信するまで CPU を停止します。ほとんどのアーキテクチャでは、このような命令を実行するとプロセッサの電力使用量と発熱量が大幅に削減されるため、スリープやアイドルのビジー待機の代わりによく使用されます。ほとんどのプロセッサでは、停止 (ループではなく) によって次の割り込みの 待ち時間も短縮されます。
オペレーティングシステムでの使用
このHLT命令の発行にはリング 0 へのアクセスが必要なので、カーネルなどの特権システム ソフトウェアでのみ実行できます。このため、アプリケーション プログラミングでは、 Linux などのオペレーティング システムでこれ以上作業ができない場合に、その目的のために提供されているアプリケーション プログラミング インターフェイス(API)を使用するのがベスト プラクティスとなることがよくありますsched_yield()。[5]これは、プロセッサの「譲歩」と呼ばれます。これにより、オペレーティング システムのスケジューラは、他のプロセスが実行可能かどうかを判断できます。実行できない場合は、プロセッサを解放します。すべてのプロセスがスリープ状態または待機状態の場合、通常は HLT 命令を実行して、次のハードウェア割り込みまで電力消費を削減します。
参照
参考文献
- ^ 「Intel 64 および IA-32 アーキテクチャ ソフトウェア開発者マニュアル: 命令セット リファレンス AZ」。2012 年 3 月 1 日閲覧。
- ^ 「Virtual PC で DOS が CPU を 100% 使用する理由」。microsoft.com。2004年 12 月 20 日。2018年11 月 18 日に閲覧。
- ^ 「POWER.EXE および Advanced Power Management (APM) のサポート」。2014 年 9 月 27 日時点のオリジナルよりアーカイブ。2015 年 9 月 27 日閲覧。
- ^ 「Linux BootPrompt-HowTo」www.faqs.org . 2018年11月18日閲覧。
- ^ 「sched_yield(2) - Linuxマニュアルページ」。2020年9月2日閲覧。
