どのようにnanosleep
x86 Linuxで実装されましたか?
説明には次のように記載されています。
nanosleep()
少なくとも*req
、指定された時間が経過するまで呼び出しスレッドの実行を中断したり、呼び出しスレッドでハンドラー呼び出しをトリガーしたり、プロセスを終了したりする信号を転送します。
n
私がナノ秒間寝たいとしましょう。
私の最初の仮定は、実行が中断されたということでしたHLT
。次の「外部割り込み」が発生するまで一時停止します。したがって、割り込みを予約する必要があります。
- 今から
n
ナノ秒割り込みを予約する方法は? - 私のプロセッサはこの時点で割り込みをどのように知ることができますか?たとえば、すべてのサイクルを確認しますか?すべてのサイクルを確認する場合、ループで単に忙しい待機を行うよりもリソースを少なく使用する方法は何ですか?
答え1
Linuxではnanosleep
高解像度タイマーによって異なります。これメイン睡眠ループサイクル
- 現在のジョブを省電力モードに切り替える
- タイマー開始
- スケジュールの変更
保留中の信号がなく、タイマーが期限切れになっていない限り(タイマーが期限切れになっている場合)、必要に応じて再起動t->task
しNULL
ます(タイマーが期限切れになる前に信号が処理されている場合)。
高解像度タイマーは割り込みを提供します。次HLT
のnanosleep
CPU命令を使用して