9.1 시간처리
9.1.1 jiffies 카운터
리눅스에서 사용하는 전역 system timer. 시스템에 내장된 타이머에서 주기적 인터럽트가 발생하는 것.
jiffies 는 부팅 시에 0으로 초기화되고, 1초에 HZ만큼 증가한다.
예를 들어, HZ가 100이라면 jiffies는 1초에 100씩 증가한다.
9.1.2 Long Delay
jiffies로 표현하는 지연.
Busy Waiting
t1 = jiffies + HZ;
while(time_before(jiffies, t1)) cpu_relax();
cpu_relax() 는 cpu가 쉬는 것.
지연시간이 정확하지만, 성능 저하가 발생한다는 단점이 있다.
양보하기
t1 = jiffies + HZ;
while(time_before(jiffies, t1)) schedule();
schedule() 함수를 호출해 기다리고, 다른 프로세스가 CPU를 점유한다. (양보)
지연 시간이 정확하지 않고 오차가 발생한다.
Uninterruptible event timeout
long wait_event_timeout(wait_queue_head_t wq, condition, long timeout);
시그널에도 깨어나지 않는 uninterruptible sleep 상태에서 timeout(jiffies의 개수)이 되면 남아있는 jiffies 개수 리턴.
Interruptible event timeout
long wait_event_interruptible_timeout(wait_queue_head_t wq, condition, long timeout);
시그널에 깨어나는 interruptible sleep 상태에서 timeout(jiffies의 개수)이 되거나 signal이 발생하면 남아있는 jiffies 개수 리턴.
스케줄 타임아웃
signed long schedule_timeout(signed long timeout);
sleep 상태에서 timeout(jiffies의 개수)이 되거나 signal이 발생하면 남아있는 jiffies 개수 리턴.
9.1.3 Short Delay
delay 함수
소프트웨어적인 Loop으로 구현됨. Busy waiting 방식.
sleep 함수
정확한 지연 시간이 필요하지 않다면 sleep을 사용하자.
'한국으로 > 임베디드 리눅스' 카테고리의 다른 글
9.3 커널 동기화 (0) | 2018.07.06 |
---|---|
9.2 지연 작업 (0) | 2018.07.06 |
8.1 인터럽트 (0) | 2018.07.06 |
7.3 문자 드라이버 (0) | 2018.07.01 |
7.2 모듈 (0) | 2018.07.01 |
7.1 디바이스 드라이버 (0) | 2018.07.01 |
5.4 파일시스템 (0) | 2018.07.01 |
5.3 메모리 관리 (0) | 2018.06.29 |