자바 세 가지 IO 모델 원리 실례 상세 설명

6801 단어 JavaIO모형.
자바 에서 IO 의 모델 은 세 가지 로 나 뉘 는데 동기 적 으로 막 힌 BIO,동기 적 으로 막 히 지 않 은 NIO,비동기 적 으로 막 히 지 않 은 AIO 이다.
BIO[동기 화 차단]
JDK 1.4 가 나 오기 전에 저 희 는 네트워크 연결 을 구축 할 때 BIO 모드 를 사용 합 니 다.먼저 서버 에서 ServerSocket 을 시작 한 다음 에 클 라 이언 트 에서 Socket 을 시작 하여 서버 에 통신 을 해 야 합 니 다.기본 적 인 상황 에서 서버 는 모든 요청 에 대해 스 레 드 를 만들어 서 기 다 려 야 합 니 다.클 라 이언 트 가 요청 을 보 낸 후에 서버 에 스 레 드 가 해당 하 는 지 문의 하 십시오.없 으 면 계속 기다 리 거나 거부 당 합 니 다.있 으 면 클 라 이언 트 는 요청 이 끝 난 후에 야 계속 실 행 됩 니 다.
NIO[동기 화 비 차단]
NIO 자 체 는 이벤트 구동 사상 을 바탕 으로 이 루어 진 것 으로 주로 BIO 의 큰 병발 문 제 를 해결 하고 자 한다.동기 화 I/O 를 사용 하 는 네트워크 응용 에서 여러 클 라 이언 트 의 요청 을 동시에 처리 하거나 클 라 이언 트 가 여러 서버 와 동시에 통신 하려 면 다 중 스 레 드 로 처리 해 야 한다.즉,모든 클 라 이언 트 요청 을 하나의 스 레 드 에 배정 하여 단독으로 처리 하 는 것 이다.이렇게 하면 우리 의 요구 에 도달 할 수 있 지만 동시에 또 다른 문 제 를 가 져 올 것 이다.하나의 스 레 드 를 만 들 때마다 이 스 레 드 에 일정한 메모리 공간(작업 메모리 라 고도 함)을 분배 해 야 하고 운영 체제 자체 도 스 레 드 의 총 수 를 제한 합 니 다.클 라 이언 트 의 요청 이 너무 많 으 면 서버 프로그램 이 무 거 운 부담 을 견 디 지 못 해 클 라 이언 트 의 요청 을 거절 하고 서버 가 마 비 될 수도 있 습 니 다.
NIO 는 Reactor 를 기반 으로 socket 에 읽 을 수 있 거나 쓸 수 있 는 흐름 이 있 을 때 운영 체 제 는 해당 하 는 알림 참조 프로그램 을 처리 하고 버퍼 나 쓰기 운영 체제 에 흐름 을 읽 습 니 다.즉,이 때 는 하나의 연결 이 하나의 처리 스 레 드 에 대응 해 야 하 는 것 이 아니 라 효과 적 인 요청 입 니 다.하나의 스 레 드 에 대응 하고 연결 에 데이터 가 없 을 때 작업 스 레 드 가 처리 되 지 않 습 니 다.
BIO 와 NIO 는 비교적 중요 한 차이 점 이 있 는데 우리 가 BIO 를 사용 할 때 다 중 스 레 드 를 도입 하고 각각 하나의 단독 스 레 드 를 연결 하 는 것 이다.NIO 는 단일 스 레 드 를 사용 하거나 소량의 다 중 스 레 드 만 사용 하 며 연결 마다 하나의 스 레 드 를 공유 합 니 다.
NIO 의 가장 중요 한 부분 은 하나의 연결 이 생 성 된 후에 하나의 스 레 드 에 대응 할 필요 가 없다 는 것 입 니 다.이 연결 은 다 중 복합 기 에 등록 되 기 때문에 모든 연결 은 하나의 스 레 드 만 있 으 면 해결 할 수 있 습 니 다.이 스 레 드 의 다 중 복합 기 가 문의 할 때 연결 에 요청 이 있 으 면 하나의 스 레 드 를 열 어 처리 합 니 다.스 레 드 모드 를 요청 하 는 것 입 니 다.
NIO 의 처리 방식 에서 요청 이 오 면 스 레 드 를 열 어 처리 합 니 다.백 엔 드 에 응 용 된 자원(JDBC 연결 등)을 기다 릴 수 있 습 니 다.사실 이 스 레 드 는 막 혔 습 니 다.병행 하면 BIO 와 같은 문제 가 발생 할 수 있 습 니 다.
HTTP/1.1 이 나타 난 후 Http 긴 연결 이 생 겼 습 니 다.시간 초과 와 특정 닫 힌 http header 를 가리 키 는 것 을 제외 하고 이 링크 는 계속 열 려 있 는 상태 입 니 다.그러면 NIO 처리 에서 진일보 한 진 화 를 할 수 있 고 백 엔 드 자원 에서 자원 풀 이나 대기 열 을 실현 할 수 있 습 니 다.요청 이 오 면...열 린 스 레 드 는 요청 과 요청 데 이 터 를 백 엔 드 자원 탱크 나 대기 열 에 전송 하면 되 돌아 오고 전역 적 으로 이 현장 을 유지 합 니 다(어느 연결 의 요청 등).그러면 앞의 스 레 드 는 다른 요청 을 받 아들 일 수 있 습 니 다.백 엔 드 의 응용 처 리 는 대기 열 에 있 는 것 만 실행 하면 됩 니 다.이렇게 요청 처리 와 백 엔 드 응용 은 비동기 적 입 니 다.백 엔 드 처리 가 끝나 면 전역 적 으로 현장 에 가서 응답 을 받 으 면 비동기 처 리 를 실현 합 니 다.
AIO[비동기 비 차단]
NIO 와 달리 읽 기와 쓰기 작업 을 할 때 API 의 read 나 write 방법 을 직접 호출 하면 된다.이 두 가지 방법 은 모두 비동기 입 니 다.읽 기 작업 에 있어 서 읽 을 수 있 는 흐름 이 있 을 때 운영 체 제 는 읽 을 수 있 는 것 을 read 방법의 버퍼 에 전달 하고 응용 프로그램 에 알 립 니 다.쓰기 작업 에 있어 서 운영 체제 가 write 방법 으로 전달 하 는 흐름 을 기록 할 때 운영 체제 가 프로그램 에 주동 적 으로 알려 줍 니 다.즉,read/write 방법 은 모두 비동기 적 이 고 완성 되면 주동 적 으로 리 셋 함 수 를 호출 하 는 것 으로 이해 할 수 있다.JDK 1.7 에서 이 부분 은 NIO.2 라 고 불 리 며 주로 java.nio.channels 패키지 에 다음 네 개의 비동기 채널 을 추 가 했 습 니 다.
AsynchronousSocketChannel
AsynchronousServerSocketChannel
AsynchronousFileChannel
AsynchronousDatagramChannel
그 중의 read/write 방법 은 리 셋 함수 가 있 는 대상 을 되 돌려 줍 니 다.읽 기/쓰기 작업 이 끝 난 후에 리 셋 함 수 를 직접 호출 합 니 다.
  • BIO 는 하나의 라인 을 연결 하 는 것 이다.
  • NIO 는 요청 스 레 드 입 니 다.
  • AIO 는 유효한 요청 라인 입 니 다.
  • 일단 예 를 들 어서 개념 을 이해 해 보도 록 하 겠 습 니 다.
    은행 에서 돈 을 인출 하 는 것 을 예 로 들 면:
  • **동기 화:**자신 이 직접 나서서 은행 카드 를 들 고 은행 에 가서 돈 을 찾 습 니 다(동기 화 IO 를 사용 할 때 자바 가 스스로 IO 읽 기와 쓰기 처리).
  • **비동기:**동생 에 게 은행 카드 를 가지 고 은행 에 가서 돈 을 찾 아 달라 고 부탁 한 다음 에 드 리 겠 습 니 다(비동기 IO 를 사용 할 때 자바 가 IO 읽 기와 쓰 기 를 OS 에 의뢰 하고 데이터 버퍼 주소 와 크기 를 OS(은행 카드 와 비밀번호)에 전달 해 야 합 니 다.OS 는 비동기 IO 조작 API 를 지원 해 야 합 니 다)
  • 차단:ATM 이 줄 을 서서 돈 을 인출 할 수 있 습 니 다.기다 릴 수 밖 에 없습니다.4567918)
  • 비 차단:카운터 에서 돈 을 인출 하고 번 호 를 찾 은 다음 에 의자 에 앉 아서 다른 일 을 할 수 있 습 니 다.등호 방송 은 당신 에 게 처리 하 라 고 통지 할 것 입 니 다.번호 가 도착 하지 않 으 면 갈 수 없습니다.로비 매니저 가 줄 을 섰 는 지 계속 물 어 볼 수 있 습 니 다.로비 매니저 가 아직 도착 하지 않 았 다 면 갈 수 없습니다.(비 차단 IO 를 사용 할 때 자바 호출 을 읽 지 못 하면 바로 돌아 올 것 입 니 다.IO 이벤트 분배 기 가 읽 기와 쓰 기 를 알 릴 때 읽 기와 쓰기 가 끝 날 때 까지 계속 반복 합 니 다)
  • BIO,NIO,AIO 에 대한 자바 의 지원:
  • **자바 BIO:**동기 화하 고 차단 합 니 다.서버 구현 모드 는 하나의 연결 스 레 드 입 니 다.즉,클 라 이언 트 가 연결 요청 이 있 을 때 서버 에서 스 레 드 를 시작 하여 처리 해 야 합 니 다.만약 에 이 연결 이 아무것도 하지 않 으 면 불필요 한 스 레 드 비용 을 초래 할 수 있 습 니 다.스 레 드 탱크 체 제 를 통 해 개선 할 수 있 습 니 다.
  • 자바 NIO:동기 화 비 차단,서버 구현 모드 는 하나의 요청 스 레 드 입 니 다.즉,클 라 이언 트 가 보 낸 연결 요청 은 다 중 재 활용 기 에 등록 되 고 다 중 재 활용 기 는 연결 에 I/O 요청 이 있 을 때 하나의 스 레 드 를 시작 하여 처리 합 니 다.
  • 자바 AIO(NIO.2):비동기 비 차단,서버 구현 모드 는 하나의 스 레 드 를 효과적으로 요청 합 니 다.클 라 이언 트 의 I/O 요청 은 모두 OS 가 먼저 완성 한 다음 에 서버 응용 프로그램 에 스 레 드 를 시작 하 라 고 알 립 니 다.
  • BIO,NIO,AIO 적용 장면 분석:
  • BIO 방식 은 연결 수량 이 비교적 작고 고정된 구조 에 적용 된다.이런 방식 은 서버 자원 에 대한 요구 가 비교적 높 고 응용 에 국한 된다.JDK 1.4 이전의 유일한 선택 이지 만 프로그램 은 직관 적 이 고 이해 하기 쉽다.
  • NIO 방식 은 연결 수량 이 많 고 연결 이 비교적 짧 은(가 벼 운 조작)구조 에 적용 된다.예 를 들 어 채 팅 서버,병발 은 응용 에 국한 되 고 프로 그래 밍 이 복잡 하 며 JDK 1.4 가 지원 하기 시작 했다.
  • AIO 방식 은 연결 수량 이 많 고 연결 이 비교적 긴(재 작업)구조 에 사용 된다.예 를 들 어 앨범 서버 는 OS 를 충분히 호출 하여 병행 작업 에 참여 하고 프로 그래 밍 이 복잡 하 며 JDK 7 이 지원 하기 시작 했다.
  • 또한 I/O 는 바 텀 작업 에 속 하기 때문에 운영 체제 의 지원 이 필요 하고 병행 도 운영 체제 의 지원 이 필요 하기 때문에 성능 에 있어 서로 다른 운영 체제 의 차이 가 비교적 현저 할 것 이다.
  • 고성능 의 I/O 디자인 에서 두 가지 유명한 모델 인 Reactor 와 Proactor 모델 이 있 는데 그 중에서 Reactor 모델 은 동기 I/O 에 사용 되 고 Proactor 는 비동기 I/O 작업 에 사용 된다.
  • 이 두 모델 을 비교 하기 전에 우 리 는 먼저 몇 가지 개념 을 알 아야 한다.차단 과 비 차단 이 무엇 인지,동기 화 와 비동기 가 무엇 인지,동기 화 와 비동기 가 응용 프로그램 과 커 널 의 상호작용 에 있어 동기 화 는 사용자 프로 세 스 가 IO 작업 을 촉발 하고 기다 리 거나 문의 하 는 것 을 말한다.비동기 란 사용자 프로 세 스 가 IO 작업 을 촉발 한 후에 자신의 일 을 시작 하고 IO 작업 이 완료 되 었 을 때 IO 가 완료 되 었 다 는 통 지 를 받 는 것 을 말한다.
    한편,차단 과 비 차단 은 프로 세 스 가 데 이 터 를 방문 할 때 IO 작업 의 준비 상태 에 따라 서로 다른 방식 으로 작 동 함 수 를 읽 거나 기록 하 는 실현 방식 입 니 다.차단 방식 에서 읽 거나 기록 함 수 는 계속 기다 리 고 있 습 니 다.차단 방식 이 아 닌 읽 거나 기록 함 수 는 즉시 상태 값 을 되 돌려 줍 니 다.
    일반적으로 I/O 모델 은 동기 블록,동기 블록,비동기 블록,비동기 블록 으로 나 눌 수 있다.
  • 동기 화 차단 IO:이러한 방식 에서 사용자 프로 세 스 는 IO 작업 을 시작 한 후에 IO 작업 이 완 료 될 때 까지 기 다 려 야 합 니 다.IO 작업 이 완 료 된 후에 만 사용자 프로 세 스 가 실 행 될 수 있 습 니 다.JAVA 의 전통 적 인 IO 모델 은 이런 방식 에 속한다!
  • 동기 화 비 차단 IO:이러한 방식 에서 사용자 프로 세 스 는 IO 작업 을 시작 한 후에 다른 일 을 되 돌 릴 수 있 습 니 다.그러나 사용자 프로 세 스 는 수시로 IO 작업 이 준비 되 었 는 지 물 어 봐 야 합 니 다.이 는 사용자 프로 세 스 가 끊임없이 문의 하여 불필요 한 CPU 자원 낭 비 를 도입 하도록 요구 합 니 다.그 중에서 현재 JAVA 의 NIO 는 동기 비 차단 IO 에 속한다.
  • 비동기 블록 IO:이런 방식 은 응용 이 IO 작업 을 시작 한 후에 커 널 IO 작업 의 완성 을 기다 리 지 않 고 커 널 이 IO 작업 을 완성 한 후에 응용 프로그램 에 알 리 는 것 을 말한다.이것 은 바로 동기 화 와 비동기 의 가장 관건 적 인 차이 이다.동기 화 는 반드시 기다 리 거나 주동 적 으로 IO 가 완성 되 었 는 지 물 어 봐 야 한다.그러면 왜 차단 되 었 다 고 말 합 니까?이 때 는 select 시스템 호출 을 통 해 이 루어 졌 기 때문에 select 함수 자체 의 실현 방식 은 막 혔 습 니 다.select 함 수 를 사용 하면 여러 파일 핸들 을 동시에 감청 하여 시스템 의 동시성 을 높 일 수 있 습 니 다!
  • 비동기 비 차단 IO:이 모드 에서 사용자 프로 세 스 는 하나의 IO 작업 을 시작 한 후에 바로 돌아 와 야 합 니 다.IO 작업 이 진정 으로 완 료 된 후에 응용 프로그램 은 IO 작업 이 완료 되 었 다 는 통 지 를 받 을 수 있 습 니 다.이때 사용자 프로 세 스 는 데이터 만 처리 하면 됩 니 다.실제 IO 읽 기와 쓰기 작업 을 할 필요 가 없습니다.진정한 IO 읽 기 또는 쓰기 작업 은 커 널 에서 이 루어 졌 기 때 문 입 니 다.현재 자바 에 서 는 이러한 IO 모델 을 지원 하지 않 습 니 다.
  • 이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

    좋은 웹페이지 즐겨찾기