|
|
게시됨 2019. 5. 17. 오후 3:34:50
|
|
|

초록: BIO와 NIO에 대한 이해
최근에 ZooKeeper와 Mina의 소스 코드를 살펴보니 둘 다 Java NIO로 구현되어 있어서 NIO가 무엇인지 알아내야 할 것 같습니다. 다음은 온라인 정보를 바탕으로 제가 직접 요약한 내용으로, 시간을 절약하기 위해 의미를 이해할 수 있는 한 자연스럽게 다이어그램을 그렸습니다.
소개:
BIO: 동기식 차단 IO입니다. 서버 구현 모드는 한 번에 한 스레드씩 연결하는 것입니다. 즉, 클라이언트가 연결 요청을 할 때 서버가 처리를 위해 스레드를 시작해야 합니다. 이 연결이 아무 일도 일어나지 않으면 불필요한 스레드 오버헤드가 발생할 수 있습니다. 물론 스레드 풀 메커니즘을 통해 개선할 수 있습니다.
NIO: 동기식 비차단 IO입니다. 서버 구현 모드는 스레드당 한 번의 요청입니다. 즉, 클라이언트가 보낸 연결 요청은 멀티플렉서에 등록되고, 멀티플렉서는 연결에 I/O 요청이 있을 때 처리를 위한 스레드를 시작합니다.
AIO (NIO.2): 비동기 비차단 IO로, 서버 구현 모드는 실질적으로 하나의 스레드를 요청하고, 클라이언트의 I/O 요청을 먼저 운영체제가 완료한 후 서버 애플리케이션에 스레드 처리 시작을 알립니다.
바이오
동기식 차단 IO, 운영체제 네트워크 프로그래밍이나 어떤 언어 네트워크 프로그래밍을 배운 사람이라면 누구나 익숙할 겁니다. while 루프 동안 서버는 수신 클라이언트의 연결 요청을 기다리기 위해 accept 메서드를 호출합니다. 연결 요청이 수신되면 이 통신 소켓에 읽기 및 쓰기 작업을 위한 통신 소켓을 설정할 수 있습니다. 이 시점에서는 다른 클라이언트 연결 요청을 받을 수 없고, 현재 연결된 클라이언트와의 작업 실행을 기다릴 수 있습니다.
BIO가 여러 클라이언트 요청을 동시에 처리하려면 멀티스레딩을 사용해야 합니다. 즉, 수락 블록마다 클라이언트 요청을 기다렸다가, 연결 요청이 수신되면 통신 소켓이 설정되어 이 소켓의 데이터 읽기 및 쓰기 요청을 처리하기 위해 새로운 스레드가 열립니다. 그리고 즉시 다른 클라이언트 연결 요청을 계속 수락하고 기다리는 방식입니다. 즉, 각 클라이언트 연결 요청을 개별적으로 처리할 스레드가 생성됩니다. 회로도는 아마도 다음과 같습니다:
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/8107c3f773ad4d2aa1a5a476e650ef84/094528_zqyy.jpeg
서버는 현재 동시성이 높아 여러 클라이언트 요청을 동시에 처리할 수 있지만, 열린 스레드 수가 증가할수록 메모리 자원을 과도하게 소모해 서버가 느려지거나 심지어 다운되는 문제를 발생시킵니다. NIO는 이 문제를 어느 정도 해결할 수 있습니다.
NIO
동기식 비차단 IO의 핵심은 이벤트 기반 아이디어를 채택해 멀티플렉서를 구현하는 것입니다.
NIO와 BIO의 가장 큰 차이점은 여러 클라이언트의 IO 이벤트를 처리하기 위해 스레드만 열면 된다는 점입니다.
이 멀티플렉서는 여러 클라이언트의 IO 이벤트를 들을 수 있는 멀티플렉서입니다:
A. 서버가 클라이언트 연결 요청을 듣는다면, 이를 위한 통신 소켓(자바의 채널)을 설정한 후 다시 듣기 위해 돌아옵니다.
B. 서버가 통신 소켓을 생성한 클라이언트로부터 전송된 데이터를 수신하면, 해당 인터페이스를 호출해 수신된 데이터를 처리하고, 동시에 여러 클라이언트가 있을 경우 데이터도 순차적으로 처리할 수 있습니다.
C. 여러 클라이언트의 연결 요청을 듣고 데이터 요청을 받으며, 전송할 데이터가 있을 때도 함께 듣습니다.
C:/Users/kevin/AppData/Local/YNote/data/kevinsir2003@163.com/41709898aa0a4f8a830d7c348ed05fbb/094528_of9c.jpeg
요약하자면, 한 스레드에서 다중화 인터페이스(자바에서 선택)를 호출해 여러 클라이언트의 IO 요청을 동시에 차단하고 청취할 수 있으며, IO 요청이 도착하면 해당 함수가 호출되어 처리합니다.
각각의 적용 시나리오
이 시점에서 요청이 도착하면(동시에 여러 개든 하나뿐이든) 해당 IO 처리 함수가 호출되어 처리한다는 것을 눈치채셨을 것입니다. 예를 들어:
(1) NIO는 Jetty, Mina, ZooKeeper 등과 같이 연결이 비교적 짧은(가벼운 동작) 많은 연결 상황을 처리하는 데 적합하며, 이들 모두 Java nio를 기반으로 구현되어 있습니다.
(2) BIO 방법은 연결 수가 상대적으로 적고 고정되어 있어 서버 자원이 많고 애플리케이션에 한정되는 상황에 적합합니다.
|
이전의:ajax와 axios, fetch의 차이점다음:오픈 소스 작업 일정 프레임워크 Quartz
|