자바 세 가지 IO 모델 원리 실례 상세 설명
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 방법 은 리 셋 함수 가 있 는 대상 을 되 돌려 줍 니 다.읽 기/쓰기 작업 이 끝 난 후에 리 셋 함 수 를 직접 호출 합 니 다.
은행 에서 돈 을 인출 하 는 것 을 예 로 들 면:
한편,차단 과 비 차단 은 프로 세 스 가 데 이 터 를 방문 할 때 IO 작업 의 준비 상태 에 따라 서로 다른 방식 으로 작 동 함 수 를 읽 거나 기록 하 는 실현 방식 입 니 다.차단 방식 에서 읽 거나 기록 함 수 는 계속 기다 리 고 있 습 니 다.차단 방식 이 아 닌 읽 거나 기록 함 수 는 즉시 상태 값 을 되 돌려 줍 니 다.
일반적으로 I/O 모델 은 동기 블록,동기 블록,비동기 블록,비동기 블록 으로 나 눌 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.