동기와 비동기
동기 : 호출이 종료된 이후에 처리 결과를 응답 받을 수있다. 서비스 처리가 완료 된 후에 처리 결과를 알 수 있는 방식을 동기식 호출이라고 한다.
비동기 : 실제로 처리가 완료되지 않았음에도 종료가 이루어 지며 그 응답을 호출자에게 전달한다.
비동기 호출을 지원하는 패턴은 다양하다. 퓨쳐 패턴, 이벤트 리스너는 옵저버 패턴, node.js는 콜백함수 , 네티는 리액터 패턴을 사용한다.
블로킹과 논 블로킹
소켓 동작 방식은 블로킹 모드와 논블로킹 모드로 나눈다.
블로킹은 요청한 작업이 성공하거나 에러가 밠행하기 전까지 응답을 돌려주지 않는 것을 의미하여 논 블로킹은 요청한 작업의 성공 여부와 상관없이 바로 결과를 돌려준다. 이때 요청의 응답값에 의해서 에러나 성공 여부를 판단한다.
블로킹 소켓은 serverSocket, socket 클래스, 논블로킹 소켓은 serverSocketChannel, SocketChannel 클래스를 사용한다.
블로킹 소켓은 데이터입출력에서 스레드의 블로킹이 발생하기 때문에 동시에 여러 클라이언트에 대한 처리가 불가능하다. 이 단점을 보완하기 위해 해결한 모델이 연결된 클라이언트 별로 스레드를 할당한다.
접속 클라이언트별 스레드르 생성한다면 OOM뿐 아니라 대기시간이 길어질 수 있다. 이를 방자하기 위해 서버에 생성되는 스레드 수를 제한하는 방법인 스레드 풀링을 사용하기도 한다.
처음부터 너무 많은 풀링을 사용하게 되면 시간이 흐름에 따라 가비지 콜렉션이 작동하고 자바 프로세스는 가비지를 작동시키는 동안 다른 스레드를 멈추는데 이때 어플리 케이션이 먹통이 된것처럼 보일 수 있다.
특히 힙의 크기가 클수록 가비지 컬렉션에 드는 시간이 길어진다.
힙 크기와 생성 가능한 스레드 수는 비례하고 힙에 할당된 메모리가 클수록 가비지 컬렉션이 수행되는 횟수는 줄어들지만 수행시간은 상대적으로 길어진다.
두번째는 컨텍스트 스위칭에 대한 고찰이다. 한 프로세스에 수행되는 스레들이 cpu점유를 위해서 자신의 상태를 변경하는 작업이다. 이때 수많은 스레드가 cpu자원을 획득하기 위하여 경쟁하면서 cpu 자원을 소모하기 때문에 실제로 작업에 사용할 cpu가 줄어들게 된다.
>> Blocing / NonBlocking
호출된 함수가 바로 리턴해서 호출한 함수에게 제어권을 넘기는가?
제어권은 메인프로세스에서 어디로 가고 있는가?
=제어권의 문제
>>Synchronous / Asynchronous
호출되는 함수에게 callback을 전달해서 사용하고 있는가?
=작업 완료 여부
'STUDY > PROGRAMMING' 카테고리의 다른 글
웹 개발 공략서 (0) | 2018.09.02 |
---|---|
failover cluster / LoadBanlancing (0) | 2018.08.30 |
2. GRADLE ( 도서: gradle 철저입문 ) (0) | 2018.08.27 |