2009-11-12 7 views
17

나는OS 수준에서 수면은 어떻게 구현됩니까?

내가 추측하고 ...

  1. 은 당신이 할 프로세서 속도에 기반 할 수있다 ... C 라이브러리 또는 기본적으로 OS 수준에서 구현하는 방법을 sleep(time in ms) 단지 관심 while 노프의 루프 (나는 수면 시간이 정확한지 확실하지 않다.) ...
  2. 어떤 값을 쓰고 프로세서가 지정된 시간 동안 멈추는 프로세서의 특별한 레지스터 (이것은 매우 비효율적이다. 프로세서는 다른 프로그램도 실행할 수 없습니다).

실마리가 있습니까? 아마도 C 라이브러리의 소스 코드를 설명 할 수 있을까요? 나는 "C"가 그것을 구현하는 방법에 대해서 너무 특별하지 않다 ... 나는 단지 "sleep()"함수가 어떻게 구현되는지 궁금하다.

답변

14

Sleep()은 OS 수준에서 구현됩니다. 프로세서는 작업/스레드/프로세스가 잠자기 상태 일 때 회전하지 않습니다. 이 특정 스레드는 스레드가 실행 준비가 된 대기열에 놓일 시간이 만료 될 때까지 보류중인 대기열에 놓입니다 (스레드는 실행할 준비가되지 않았습니다).

그 동안 실행 준비가되어있는 다른 스레드가 실행됩니다.

OS가 스레드를 실행할 준비가되지 않은 경우에만 OS는 유휴 스레드로 들어가고 하드웨어 인터럽트가 발생할 때까지 일반적으로 프로세서를 종료 (또는 어쨌든 저전력 상태로 전환)하라는 지시를 내립니다.

매우 간단한 시스템 (임베디드 시스템 중 가장 단순한 시스템)의 경우에만 Sleep()이 실제로 대기중인 대기 루프로만 구현 될 수 있습니다.

"Modern Operating Systems" by Tanenbaum과 같은 운영 체제 텍스트 북은 아주 상세하게 다룹니다 (예전의 값싼 중고품도 포함).

+0

아 .. 시간 초과 후 깨어나지 않을 수 있습니다. 스케줄러 또는 시스템의 기본적으로 다른 작업에 이르기까지 ... ?? – FatDaemon

+3

제한 시간이 만료 된 후 작업이 다시 실행되는 시간은 스케줄러에 따라 다릅니다. 시스템은 타임 아웃이 만료되는 즉시 실행되도록 보장 할 수 있지만, 대부분은 ready-to-run 큐의 적절한 위치에 배치 할 것입니다 (스레드 우선 순위가보다 높으면 앞에 위치 할 수도 있음). 다른 것), 다음에 예정되어있을 때 달릴 것입니다. –

+0

많은 임베디드 프로세서는 재시작시 전용 절전 모드 – mocj

2

귀하의 질문에 대한 답변은 완전히 운영 체제 및 구현에 따라 다릅니다.

간단한 방법 : sleep()으로 전화하면 OS가 깨우기 시간을 계산 한 다음 어딘가에 우선 순위 대기열에 프로세스를 고정시킵니다. 그런 다음 대기 시간을 초과하여 대기 시간이 경과하기까지 실제 시간이 지나기까지 실행 시간을 확보하기 위해 프로세스를 예약하지 않습니다. 루프, 그렇지 않으면 시스템이 아무것도 할 수 없습니다 동안

1

당신은 어떤을하지 -하지 마우스, 키보드, 네트워크에 응답 등

일반적으로 대부분의 운영 체제는 무엇을 추가입니다 지연을 요청한 작업이 다시 시작될 때 (현재 해당 시간에 더 높은 우선 순위의 작업이 실행 중이 아닐 때) 타임 스탬프를 얻으려면 현재 시간 소인으로 지연하고 오름차순으로 정렬 된 목록에 [wakeupTimestamp, task pointer]를 추가하십시오 타임 스탬프에 의해. 그런 다음 OS는 컨텍스트 전환을 수행하고 다음 사용 가능한 작업을 실행합니다. 주기적으로 시스템은 졸린 목록의 가장 빠른 시간 소인과 현재 시간 소인을 비교하고 마감 시간이 지났을 때 잠자는 작업을 "준비"작업 대기열로 이동시킵니다.

+0

두 번째 부분에서는 지적인 것을 말하지만 첫 번째 부분에서는 너무 어리 석다. while 루프는 선점 가능하며 어떤 마우스 이벤트도 방해하지 않습니다. –

2

일반적인 운영 체제에서는 특정 시간이 경과 할 때까지 프로세스가 대기하도록 설정 한 다음 다른 프로세스가 실행되도록 커널을 호출합니다. 더 나은 일이 없으면 유휴 프로세스가 실행됩니다.시간이 경과하면 스케줄러는 수면 프로세스가 잘 진행되었다는 것을 알게되고 다시 스케줄링합니다.

+0

물론 Idle 프로세스는 HLT 명령을 실행하는 프로세스라는 점에 유의해야합니다. 최신 CPU에서는 매우 복잡해지고 수면 시간에 따라 CN 모드로 내려갑니다. (C0 각성, C1 짧은 수면, ... C7 긴 수면) –

1

전달 된 시간 값에 대해 작업/스레드를 잠자기로 차단합니다. 그 기간 동안 또는 다른 흥미로운 일 (신호 같은)이 발생할 때까지, 당신의 과제는 실행 불가능해진다.

sleep이 select()를 호출하고 대기 할 디스크립터를 전달하지 않고 잠자기 시간과 같은 시간 초과 값을 전달하는 경우는 드뭅니다.

시스템은 시간 경과 후에 타이머가 만료되도록 설정 한 다음 해당 타이머가 만료 될 때 신호를받을 세마포어를 기다리면서이를 구현할 수 있습니다. 따라서 해당 세마포어에서 차단됩니다.

관련 문제