공부용 블로그

JAVA NIO 와 Selector 본문

설계/WebServer

JAVA NIO 와 Selector

tomato212 2018. 10. 19. 18:13


소켓연결시 기존의 blocking 형태는 동시접속자가 증가할 경우 client = thread 이기 때문에


thread 수가 너무 많아져 context switching 등의 문제가 발생하여 서버의 성능이 떨어진다는 문제점이 있었다.


그래서 나온 방식이 non-blocking. 


싱글스레드로 작동하며 클라이언트로부터 소켓연결이나 데이터 입력 등과 같은 요청이 들어올때 실제로 처리할 값이 없으면


null값을 리턴한다. 바로바로 리턴하기 때문에 blocking 되지 않고, thread를 계속 늘리지 않아도 된다.


그러나 non-blocking의 문제점은 실제적으로 수행할 일이 없어도 코드가 무한루프를 돌기 때문에 cpu의 낭비가 심하다.


이러한 비효율적인 무한루프를 해결하기 위해 셀렉터가 이벤트 리스너 역할을 해준다.


셀럭터를 사용해서 무한루프를 돌지 않고도 클라의 요청이 들어오면 이벤트를 발생시켜 처리해준다. 


이벤트 발생 후 worker thread 에게 작업 요청?




nginx는 싱글 프로세스 스레드로 이벤트 구동에 의한 넌블로킹(Non-Blocking) 처리를 하므로 처리속도가 매우 빠르다. 그러나 넌블로킹 처리에 따라 프로그램의 제어가 이벤트 핸들러(Event Handler)로 넘어왔다고는 해도 실제 데이터를 읽고 쓰는건 OS(커널) 내에 있는 시스템 호출 프로그램과 하드웨어 사이에서 실행되므로, 해당 처리가 너무 길어지면(I/O 시간이 길어지면) 결국 시스템 호출 큐에 요청이 많이 쌓여 성능이 저하될 수 있다.




JAVA NIO


https://www.slideshare.net/allnewangel/java-nio-23150417





'설계 > WebServer' 카테고리의 다른 글

ubuntu 16.04 $JAVA_HOME 설정  (0) 2018.10.25
Apache 마인드맵  (0) 2018.10.23
비동기처리, 콜백 함수  (0) 2018.10.19
vert.x 구조 이해하기  (0) 2018.10.18
JVM 이란  (0) 2018.10.13