본문 바로가기
한국으로/임베디드 리눅스

9.2 지연 작업

by 영킴. 2018. 7. 6.

9.2 지연 작업

9.2.1 커널 타이머

커널 타이머를 이용하면 일정 시간 후에 정해진 작업을 할 수 있다. 또는 정해진 작업 사이에 시간 간격을 줄 수 있다.
이 때 호출되는 함수가 타이머 핸들러인데, 타이머 핸들러는 비동기적으로 실행되는 인터럽트 문맥이다.
따라서 인터럽트 핸들러와 같이 제약이 있다. 이를테면 sleep과 스케줄링이 불가능하다는 것.
하지만 인터럽트 핸들러와 다르게 하드웨어 인터럽트는 활성화되어있는 상태임!



9.2.2 커널 타이머 API

struct timer_list;

unsigned long expires;
jiffies가 expires에 도달하면 타이머 핸들러 호출.

void (*function)(unsigned long);
타이머 핸들러를 가리킨다.

unsigned long data;
타이머 핸들러 호출 시 전달되는 인자.

void init_timer(struct timer_list* timer);

타이머 초기화.

void add_timer(struct timer_list* timer);

타이머 등록.

int del_timer(struct timer_list* timer);

타이머 해제.

int mod_timer(struct timer_list* timer, unsigned long expires);

타이머의 expires 갱신.




9.2.3 tasklet

tasklet은 인터럽트 핸들러가 남겨놓은 작업을 나중에 처리하는 역할을 한다.
인터럽트 핸들러는 빠르게 작업을 처리하는데, 급하지 않거나 연산이 오래 걸리는 작업은 나중에 처리된다. 이렇게 나중에 처리할 작업을 '지연 작업'이라고 하고, tasklet이 이 '지연 작업'을 처리한다.

tasklet 핸들러

tasklet 핸들러도 커널 타이머와 같이 인터럽트 문맥이다. 따라서 sleep과 스케줄링이 불가능하고 하드웨어 인터럽트는 활성화되어있다.
타이머 핸들러와 다르게 커널이 자동적으로 실행하고 이를 스케줄링한 CPU가 실행한다. 
또한, 동시에 동작하지 않기 때문에 동기화 문제가 없고, 자기 자신을 다시 스케줄하는 것도 가능하다.



9.2.4 workqueue

work item들을 저장하는 큐. 각 work item은 실행될 함수(work handler)를 포함한다.
worker는 필요에 따라 생성되며, 커널 스레드로 동작하는 프로세스 문맥임. 따라서 제약 사항이 거의 없고 sleep 및 스케줄링이 가능하다.




'한국으로 > 임베디드 리눅스' 카테고리의 다른 글

9.3 커널 동기화  (0) 2018.07.06
9.1 시간처리  (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