하드웨어 & OS
IT 로드맵의 하드웨어 & OS 구역이다.
터미널에 ls 를 치면 목록이 나오고, rm 을 치면 파일이 사라진다. 그 사이에 커널은 프로세스를 복제하고, 권한을 확인하고, 디스크에서 읽어 메모리에 얹는다. 그 일들을 분야로 가르고, 분야마다 실제로 궁금한 것을 하나씩 떼어 놓았다.
그 커널이 만지는 메모리 · 디스크 · 랜 카드가 실제로 무엇인지는 부품에서 본다. 부품은 커널 아래층이라 이 페이지 맨 앞에 둔다.
부품 아홉 — 이 PC의 실제 하드웨어를 부품마다 한 페이지에 모은다
부품 하나에 카드 한 장이고, 누르면 그 부품의 페이지가 나온다. 비유 없이 있는 그대로 본다 — 그 부품이 무엇을 하는지(움직임 그림과 함께), 그리고 이 PC에서 잰 값이다. 이 PC에 없는 부품(HDD)도 「없다」를 잰 값으로 두고 같은 자리에 둔다. 부품 속을 깊게 파 내려간 것(RAM부터)도 그 페이지에 쌓는다.
값은 tools/hardware-snapshot.ps1이 재서 _data/hardware-snapshot.json에 적은 것이다. GitHub Pages는 이 PC를 직접 읽지 못해서 실시간 값은 아니고, 다시 재고 커밋하면 화면이 바뀐다.
- 파워배터리 57 Wh · 어댑터 연결됨 벽의 전기를 받아 부품마다 맞는 전압으로 나눠 준다. 노트북은 어댑터와 배터리가 번갈아 맡는다.
- 메인보드ThinkPad E14 Gen 6 · 펌웨어 UEFI 부품이 꽂히고 서로 이어지는 판이다. 켜면 맨 먼저 실행되는 펌웨어 칩도 여기 있다.
- CPUAMD Ryzen 7 7735HS with Radeon Graphics · 8코어 16스레드 프로그램의 명령(기계어)을 꺼내 실행하는 칩이다. 코어 여럿이 동시에 돌고, 메모리를 캐시 세 층에 덜어 둔다.
- RAM64 GB DDR5 · 4800 MT/s · 막대 2장 CPU가 주소로 읽고 쓰는 저장 공간이다. 전원이 꺼지면 지워진다. 셀 하나(1장)와 셀이 모인 모양(2장)까지 팠다.
- SSDCT1000E100SSD8 · NVMe SSD · 932 GB 전원이 꺼져도 남는 저장 장치다. 프로그램 파일과 데이터 원본이 여기 있다.
- HDD이 PC에는 HDD가 없다 도는 원판에 자기로 기록하는 저장 장치다. 전원이 꺼져도 남고, 움직이는 부품이 있어서 SSD보다 느리다.
- GPUAMD Radeon(TM) Graphics · 그래픽 1개 화면에 보일 그림을 그리는 칩이다. 이 PC는 CPU 칩 안의 내장 그래픽이라 RAM을 나눠 쓴다.
- 랜 카드랜 카드 2개 · 연결 1개 다른 컴퓨터와 데이터를 주고받는 장치다. 이 PC는 유선(이더넷) 하나, 무선(Wi-Fi) 하나가 있다.
- 입출력 장치화면 3개 · 카메라 2개 사람과 맞닿는 장치다. 키보드 · 마우스 · 카메라 · 마이크는 받아들이고, 화면 · 스피커는 내보낸다.
LENOVO ThinkPad E14 Gen 6에서 2026-10-11 11:04에 잰 값이다. 다시 재려면 pwsh tools/hardware-snapshot.ps1
처음에는 이 부품들을 세계관의 비유(땅 · 작업대 · 서고)로 그렸다. 부품마다 땅에 자리를 주다가 메인보드 · 파워에서 비유가 컴퓨터 배치도가 되어 가서 2026-10-10에 그만뒀다. 세계관은 코드가 겪는 일을 그리는 무대로만 쓴다.
켜면 일어나는 일 — 부품이 깨어나고 커널이 올라오기까지
부품과 커널 분야 사이에 놓이는 일이다. 전원 버튼을 누르면 부품이 하나씩 깨어나고, 펌웨어가 커널을 RAM에 올리고, 그다음에야 아래 분야들이 시작된다. 이 PC는 대부분 처음부터가 아니라 저장해 둔 상태에서 깨어난다는 것도 거기서 본다.
왜 「1단계 → 5단계」가 아니라 「분야 × 항목」인가
처음에는 로그인 → 명령 → 파일 → 메모리 → 네트워크 다섯 단계로 늘어놓았다. 버렸다. 두 가지가 어긋나서다.
첫째, 다섯은 순서가 아니다. 메모리를 알아야 네트워크를 볼 수 있는 것이 아니고, 네트워크를 봤다고 「다 읽었다」가 되지도 않는다. 그런데 번호를 붙이는 순간 화면은 「이전 · 다음」과 「STEP 3 / 5」를 그리고, 그건 없는 순서를 있다고 말하는 것이다.
둘째, 한 단계가 너무 크다. 「파일」 하나에 만들기 · 읽기 · 지우기 · 권한이 전부 들어가 있었다. 그러면 화면 하나가 네 가지를 답해야 하고, 무엇 하나 제대로 못 본다. 실제로 궁금한 것은 「파일」이 아니라 「rm 을 했는데 그 파일을 읽던 프로그램은 어떻게 되나」 같은 질문 하나다.
그래서 분야는 순서가 없고, 분야 안의 항목은 순서가 있다. 파일을 만들어야 지우고, 소켓을 만들어야 연결을 받는다. 번호는 그 안에서만 뜻이 있다.
커널이 하는 일은 분야 5개 · 항목 17개로 나눈다
Study · 운영체제는 항목마다 버튼으로 한 스텝씩 넘기며 본다. 글로 읽고 끝나는 것이 아니라 그 자리에서 값이 움직이는 것을 본다.
소스는 Linux 7.3-rc4를 저장소(open-source/os/linux)에 그대로 받아 두고 읽는다. 리눅스에서 돌려 봐야 아는 것은 도커로 잰다(tools/os-study).
분야를 누르면 그 분야의 항목이 순서대로 카드로 나온다.
- 계정과 권한 로그인하면 커널이 나를 무엇으로 알아보는지, 계정과 권한이 어디에 적히고 언제 검사되는지를 맡는다.
- 파일과 디렉터리 파일을 만들고 · 읽고 · 지울 때 디스크와 메모리에서 무엇이 생기고 사라지는지를 맡는다.
- 프로세스 명령 하나를 쳤을 때 프로세스가 생겨서 파일을 열고 CPU 를 나눠 쓰기까지를 맡는다.
- 메모리 메모리를 달라고 했을 때 실제로 언제 받는지, 모자라면 무슨 일이 생기는지를 맡는다.
- 네트워크 소켓을 만들고 연결을 받고 데이터를 주고받을 때 커널 안에서 무엇이 움직이는지를 맡는다.
근거가 두 갈래다. 장면에 붙은
파일:줄은 저장소에 받아 둔 Linux 7.3-rc4 소스를 직접 열어 확인한 것이고(장면 17개에 137곳), 수치는 도커 우분투 24.04 · 커널 6.6.87.2 에서 돌려 잰 것이다. 둘의 커널이 다르므로 섞어 읽으면 안 된다 — 줄 번호를 6.6 에서 찾으면 안 맞고, 수치를 7.3-rc4 의 값이라고 말해도 안 된다. 무엇을 어떻게 쟀는지는 항목마다 「어떻게 확인했나」에 있고, 다시 재려면tools/os-study를 돌린다.
분야를 잇는 개념이 하나 있다 — 파일 디스크립터
다섯 분야를 따로 두었지만 10번과 15번은 같은 것을 말한다. 프로세스가 파일을 열면 번호 하나를 받고(10번), 소켓을 만들어도 같은 종류의 번호를 받는다(15번). 그래서 read 와 write 가 파일에도 소켓에도 똑같이 통한다.
이게 「분야가 다섯인데 왜 따로 안 놀고 한 덩어리로 읽히나」의 답이다. 프로세스 · 파일 · 네트워크가 fd 표 하나를 사이에 두고 만난다.
같이 읽는 글
같은 일을 자바 쪽에서 보면 이렇게 보인다. 층이 다를 뿐 같은 장면이다.
- Study · JDK —
java Hello한 줄이 실행되기까지. 9번의exec다음에 벌어지는 일이다 - Study · Spring Boot — 톰캣이 포트를 열고 스레드가 요청을 집어 간다. 16번을 프로그램 쪽에서 본 것이다
- JVM 메모리 구조와 Spring Bean 생명주기 — 스택·힙·GC. 12~14번의 가상 메모리가 그 아래층이다
아직 안 한 것
이 구역의 나머지 자리다. 지금은 비어 있고, 공부하면서 채운다.
- 디스크 스케줄러 — 7번은 페이지 캐시까지만 본다. 캐시에 없을 때 실제로 디스크에 가는 길
- 시그널 —
Ctrl+C와kill이 하는 일.kill이 왜 「죽이기」가 아닌지 - 컨테이너 — cgroup 과 네임스페이스. 도커가 무엇으로 가두는지. 칸막이가 이 구역의 다섯 분야와 어떻게 겹치는지는 데브옵스에 표로 먼저 적어 두었다
- 인터럽트 — 하드웨어가 CPU 를 붙잡는 방법. 17번의 랜 카드가 여기에 닿는다