block I/O 와 non-block I/O 가 어떻게 동작하는지 알아본다.
block I/O
- I/O 작업을 요청한 프로세스/스레드는 요청이 완료될 때까지 블락됨(기다림)
스레드가 read blocking system call 을 실행하게 되면 블락된다
커널에서는 read I/O를 실행한다.
시간이 지나고 응답을 주면 커널이 응답을 받고 data를 커널에서 user로 옮긴다.
위 과정을 거치고 스레드는 깨어나서 다시 일을 진행한다.
non-block I/O
- 프로세스/스레드를 블락시키지 않고 요청에 대한 현재 상태를 즉시 리턴
스레드가 read non-blocking system call 을 실행한다.
커널모드로 컨택스트 스위칭이 되고, 커널에서는 read I/O 작업을 실행한다.
그리고 바로 리턴을 시킨다.
스레드는 이어서 다른 코드를 실행시킬 수 있다.
커널에서는 응답을 보낼 준비가 되었고 기다리고 있다.
스레드에서 read non-blocking system call 을 실행하면, 데이터를 받는다.
스레드에서는 다시 작업을 실행한다.
non-blocking 에서는 한가지 이슈가 있다.
read I/O 작업을 어떻게 확인해야할까?
1. 완료됐는지 반복적으로 확인한다.
- 스레드가 다른 작업을 하다가 반복적으로 확인을 하면 확인하는 시간에 대한 처리속도가 느려질 수 있다.
- CPU 낭비가 발생한다.
2. I/O multiplexing (다중 입출력) 사용
- 관심있는데 I/O작업들을 동시에 모니터링하고 그 중에 완료된 I/O 작업들을 한번에 알려준다.
- epoll(리눅스) / kqueue(맥os) / IOCP(I/O completion port / 윈도우) 에서 사용
- 네트워크 통신에 많이 사용
3. Callback / singnal 사용
- callback / signal 을 통해 처리된다
- 널리 사용되지는 않는다.
참고
https://www.youtube.com/watch?v=mb-QHxVfmcs
https://musma.github.io/2019/04/17/blocking-and-synchronous.html
'Knowledge > CS' 카테고리의 다른 글
해시(Hash)란 무엇인가? (0) | 2022.08.16 |
---|---|
시간복잡도란 무엇인가? 다른방법은? (0) | 2022.08.13 |
상속과 구현의 차이 (0) | 2022.08.09 |
데이터베이스와 파일처리 시스템의 차이 (0) | 2022.08.09 |
여기저기 참고한 예상질문 정리 - 네트워크 (0) | 2022.07.27 |
댓글