시스템 콜
은 사용자 영역에서 커널 영역에게 작업을 요청하는 것을 말한다.
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가 어떤 일을 하는지 이해하기 편하다.
한 줄평 : 커널영역을 직접 제어하면 좋은 쪽이든, 나쁜 쪽이든 많은 일을 할 수가 있다. 때문에 직접 커널영역을 접근을 하지 못하고 시스템 콜을 통해서 커널영역을 접근 하는 거다.