어떻게 BIO, NIO, AIO의 차이를 이해하는 것이?

단지 정의의 무리뿐만 아니라 생생한 예를 던질 때 BIO, NIO, AIO 이야기 많은 기사. 겉으로 잘 이해. 그러나 가장 기본적인 원칙이 아니라 본질은하지 않을 경우, 다음 IO의 원리로부터 출발이 세 사이의 차이를 이해하기 어려운 거기 없다 등장. 따라서이 문서는 자바 IO 작업부터 시작되는 방식을 분석하는 것이다.

자바 IO 원리

먼저 자바 IO에서 운영 체제 커널에 의존, IO 읽고 우리의 프로그램은 실제로 두 개의 시스템 호출을 쓰기 및 읽기 운영 체제 커널을 호출 물품.

즉, 커널이 IO가와 상호 작용하는 방법입니까?

  1. NIC는 오는 네트워크 케이블을 통해 데이터를 수신 및 네트워크 데이터를 메모리에 기록됩니다.
  2. 데이터가 인터럽트 신호에 발행 된 메모리 카드, CPU 카드에 기록 될 때, 운영 체제는 새로운 데이터가 후에 도착 여부를 알려줍니다, 다음 네트워크 카드 인터럽트 프로그램을 통해 데이터를 처리 할 수 ​​있습니다.
  3. 네트워크 데이터는 대응하는 소켓의 수신 버퍼 메모리에 기록된다.
  4. 데이터가 수신 버퍼에 기록 된 후, 데이터 처리 애플리케이션을 시작한다.

다음과 같이 추상적 인 소켓은 코드 자바 간단한 예에 해당합니다

public class SocketServer {
  public static void main(String[] args) throws Exception {
    // 监听指定的端口
    int port = 8080;
    ServerSocket server = new ServerSocket(port);
    // server将一直等待连接的到来
    Socket socket = server.accept();
    // 建立好连接后,从socket中获取输入流,并建立缓冲区进行读取
    InputStream inputStream = socket.getInputStream();
    byte[] bytes = new byte[1024];
    int len;
    while ((len = inputStream.read(bytes)) != -1) {
      //获取数据进行处理
      String message = new String(bytes, 0, len,"UTF-8");
    }
    // socket、server,流关闭操作,省略不表
  }
}

复制代码

이 프로세스는 기본적인 커널 IO 및 네트워크는 주로 매우 유사하다는 것을 알 수있다 수락 () 데이터로 채워진 버퍼 처리 대기 후 네트워크 바이트 [] 어레이에서 요청을 기다린다. BIO, NIO, AIO 차이는 이들 동작이 차단 또는 비 차단, 동기 또는 비동기이다.

그래서 우리는 동기 비동기 비 차단 및 차단 개념을 이끌어.

동기 및 비동기

동기 및 비동기는 프로세스 실행 방법은 계속 이전 방법의 완료 후 각에 의존해야하는지 여부를 나타냅니다. 우리는 실행 과정 가정 : 턴하는 방법과 두 번째 방법이다.

동기화는 통화 시작하면, 발신자가 후속 작업을 계속하기 위해, 메소드 호출이 반환 때까지 기다려야해야한다는 것을 의미합니다. 즉, 두 번째 방법은, 방법의 실행의 완료를 수행 할 수있다 때까지 기다려야한다.

비동기 결국 발신자 코드 실행 방법을 기다리지 않고 즉시 반환에 대한 호출을 의미한다, 우리는 후속 행동을 계속할 수 있습니다. (다른 스레드 실행 언급 된 구체적인 방법은 종료 코드 내에 콜백 수있다). 시간 수행의 방법은, 직접 다른 쓰레드로 실행 메인 쓰레드되지 않으며,이 메인 스레드를 차단하지 않을 번째 방법은 방법의 완료를 시작할 때까지 기다릴 필요가 없다.

동기 및 실행 방법에 대한 비동기 우려 메인 스레드 또는 다른 스레드, 메인 스레드가 다음 다음, 방법, 다른 스레드의 이행의 완료를 기다릴 메서드 호출을 기다리지 않고 즉시 반환 할 필요가 메인 스레드가 직접 다음의 코드를 실행할 수 있습니다.

여러 스레드 간의 조정에서 동기 및 비동기 효율성의 차이를 달성했다.

왜 우리는 비동기 필요합니까? 나는 본질은 온라인 비동기 블록을 메인 스레드, 토론 너무 많이 해결하기 위해 비동기 비 차단 비동기가 차단되는 경우,이 상황을 차단 비동기했다 그 중 하나는 네 개의 조합을 차단되었습니다 동기화이라고 생각? 그래서 왜 특별히 비동기합니까?

차단 및 비 차단

여부 장소에서, 차단 및 비 차단이 단일 스레드 내에서 발생하는 동기 대기를 참조하면 아무 작업도 수행되지 않습니다.

차단 자리에 동기화 방법까지 경험 동기화 대기를 의미 후 처리를 기다리고 완료됩니다.

비 차단 다시 동기화 방법이 완료 관찰 기다렸다가 다른 작업을 할 시간을 차단하지, 만남 동기화 대기를 의미합니다.

차단 및 우려를 비 차단하면 스레드가 장소에 대기할지 여부입니다.

나는 차단 및 비 차단하는 것은 단지 조합으로 동시에 수행 할 수 있다고 생각합니다. 자연 비동기 비 차단, 비 차단하고이 해당 메인 스레드입니다. (어떤 사람들은 차단 작업을 내부에 배치 비동기 방법은 비동기 차단이라고 생각하지만, 생각, 그것을 차단 작업이 비동기 방식에 넣어 것입니다 정확하게 때문에, 메인 스레드를 차단하지 않을 수 있습니다)

예 설명

바다 낚시는 잘 먹고,하지만 종종 대기해야합니다. 우리는 설명이 삶의 예에 있습니다.

  • 고객은 바다 낚시를 먹고, 그래서 앉아서 시간을 기다렸다, 다음 냄비를 먹기 시작. (BIO)
  • B 고객이 자신이 기다리는 꽤 오랜 시간을보고, 바다 낚시를 먹고, 그 다음 하나 하나가 그를보고 다시 연결됩니다 방문, 쇼핑을. 그래서 그는뿐만 아니라 마지막을 구입하고, 바다 낚시를 먹는다. (NIO)
  • 그는 수석 멤버이기 때문에 C 고객은 당신은 단지 재생 쇼핑몰로 이동, 등 위치 아래, 나는 즉시 전화, 관리자가 말했다, 바다 낚시를 먹을 수 있습니다. (AIO)를 그래서 앉아서하지 않고 C 고객은, 등, 마지막으로 바다 낚시를 먹을 때까지 기다릴 필요가 없습니다 것입니다 가끔마다 다시 보이지 않는

어느 방법이 더 효율적입니다? 그것은 분명하지 않다?

BIO

BIO는 IO를 차단하기위한, IO는 JDK1.4, 자체 동기 블록 모드 이전의 전통적인 모델입니다 의미합니다. 스레드가 IO 요청을 시작한 후, 후 준비 버퍼 데이터까지, IO를 차단하고 다음 단계를 입력하고있다. 모든 요청을 처리하는 새로운 스레드를 생성 할 필요가있는 경우 네트워크의 통신이 상위 단순화 된 애플리케이션 개발 있지만 성능 및 안정성에 큰 병목 현상이, 응답을 요청하는 방법입니다, 다음, 높은, 상상 동시 장면, 기계 자원은 곧 고갈 될 것이다.

NIO

NIO는 또한 비 차단 IO IO 모델로 알려진 것은 동기 비 차단하고 있습니다. 즉시 IO 요청 스레드의 반환을 개시 한 후 (IO 비 차단). 비 차단 사용자가, IO 버퍼를 기다리는 스레드를 배치하지 않는 다른 작업을 할 수 있지만 정기적으로 IO 버퍼가 준비 폴링 데이터를 확인하는 것을 의미하면서 동기화, 장소에 IO 버퍼 영역의 데이터를 기다릴 필요를 의미 . 자바 NIO는 새로운 IO 의미입니다. 게다가 사실 NIO IO 멀티플렉싱 기술. NIO는 IO 버퍼가 준비 폴링을 볼 수있는 공통점이지만, 자바 새로운 IO가 준비 IO 버퍼의 무리를 볼 갈 수있는 폴링 스레드를 의미, 그것은 생각 IO 다중화입니다 . IO 멀티플렉싱 모델은 IO 데이터 준비 작업을 선택하거나 시스템에 의해 모니터링 epoll 파일 시스템 레벨 모델은, 사용자 스레드의 부담을 줄일 수 있는지 확인합니다.

NIO 메인 버퍼 통합 채널 ,, 선택기 셀렉터 (멀티플렉서)에 등록되어있는 클라이언트에 의해 각 채널의 제로 카피 데이터 수신 버퍼에 의해 세 가지 기법. 지속적으로 폴링 서버 채널은 클라이언트의 정보를 얻을 수있다. 채널이 연결 확인 된 네 개의 상태 (쓰기) 읽기 (차단) 동의 (읽기), 쓰기. 식별에 따라 후속 작업에. 그래서 서버는 채널을 무제한으로받을 수 있습니다. 새 스레드를 열 필요가 없습니다. 크게 성능을 향상시킬 수 있습니다.

AIO

AIO는 진정한 의미에서 비동기 비 차단 IO 모델입니다. 여전히 어떤 IO를 찾을 필요가 있기 때문에 NIO 위 달성하기 위해, 사용자 스레드는 스레드 리소스를 많이 사용하는 응용 프로그램은, 사실, 여전히 차단 폴링의 상응하는, 현재의 thread가 진정한 해방은 IO 버퍼의 데이터 준비가되지 않습니다 여부를 확인하기 위해 정기적으로 폴링을 필요로 준비. 비동기 비 차단 IO의 진정한 이상적인 사용자는 버퍼가 준비되면, 커널 스레드에게 저를 알리거나 콜백 함수에 저를 통해 실행해야합니다, 시스템 커널이 완료 될 수 있도록해야한다.

AIO가 진정으로 비동기 작업이 될 수 있지만, 구현이 더 복잡, 비동기 IO 지원 순수한 운영체제도 윈도우 IOCP 기술이있다, 매우 작은 리눅스, 기본 또는 사용 위치는 epoll 구현에있다.

오류 정정 리뷰를 촉구한다면 나는 개인적으로, 요약을 이해합니다.

내 개인 블로그 vc2x.com에서 이동

추천

출처juejin.im/post/5dbba5df6fb9a0204a08ae55