본문 바로가기

서버운영 (TA, ADMIN)/네트워크

[네트워크] 동기 I/O와 비동기 I/O의 비교

동기 I/O와 비동기 I/O의 비교


동기 실행과 비동기 실행의 차이점은 처음에는 약간 혼동될 수 있습니다. 기본적으로 입출력 동기화에는 동기 I/O와 비동기 I/O(또는 오버랩 I/O) 두 가지가 있습니다. 동기 I/O 처리에서는 스레드가 행동에 들어가면 I/O 요청이 완료될 때까지 기다려야 합니다(프로그램은 프로세스가 종료될 때까지 대기 상태에 '빠지고', 이를 빠져나갈 길은 없습니다). 비동기 환경에서 같은 행동이 일어나면 스레드는 커널의 도움을 받아 I/O 작업을 처리합니다. 실제로 스레드는 요청을 커널에 즉시 전달하고 계속해서 다른 작업을 처리합니다. 커널은 작업이 완료됐을 때 스레드에 신호를 보내고, 스레드는 현재 작업을 중단하고 I/O 작업의 데이터를 필요한대로 처리하는 것으로 이 신호에 답합니다. 플랫폼 독립이라는 자바의 정신 덕분에 비동기 I/O는 여러 개의 스레드에 연결될 수 있습니다. (기본적으로 개별 스레드에서 처리하는 것이 허용됩니다)




비동기 I/O와 동기 I/O는 사용하는 목적이 다릅니다. 간단하게 요청을 하나 보내고 응답을 하나 받고 싶다면 동기 I/O를 사용할 수 있습니다. 동기 I/O는 I/O 연결당 스레드 하나이며, 수천 개의 스레드를 실행하면 운영체제의 부하를 증가시키므로 성능과 확장성이 제한됩니다. 비동기 I/O는 응답을 기다릴 필요가 없으므로 다른 프로그래밍 모델을 사용합니다. 비동기 I/O에서는 일을 실행하라고 제출하고, 즉시 또는 어느 정도 시간이 지난 후에 응답이 되돌아옵니다.


따라서 성능과 확장성이 I/O 시스템의 핵심이므로 비동기 I/O가 동기 I/O보다 더 나아 보입니다. 윈도우나 리눅스 같은 주요 운영체제에서는 운영체제 레이어에서 처리하는 I/O 작업을 비동기 통지 사용에 기반해 빠르고, 확장성이 좋은 I/O를 지원합니다.


요약하자면 매우 많은 시간이 걸리리라 예상하는 I/O 처리는 비동기 I/O를 사용해서 최적화할 수 있습니다. 비동기 I/O는 커널 I/O 요청을 처리하는 부하와 커널 시그널이 다소 발목을 잡기 때문에 상대적으로 빠른 I/O. 처리에는 동기 I/O가 더 좋은 선택일 수 있습니다.



비동기 I/O의 큰 그림


자바에서 비동기 I/O는 비동기 채널을 말합니다. 비동기 채널은 개별 스레드를 통해 여러 I/O 작업을 병렬로 처리하고(예를 들어 연결, 읽기, 쓰기), 작업이 시작된 이후에 작업을 제어하는 메커니즘을 제공하는 연결을 말합니다.


  • 미처리 결과(Pending result)
  • 완료 결과(Complete result)

모든 비동기 I/O 작업은 두 가지 양식 중 하나를 갖습니다.