프로세스 종료와 시그널
·
Server
[ 프로세스 종료가 중요한 이유 ]프로세스가 우아하게 종료되는 일은 서비스 품질과 시스템 안정성 두 가지 측면에서 매우 중요합니다.먼저, 운영체제 관점에서 보면 애플리케이션이 열어 둔 파일 디스크립터나 네트워크 소켓, 메모리 맵과 같은 커널 자원을 스스로 해제하지 않으면 커널이 이를 회수할 때까지 자원이 묶여 있어 FD 고갈이나 메모리 누수로 이어질 수 있습니다. 이는 장시간 실행되는 서버라면 특히 치명적이며, 자원 부족 때문에 신규 프로세스가 기동 되지 못하거나 예기치 않은 OOM(Out Of Memory) 오류로 서비스 전체가 중단될 위험을 높입니다. 또한 데이터 무결성 측면에서도 올바른 종료 절차가 필수적입니다. 프로세스가 트랜잭션을 진행 중이거나 버퍼에 기록을 쌓아 두고 있을 때 강제 종료가 발생..
kotlin coroutine 에 대하여
·
Server
[ 코루틴 이란? ] 코루틴(coroutine)은 co-(함께)와 routine(루틴, 일상적인 함수 실행)의 합성어입니다.즉, "함께 실행되는 루틴"이라는 의미로, 서로 협력하며 실행 흐름을 주고받는 함수(또는 실행 단위)를 뜻합니다.일반 함수는 호출되면 실행을 마칠 때까지 제어권을 갖고 있다가 끝나면 호출자에게 제어권을 반환합니다.반면 코루틴은 실행 도중에도 중단(suspend)하고, 다시 재개(resume)할 수 있는 함수입니다. [ 탄생 배경 ]‘코루틴’이라는 개념 자체는 현대적인 async/await, Kotlin 코루틴보다 훨씬 오래된 개념입니다코루틴은 1960년대에 처음 등장한 개념으로, 당시에는 스택프레임을 공유하며 함수 간 제어권을 명시적으로 전환할 수 있는 구조로 설계되었습니다.현대에..
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)..