채록채록
[Linux\Kernel] System.in, Stream, I/O 본문
자바 언어를 쓱 공부해보는 중... 콘솔입출력에 대해 공부하다가 운영체제가 파일 디스크립터를 사용해서 입출력 통로를 관리할 때 일어나는 일들을 다시 정리해보았다. (ft. ChatGPT)

자바에서 말하는 Stream은 운영체제가 제공하는 I/O 추상화를 객체로 감싼 개념이고, 벌어지는 일들을 OS 레벨로 풀어보면 다음과 같다.
- 사용자가 키보드에서 A를 누른다.
- 키보드 컨트롤러(하드웨어)가 신호를 CPU로 인터럽트(IRQ)로 전달한다.
- OS 커널의 디바이스 드라이버가 이 신호를 처리해서, 해당 키보드 입력을 바이트코드(스캔코드->아스키변환)로 변환한다.
- 커널은 변환된 데이터를 커널 내부 버퍼(stdin에 연결된 큐)에 넣는다.
- 이 버퍼는 RAM의 일부분. 커널이 직접 관리하는 ring buffer/circurlar buffer에 가깝다. - 사용자 모드(User space)의 자바 프로그램에서 System.in.read() 호출한다.
= 커널에 read 시스템 콜을 요청한다. - 커널은 stdin 버퍼에서 한 바이트를 꺼내서 사용자 공간 메모리로 복사한다.
- JVM은 그 바이트를 다시 자바 객체 (InputStream) 레벨에서 반환한다.
이는 네트워크/마우스/디스플레이의 경우에도 동일하다.
- 네트워크 소켓:
- NIC(Network Interface Card)가 패킷을 받으면 → 커널 네트워크 스택의 버퍼에 저장 → recv() 시스템 콜로 사용자 공간에 전달 → 자바의 Socket.getInputStream()이 읽음.
- 마우스/터치패드:
- 입력 이벤트를 커널이 이벤트 디바이스(/dev/input/...) 버퍼에 저장 → GUI 라이브러리(X11, Wayland 등)나 프로그램이 읽어감.
- 디스플레이 출력:
- 반대 방향. 프로그램이 write()로 데이터를 OS에 전달 → 커널이 GPU/디스플레이 드라이버에 전달 → 화면에 출력됨.
즉, 모든 입출력 장치는 공통적으로
디바이스 드라이버 + 커널버퍼 + 파일 디스크립터
구조로 관리된다.
'Linux' 카테고리의 다른 글
| [Linux\Raspberrypi] raspi-config, ALSA, mixer, audio route, amixer (0) | 2025.02.12 |
|---|---|
| [Linux\Raspberrypi] zImage, 디바이스 드라이버, led, scp, insmod, mknod, lsmod, rmmod, dmesg (0) | 2025.02.11 |
| [Linux\Kernel] 오제이 한국에서 제일 쉬운 리눅스커널 강의, 나는 지금 까지 무엇을 한 것인가 (0) | 2024.11.27 |
| [Linux/Debian] debian fin, ubuntu start (0) | 2024.08.18 |
| [Linux\SystemProgramming] pthread_create, pthread_join, pthread_detach (0) | 2024.08.15 |