소켓 대 SocketChannel
일반적으로 SocketChannels 및 NIO 를 이해하려고합니다 . 일반 소켓으로 작업하는 방법과 일반 블로킹 소켓을 사용하여 클라이언트 당 간단한 스레드 서버를 만드는 방법을 알고 있습니다.
그래서 내 질문 :
- SocketChannel이란 무엇입니까?
- Socket 대신 SocketChannel로 작업 할 때 얻는 추가 사항은 무엇입니까?
- 채널과 버퍼의 관계는 무엇입니까?
- 선택기 란 무엇입니까?
- 문서 의 첫 번째 문장 은
A selectable channel for stream-oriented connecting sockets.
입니다. 그게 무슨 뜻입니까?
나는 또한 이 문서를 읽었 지만 어떻게 든 그것을 얻지 못하고 있습니다 ...
A Socket
는 차단 입 / 출력 장치입니다. 그것은 Thread
그것을 사용하여 읽기를 차단하고 잠재적으로 기본 버퍼가 가득 찬 경우 쓰기를 차단합니다. 따라서 서버에 열린 Socket
s 가 많은 경우 여러 스레드를 만들어야합니다 .
A SocketChannel
는 소켓에서 읽는 비 차단 방식이므로 한 스레드가 한 번에 여러 개의 열린 연결과 통신 할 수 있습니다. 이것은에 SocketChannel
s 묶음을 추가 한 Selector
다음 선택기의 select()
메서드 를 반복 하여 작동 합니다 . 그러면 소켓이 수락되었는지, 데이터를 받았는지 또는 닫혔는지 알 수 있습니다. 이를 통해 하나의 스레드에서 여러 클라이언트와 통신 할 수 있으며 여러 스레드 및 동기화의 오버 헤드가 없습니다.
Buffer
는 데이터를 새 어레이로 복사하는 오버 헤드를 피하기 위해 읽기 및 쓰기에서 기본 데이터에 액세스 할 수있는 NIO의 또 다른 기능입니다.
지금 NIO
까지 1.4 이전의 Java가 어땠는지 기억하는 사람은 거의 없습니다. 이는 .NET의 "이유"를 이해하기 위해 알아야 할 사항입니다 NIO
.
간단히 말해서 Java 1.3까지는 모든 I / O가 차단 유형이었습니다. 더 나쁜 것은 select()
다중 I / O 에 대한 시스템 호출의 아날로그가 없다는 것 입니다. 그 결과 Java로 구현 된 서버는 "연결 당 하나의 스레드"서비스 전략을 채택 할 수밖에 없었습니다.
Java 1.4에 도입 된 NIO의 기본 요점은 Java에서 사용 가능한 전통적인 UNIX 스타일 멀티 플렉스 비 차단 I / O의 기능을 만드는 것입니다. 파일 설명자 집합 (일반적으로 소켓)에서 I / O 준비 상태 를 프로그래밍 select()
하거나 poll()
감지 하는 방법을 이해하면 다음에서 필요한 서비스를 찾을 수 있습니다 NIO
. SocketChannel
비 차단 I / O 엔드 포인트에 s를 사용 합니다. , Selector
s는 fdsets 또는 pollfd 배열입니다. 스레드 풀이있는 서버 또는 각각 하나 이상의 연결을 처리하는 스레드가있는 서버가 이제 가능해졌습니다. 그것은 "추가"입니다.
A Buffer
는 특히 출력 / 쓰기 측면에서 비 블로킹 소켓 I / O에 필요한 종류의 바이트 배열입니다. 버퍼의 일부만 즉시 쓸 수 있고 I / O를 차단하면 전체가 쓸 수있을 때까지 스레드가 차단됩니다. non-blocking I / O를 사용하면 쓰레드는 쓰여진 양의 반환 값을 가져와 다음 라운드를 위해 남은 것을 처리 할 수 있습니다. A Buffer
는 채우기 및 드레 이닝을위한 생산자 / 소비자 패턴을 명시 적으로 구현하여 이러한 기계적 세부 사항을 처리합니다. 스레드와 JVM의 커널이 동기화 되지 않을 것임을 이해합니다 .
을 사용하고 있지만 처리하려면 SocketChannels
스레드 풀을 사용해야합니다 channels
.
scenairo를 생각하면 select()
에서 SocketChannels
선택한 항목을 폴링 하고 처리하는 하나의 스레드 만 사용 Selectors
합니다. 한 채널이 처리하는 데 1 초가 걸리고 대기열에 10 개의 채널이있는 경우 다음 폴링 전에 10 초를 기다려야합니다. 참을 수 없습니다. 채널 처리를위한 스레드 풀이 있어야합니다.
이런 의미에서 클라이언트 당 스레드 차단 소켓 패턴과는 큰 차이가 없습니다. 주요 차이가있는 NIO
패턴, 작업이 작고, 더 스레드 당 작업처럼, 그리고 작업이 자세한 내용을 위해, 등 쓰기, 비즈 과정을 읽을 수, 당신은 한 번 봐 걸릴 수 의 Netty 의의 구현을 NioServerSocketChannelFactory
, 어떤 연결을 수락하는 하나의 보스 스레드를 사용하고 처리를 위해 작업자 스레드 풀에 작업을 발송합니다.
하나의 스레드를 정말 좋아한다면 I / O 작업이 명령 처리주기보다 훨씬 느리기 때문에 최소한 I / O 스레드를 풀링했다고 생각하면 귀중한 스레드를 원하지 않을 것입니다. I / O에 의해 차단되고 이것은 정확히 NodeJS가 수행하며 하나의 스레드 승인 연결을 사용하며 모든 I / O는 비동기 적이며 백엔드 I / O 스레드 풀에 의해 병렬 처리됩니다.
클라이언트 당 오래된 스타일의 스레드가 죽었습니까? 나는 그렇게 생각하지 않는다. NIO 프로그래밍은 복잡하고 멀티 스레드는 당연히 나쁘지 않다. 최신 운영 체제와 CPU는 멀티 태스킹에서 점점 더 좋아지고, 따라서 멀티 스레딩의 오버 헤드는 시간이 지남에 따라 작아진다는 것을 명심하십시오.
참고 URL : https://stackoverflow.com/questions/14225957/socket-vs-socketchannel
'Program Tip' 카테고리의 다른 글
정규식의 복잡성은 무엇입니까? (0) | 2020.11.15 |
---|---|
MongoDB에서 "id"와 "_id"필드의 차이점 (0) | 2020.11.15 |
Perl에서 shift ()는 무엇을합니까? (0) | 2020.11.15 |
IntelliJ IDEA 용 Visual Studio ReSharper 키맵 (0) | 2020.11.15 |
D3로 "실시간"그래프 생성 (0) | 2020.11.15 |