Java의 BLOCKED 상태와 I/O 대기로 인한 일시정지 상태
·
Server
[ 대상 독자 ] 자바에는 Thread 객체가 있으며, 각 스레드는 고유의 상태(state)를 가집니다.그중 하나가 바로 BLOCKED 상태입니다.그렇다면 자바 서버 애플리케이션에서 A 스레드가 Socket을 통해 클라이언트와 통신 중이고, 현재 socket.read()를 호출한 채 클라이언트의 응답을 기다리고 있다면, 이때 A 스레드의 상태는 무엇일까요?"네트워크 I/O 작업이 진행되지 않고, 클라이언트 응답을 기다리며 block 된 상태이니 자바 스레드 상태도 BLOCKED가 아닐까?"라고 생각하신다면, 이 글이 도움이 될 수 있습니다. [ Java 스레드의 주요 상태 ] Java에서는 Thread.State 열거형으로 여섯 가지 스레드 상태를 정의합니다. 1. NEW : 스레드 객체를 생성했지만 ..
java 다이렉트 버퍼에 대하여
·
Server
[ Direct Buffer 탄생 배경 ]기존 io 에서 불편했던 것 초기 버전 Java에서는 전통적인 I/O 에서 소켓에 바이트를 write 하는 방식을 보자유저레벨의 자바 애플리케이션 힙 영역에 전달할 데이터 생성 한다.유저레벨의 네이티비 메모리(물리 메모리) 공간에 고정된 버퍼를 하나 만들어서 여기다 전달할 데이터를 복사한다. 즉 유저레벨 → 유저레벨로의 복사다.위에서 만든 물리 메모리 버퍼의 참조를 시스템 콜로 넘긴다. 시스템콜은 이 버퍼의 데이터를 커널레벨의 소켓 버퍼로 옮긴다. 이건 유저레벨 → 커널레벨로의 복사다. 왜 힙영역에서 물리메모리 영역으로 복사하나?힙 메모리에서 바로 커널 메모리로 복사하면 되는거 아닌가!?Java의 가비지 컬렉터는 힙 메모리를 자유롭게 이동 및 압축시키기 때문에,..
Multi Plexing 에 대하여
·
Server
[ 멀티플렉싱(multiplexing)은 왜 등장했을까? ]서버를 개발하다 보면 여러 클라이언트가 동시에 접속해 서비스를 제공받도록 하는 '다중 접속 서버'를 만들 필요가 생깁니다. 이러한 다중 접속 서버를 구현하는 방법은 크게 세 가지로 나눌 수 있습니다.멀티프로세싱(multiprocessing): 각각의 클라이언트 요청을 처리할 때마다 '새로운 프로세스를 생성'해서 대응하는 방식입니다. 프로세스 생성과 유지 비용이 커서 자원을 많이 소모합니다.멀티스레딩(multithreading): 한 프로세스 내에서 여러 개의 '스레드를 생성'해서 동시에 요청을 처리하는 방식입니다. 프로세스보다는 가볍지만, 스레드 간의 자원 경쟁과 컨텍스트 스위칭으로 인해 성능에 한계가 있습니다.멀티플렉싱(multiplexing)..