본문 바로가기

Programming/Linux_Kernel

sleep and delay in linux kernel

무엇보다 kernel document 를 추천한다.

https://www.kernel.org/doc/Documentation/timers/timers-howto.txt


아래 한글 번역본이 있다.

http://blog.dasomoli.org/498






출처 : 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