ref :
1.https://www.baeldung.com/linux/kernel-system-call-implementation
2.https://github.com/torvalds/linux/blob/master/arch/x86/entry/syscalls/syscall_64.tbl
3. https://www.baeldung.com/linux/kernel-system-call-implementation
4. https://stackoverflow.com/questions/54878237/is-there-a-separate-kernel-level-thread-for-handling-system-calls-by-user-proces
5. https://0xax.gitbooks.io/linux-insides/content/SysCall/linux-syscall-4.html ( 시스템 콜 )
6. https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md#arm64-64_bit ( 시스템 콜 )
7. https://docs.oracle.com/javase/tutorial/essential/io/index.html
8. https://0xax.gitbooks.io/linux-insides/content/SysCall/linux-syscall-4.html
서론
컴퓨터에서 사용자 프로그램의 입출력은 결국 운영체제가 제공하는 시스템 콜을 통해 이루어진다. 시스템 콜을 통해 디바이스 드라이버에 명령을 전달하고, 디바이스 드라이버는 디바이스 컨트롤러의 적절한 레지스터에 적절한 값을 할당하여 메모리로의 입출력을 수행하도록 한다. 이때, DMA를 통해 메모리의 커널영역에 CPU의 연산 없이 데이터를 적재할 수 있다.
커널 영역에 적재된 데이터를 사용자 영역으로 로드하는 여러 방법이 Java IO, NIO, NIO2이다.
즉, 이러한 Java API는 시스템 콜을 통해 IO 작업을커널 메모리에 적재된 데이터를 어떻게 사용자 영역에 가져올지에 대한 전략을 구성한다.
시스템 콜부터 간략하게 살펴보자
System Call (System Call)
시스템 콜은 운영체제가 사용자 프로그램에게 제공하는 미리 구현된 하나의 라이브러리다. 사용자 프로그램은 하드웨어 자원에 접근하는 로직을 작성할 수 없으며, 이러한 방법을 위해서는 반드시 시스템 콜을 사용하도록 하여 정해진 절차만을 밟도록 구현한다.
시스템 콜은 사용자 프로그램이 직접 호출할 수 없다. 시스템 콜은 미리 약속된 방식으로 호출되어지며 이는 CPU 레지스터에 System Call Number를 적재하고, syscall 을 호출함으로써 이루어진다.
어떤 사용자 프로그램이 시스템 콜을 호출한다고 하자. 시스템 콜을 처리하는 CPU는 현재 레지스터 내용을 스택에 적재하고, 커널모드로 전환되어 적절한 시스템 콜을 실행한다.
서론에 말했듯이, 결국 Java IO, NIO, NIO2 의 근본은 커널 메모리의 데이터를 어떻게 사용자영역으로 가져올지에 대한 전략이다.
Java IO
Java IO는 스트림을 통해 JVM의 힙 영역으로 데이터들을 가져오도록 구현한다. 스트림을 통해 데이터를 가져옴에 따라, 사용자 영역의 메모리 사용량이 줄어든다. 다만, 스트림으로 부터 즉각적으로 데이터가 읽히지 않는 경우, 때때로 블락되어 전체 처리시간이 길어진다.
Java NIO
Java NIO는 버퍼 단위로 커널로부터 데이터를 읽어들인다. 사용자 스레드는 사용자 영역의 버퍼가 가득 찼을때 이에 대한 처리를 한번에 수행하도록 한다 ( 이는 reactor 패턴을 이용해 구현되는데, 이는 다음 포스팅에서 살펴보자 ). JVM Off-heap 사용자 영역의 메모리 사용량은 늘어나지만, 버퍼가 가득 찰때까지 스레드가 block점유하지 않음에 따라 처리시간은 줄어든다.
둘다 메모리의 커널 영역에서 사용자 영역으로 데이터를 운반하는 것은 같다. 하지만, 도착지에서 분명한 차이가 존재한다. IO는 JVM heap 영역에 데이터를 로드하며, NIO는 off-heap( GC 의 영향 밖 )의 공간에 커널로부터 받은 데이터를 적재한다.
내용 보강 예정
'Java' 카테고리의 다른 글
[Java] Optional 클래스 살펴보기 (2) (0) | 2024.01.24 |
---|---|
[Java] Optional 클래스의 등장 (1) (2) | 2024.01.23 |
[Java] 제네릭 - 와일드 카드 (0) | 2024.01.15 |
[Java] Collection Framework (1) | 2024.01.10 |
[Java] 제네릭의 기초 (1) | 2024.01.04 |