13. 블로킹 IO

Download Report

Transcript 13. 블로킹 IO

13. 블로킹 I/O
김진홍
[email protected]
2015.12.02.
목차
1. 프로세스의 사용 효율성과 잠들기 구조
2. 블로킹 I/O의 구현
3. 인터럽트 발생 시간 체크 예제
4. wait_event_interruptible 매크로
개요
• 개요
• 응용 프로그램은 시리얼 포트 디바이스에서 수신된 데이터를 이용하여 외부에서 전달된
명령이나 데이터를 처리 함
•
이때 응용 프로그램이 하드웨어에 읽기/쓰기를 요청함
•
요청 시점과 실제 하드웨어가 처리하는 시점의 차이를 극복하기 위해 블로킹 I/O 기능을 지원함
• 블로킹 I/O
•
응용프로그램에서 요구한 처리를 수행하기 위해 하드웨어가 준비될 때 까지 프로세서를 잠들게 함
•
장점
•
1. 프로세스의 사용 효율성과
잠들기 구조
2. 블로킹 I/O의 구현
3. 인터럽트 발생 시간 체크 예제
4. wait_event_interruptible
여러 프로세스가 동작할 때 효율을 높임
3/36
1. 프로세스의 사용 효율성과 잠들기 구조
프로세스의 사용 효율성과 잠들기 구조
• 다중 프로세스와 시분할 처리
• 다중프로세스 환경
•
여러 응용 프로그램들이 서로 협조하거나 단독으로 수행됨
• 프로세스의 sleep과 시스템의 효율성
•
처음 프로세스를 설계할 때 가급적 프로세스가 잠들게 구현한다면 시스템 효율성을 높일 수 있음
• 프로세스의 잠든 상태
•
자신에게 할당된 시간을 모두 써서 잠든 경우
4. wait_event_interruptible
두번째
•
•
3. 인터럽트 발생 시간 체크 예제
첫번째
•
•
1. 프로세스의 사용 효율성과
잠들기 구조
2. 블로킹 I/O의 구현
특정 사건을 기다리기 위해 잠시 대기하는 경우
프로세스를 깨우기 위해 외부에서 발생하는 입력 상태는 event라고 함
5/36
2. 블록킹 I/O의 구현
블록킹 I/O의 구현
• 개요
• 블록킹 I/O는 하드웨어가 처리를 마치지 못했을 때 프로세스의 진행을 멈추고 기다리는
것을 의미
• 처리를 위해 대기 큐라는 개념을 이용 함
1. 프로세스의 사용 효율성과
잠들기 구조
2. 블로킹 I/O의 구현
3. 인터럽트 발생 시간 체크 예제
4. wait_event_interruptible
7/36
블록킹 I/O의 구현
• 블록킹 I/O
• 강제로 재우는 방법
•
sleep()
•
select(), poll()
•
sched_yield()
• 외부 입력 상태의 변화를 기다리기 위해 잠드는 것
•
블록킹 I/O
1. 프로세스의 사용 효율성과
잠들기 구조
2. 블로킹 I/O의 구현
3. 인터럽트 발생 시간 체크 예제
4. wait_event_interruptible
8/36
블록킹 I/O의 구현
• 블록킹 I/O
• 일반적으로 HW들은 인터럽트와 조합하여 입출력을 처리 함
•
입력과 출력 처리에 대한 동기를 맞춤
•
디바이스 드라이버에 입출력 조건이 발생할 때 까지 프로세서를 재우는 루틴이 필수적
1. 프로세스의 사용 효율성과
잠들기 구조
2. 블로킹 I/O의 구현
3. 인터럽트 발생 시간 체크 예제
4. wait_event_interruptible
9/36
블록킹 I/O의 구현
• 블록킹 모드와 프로세스 처리 과정
• 프로세스가 디바이스 드라이버에 의해 잠드는 과정
1. 프로세스가 디바이스 파일을 O_NDELAY를 포함하지 않는 블로킹 모드로 open()
2. 프로세스가 디바이스 파일에 접근, 예를들어 read()
3. 프로세스에 의해 호출된 드라이버는 read() 함수가 처리할 데이터가 있는지 검사
1. 만약 데이터가 있다면 데이터를 프로세스 공간에 전달하고 처리를 종료 함
2. 만약 데이터가 없다면 하드웨어에서 데이터가 발생할 때 까지 프로세스를 재움
1. 스케줄러에 의해 잠들어 있는 다른 프로세스에 처리 시간을 할당 함
1. 프로세스의 사용 효율성과
잠들기 구조
2. 블로킹 I/O의 구현
3. 인터럽트 발생 시간 체크 예제
4. wait_event_interruptible
3. 입력 데이터의 처리가 인터럽트에 의해 발생 된다면 인터럽트 서비스 함수가 데이터를
처리 하고 프로세스를 깨움
4. 프로세스에 할당된 시간이 끝났기에 다른 프로세스에 처리시간을 할당 하고 잠든 프로세스
를 깨움
5. 깨어난 프로세스는 read() 함수에서 탈출 하고 다음 처리 흐름을 진행
10/36
블록킹 I/O의 구현
• 프로세스 관련 함수와 변수
• 함수
•
•
•
변수 선언 및 초기화
•
wait_queue_head_t
•
init_waitqueue_head
•
DECLARE_WAIT_QUEUE_HEAD
프로세스 재움
•
interruptible_sleep_on()
•
interruptible_sleep_on_timeout()
1. 프로세스의 사용 효율성과
잠들기 구조
2. 블로킹 I/O의 구현
3. 인터럽트 발생 시간 체크 예제
4. wait_event_interruptible
프로세스 깨움
•
wake_up_interruptible()
11/36
블록킹 I/O모드로 열기
• 블록킹 I/O 모드로 열기
• 응용 프로그램에서 디바이스 파일을 열때 블록킹I/O 모드는 선택사항임
•
int dev
dev = open(“/dev/xxx”, O_RDWR);
• 프로세스를 잠들지 않게 하려면 O_NDELAY를 사용
•
int dev
dev = open(“/dev/xxx”, O_RDWR|O_NDELAY);
• 디바이스 드라이버에 블록킹 I/O가 구현 되지 않았다면 잠들지 않음
1. 프로세스의 사용 효율성과
잠들기 구조
2. 블로킹 I/O의 구현
3. 인터럽트 발생 시간 체크 예제
4. wait_event_interruptible
12/36
대기 큐와 wait_queue_head_t 구조체
• 대기 큐
• 목적
•
잠들거나 깨우기 위한 조건을 관리
•
여러 프로세스의 접근을 관리
1. 프로세스의 사용 효율성과
잠들기 구조
2. 블로킹 I/O의 구현
•
wait_queue_head_t 구조체로 선언
3. 인터럽트 발생 시간 체크 예제
•
대기 큐는 필요한 조건마다 선언하고 사용함
• 변수
•
읽기 전용 대기 큐
•
쓰기 전용 대기 큐
4. wait_event_interruptible
• 만드는 방법
•
wait_queue_head_t 구조체로 변수를 선언하고, init_waitqueue_head()로 초기화
•
DECLARE_WAIT_QUEUE_HEAD 매크로 함수로 초기화
•
wait_queue_head_t 구조체와 init_waitqueue_head()를 호출하는 매크로
13/36
대기 큐와 wait_queue_head_t 구조체
• 만드는 방법
•
wait_queue_head_t 구조체로 변수를 선언하고, init_waitqueue_head()로 초기화
•
wait_queue_head_t Wait Queue;
init_waitqueue_head(&WaitQueue);
•
DECLARE_WAIT_QUEUE_HEAD 매크로 함수로 초기화
•
wait_queue_head_t 구조체와 init_waitqueue_head()를 호출하는 매크로
•
DECLARE_WAIT_QUEUE_HEAD(WaitQueue);
•
읽기 : DECLARE_WAIT_QUEUE_HEAD(ReadWaitQueue);
•
쓰기 : DECLARE_WAIT_QUEUE_HEAD(WriteWaitQueue);
1. 프로세스의 사용 효율성과
잠들기 구조
2. 블로킹 I/O의 구현
3. 인터럽트 발생 시간 체크 예제
4. wait_event_interruptible
14/36
프로세스 재우기(sleep)와 깨우기(wake up)
• 재우기와 깨우기
• 재우기
•
DECLARE_WAIT_QUEUE_HEAD(WaitQueue_Read);
:
interruptible_sleep_on(&WaitQueue_Read);
•
재우기 전에 2가지를 검사해야 함
•
사건을 기다릴 필요가 있는가
•
논 블로킹 모드로 열렸는가
•
그렇다면 interruptible_sleep_on 대신 EAGAIN 에러를 반환하고 응용프로그램에게 다시 요청 해야함
1. 프로세스의 사용 효율성과
잠들기 구조
2. 블로킹 I/O의 구현
3. 인터럽트 발생 시간 체크 예제
4. wait_event_interruptible
• 깨우기
•
wake_up_interruptible(&WaitQueue_Read);
15/36
wait_event_interruptible 매크로
• 자주쓰는 함수의 매크로화
• wait_event_interruptible(wq, condition);
•
wq : 대기큐
•
condition : 함수 탈출 조건식
DECLARE:_WAIT_QUEUE_HEAD(WaitQueue_Read);
:
wait_event_interruptible(WaitQueue_Read, count>30);
•
현재 프로세스를 Wait_Queue_Read 대기 큐에 등록하고 잠듬
1. 프로세스의 사용 효율성과
잠들기 구조
2. 블로킹 I/O의 구현
3. 인터럽트 발생 시간 체크 예제
4. wait_event_interruptible
16/36
Q&A
17/40