퐁키조아 2021. 12. 29. 00:20

1. Sleeping

Sleeping: 프로세스가 CPU 자원을 갖지 못하게 한다. 즉 해당 프로세스는 실행되지 못하고 가만히 있게 된다.

REALTIME, MONOTONIC 시계는 Sleep 하는 동안 계속 시간이 흐르지만, PROCESS_CPUTIME, THREAD_CPUTIME 시계는 Sleep 하는동안 시간이 멈춘다.

 

$\verb|sleep(int seconds)|$
  • seconds 만큼 재우는 Low Resolution Sleeping 함수
  • 리턴값은 "Number of seconds not slept" 이다. 즉 Sleep에 성공하면 0을 리턴하고, 그렇지 않으면 0과 seconds 사이의 값을 리턴한다. (시그널 받는 경우 수면 방해함)

 

$\verb|nanosleep(struct timespec *req, struct timespec *rem)|$
  • req 시간 만큼 재우는 Nanosecond Resolution Sleeping 함수
  • 리턴값은 성공 시 0, 실패 시 -1이다. 시그널을 받아 수면을 방해했을 경우 errno에 EINTR이 저장되고, rem에 남은 수면 시간을 저장한다.

 

$\verb|clock_nanosleep(clock_id, int flags, struct timespec *req, struct timespec *rem)|$
  • nanosleep과 기능은 같지만 어떤 시계로 측정할지와 상대/절대 시간을 사용할지 정할 수 있는 함수
  • clock_id에는 POSIX clock들을 넣으면 된다. 이때 PROCESS_CPUTIME, THREAD_CPUTIME 은 잠들어있는동안 시간이 흘러가지 않으므로 깨울 수가 없다. 따라서 이 시계들은 사용이 불가능하다.
  • flags에는 $\verb|TIMER_ABSTIME|$ (절대 시간) 이나 0 (상대 시간)이 들어간다.

 

추가로 이전에 Multiplexd IO에서 배운 select() 시스템 콜도 timeout을 이용해 sleep을 할 수 있다.

 

 

2. Alarms

$\verb|unsigned int alarm(seconds)|$
  • 프로세스에게 seconds 초 이후에 SIGALRM 시그널을 보내라는 알람 함수 (따라서 시그널 핸들러가 필요함)
  • 알람이 대기하고 있는 중에 새로운 알람을 설정하면 이전 알람을 취소하고 덮어씌움
  • 리턴값은 이전에 설정한 알람의 남은 시간
  • seconds가 0일 경우 알람을 생성하진 않고 이전의 알람을 초기화하는 역할을 한다.

 

3. Overruns

시스템 콜은 요청받은 시간만큼은 Sleep되는 것을 보장하지만, overrun이 되는 경우가 발생할 수 있다.

  • 아무리 nanoseconds 단위로 지원하더라도 내부의 소프트웨어 clock이 어떤 resolution을 가지고 있는지에 따라 달라질 수 있다.
  • 시간을 맞춰서 깨웠다해도 CPU를 배정받을 수 있도록 된것뿐이다. 즉 큐에서 기다리고 있으므로 Queuing Delay 가 발생할 수 있다.