고성능 IO 시스템 설계에는 종종 우리를 혼란스럽게하는 몇 가지 명사 개념이 있습니다. 세부 사항은 다음과 같습니다.
1 동기화 란 무엇입니까?
2 비동기식은 무엇입니까?
3 차단이란 무엇입니까?
4 블로킹이없는 것은 무엇입니까?
5 동기식 차단이란 무엇입니까?
6 동기 비 블로킹 란 무엇입니까?
7 비동기 차단이란 무엇입니까?
8 비동기 비 차단은 무엇입니까?
인생의 모범을 보여 드리겠습니다.
쿵 파오 치킨 주사위 라이스 그릇을 원한다면 :
동기식 막힘 : 식당에 가서 음식을 주문한 다음 기다렸다가 소리를 지르십시오.
동기 비 차단 : 식당에서 주문한 후 나는 개를 걷다가 갔다. 그러나 한동안 걸은 후, 그는 식당으로 돌아가서 소리 쳤다.
비동기식 막힘 : 개를 걷을 때, 나는 식당에서 식사가 준비되었다고 말하는 전화를 받았으며 직접 가져 오라고 요청했습니다.
비동기식 비 블로킹 : 식당은 전화를 걸어 말했다.
위의 문제를 알아 내기 전에 먼저 동기화, 비동기식, 차단 및 비 블로킹이 무엇인지 이해해야합니다. 이러한 단일 개념이 명확하게 이해되고 결합되면 비교적 쉬워집니다.
1. 동기화 및 비동기식은 응용 프로그램과 커널 간의 상호 작용을위한 것입니다.
2. 차단 및 비 블로킹은 IO 작업의 준비 상태에 따라 데이터에 액세스 할 때 프로세스에 의해 채택 된 다른 방법입니다. 무뚝뚝하게 말하면, 그것은 작동 기능을 읽거나 쓰는 구현 방법입니다. 차단 방법에 따라 읽기 또는 쓰기 기능은 읽기 또는 쓰기 기능보다는 대기합니다.
위의 설명에서 기본적으로 짧은 문장을 요약 할 수 있습니다. 동기화 및 비동기식은 목적이며 차단 및 비 블로킹이 구현 방법입니다.
1. 동기화 : IO 작업이 준비되어 있는지 확인하기 위해 IO 작업을 트리거하고 대기 또는 폴링을 트리거하는 사용자 프로세스를 나타냅니다. 나는 길거리에서 옷을 사러 나가서 직접이 일을했는데 다른 일을 할 수 없었습니다.
2. 비동기식 : 비동기식은 사용자가 IO 작업을 트리거 한 후 자체 일을 시작한다는 것을 의미합니다. IO 작업이 완료되면 IO의 완료를 알립니다 (비동기식의 특성은 알림). 옷의 크기, 크기 및 색상에 맞게 친구에게 말하고 친구를 팔도록 맡기게 한 다음 다른 일을 할 수 있습니다. (비동기 IO를 사용할 때 Java는 IO를 OS에 읽고 쓰고 쓰기를 위임하고 데이터 버퍼 주소와 크기를 OS로 전달해야합니다)
3. 차단 : 소위 차단 방법은 파일 디스크립터를 읽고 쓰려고 할 때 읽을 것이 없거나 일시적으로 필요하지 않은 경우 프로그램이 읽거나 쓸 수있는 것이있을 때까지 대기 상태에 들어가서 버스 정류장으로 가서 재충전 함을 의미합니다. 이때, 충전기는 거기에 없으며 (아마도 화장실에 갔을 수도 있음), 우리는 충전기가 돌아올 때까지 여기서 기다립니다. (물론 이것은 실제 사회에서는 그렇지 않지만 실제로 컴퓨터의 경우입니다.)
4. 비 차단 : 비 차단 상태에서 읽을 것이 없거나 쓸 수없는 경우 읽기 및 쓰기 기능은 대기하지 않고 즉시 돌아옵니다. 은행이 사업을 처리하기 위해 돈을 인출하면 작은 영수증을 받게됩니다. 우리가 그것을 받으면, 우리는 휴대 전화를 가지고 놀거나 다른 사람들과 채팅 할 수 있습니다. 우리가 돌리면 은행의 스피커가 우리에게 알리고 갈 수 있습니다.
IO 작업은 실제로 IO 요청 시작 및 실제 IO 작업의 두 단계로 나뉩니다.
동기 IO와 비동기 IO의 차이점은 두 번째 단계가 차단되는지 여부입니다. 실제 IO가 읽기 및 쓰기가 요청 프로세스를 차단하면 동기식 IO입니다.
IO 차단과 비 블로킹 IO의 차이점은 IO 요청이 차단 될지 여부에 관계없이 첫 번째 단계에 있습니다. 완성 될 때까지 차단되면 전통적인 차단 IO입니다. 차단되지 않으면 차단하지 않는 IO입니다.
동기화 및 비동기식은 응용 프로그램과 커널 간의 상호 작용을 목표로합니다. 동기화는 IO 작업을 트리거하고 IO 작업이 준비되었는지 확인하기 위해 대기 또는 폴링을 트리거하거나 폴링하는 사용자 프로세스를 나타냅니다. 비동기식은 사용자 프로세스가 IO 작업을 트리거 한 후 자체 작업을 시작한다는 것을 의미하며 IO 작업이 완료되면 IO 완료가 완료 될 것임을 알립니다.
차단 및 비 블로킹은 IO 작업의 준비 상태에 따라 데이터에 액세스 할 때 프로세스에 의해 채택 된 다른 방법입니다. 무뚝뚝하게 말하면, 그것은 작동 기능을 읽거나 쓰는 구현 방법입니다. 차단 방법에 따라 읽기 또는 쓰기 기능은 읽기 또는 쓰기 기능보다는 대기합니다.
따라서 IO 작업은 동기 차단 (예 : 초기 바이오 작업), 동기 비 블로킹 (NIO) 및 비동기 비 블로킹 (AIIO)의 세 가지 범주로 나눌 수 있습니다.
동기 차단 (바이오) :
이러한 방식으로, 사용자 프로세스가 IO 작업을 시작한 후에는 IO 작업이 완료 될 때까지 기다려야합니다. IO 작업이 실제로 완료된 후에 만 사용자 프로세스가 실행될 수 있습니다. Java의 전통적인 IO 모델은이 방법에 속합니다.
동기 비 블로킹 (NIO) :
이러한 방식으로 사용자 프로세스는 IO 작업을 시작한 후 다른 작업을 수행하기 위해 돌아올 수 있지만 사용자 프로세스는 IO 작업이 때때로 준비되어 있는지 묻어야하므로 사용자 프로세스가 지속적으로 요청해야하므로 CPU 리소스의 불필요한 낭비를 도입해야합니다. 그 중에서 현재 Java의 NIO는 동기 비 차단 IO입니다.
비동기 비 차단 (AIO) :
이러한 방식으로 응용 프로그램이 IO 작업을 시작한 후 커널의 IO 작업이 완료 될 때까지 기다리지 않으며 커널이 IO 작업을 완료 한 후에 응용 프로그램에 알립니다.
동기 차단 IO (Java Bio) :
Synchronize 및 Block, 서버 구현 모드는 하나의 스레드에 연결하는 것입니다. 이 연결이 아무것도 수행하지 않으면 불필요한 스레드 오버 헤드가 발생하며 물론 스레드 풀 메커니즘을 통해 개선 될 수 있습니다.
동기 비 블로킹 IO (Java Nio) :
동기 비 블로킹, 서버 구현 모드는 하나의 스레드를 요청하는 것입니다. 즉, 클라이언트가 보낸 연결 요청은 멀티플렉서에 등록됩니다. 멀티플렉서는 I/O 요청에 대한 연결을 폴링하고 처리를위한 스레드를 시작합니다. 사용자 프로세스는 또한 IO 작업이 때때로 준비되었는지 여부를 묻습니다. 이는 사용자 프로세스가 지속적으로 요청해야합니다.
비동기 차단 IO (Java Nio) :
이러한 방식으로 응용 프로그램이 IO 작업을 시작한 후 커널의 IO 작업이 완료 될 때까지 기다리지 않으며 커널이 IO 작업을 완료 한 후에 응용 프로그램에 알립니다. 이것은 실제로 동기화와 비동기 간의 가장 중요한 차이입니다. 동기화는 IO가 완료되었는지 대기 또는 적극적으로 묻습니다. 그렇다면 왜 차단됩니까? 현재 선택 시스템 호출에 의해 수행되고 선택 함수 자체의 구현이 차단되고 있으며, 선택 함수를 사용하는 한 가지 장점은 동시에 여러 파일 핸들을 동시에들을 수 있다는 것입니다 (UNP의 관점에서 SELECT는 동기화 작업입니다. 선택 후에 프로세스가 데이터를 읽고 쓰는 것이 필요하기 때문에 시스템의 동의를 향상시킵니다!
(Java Aio (Nio.2)) 비동기 비 차단 IO :
이 모드에서 사용자 프로세스는 IO 작업을 시작하고 즉시 반환하면됩니다. IO 작업이 실제로 완료되면 응용 프로그램에 IO 작업이 완료되었다는 알림이 표시됩니다. 현재 사용자 프로세스는 데이터 만 처리하면되며 실제 IO 읽기 또는 쓰기 작업이 커널에 의해 완료 되었기 때문에 실제 IO 읽기 및 쓰기 작업을 수행 할 필요가 없습니다.
바이오, NIO 및 AIO에 대한 해당 시나리오 분석 :
바이오 방법은 비교적 작은 연결과 고정 연결이있는 아키텍처에 적합합니다. 이 방법에는 높은 서버 리소스가 필요하며 동시성은 응용 프로그램으로 제한됩니다. JDK1.4 이전의 유일한 선택이지만 프로그램은 직관적이고 간단하며 이해하기 쉽습니다.
NIO 방법은 채팅 서버와 같은 많은 연결 및 비교적 짧은 연결 (조명 작동)이있는 아키텍처에 적합합니다. 동시성은 응용 프로그램으로 제한되며 비교적 복잡한 프로그래밍을 가지고 있습니다. JDK1.4가이를 지원하기 시작했습니다.
AIO 방법은 앨범 서버와 같이 많은 연결과 비교적 긴 연결 (재개)이있는 아키텍처에 사용되며, 동시 작업에 참여하기 위해 OS를 완전히 호출하며 프로그래밍은 비교적 복잡합니다. JDK7이이를 지원하기 시작했습니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.