참고: Blocking I/O & Non-Blocking I/O
참고: blocking, non-blocking IO, 동기, 비동기 개념 정리
I/O는 Kernel Level에서 만 수행할 수 있다. 따라서 Process(thread)는 I/O를 수행하기 위해서 Kernel을 호출해야 한다.
Sync Blocking I/O
- Process(Thread)가 Kernel에게 I/O를 요청한다.
- Process는 작업을 중단한 채 대기한다. (Kernel에게 응답을 받기 전까지 다른 작업 못한다)
- Kernel이 I/O 작업을 완료하면 결과를 반환한다.
특징
- I/O 작업이 진행되는 동안 User Process는 자신의 작업을 중단한 채 대기
- 리소스 낭비가 심하다 (I/O 작업이 CPU 자원을 거의 쓰지 않기 때문)
- 여러 클라이언트가 접속하는 서버를 Blocking 방식으로 구현한 경우
- I/O 작업을 진행하는 클라이언트의 작업을 중지해야 한다.
- 다른 클라이언트의 작업을 중지하면 안 되기 때문에 클라이언트 별로 별도의 Thread를 생성 → Thread가 매우 많아짐 → 콘텍스트 스위칭 횟수가 증가 ⇒ 비효율적 동작 방식
Sync Non-Blocking I/O
- User Process가 Kernel에게 I/O를 요청한다.
- Kernel은 바로 EWOULDBLOCK을 반환한다.
- User Process는 그동안 다른 작업을 진행한다. 진행 중간에 Kernel에 I/O가 완료되었는지 확인한다.
- User Process가 확인했을 때 Kernel의 I/O가 끝난 경우 데이터를 복사해서 받아온다. 이때, 데이터는 Kernel이 가지고 있는 메모리에 적재되어 있으므로, Memory 간 복사로 I/O보다 훨씬 빠른 속도로 data를 받아올 수 있다.
Async Blocking I/O
I/O는 Non-Blocking이지만, notification(작업 완료)은 Blocking 방식
- User Process는 Kernel에 I/O를 요청한다.
- Kernel은 EWOULDBLOCK을 반환한다.
- User Process는 select() 함수를 수행하며 I/O가 끝날 때까지 대기한다. (Block)
- Kernel은 I/O가 끝나면 User Process에 데이터 사용이 가능함을 알린다.
- 해당 알림을 받은 User Process는 Block을 풀고 데이터를 복사해서 받아온다.
Async Non-Blocking I/O
- User Process는 Kernel에 I/O를 요청한다.
- Kernel은 I/O 작업의 완료와 무관하게 즉시 응답해 준다.
- User Process는 다른 작업을 수행한다. (I/O 작업이 끝났는지 확인하지 않음)
- Kernel은 I/O가 끝나면 User Process에 알려준다. 데이터를 복사해서 받아온다.
'CS' 카테고리의 다른 글
[CS 스터디] 프로세스 (Process), 스레드 (Thread) (0) | 2023.07.13 |
---|---|
[Java] Runnable, Thread (0) | 2023.07.11 |
[CS 스터디] Blocking, Non-blocking & Synchronous, Asynchronous (0) | 2023.07.10 |
[CS 스터디] 대칭키, 공개키(비대칭키) (0) | 2023.06.30 |
[CS 스터디] HTTP, HTTPS (0) | 2023.06.30 |