panda.jpg


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


오늘은 분위기 전환을 위해 사진을 하나 올려 보았습니다.

(제 별명이 판다라서 직접 찍은 팬더 인형 사즌을 올려 봅니다 ㅎㅎ)


저번 시간에는 블록킹 I/O가 무엇인지 알아 보았습니다.


오늘은 linux에서 어떤 방식으로 구현 되있는지 알아 보겠습니다.



그럼 복습부터 해보겠습니다.


1. 복습!!!




블록킹 I/O가 무엇 이였는지 기억이 나시나요? 


가물가물 하시죠? ㅎㅎ


그럼 우선 그림 을 보면서 간단하게 설명하고 넘어 가겠습니다.


01.PNG


기존의 응용프로그램에서 하드웨어 처리를 요청을 하면 요청이 끝날 때까지 다른 작업들을 하지 못하지만


위와같이 하드웨어 처리를 요청하고 잠들어 버려 이 시간 동안 다른 응용프로그램이 


다른 일을 수행 할 수 있도록 해주는 것이 블록킹 I/O 입니다.


2. 디바이스 드라이버에서 해주어야 하는 일은?




블록킹 I/O를 사용하기 위해서는 디바이스 드라이버에 기능이 들어 있어야 합니다.


그럼 어떤 식으로 코딩을 해주어야 할까요?


그럼 심플하고 차근차근 알아보겠습니다.


리눅스에서는 대기 큐(Wait Queue)를 이용해서 블로킹 I/O를 구현 합니다.


대기 큐를 사용하기위해서는 다음 해더 파일을 꼭 추가 하셔야 합니다.


 #include <linux/wait.h>


대기 큐를 사용하기 위해서는 “wait_queue_head_t” 구조체를 선언 해야 합니다.


/include/linux/wait.h 에 보면 다음과 같이 되어 있습니다.


  50struct __wait_queue_head {
  51        spinlock_t lock;
  52        struct list_head task_list;
  53};
  54typedef struct __wait_queue_head wait_queue_head_t;


아해와 같이 선언을 해주시면 됩니다.

 wait_queue_head_t      WaitQueue;



위와 같이 선언을 했다면 초기화를 해주어야 합니다. 


초기화 하는 함수는 "init_waitqueue_head()" 입니다.


 init_waitqueue_head( &WaitQueue );


위와 같이 사용하시면 구조체가 초기화 됩니다.


위 2가지 과정을 한번에 해주는 매크로가 있습니다. 

(한번에 하면 조금더 편하겠죠? ㅎㅎ)


▪ DECLARE_WAIT_QUEUE_HEAD( WaitQueue );


그럼 다음으로 넘어 가겠습니다. 대기 큐는 사건에 따라 구현을 합니다.


보통 read, write가 있겠지요 그럼 2개를 만들어 주어야겠죠? 

(일단 한숨 쉬고 다음으로 넘어 갑시다 휴~~)


3. 응용프로그램을 재우고 깨워 보자!!




초기화를 마치고 응용프로그램에서 read를 요청을 했다고 했을 때 


디바이스 드라이버는 요청을 한 응용프로그램을 재워야 합니다.

(응용프로그램에서 잠시만 기다려달라!! 하고 알려줘야겠죠 ㅎㅎ)


이때 사용하는 함수가 "interruptible_sleep_on()" 입니다.


▪ interrupible_sleep_on(&WaitQueue);


위와 같이 사용해주시면 응용프로그램은 잠에 빠져 듭니다 ㅎㅎ



하드웨어 장치가 쓰기를 완료했다고 인터럽트가 발생 했습니다.


그럼 응용프로그램을 깨워 주어야 겠죠?


이 때 사용하는 함수가 "wake_up_interruptible()" 함수 입니다.


wake_up_interruptible(&WaitQueue);


위와같이 인터럽트 루틴에 추가 해주시면 다시 응용프로그램이 동작을 하기 시작 합니다.



오늘은 여기까지!!!


다음시간에는 조금더 상세한 설명과 응용프로그램에서 해줘야하는 간단한 일 하나를 설명할까 합니다.


그럼 다음 시간에 만나요~~~


빠른만남을 원하시면 http://ms-osek.org/ 여기로 찾아오세요~