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