아마도 많은 친구들이 NIO를 배울 때 약간 어렵다고 느낄 것이고 NIO의 많은 개념은 명확하지 않습니다. Java NIOprogramming에 들어가기 전에 오늘 몇 가지 기본 지식인 I/Omodel에 대해 논의해 보겠습니다. 다음 기사에서는 동기화와 비동기의 개념으로 시작한 다음 차단과 비차단의 차이점을 설명하고 차단 IO와 비차단 IO의 차이점을 소개한 다음 동기 IO와 비동기 IO의 차이점을 소개하고 다음을 소개합니다. 5가지 IO 모델, 그리고 마지막으로 고성능 IO 디자인과 관련된 2가지 디자인 패턴(Reactor 및 Proactor)이 소개됩니다.
다음은 이 글의 목차 개요입니다.
1. 동기화란 무엇인가요? 비동기식이란 무엇입니까?
2. 차단이란 무엇인가요? 논블로킹이란 무엇인가요?
3. 블로킹IO란? 논블로킹 IO란 무엇입니까?
4. 동기식 IO란 무엇인가요? 비동기 IO란 무엇입니까?
5. 5가지 IO 모델
6. 2가지 고성능 IO 디자인 패턴
혹시라도 실수가 있다면 양해해주시고 비판과 수정을 환영합니다.
동기화와 비동기화의 개념은 오래 전부터 존재해왔고, 인터넷에는 동기화와 비동기화에 대한 많은 의견이 있습니다. 다음은 개인적인 이해입니다.
동기화는 여러 작업 또는 이벤트가 발생하는 경우 이러한 작업 또는 이벤트를 하나씩 수행해야 하며 하나의 이벤트 또는 작업을 실행하면 전체 프로세스가 대기하게 된다는 것을 의미합니다.
비동기식이란 여러 작업이나 이벤트가 발생하는 경우 이러한 이벤트가 동시에 실행될 수 있으며 하나의 이벤트나 작업 실행으로 인해 전체 프로세스가 일시적으로 기다리지 않는다는 의미입니다.
이것은 동기식과 비동기식입니다. 간단한 예를 들자면, 두 개의 하위 작업 A와 B를 포함하는 작업이 있는 경우입니다. 동기화를 위해 A가 실행 중일 때 B는 A가 완료될 때까지만 기다릴 수 있으며 그런 다음 B는 비동기식으로 실행할 수 있습니다. 동시에 실행되며 B는 A의 실행이 완료될 때까지 기다릴 필요가 없으므로 A의 실행으로 인해 전체 작업이 일시적으로 기다리지 않습니다.
그래도 이해가 되지 않는다면 다음 두 가지 코드를 먼저 읽어보세요:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
🎜🎜 }🎜🎜<code class="java space"> 🎜🎜 void code> <code class="java plain">fun2() { 🎜🎜 🎜🎜 }🎜🎜 🎜🎜 void code> function(){ 🎜🎜 fun1(); 🎜
|
이 코드는 메소드 함수에서 fun1을 실행하면 후속 fun2를 실행할 수 없게 됩니다. Fun2는 실행되기 전에 fun1의 실행이 완료될 때까지 기다려야 합니다.
그런 다음 다음 코드를 살펴보세요.
1
2🎜 3🎜 4🎜 5🎜 6🎜 7🎜 8🎜 9🎜 10🎜 11🎜 12🎜 13🎜 14🎜 15🎜 16🎜 17🎜 18🎜 19🎜 20🎜 21🎜 22🎜 23🎜 24🎜 |
🎜🎜
🎜
🎜
🎜
|
이 코드는 일반적인 비동기 코드입니다. fun1의 실행은 fun2의 실행에 영향을 주지 않으며 fun1과 fun2의 실행으로 인해 후속 실행 프로세스가 일시적으로 대기하지 않습니다.
실제로 동기화와 비동기성은 매우 광범위한 개념입니다. 이벤트 발생이나 실행으로 인해 여러 작업과 이벤트가 발생할 때 전체 프로세스가 일시적으로 대기하게 되는지 여부에 중점을 둡니다. Java의 synchronized 키워드로 동기화와 비동기를 비유할 수 있다고 생각합니다. 여러 스레드가 동시에 변수에 액세스하는 경우 각 스레드의 변수 액세스는 이벤트입니다. 동기화를 위해서는 한 스레드가 변수에 액세스하는 과정에서 다른 스레드가 하나씩 변수에 액세스해야 합니다. 비동기식의 경우 여러 스레드가 변수에 하나씩 액세스할 필요가 없지만 동시에 액세스할 수 있습니다.
그러므로 저는 개인적으로 동기화와 비동기성을 여러 가지로 표현할 수 있다고 생각하는데, 기억해야 할 핵심은 여러 작업과 이벤트가 발생할 때, 이벤트의 발생이나 실행으로 인해 전체 프로세스가 일시적으로 대기하게 되는 것인지 여부입니다. 일반적으로 비동기는 멀티 스레딩을 통해 달성할 수 있지만 멀티 스레딩을 비동기와 동일시하지 마십시오. 비동기는 단지 매크로 패턴일 뿐이며 멀티 스레딩을 사용하여 비동기를 달성하는 것은 단지 수단일 뿐이며 비동기 구현도 달성할 수 있습니다. 다중 처리를 통해.
동기식과 비동기식의 차이점은 앞서 소개했습니다. 이번 섹션에서는 차단과 비차단의 차이점을 살펴보겠습니다.
블로킹은 이벤트나 작업이 실행될 때 요청 작업을 실행하지만 요청 작업에 필요한 조건이 충족되지 않기 때문에 조건이 충족될 때까지 대기한다는 의미입니다. 이벤트나 작업이 실행 중일 때 요청 작업에 필요한 조건이 충족되지 않으면 조건이 충족되지 않았음을 알리는 플래그 메시지가 즉시 반환되며 거기서 영원히 기다리지 않습니다. .
이것이 차단과 비차단의 차이입니다. 즉, 차단과 비차단의 주요 차이점은 작업을 요청할 때 조건이 충족되지 않으면 영원히 기다리거나 플래그 메시지를 반환하는지 여부입니다.
간단한 예를 들자면:
파일의 내용을 읽고 싶은 경우, 현재 파일에 읽을 수 있는 내용이 없으면 동기화를 위해 파일에 읽을 수 있는 내용이 있을 때까지 기다리게 됩니다. Non-Blocking의 경우 파일에 읽을 내용이 없음을 알리기 위해 플래그 메시지가 직접 반환됩니다.
인터넷의 일부 친구들은 동기화와 비동기를 각각 차단 및 비차단과 동일시합니다. 사실 둘은 완전히 다른 개념입니다. 후속 IO 모델을 이해하려면 이 두 가지 개념 집합 간의 차이점을 이해하는 것이 매우 중요합니다.
동기식 및 비동기식의 초점은 하나의 작업 실행으로 인해 여러 작업이 실행되는 동안 전체 프로세스가 일시적으로 대기하게 되는지 여부에 있습니다.
요청 작업을 실행할 때 차단 및 비차단의 초점은 다음과 같습니다. 작업 조건이 충족되지 않으면 조건이 충족되지 않았음을 알리는 플래그 메시지가 반환됩니다.
블로킹과 비블로킹의 이해는 스레드 블로킹에 비유하여 이해할 수 있습니다. 스레드가 요청 작업을 수행할 때 조건이 충족되지 않으면 차단됩니다. 즉, 조건이 충족될 때까지 기다립니다.
3. IO 차단이란 무엇인가요? 논블로킹 IO란 무엇입니까?
일반적으로 IO 작업에는 하드 디스크 읽기 및 쓰기, 소켓 읽기 및 쓰기, 주변 장치 읽기 및 쓰기가 포함됩니다.
사용자 스레드가 IO 요청 작업을 시작하면(이 문서에서는 읽기 요청 작업을 예로 들었습니다) 커널은 읽을 데이터가 준비되었는지 확인합니다. IO 차단의 경우 데이터가 준비되지 않은 경우 데이터가 준비될 때까지 기다리세요. 비차단 IO의 경우 데이터가 준비되지 않은 경우 현재 읽고 있는 데이터가 준비되지 않았음을 사용자 스레드에 알리는 플래그 메시지가 반환됩니다. 데이터가 준비되면 데이터가 사용자 스레드에 복사되어 전체 IO 읽기 요청 작업이 완료됩니다. 즉, 전체 IO 읽기 요청 작업에는 두 단계가 포함됩니다.
1) 데이터가 준비되었는지 확인합니다.
2) 데이터 복사(커널이 데이터를 사용자 스레드에 복사합니다).
그러면 블로킹(blocking IO)과 비차단(non-blocking IO)의 차이점은 첫 번째 단계에서 데이터가 준비되지 않은 경우 데이터가 준비되었는지 확인하는 과정에서 항상 기다려야 하는지 여부입니다. 준비가 되었거나 플래그 정보를 직접 반환할 수 있습니다.
Java의 기존 IO는 소켓을 통해 데이터를 읽는 등의 IO를 차단합니다. read() 메서드를 호출한 후 데이터가 준비되지 않은 경우 현재 스레드는 항상 읽기 메서드 호출에서 차단되고 그 때까지 반환되지 않습니다. 데이터가 있고 비차단 IO인 경우 데이터가 준비되지 않은 경우 read() 메서드는 항상 대기하는 대신 현재 스레드에 데이터가 준비되지 않았음을 알리는 플래그 메시지를 반환해야 합니다.
먼저 동기 IO와 비동기 IO의 정의를 살펴보겠습니다. "유닉스 네트워크 프로그래밍" 책에 나오는 동기 IO와 비동기 IO의 정의는 다음과 같습니다.
동기 I/O 작업으로 인해 요청 프로세스가 발생합니다. 해당 I/O 작업이 완료될 때까지 차단됩니다.
비동기 I/O 작업으로 인해 요청 프로세스가 차단되지는 않습니다.
문자 그대로의 의미로 볼 수 있습니다. 동기 IO는 스레드가 요청하는 경우 IO 작업이 완료되기 전에 스레드가 차단됩니다.
비동기 IO는 스레드가 IO 작업을 요청하면 IO 작업으로 인해 요청 스레드가 차단되지 않음을 의미합니다.
실제로 동기식 IO 및 비동기식 IO 모델은 사용자 스레드와 커널 간의 상호 작용을 목표로 합니다.
동기식 IO의 경우: 사용자가 IO 요청 작업을 실행한 후 데이터가 준비되지 않은 경우 사용자 스레드 또는 커널에 의해 지속적으로 처리됩니다. 데이터가 준비되었는지 폴링하기 위해 데이터가 준비되면 커널에서 사용자 스레드로 데이터를 복사합니다.
비동기 IO: IO 요청 작업의 발행만 수행됩니다. 사용자 스레드이며 IO 작업의 두 단계는 커널에 의해 자동으로 완료된 다음 사용자에게 스레드 IO 작업이 완료되었음을 알리는 알림을 보냅니다. 즉, 비동기 IO에서는 사용자 스레드가 차단되지 않습니다.
이것이 동기 IO와 비동기 IO의 주요 차이점입니다. 동기 IO와 비동기 IO의 주요 차이점은 데이터 복사 단계가 사용자 스레드 또는 커널에 의해 완료되는지 여부에 반영됩니다. 따라서 비동기 IO에는 운영 체제의 기본 지원이 있어야 합니다.
동기식 IO와 비동기식 IO는 차단 IO 및 비차단 IO와는 다른 개념입니다.
블로킹 IO와 비블로킹 IO는 사용자가 IO 작업을 요청할 때 데이터가 준비되지 않은 경우 데이터가 준비될 때까지 기다리는 경우 사용자 스레드가 여전히 플래그 메시지를 수신한다는 사실에 반영됩니다. 즉, Blocking IO와 Non-Blocking IO는 IO 작업의 첫 번째 단계에 반영되어 데이터 준비 여부를 확인할 때 처리됩니다.
"Unix 네트워크 프로그래밍"이라는 책에는 차단 IO, 비차단 IO, 다중화 IO, 신호 드라이버 IO 및 비동기 IO라는 다섯 가지 IO 모델이 언급되어 있습니다.
이제 5가지 IO 모델의 유사점과 차이점을 소개하겠습니다.
1. 차단 IO 모델
가장 전통적인 IO 모델, 즉 데이터를 읽고 쓰는 과정에서 차단이 발생합니다.
사용자 스레드가 IO 요청을 발행하면 커널은 데이터가 준비되었는지 확인하고 그렇지 않은 경우 데이터가 준비될 때까지 기다리며 사용자 스레드는 차단된 상태에 있게 됩니다. 스레드가 CPU를 넘겨줍니다. 데이터가 준비되면 커널은 데이터를 사용자 스레드에 복사하고 결과를 사용자 스레드에 반환한 다음 사용자 스레드는 블록 상태를 해제합니다.
IO 모델 차단의 일반적인 예는 다음과 같습니다.
1
|
🎜🎜
|
데이터가 준비되지 않은 경우 읽기 방법에서 항상 차단됩니다.
2. 비차단 IO 모델
사용자 스레드가 읽기 작업을 시작하면 기다릴 필요가 없지만 즉시 결과를 얻습니다. 결과가 오류인 경우 데이터가 아직 준비되지 않았음을 알고 읽기 작업을 다시 보낼 수 있습니다. 커널의 데이터가 준비되고 사용자 스레드로부터 다시 요청이 수신되면 즉시 데이터를 사용자 스레드에 복사한 다음 반환합니다.
실제로 비차단 IO 모델에서 사용자 스레드는 커널 데이터가 준비되었는지 지속적으로 물어봐야 합니다. 이는 비차단 IO가 CPU를 넘겨주지 않고 항상 CPU를 점유한다는 의미입니다.
일반적인 비차단 IO 모델은 일반적으로 다음과 같습니다.
1
2🎜 3🎜 4🎜 5🎜 6🎜 7🎜 |
🎜🎜
|
위 내용은 자바 NIO: I/O 모델의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!