serversim
학습시뮬레이터템플릿가격
…
…
메뉴 열기
학습↗시뮬레이터↗템플릿↗가격↗
내 Documents문서

Interactive course · 6장 · 40절

컴퓨터는 밑에서 어떻게 움직이나
직접 움직이며 배웁니다.

목차는 범위를 놓치지 않기 위한 지도입니다. 화면은 정적인 그림을 옮기는 데서 끝내지 않고 Java 코드 한 줄에서 JVM·커널·스케줄러·CPU까지 내려가, 누가 왜 다음 상태를 선택했는지를 직접 움직이며 확인합니다.

1.1부터 시작하기 →
먼저 보고 싶은 핵심 실험 · 2.11코어에서 sleep·blocking·busy wait·락 대기는 어떻게 다른가?Java 상태와 OS 상태, run queue와 대기열, 문맥 교환을 한 화면에서 단계별로 비교합니다.실험 열기 →
6개 장언어 → 실행 → 메모리 → CPU → 캐시 → 입출력
40개 절목차가 순서와 범위를 잡는 지도
메커니즘 실험코드 → 런타임 → 커널 → 하드웨어
01

프로그래밍 언어부터 프로그램 실행까지

사람이 쓴 한 줄이 어떻게 CPU가 읽는 숫자 묶음이 되는지 따라갑니다.

  1. 1.1프로그래밍 언어를 직접 발명해 본다면?CPU가 0과 1만 안다면 우리는 어떻게 이름과 함수를 쓸 수 있을까요?
  2. 1.2컴파일러는 어떻게 코드를 번역할까?컴파일러는 긴 소스 코드를 어디서부터 읽을까요?
  3. 1.3링커는 흩어진 코드를 어떻게 하나로 합칠까?다른 파일에 있는 함수를 호출하면 주소를 누가 찾아줄까요?
  4. 1.4왜 컴퓨터 과학에서는 추상화가 중요할까?매번 트랜지스터부터 생각하지 않고도 프로그램을 만들 수 있는 이유는 무엇일까요?
02

프로그램이 실행될 때 벌어지는 일

실행 중인 프로그램이 CPU 시간을 나눠 쓰고, 기다리고, 다시 깨어나는 과정을 봅니다.

  1. 2.1CPU에서 운영 체제, 프로세스, 스레드까지1코어 CPU가 Java의 sleep·blocking 코드를 만났을 때, 거기 머무르지 않고 어떻게 다른 일을 할까요?
  2. 2.2스레드는 무엇을 공유하고 무엇을 따로 가질까?같은 프로세스의 두 스레드는 왜 서로 영향을 줄 수 있을까요?
  3. 2.3스레드 안전 코드는 어떻게 만들까?두 스레드가 동시에 count++를 하면 왜 한 번이 사라질 수 있을까요?
  4. 2.4코루틴은 함수와 무엇이 다를까?함수가 중간에서 멈췄다가 그 자리에서 다시 시작할 수 있을까요?
  5. 2.5콜백 함수는 왜 필요할까?작업이 언제 끝날지 모를 때 결과를 받을 코드를 어떻게 알려줄까요?
  6. 2.6동기와 비동기는 무엇이 다를까?결과를 지금 받는 것과 나중에 통보받는 것은 어떤 차이를 만들까요?
  7. 2.7블로킹과 논블로킹은 무엇이 다를까?작업을 요청한 함수가 지금 돌아올 수 있느냐가 왜 중요할까요?
  8. 2.8높은 동시성의 서버는 어떻게 만들까?연결 1만 개마다 스레드 하나를 두지 않고도 요청을 처리할 수 있을까요?
  9. 2.9코드와 데이터는 어떻게 컨테이너·가상 머신까지 이어질까?프로그램을 “실행 환경째 포장한다”는 말은 무슨 뜻일까요?
03

메모리라는 사물함에서 시작하기

주소가 붙은 바이트에서 변수, 포인터, 스택, 힙과 가상 메모리가 만들어지는 과정을 봅니다.

  1. 3.1메모리의 본질과 포인터·참조변수 이름 아래에는 실제로 무엇이 있을까요?
  2. 3.2프로세스의 가상 메모리는 어떻게 실제 RAM과 연결될까?두 프로세스가 모두 주소 0x1000을 써도 충돌하지 않는 이유는 무엇일까요?
  3. 3.3스택은 함수 호출을 어떻게 기억할까?함수가 끝난 뒤 원래 코드의 다음 줄로 돌아가는 방법은 무엇일까요?
  4. 3.4힙의 동적 메모리 할당은 어떻게 동작할까?실행 중 크기를 알게 된 객체는 어디에 놓을까요?
  5. 3.5malloc 아래에서 운영 체제는 무엇을 할까?힙에 줄 빈 공간이 부족하면 할당자는 누구에게 요청할까요?
  6. 3.6고성능 서버는 왜 메모리 풀을 사용할까?같은 크기의 객체를 계속 만들고 지울 때 더 간단한 방법이 있을까요?
  7. 3.7대표적인 메모리 버그는 왜 생길까?주소는 남아 있는데 그곳을 더 이상 사용하면 안 되는 순간은 언제일까요?
  8. 3.8SSD는 왜 RAM처럼 사용할 수 없을까?둘 다 데이터를 저장하는데 왜 역할이 다를까요?
04

트랜지스터에서 CPU로

스위치에서 논리 게이트, 덧셈기, 레지스터와 CPU가 만들어지고 명령이 빨라지는 과정을 봅니다.

  1. 4.1작은 스위치로 CPU를 만들 수 있을까?켜짐과 꺼짐뿐인 트랜지스터가 어떻게 계산하고 기억할까요?
  2. 4.2CPU는 할 일이 없을 때 무엇을 할까?실행할 프로그램이 없으면 CPU는 정말 아무것도 하지 않을까요?
  3. 4.3CPU는 음수를 어떻게 표현할까?0과 1뿐인 공간에서 -3을 어떻게 저장할까요?
  4. 4.4if 문은 CPU 파이프라인을 왜 흔들까?CPU가 다음 명령을 미리 가져오는데 분기 결과를 아직 모르면 어떻게 할까요?
  5. 4.5CPU 코어 수와 스레드 수는 어떤 관계일까?4코어 컴퓨터에서 스레드 100개가 동시에 계산할 수 있을까요?
  6. 4.6복잡 명령어 집합은 왜 탄생했을까?한 명령이 더 많은 일을 하면 프로그램이 더 간단해질까요?
  7. 4.7축소 명령어 집합은 무엇을 단순하게 만들까?작은 명령 여러 개가 복잡한 명령 하나보다 빠를 수 있을까요?
  8. 4.8현대 CPU에서 CISC와 RISC는 어떻게 만날까?x86 CPU가 복잡한 명령을 유지하면서 내부는 단순하게 실행할 수 있을까요?
  9. 4.9함수·시스템 호출·인터럽트·스레드 전환의 공통점CPU가 다른 코드로 갔다가 원래 자리로 정확히 돌아오는 비결은 무엇일까요?
05

작은 것으로 큰 성과 이루기, 캐시

가까운 작은 저장소가 속도 차이를 가리는 방법과 다중 코어에서 생기는 문제를 봅니다.

  1. 5.1캐시는 왜 컴퓨터 곳곳에 있을까?작은 L1 캐시가 큰 메모리보다 중요한 순간은 언제일까요?
  2. 5.2캐시 친화적인 코드는 어떻게 생겼을까?같은 데이터를 계산해도 순회 순서에 따라 왜 속도가 달라질까요?
  3. 5.3거짓 공유는 왜 다중 스레드를 느리게 할까?서로 다른 변수를 수정하는 두 스레드가 왜 싸울 수 있을까요?
  4. 5.4메모리 장벽은 어떤 순서를 지킬까?코드에 먼저 쓴 값이 다른 코어에도 먼저 보인다고 믿어도 될까요?
06

입출력이 없는 컴퓨터가 있을까?

CPU가 느린 장치와 협력하는 폴링, 인터럽트, DMA, 파일과 입출력 다중화를 따라갑니다.

  1. 6.1CPU는 입출력 장치와 어떻게 대화할까?키보드가 눌렸는지 CPU가 매 순간 확인해야 할까요?
  2. 6.2디스크 입출력 중 CPU는 무엇을 할까?디스크의 모든 바이트를 CPU가 직접 RAM으로 옮겨야 할까요?
  3. 6.3read 함수로 파일을 읽으면 내부에서 무슨 일이 생길까?read 한 줄이 디스크까지 내려가는 길에는 어떤 층이 있을까요?
  4. 6.4select·poll·epoll은 여러 연결을 어떻게 다룰까?소켓 1만 개 중 데이터가 온 12개만 어떻게 찾을까요?
  5. 6.5mmap은 어떻게 파일을 메모리처럼 보이게 할까?read를 호출하지 않고 배열처럼 파일 바이트를 읽을 수 있을까요?
  6. 6.6컴퓨터 각 부분의 지연시간은 얼마나 다를까?100ns와 10ms의 차이를 사람의 시간으로 바꾸면 얼마나 클까요?

이 과정은 참고 자료의 범위를 기준으로 삼되, 설명과 실험 문장을 그대로 옮기지 않고 초급자가 실제 실행 원인을 추적할 수 있도록 Java·JVM·운영 체제·하드웨어 층을 연결해 새로 구성합니다.