Abstraction by Wrapping

I/O Access(FileSystem, Disk ..) 를 하기 위해서는 system call 을 통해 Kernel Space 에 진입하여 OS 와 상호 작용을 해야 한다.

예를 들어, C 언어에서 exit(1)을 호출하면 해당 함수는 내부적으로 올바른 레지스터/스택/기타에 시스템 호출의 opcode 인수를 배치한 후 인터럽트를 트리거하는 기계 코드를 실행한다.

Java 에서는 Java Native Interface 라는 것이 있다. hardware handling or performance improvement 를 위해서 Natvie Code (C/C++ 로 코딩된 네이티브 메서드) 를 사용해야 한다. 이 Native Code 는 바이트 코드로 컴파일 되지 않는다.

JDK 에서는 JVM 내에서 실행되는 byte code 와 native code 사이의 bridge 를 제공하는데 이것이 JNI 이고, JNI 를 통해서 system call 을 하게 된다.

System call by JNI:

// Blocking 방식
JVM -> JNI -> 시스템 콜 -> 커널 -> 디스크 컨트롤러 -> 커널 버퍼 복사 -> JVM 버퍼 복사

// NonBlocking 방식
JVM -> 시스템 콜 -> JNI -> 디스크 컨트롤러 -> DMA -> 복사

Java 에서 System.exit 코드를 쭉 들어가면 아래와 같이 native code 를 사용하는 것을 알 수 있다. native code 를 사용하는 순간 thread 는 _thread_in_native 상태가 된다.

static native void halt0(int status);

즉, Java 에서 OS Kernel Space 를 조작하기 위해서 JNI 를 통해 system call 을 하게 되고, 우리는 System.exit 과 같은 추상화된(abstracted) 메서드를 사용하여 쉽게 I/O Access 등을 할 수 있는 것이다.

Monitors in Process Synchronization

Java's execution environment supports mutual exclusion via an entrance queue & synchronized method.

Mutual exclusion - allows concurrent access & updates to shared resources without race conditions.

Monitors are a higher-level synchronization construct that simplifies process synchronization by providing a high-level abstraction for data access and synchronization. Monitors are implemented as programming language constructs, typically in object-oriented languages, and provide mutual exclusion, condition variables, and data encapsulation in a single construct.

Java 에서 synchronized 키워드를 사용하여 공유 자원(shared resources)을 보호 할 수 있다. 이 synchronized 도 잘 추상화된 API 라고 할 수 있다.

Java 의 synchronized 가 Monitors 라는 기법을 사용한다. Monitor in Java Concurrency is a synchronization mechanism. Monitors 는 본질적으로 encapsulates a shared resource 한다. Monitors베타동기, 조건동기 라는 두개의 queue 를 활용하여 Critical Section 을 보호한다.

  • 베타동기: 하나의 스레드만 공유자원에 접근하게 해준다. 공유자원을 사용하는 스레드가 존재하면, 베타동기 큐에서 대기한다.
  • 조건동기: 공유자원을 사용하는 스레드가 Block 을 당하면서, 새로운 스레드가 진입하게 해준다. Block 당한 스레드는 조건동기에서 대기한다. 만약 공유자원을 사용하는 스레드가 깨우고 임계영역에서 나가면, 깨워진 스레드가 진입한다.

Synchronization Docs:

The Java programming language provides multiple mechanisms for communicating between threads. The most basic of these methods is synchronization, which is implemented using monitors. Each object in Java is associated with a monitor, which a thread can lock or unlock. Only one thread at a time may hold a lock on a monitor. Any other threads attempting to lock that monitor are blocked until they can obtain a lock on that monitor.

References