panda.jpg 


안녕하세요 판다 이우영입니다.


벌써 30번째 내요 ㅎㅎ. 오늘 부터는 워크 큐에 대해서 알아 보도록 하겠습니다.


그럼 시작해 보겠습니다.


1. 워크큐?



 지금까지 해보았던 프로그램들은 응용프로그램이 디바이스 파일에 읽고 쓰거나 


디바이스 드라이버에 등록해둔 인터럽트가 발생 했을 경우에 동작하도록 했었습니다.


순차적으로 진행이 되었지요. 그러나 디바이스 드라이버의 함수를 독립적으로 실행 시키거나 


인터럽트의 후처리를 하기위해서 이 워크 큐라는 것이 생겨 났습니다.


커널 2.4에서는 태스큐에서 커널 2.6 버전부터 한층 버전업한 워크큐가 되었습니다.


워크큐는 기본적으로 워크큐라는 구조체에 함수를 등록을 해서 사용합니다.

(여기 까지는 전에 사용해본 다른것들과 비슷합니다.)


하지만 동작하는 방식은 완전 다르지요.


가장 큰 차이점은 태스크의 특성이 포함 되어 있다는 것입니다.


기존의 인터럽트 처리 루틴에서는 제약사항이 많았습니다.

(잠들지 못하거나 빠르게 처리하기위해 많은 처리 루틴을 넣어서는 안되는등..)


하지만 워크큐는 태스크의 특성을 가지기 때문에 이런 제약 사항에서 많이 자유를 보장 받았습니다.


그럼 조금더 자세하게 알아 보겠습니다.


2. 스케줄 워크 큐




보통 워크 큐는 스케줄 워크 큐를 지칭한다고 합니다.


스케줄 워크 큐는 커널에서 워크큐를 소비하는 스레드 event를 만들고 처리하는 방법을 의미한다.


워크큐를 사용하기 위해서는 #include <linux/workqueue.h> 를 포함 시켜야 한다.


여기에는 work_struct 주조체가 선언 되어 있다.


                                                                                                                                                                                     

 struct work_struct {

unsigned long pending;

struct list_head entry;

void (*func)(void *);

void *data;

struct timer_list timer;

 };



여기서 중요한 것은 func, data가 중요합니다.


왜냐하면! 우리가 만들어야 하니까요 ㅎㅎㅎ


우선 워크큐를 등록을 해야겠죠? 그것부터 알아 보겠습니다.


DECLARE_WORK - 워크 큐에 등록할 작업 구조체 변수를 선언하고 초기화

INIT_WORK          - 워크 큐 구조제 변수를 조기화


위와같이 매크로가 있습니다.


먼저 DECLARE_WORK 는 다음과 같이 사용합니다.


DECLARE_WORK( name, void (*function)(void *), void *data);


name     - 선언하는 변수 이름

function - 수행할 워크 큐 함수

data       - 함수에 넘겨 줄 인자(데이터)


시작 부터  func, data를 만들어 주어야 하는 군요 ㅎㅎ



오늘은 여기까지 하고 다음시간에 자세하게 알아 보도록 하겠습니다.


그럼 다음주에 만나요~