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 가 발생할 수 있다.
'학부 수업 정리 > 시스템프로그래밍 (21-2)' 카테고리의 다른 글
[시스템] 15. Timers (0) | 2021.12.29 |
---|---|
[시스템] 13. Time & Clock (0) | 2021.12.29 |
[시스템] 12. I/O Redirection, Standard I/O Library (0) | 2021.12.29 |
[시스템] 11. Multiplexed I/O, Memory Mapped I/O (0) | 2021.12.29 |
[시스템] 10. File Offset (0) | 2021.12.29 |