NIO, 비동기(Async)IO

leocodms·2021년 1월 24일
0

Java

목록 보기
3/10

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의 비교

profile
Backend Developer

0개의 댓글