무엇보다 kernel document 를 추천한다.
https://www.kernel.org/doc/Documentation/timers/timers-howto.txt
아래 한글 번역본이 있다.
출처 : http://poplinux.tistory.com/122
가장 기본이 되는 지연 함수는 schedule_timeout() 입니다.
관계를 살펴보면
ssleep()
-----------------------------------------
msleep()
-----------------------------------------
schedule_timeout_interruptible(), schedule_timeout_uninterruptible
-----------------------------------------
schedule_timeout()
입니다. 위에 그림만으로는 잘 설명이 안될 수도 있는데, 커널 소스를 살펴보면 관계를 확실히 확인 할 수 있습니다.
ssleep() 는 msleep() 를 호출합니다.
msleep() 는 schedule_timeout_uninterrupt() 를 호출합니다.
schedule_timeout_uninterrupt() 는 schedule_timeout() 을 호출합니다.
결국 최종으로 호출되는 것은 schedule_timeout() 인데 시간 지연이라는게 인터럽트를 허용할 수도, 아닐수도 있고 또한 사용상의 편의상 ssleep() 나 msleep() 같은 front-end 를 만들어 쓴다고 생각하면 됩니다.
그렇다면 각 함수들의 resolution 은 어떨까?
https://www.cs.elte.hu/local/Linux-bible/IO-Port-Programming/node6.html
위 글에 따르면,
usleep(3) 을 준다 해도, system 은 최소 20 ms 는 sleep 할것이다. sleep 함수는 context switch 를 하고, linux scheduler 는 최소 20 ms 는 소모된다.
따라서 10ms 이하에서는 usleep 보다는 nanosleep 을 사용하는것을 권장한다.
http://tldp.org/HOWTO/IO-Port-Programming-4.html
http://linux.die.net/man/2/nanosleep
udelay 는 us(microsecond) resolution 을 보장한다. (x86기준)
https://www.cs.elte.hu/local/Linux-bible/IO-Port-Programming/node6.html
loop_for_sec 값을 계산하기 위해 /proc/cpuinfo 의 BogoMips 값에 500000을 곱해서 사용한다.
'Programming > Linux_Kernel' 카테고리의 다른 글
vmalloc 할당의 최대 크기는? (0) | 2015.04.02 |
---|---|
linux kernel time resolution & hrtimer (0) | 2015.03.22 |
uevent 사용하기 (0) | 2015.03.21 |
virtual address to physical address (64bit linux) (0) | 2014.06.16 |
File System의 개요 (0) | 2014.05.12 |