[JAVA]자바의 시스템 콜(feat.JNI)

무지성개발자·2023년 9월 3일
0

시스템 콜

시스템 콜은 사용자 영역에서 커널 영역에게 작업을 요청하는 것을 말한다.

OS는 사용자 영역과 커널 영역으로 나뉜다. 단어 그대로 사용자 영역은 사용자가 사용하는 곳으로 일반 프로그램들이 작동하는 영역을 말하며, 커널 영역은 사용자가 직접 접근하지 못하는 곳으로 운영체제의 내부를 커널이 관리하는 영역을 말한다. 대표적으로 I/O작업이 커널영역에서 이루어 진다.

하지만 우리가 실행하는 프로그램은 I/O같은 작업을 어떻게 할까? 프로그램은 사용자 영역에서 실행했으니 I/O 작업을 못하는 걸까? 근데 게임의 경우만 해도 저장과 불러오기를 하는 걸 보면 I/O작업을 한다. 바로 프로그램(사용자 영역)이 커널 영역에 이것 좀 해줘~ 하고 요청(시스템 콜) 하는 것이다.

자바의 시스템 콜

C언어 같은 경우 직접 메모리에 접근이 가능해서 할당과 해제를 직접 하지만 자바는 개발자가 메모리 관리를 하지 않는다.

만약 C로 I/O를 한다하면 시스템 콜의 흐름은 다음과 같다.
C 프로세스 -> 시스템 콜 -> 커널 -> 디스크 컨트롤러 -> 데이터 복사

근데 자바는 직접 시스템 콜을 하지 못한다. 때문에 JNI라는 걸 사용해서 시스템 콜을 하며, 그 흐름은 다음과 같다.
JVM -> JNI -> 시스템 콜 -> 커널 -> 디스크 컨트롤러 -> 커널 버퍼 복사 -> JVM 버퍼 복사

JNI(Java Navtive Interface)는 C 혹은 C++로 작석된 모듈에 접근하게 해주는 인터페이스다. JAVA는 C와 C++로 만들어진 언어라서 코드를 보다 보면 native 예약어가 붙어 있는 것들을 볼 수 있다. 이것들이 C 혹은 C++로 작성된 모듈과 연결이 된다.
이미지를 보면 JNI가 어떤 일을 하는지 이해하기 편하다.


한 줄평 : 커널영역을 직접 제어하면 좋은 쪽이든, 나쁜 쪽이든 많은 일을 할 수가 있다. 때문에 직접 커널영역을 접근을 하지 못하고 시스템 콜을 통해서 커널영역을 접근 하는 거다.

참고 -
https://brewagebear.github.io/java-syscall-and-io/

profile
no-intelli 개발자 입니다. 그래도 intellij는 씁니다.

0개의 댓글