강좌 & 팁
안녕하세요~ 이우영 입니다.
오늘은 분위기 전환을 위해 사진을 하나 올려 보았습니다.
(제 별명이 판다라서 직접 찍은 팬더 인형 사즌을 올려 봅니다 ㅎㅎ)
저번 시간에는 블록킹 I/O가 무엇인지 알아 보았습니다.
오늘은 linux에서 어떤 방식으로 구현 되있는지 알아 보겠습니다.
그럼 복습부터 해보겠습니다.
1. 복습!!!
블록킹 I/O가 무엇 이였는지 기억이 나시나요?
가물가물 하시죠? ㅎㅎ
그럼 우선 그림 을 보면서 간단하게 설명하고 넘어 가겠습니다.
기존의 응용프로그램에서 하드웨어 처리를 요청을 하면 요청이 끝날 때까지 다른 작업들을 하지 못하지만
위와같이 하드웨어 처리를 요청하고 잠들어 버려 이 시간 동안 다른 응용프로그램이
다른 일을 수행 할 수 있도록 해주는 것이 블록킹 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/ 여기로 찾아오세요~