December 02, 2023
메모리 아키텍처 최신 하드웨어에서의 동시 프로그래밍은 동일한 물리적 순간에 서로 다른 코어에서 여러 스레드를 동시해 실행할 수 있다. 아래 그림2에서 이를 확인할 수 있다. 각 CPU는 자체 레지스터를 포함하고 있는데, 이는 CPU 내부의 메모리로 간주된다. 레지스터에 접근하고 여기에 있 는 변수들에 연산을 수행하는 것은 매우 빠르다. CPU는 캐시 메모…
November 16, 2023
잠금 엑세스 레벨 공유 잠금(Shared Locks) 공유 잠금은 다수의 쿼리가 동시에 진행될 수 있도록 허용하지만 배타적 잠금을 얻으려는 시도를 차단한다. 즉, 어떤 트랜잭션이 공유 잠금을 적용하고 있다면, 해당 데이터에 대한 쓰기 작업을 시도하는 다른 트랜잭션은 잠금이 해제될 때까지 기다려야 한다. MySQL에서는 나 같은 locking read c…
October 30, 2023
문제 상황 소켓을 활용하여 서버-클라이언트 간 통신을 진행하는 과정에서, 클라이언트로부터의 요청이 일시적으로 급증하는 상황을 테스트하던 중, 클라이언트 측에서 라는 예외가 간헐적으로 발생하였다. 아래는 해당 예외가 발생했을 때 클라이언트 측에서 기록된 로그이다. 는 클라이언트가 서버로부터 정상적으로 응답을 받아 출력한 메시지이 다. 그 아래에 나타나는 …
October 19, 2023
Selector Buffer 편에서도 보았듯이, java.nio 는 기존 Java I/O의 한계를 극복하기 위해서 탄생되었다. C/C++의 경우에는 이미 POSIX 계열 OS의 select()나 poll() 같은 시스템 호출로 멀티플렉싱을 구현하였지만 기존 Java I/O는 이를 사용할 수 없었다. Selector는 멀티플렉싱 I/O를 가능하게 한다. …
October 14, 2023
Channel Channel은 파일이나 소켓과 같은 엔티티 간에 데이터를 효율적으로 전송하는 통로이다. 채널은 일반적으로 운영체제의 파일 디스크립터나 핸들러와 일대일 관계를 가진다. 채널은 Java의 플랫폼 독립성을 유지하면서도 운영 체제의 네이티브 I/O 기능에 대한 추상화를 제공한다. 아래 그림은 Channel 클래스의 상속관계를 나타낸다. 계층구조…
October 11, 2023
What is Light-Weight Container? 애플리케이션 코드가 실행되는 프레임워크를 의미한다. 애플리케이션 객체(대부분 비즈니스 객체)는 컨테이너 내부에서 실행되며 컨테이너에 의해 관리된다고 한다. 다음은 경량 컨테이너가 가지는 특징들이다. 비침투성 (Non-invasiveness): 이는 애플리케이션 코드에 특별한 의존성을 부과하지 않는 …
October 07, 2023
개요 지난 게시물에서는 Tomcat의 아키텍처와 클라이언트와의 연결 방식, 그리고 요청 처리 메커니즘에 대해 알아보았다. 특히, NIO Connector의 Selector를 활용한 이벤트 루프 처리 방식은 BIO Connector에 비해 훨씬 더 많은 연결을 효율적으로 관리하면서 요청을 처리할 수 있게 만들었다. 이번 게시물에서는 Tomcat이 Selec…
October 03, 2023
버퍼 I/O 운영체제의 I/O는 모두 버퍼를 통해 이루어진다. 프로세스는 버퍼에서 데이터를 채우는 (쓰기) 또는 버퍼에 데이터를 비우는 (읽기) 작업을 운영 체제에 요청함으로써 I/O를 수행한다. 모든 데이터는 이 메커니즘을 통해 프로세스 내부로 이동하거나 나간다. 위 그림에서 사용자 공간(user space)과 커널 공간(kernel space)의 개…
September 29, 2023
Socket Option 소켓 옵션은 자바의 Socket 클래스가 사용하는 네트워크 소켓이 데이터를 어떻게 보내고 받을 것인지를 결정한다. 자바에서는 클라이언트 측 소켓에 대해 9가지 옵션이 존재한다. TCP_NODELAY SO_BINDADDR SO_TIMEOUT SO_LINGER SO_SNDBUF SO_RCVBUF SO_KEEPALIVE OOBINLIN…
September 26, 2023
Jakarta EE Jakarta EE(Java EE)는 기업용 애플리케이션에 필요한 기능들의 사양을 정의해둔 명세서이다. 즉, 대규모 애플리케이션을 개발하는데 필요한 표준화된 Java API의 모음이라고 할 수 있 다. Java API의 특징은 API를 제공하는 구현 벤더와 분리되어 있기 때문에 API를 준수한다면 플러그 형태로 구현 벤더를 교체할 수 있…