Program Tip

소켓 대 SocketChannel

programtip 2020. 11. 15. 11:41
반응형

소켓 대 SocketChannel


일반적으로 SocketChannelsNIO 를 이해하려고합니다 . 일반 소켓으로 작업하는 방법과 일반 블로킹 소켓을 사용하여 클라이언트 당 간단한 스레드 서버를 만드는 방법을 알고 있습니다.

그래서 내 질문 :

  • SocketChannel이란 무엇입니까?
  • Socket 대신 SocketChannel로 작업 할 때 얻는 추가 사항은 무엇입니까?
  • 채널과 버퍼의 관계는 무엇입니까?
  • 선택기 란 무엇입니까?
  • 문서 의 첫 번째 문장 A selectable channel for stream-oriented connecting sockets.입니다. 그게 무슨 뜻입니까?

나는 또한 이 문서를 읽었 지만 어떻게 든 그것을 얻지 못하고 있습니다 ...


A Socket는 차단 입 / 출력 장치입니다. 그것은 Thread그것을 사용하여 읽기를 차단하고 잠재적으로 기본 버퍼가 가득 찬 경우 쓰기를 차단합니다. 따라서 서버에 열린 Sockets 가 많은 경우 여러 스레드를 만들어야합니다 .

A SocketChannel는 소켓에서 읽는 비 차단 방식이므로 한 스레드가 한 번에 여러 개의 열린 연결과 통신 할 수 있습니다. 이것은에 SocketChannels 묶음을 추가 한 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를 사용 합니다. , Selectors는 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

반응형