IO 모델
IO모델은 동기/비동기, 블로킹/논블로킹을 기준으로 나눌 수 있다.
Blocking & Non-blocking
호출된 함수가 자신이 할 일을 모두 마칠 때까지 제어권을 계속 가지고서 호출한 함수에게 바로 돌려주지 않으면 Block
->해당 프로세스의 동작이 중지되고, wait 상태
blocking과 thread..
호출된 함수가 자신이 할 일을 채 마치지 않았더라도 바로 제어권을 건네주어(return) 호출한 함수가 다른 일을 진행할 수 있도록 해주면 Non-block
Synchronous & Asynchronous
호출된 함수의 수행 결과 및 종료를 호출한 함수가(호출된 함수뿐 아니라 호출한 함수도 함께) 신경 쓰면 Synchronous
호출된 함수의 수행 결과 및 종료를 호출된 함수 혼자 직접 신경 쓰고 처리한다면(as a callback fn.) Asynchronous
1. 동기 블로킹(Synchronous Blocking I/O)
- user space에 있던 어플리케이션이 블록을 일으키는 System call
- 이로써 한 작업당 한 번의 사용자공간-커널공간의 context switching 발생
context switching : CPU가 task를 바꿔가며 multitasking을 실행하기 위해 각 task(thread, process)의 상태를 저장하고 다음 task의 상태값을 읽어 들여 적용하는 과정
- 정지된 어플리케이션은 CPU를 사용하지 않고 커널(kernel) 응답을 기다림 -> 개선 필요
- 응답이 되돌아오면 데이터도 사용자 공간 버퍼로 돌아오고, 어플리케이션은 블록이 풀림(unblocked)
2. 동기 넌블로킹(Synchronous Non-blocking I/O)
- Synchronous Blocking I/O의 개선안
- non-blocking으로 호출함수에게 바로 제어권을 주지만, 동기 방식이기 때문에 호출함수가 정상 데이터가 올때까지 계속해서 시스템콜을 하며 context switching한다. -> 비효율
- I/O latency 초래
EAGAIN : 아직 데이터가 없으니 이후 다시 시도하라는 의미
EWOULDBOLCK : 송신시 소켓 송신 버퍼가 꽉 찼거나 수신시 소켓 수신 버퍼가 비어 있음을 의미
3. 비동기 블로킹 IO (Asynchronous blocking I/O)
- IO는 논블로킹이고 알림(notify)이 블로킹인 방식
- select() 시스템함수 호출이 사용자프로세스를 블로킹한다.-> I/O작업이 끝나기를 모니터링
- Application은 System call을 하고 해당 처리에 대해 관심이 없고 다른 일을 하고 싶어하지만 Kernel에서 blocking을 걸기 때문에 다른 일을 할 수가 없다.
4. 비동기 넌블로킹 IO (Asynchronous non-blocking I/O (AIO))
- 시스템 콜 요청(request)이 즉시 IO 개시 여부를 반환
- I/O는 백그라운드에서 실행하고 어플리케이션은 다른 작업을 실행
- IO 응답(response)가 도착하면 신호(signal)나, 쓰레드 기반 콜백(callback)으로 IO 전달(transaction)을 완료
NIO와 buffer
- 버퍼 종류 두가지
direct buffer : OS의 메모리에 위치, 생성시간 느리다(운영체제에 메모리 할당하려니 system call호출등..), 크기 크다, 성능 높다(버퍼의 위치때문에 성능이 높을 듯)
non-direct buffer : JVM의 힙영역에 위치, 생성시간 빠르다(힙 영역에 생성됨), 크기 작다, 성능 낮다
Q. Disk I/O에서 동기와 비동기가 나누어져 있는 이유
Q. sync blocking과 async blocking의 비교