어떻게nanosleep
x86 Linux에서 구현되었나요?
설명에는 다음과 같이 나와 있습니다.
nanosleep()
최소한*req
지정된 시간이 경과할 때까지 호출 스레드의 실행을 일시 중단하거나, 호출 스레드에서 핸들러 호출을 트리거하거나 프로세스를 종료하는 신호를 전달합니다.
n
내가 나노초 동안 자고 싶다고 가정 해 봅시다 .
나의 초기 가정은 실행이 중단되었다는 것이었습니다 HLT
. 다음 "외부 인터럽트"가 발생할 때까지 일시 중지됩니다. 따라서 인터럽트를 예약해야 합니다.
- 지금부터
n
나노초 인터럽트를 예약하는 방법은 무엇입니까? - 내 프로세서는 이 시점에서 인터럽트를 어떻게 알 수 있습니까? 예를 들어 모든 주기를 확인합니까? 모든 주기를 확인한다면 루프에서 단순히 바쁜 대기를 하는 것보다 리소스를 덜 사용하는 방법은 무엇입니까?
답변1
리눅스에서는nanosleep
고해상도 타이머에 따라 다름. 이것메인 수면 루프주기
- 현재 작업을 절전 모드로 전환
- 타이머 시작
- 일정 변경
보류 중인 신호가 없고 타이머가 만료되지 않은 한( 타이머가 만료된 경우 t->task
가 됨 NULL
) 필요한 경우 다시 시작합니다(타이머가 만료되기 전에 신호가 처리되는 경우).
고해상도 타이머는 인터럽트를 제공합니다. 다음 HLT
과 같은 nanosleep
CPU 명령어를 사용하여