Blocking/Non-Blocking
호출된 함수가 호출한 함수에게 제어권을 건네주는 유무의 차이
- 함수 A, B가 있고 A 안에서 B를 호출했다고 가정했을 때 호출한 함수는 A이며, 호출된 함수는 B가 된다. 현재 B가 호출되면서 B는 자신의 일을 진행해야한다, 즉 제어권은 B에게 주어진 상황이다.
- Blocking : 함수는 B는 할일을 마칠 때까지 제어권을 가지고 있고 A는 B를 기다려야 한다.
- NonBlocking : 함수 B는 할일을 마치지 않았어도 A에게 제어권을 바로 넘겨준다. A는 B를 기다리면서도 다른 일을 진행할 수 있다.
- 호출된 함수에서 일을 시작할 때 바로 제어권을 리턴해주느냐 할일을 마치고 제어권을 주느냐에 따라 블록과 논블록으로 나눠진다.
Synchronous/Asynchronous
동기/비동기는 일을 수행 중인 동시성이 중요
- B의 수행 결과나 종료 상태를 A가 신경쓰고 있는 유무의 차이
- Synchronous : 함수 A는 함수 B가 일을 하는 중에 기다리면서 현재 상태가 어떤지 체크
- Asynchronous : 함수 B의 수행 상태를 B 혼자 직접 신경쓰면서 처리
- 호출된 함수를 호출한 함수가 신경쓰는지 호출된 함수 스스로 관리하는지의 문제를 동기/비동기라고 하는 것
- 비동기는 호출 시 callback을 전달하여 작업의 완료 여부를 호출한 함수에게 답하게 된다. callback이 오기 전까지 호출한 함수는 신경쓰지 않고 다른 일을 할 수 있다.
I/O 작업은 Kernel level에서만 수행할 수 있다.
따라서 Process, Thread는 커널에게 I/O를 요청해야 한다.
Blocking I/O
- Process가 Kernel에게 I/O을 요청하는 함수를 호출
- Kernel이 작업을 완료하면 작업 결과 반환 받는다.
- I/O작업이 진행되는 동안 user process는 자신의 작업을 중단한 채 대기
- I/O작업이 CPU자원을 거의 쓰지 않아 Resource 낭비가 심하다.
- 여러 클라이언트가 접속하는 서버를 Blocking 방식으로 구현하는 경우 I/O 작업을 진행하는 작업을 중지→다른 클라이언트가 진행중인 작업을 중지하면 안되므로 클라이언트별로 별도의 Thread를 생성해야함 → 접속자수가 많아지면 Thread가 많아져서 컨텍스트 스위칭 횟수가 증가한다.
Non-Blocking I/O
- User process가 recvform 함수(커널에게 해당 Socket으로부터 data 를 받고 싶다고 요청) 호출
- Kernel은 이 요청에 대해 곧바로 recvBuffer를 채워서 보내지 못하므로 EWOULDBLOCK을 반환
- Blocking 과 달리 User Process는 다른 작업을 진행할 수 있다
- recvBuffer에 user가 받을 수 있는 데이터가 있는 경우 Buffer로부터 데이터를 복사하여 받아온다
- recvBuffer는 Kernel이 가지고 있는 메모리에 적재되어 있어, memory간 복사로 인해 I/O보다 빠른 속도로 data를 받아올 수 있다.
- recvform 함수는 빠른 속도로 data를 복사한 후 복사한 data의 길이와 함께 반환
- I/O 작업이 진행되는 동안 User Process 작업을 중단하지 않는다.
'기초 CS 정리' 카테고리의 다른 글
마이크로 서비스 아키텍처 (MSA) (0) | 2023.02.13 |
---|---|
데브옵스 DevOps (0) | 2023.02.12 |
로드 밸런싱(Load Balancing) (0) | 2023.02.10 |
TLS/SSL handshaking (0) | 2023.02.09 |
HTTP & HTTPS (0) | 2023.02.08 |