CS - File writing process in Java (OS, interrupt, I/O perspective)
1. 자바에서 파일을 읽는 과정 (OS와 인터럽트, I/O 관점)
- 자바에서 파일을 읽는 과정을 OS와 인터럽트 I/O 관점에서 보면 이러하다.
String str = "Hello World !";
- 해당 문자열을 파일에 쓰려고 한다.
public class WriteToFileExample { public static void main(String[] args) { // 파일 경로 설정 String filePath = "path/to/your/file.txt"; // FileWriter와 BufferedWriter를 사용하여 파일에 쓰기 try (BufferedWriter writer = new BufferedWriter(new FileWriter(filePath))) { // 파일에 쓸 내용 String str = "Hello World !"; // 파일에 내용 쓰기 writer.write(str); } catch (IOException e) { // 파일 쓰기 중 예외 발생 시 처리 e.printStackTrace(); } } }
- 그럼 이렇게 File과 관련된 코드 중 writer.write(); 메서드가 동작하는 순간,
- 우리 UserProcess(Java)는 System Call을 일으킨다. ( 이러한 행위 자체가 인터럽트이다. )
- 그 때 동안은 Java 프로그램의 해당 스레드가 Blocking 상태가 된다.
- str의 내용이 Kernel(OS)로 넘어가고,
- Kernel에서는 str의 내용을 하드웨어에 작성한다. ( 파일이니까 Disk 헤더 어딘가에 )
- 작성이 완료되면, 다 썼다고 UserProcess(Java)에 알려준다. ( 이것도 인터럽트이다 )
- Ready, Running 상태로 순차적으로 진행되고,
- 제어권은 다시 UserProcess로 넘어온다.
- 인터럽트 발생은 사실상 CPU에 이거 해달라고 예약을 걸어두는 것이며, CPU가 항상 주기적으로 인터럽트 예약이 들어와있는지 확인하고, 진행한다.
- 추가)
- 예전에는 CPU가 I/O에 대한 버퍼를 직접 메모리에 올렸지만, 요즘은 DMA가 함. ( CPU는 비싼 자원이니 계산 위주로 동작하게끔 )
- 또한 시스템 콜이라는 것을 알아야함. 위에서 말했듯 UserMode에서 커널로 동작을 요청하는게 시스템 콜임.
- 근데 거기서 헷갈리면 안되는게 위에 Java라고 적어두긴했지만 Java가 직접 시스템콜을 하는건 절대 아님. Java를 다루고 있는 우리 OS의 UserMode에서 커널단으로 시스템콜을 날리는 것임.
공부 출처 : https://jongmin92.github.io/2019/02/18/Programming/computer-structure/#System-call