Notice
Recent Posts
Recent Comments
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

채록채록

[Linux\Kernel] System.in, Stream, I/O 본문

Linux

[Linux\Kernel] System.in, Stream, I/O

김책은 2025. 9. 12. 12:21

자바 언어를 쓱 공부해보는 중... 콘솔입출력에 대해 공부하다가 운영체제가 파일 디스크립터를 사용해서 입출력 통로를 관리할 때 일어나는 일들을 다시 정리해보았다. (ft. ChatGPT)


자바에서 말하는 Stream은 운영체제가 제공하는 I/O 추상화를 객체로 감싼 개념이고, 벌어지는 일들을 OS 레벨로 풀어보면 다음과 같다. 

  1. 사용자가 키보드에서 A를 누른다. 
  2. 키보드 컨트롤러(하드웨어)가 신호를 CPU로 인터럽트(IRQ)로 전달한다. 
  3. OS 커널의 디바이스 드라이버가 이 신호를 처리해서, 해당 키보드 입력을 바이트코드(스캔코드->아스키변환)로 변환한다. 
  4. 커널은 변환된 데이터를 커널 내부 버퍼(stdin에 연결된 큐)에 넣는다. 
    - 이 버퍼는 RAM의 일부분. 커널이 직접 관리하는 ring buffer/circurlar buffer에 가깝다. 
  5. 사용자 모드(User space)의 자바 프로그램에서 System.in.read() 호출한다. 
    = 커널에 read 시스템 콜을 요청한다.
  6. 커널은 stdin 버퍼에서 한 바이트를 꺼내서 사용자 공간 메모리로 복사한다. 
  7. JVM은 그 바이트를 다시 자바 객체 (InputStream) 레벨에서 반환한다. 

이는 네트워크/마우스/디스플레이의 경우에도 동일하다. 

 

  • 네트워크 소켓:
    • NIC(Network Interface Card)가 패킷을 받으면 → 커널 네트워크 스택의 버퍼에 저장 → recv() 시스템 콜로 사용자 공간에 전달 → 자바의 Socket.getInputStream()이 읽음.
  • 마우스/터치패드:
    • 입력 이벤트를 커널이 이벤트 디바이스(/dev/input/...) 버퍼에 저장 → GUI 라이브러리(X11, Wayland 등)나 프로그램이 읽어감.
  • 디스플레이 출력:
    • 반대 방향. 프로그램이 write()로 데이터를 OS에 전달 → 커널이 GPU/디스플레이 드라이버에 전달 → 화면에 출력됨.

즉, 모든 입출력 장치는 공통적으로 
디바이스 드라이버 + 커널버퍼 + 파일 디스크립터
구조로 관리된다.