πŸ’» ν”„λ‘œκ·Έλž˜λ°μ˜ 뿌리λ₯Ό μ΄ν•΄ν•˜κΈ°

JEONG WOO SIΒ·2025λ…„ 11μ›” 7일

μš°λ¦¬κ°€ 맀일 μ‚¬μš©ν•˜λŠ” μ»΄ν“¨ν„°λŠ” λ‹¨μˆœνžˆ 전원을 켜고 ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λŠ” λ„κ΅¬μ²˜λŸΌ λ³΄μ΄μ§€λ§Œ, κ·Έ μ†μ—μ„œλŠ” μˆ˜λ§Žμ€ λ³΅μž‘ν•œ 과정이 유기적으둜 맞물렀 λŒμ•„κ°„λ‹€. 이 κΈ€μ—μ„œλŠ” 컴퓨터가 μ‹€μ œλ‘œ μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€, 그리고 μš΄μ˜μ²΄μ œμ™€ 컀널, λ“œλΌμ΄λ²„κ°€ μ–΄λ–€ 역할을 ν•˜λŠ”μ§€λ₯Ό κ°„λ‹¨νžˆ 정리해본닀.

μ»΄ν“¨ν„°λŠ” CPU, λ©”λͺ¨λ¦¬, μ €μž₯μž₯치, μž…μΆœλ ₯ μž₯치 λ“±μœΌλ‘œ 이루어져 μžˆλ‹€. 이 쀑 CPUλŠ” λͺ…λ Ήμ–΄λ₯Ό ν•΄μ„ν•˜κ³  μ‹€ν–‰ν•˜λŠ” 핡심 λ‘λ‡Œ 역할을 ν•œλ‹€. CPUλŠ” 였직 기계어(Machine Code), 즉 0κ³Ό 1둜 이루어진 λͺ…λ Ήλ§Œ 이해할 수 μžˆλ‹€. ν•˜μ§€λ§Œ μ‚¬λžŒμ΄ 직접 μ΄μ§„μˆ˜λ₯Ό λ‹€λ£¨κΈ°λŠ” λΉ„νš¨μœ¨μ μ΄κΈ° λ•Œλ¬Έμ—, 이λ₯Ό μ‚¬λžŒμ΄ 읽을 수 μžˆλŠ” ν˜•νƒœλ‘œ ν‘œν˜„ν•œ 것이 μ–΄μ…ˆλΈ”λ¦¬μ–΄(Assembly)λ‹€.

예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같은 λͺ…령이 μžˆλ‹€κ³  ν•˜μž.

MOV AX, 1

이 λͺ…령은 CPUμ—κ²Œ β€œAX λ ˆμ§€μŠ€ν„°μ— 숫자 1을 μ €μž₯ν•˜λΌβ€λŠ” μ˜λ―Έλ‹€. μ‹€μ œλ‘œλŠ” 이 λͺ…령이 0κ³Ό 1의 μ‘°ν•©μœΌλ‘œ λ³€ν™˜λ˜μ–΄ CPU둜 μ „λ‹¬λœλ‹€. 즉, μ–΄μ…ˆλΈ”λ¦¬μ–΄λŠ” 기계어 λͺ…령을 μ‚¬λžŒμ΄ 읽기 μ‰½κ²Œ λ°”κΎΌ ν˜•νƒœλΌκ³  λ³Ό 수 μžˆλ‹€.

이후 κ°œλ°œμžλ“€μ€ 더 높은 생산성을 μœ„ν•΄ κ³ κΈ‰ ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄(High-level Language)λ₯Ό λ§Œλ“€μ—ˆλ‹€. 파이썬, μžλ°”μŠ€ν¬λ¦½νŠΈ, C와 같은 언어듀이 κ·Έ μ˜ˆλ‹€. 이런 언어듀은 μ‚¬λžŒμ΄ μ΄ν•΄ν•˜κΈ° μ‰¬μš΄ λ¬Έμž₯ ν˜•νƒœλ‘œ μž‘μ„±λ˜λ©°, λ‚΄λΆ€μ μœΌλ‘œλŠ” 컴파일러(Compiler)λ‚˜ 인터프리터(Interpreter)λ₯Ό 톡해 κΈ°κ³„μ–΄λ‘œ λ³€ν™˜λœλ‹€.

즉, ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ˜ λ°œμ „ λ°©ν–₯은 β€œμΆ”μƒν™”(Abstraction)β€μ˜€λ‹€. ν•œ μ€„μ˜ μ½”λ“œκ°€ μ—¬λŸ¬ 개의 기계 λͺ…령을 μˆ˜ν–‰ν•˜κ²Œ λ§Œλ“œλŠ” 것이닀.

print("Hello World")

1. 파이썬 인터프리터가 print()λ₯Ό 해석함
2. λ‚΄λΆ€μ μœΌλ‘œ C μ–Έμ–΄μ˜ I/O 라이브러리 호좜
3. C λΌμ΄λΈŒλŸ¬λ¦¬κ°€ μ‹œμŠ€ν…œ 콜(System Call)을 톡해 컀널에 μš”μ²­
4. 컀널이 λ””λ°”μ΄μŠ€ λ“œλΌμ΄λ²„μ—κ²Œ β€œν™”λ©΄μ— 이 λ¬Έμžμ—΄μ„ 좜λ ₯ν•˜λΌβ€κ³  λͺ…λ Ή
5. λ“œλΌμ΄λ²„κ°€ λ””μŠ€ν”Œλ ˆμ΄ ν•˜λ“œμ›¨μ–΄λ₯Ό μ œμ–΄ν•΄μ„œ μ‹€μ œλ‘œ β€œHello World”λ₯Ό λ³΄μ—¬μ€Œ

이 κ°„λ‹¨ν•œ μ½”λ“œ ν•œ 쀄은 사싀상 λ©”λͺ¨λ¦¬μ— λ¬Έμžμ—΄μ„ μ €μž₯ν•˜κ³ , 좜λ ₯ 버퍼λ₯Ό μ—΄κ³ , λ””μŠ€ν”Œλ ˆμ΄ μž₯치둜 데이터λ₯Ό μ „μ†‘ν•˜λŠ” μ—¬λŸ¬ λ³΅μž‘ν•œ 과정을 ν¬ν•¨ν•œλ‹€. 이처럼 μΆ”μƒν™”λž€ λ³΅μž‘ν•œ 일을 λ‹¨μˆœν•œ ν‘œν˜„μœΌλ‘œ κ°μ‹ΈλŠ” 것이닀.

ν•œνŽΈ, λ‘œλ΄‡μ΄λ‚˜ μ„Όμ„œ 같은 μž„λ² λ””λ“œ μ‹œμŠ€ν…œμ—μ„œλŠ” CPU μ„±λŠ₯μ΄λ‚˜ λ©”λͺ¨λ¦¬κ°€ μ œν•œλ˜μ–΄ 있기 λ•Œλ¬Έμ—, μ—¬μ „νžˆ Cλ‚˜ μ–΄μ…ˆλΈ”λ¦¬ 같은 μ €μˆ˜μ€€(λ˜λŠ” μ €μˆ˜μ€€μ— κ°€κΉŒμš΄) μ–Έμ–΄κ°€ 많이 μ‚¬μš©λœλ‹€. 기계어λ₯Ό 직접 λ‹€λ£¨λŠ” κ²½μš°λŠ” 거의 μ—†μ§€λ§Œ, ν•˜λ“œμ›¨μ–΄λ₯Ό μ„Έλ°€ν•˜κ²Œ μ œμ–΄ν•  ν•„μš”κ°€ 있기 λ•Œλ¬Έμ΄λ‹€.

λͺ¨λ“  μ»΄ν“¨ν„°λŠ” κ²°κ΅­ μˆ«μžλ§Œμ„ 닀룬닀. λ¬Έμžλ‚˜ 이미지쑰차도 숫자둜 λ³€ν™˜λ˜μ–΄ μ €μž₯λœλ‹€. 예λ₯Ό λ“€μ–΄ β€œAβ€λΌλŠ” λ¬ΈμžλŠ” μ•„μŠ€ν‚€(ASCII) μ½”λ“œλ‘œ 65에 ν•΄λ‹Ήν•œλ‹€. β€œμ΄ μˆ«μžλŠ” 이 문자λ₯Ό μ˜λ―Έν•œλ‹€β€λŠ” 약속이 λ°”λ‘œ 문자 인코딩 체계(Encoding)λ‹€. μœ λ‹ˆμ½”λ“œλŠ” 이λ₯Ό μ „ 세계 μ–Έμ–΄λ‘œ ν™•μž₯ν•œ ν˜•νƒœλ‹€.

이제 운영체제의 μ—­ν• λ‘œ λ„˜μ–΄κ°€λ³΄μž. 운영체제(Operating System)λŠ” ν•˜λ“œμ›¨μ–΄λ₯Ό 효율적으둜 κ΄€λ¦¬ν•˜κ³ , μ—¬λŸ¬ ν”„λ‘œκ·Έλž¨μ΄ λ™μ‹œμ— 싀행될 수 μžˆλ„λ‘ λ„μ™€μ£ΌλŠ” μ‹œμŠ€ν…œμ΄λ‹€. λ¦¬λˆ…μŠ€(Linux), μœ λ‹‰μŠ€(Unix), μœˆλ„μš°μ¦ˆ(Windows)κ°€ 여기에 μ†ν•œλ‹€. 운영체제의 ν•΅μ‹¬μ—λŠ” 컀널(Kernel)이 μžˆλ‹€.

컀널은 운영체제의 쀑심이며, CPU, λ©”λͺ¨λ¦¬, λ””μŠ€ν¬ 같은 μžμ›μ„ 효율적으둜 λΆ„λ°°ν•˜κ³  λ³΄ν˜Έν•œλ‹€. ν•˜μ§€λ§Œ 컀널이 λͺ¨λ“  ν•˜λ“œμ›¨μ–΄μ˜ μž‘λ™ 방식을 직접 μ•Œ μˆ˜λŠ” μ—†λ‹€. κ·Έλž˜μ„œ ν•˜λ“œμ›¨μ–΄μ™€ μ†Œν†΅ν•˜κΈ° μœ„ν•΄ λ“œλΌμ΄λ²„(Driver)λ₯Ό μ‚¬μš©ν•œλ‹€.

예λ₯Ό λ“€μ–΄ μŒμ•…μ„ μž¬μƒν•˜λ©΄ 컀널은 β€œμŠ€ν”Όμ»€λ‘œ μ†Œλ¦¬ λ‚΄!β€λΌλŠ” λͺ…령을 μ˜€λ””μ˜€ λ“œλΌμ΄λ²„μ— μ „λ‹¬ν•˜κ³ , λ“œλΌμ΄λ²„κ°€ μ‹€μ œ μŠ€ν”Όμ»€ ν•˜λ“œμ›¨μ–΄μ— μ‹ ν˜Έλ₯Ό 보내 μ†Œλ¦¬λ₯Ό λ‚Έλ‹€. 즉, 컀널은 ν•˜λ“œμ›¨μ–΄λ₯Ό 직접 μ œμ–΄ν•˜μ§€ μ•Šκ³  λ“œλΌμ΄λ²„λ₯Ό 톡해 μ œμ–΄ν•œλ‹€. ν”„λ‘œκ·Έλž¨μ΄ ν•˜λ“œμ›¨μ–΄λ₯Ό μ œμ–΄ν•˜κΈ°κΉŒμ§€μ˜ 전체 흐름은 λ‹€μŒκ³Ό κ°™λ‹€.

[μ‚¬μš©μž]
   ↓
[μ‘μš© ν”„λ‘œκ·Έλž¨ (예: Chrome, VSCode)]
   ↓
[μ‹œμŠ€ν…œ 호좜 (System Call)]
   ↓
[컀널 (Kernel)]
   ↓
[λ“œλΌμ΄λ²„ (Driver)]
   ↓
[ν•˜λ“œμ›¨μ–΄ (CPU, λ©”λͺ¨λ¦¬, λ””μŠ€ν¬ λ“±)]

μ‚¬μš©μžκ°€ μ‘μš© ν”„λ‘œκ·Έλž¨μ— λͺ…령을 내리면, ν”„λ‘œκ·Έλž¨μ€ μ‹œμŠ€ν…œ 호좜(System Call)을 톡해 μ»€λ„μ—κ²Œ μš”μ²­μ„ 보낸닀. 컀널은 μš”μ²­μ„ ν•΄μ„ν•˜κ³ , μ μ ˆν•œ λ“œλΌμ΄λ²„λ₯Ό ν˜ΈμΆœν•˜μ—¬ ν•˜λ“œμ›¨μ–΄μ— λͺ…령을 λ‚΄λ¦°λ‹€. μ΄λ ‡κ²Œ 컀널은 λͺ¨λ“  ν”„λ‘œκ·Έλž¨κ³Ό ν•˜λ“œμ›¨μ–΄ μ‚¬μ΄μ—μ„œ μ€‘μž¬μžλ‘œ μž‘λ™ν•œλ‹€.

κ²°κ΅­, μš°λ¦¬κ°€ ν•œ μ€„μ˜ μ½”λ“œλ₯Ό μ‹€ν–‰ν•˜λŠ” μˆœκ°„ κ·Έ λ’€μ—μ„œλŠ” 기계어, μ–΄μ…ˆλΈ”λ¦¬, 컴파일러, 컀널, λ“œλΌμ΄λ²„, ν•˜λ“œμ›¨μ–΄κ°€ λ³΅μž‘ν•˜κ²Œ 맞물렀 움직이고 μžˆλ‹€. ν”„λ‘œκ·Έλž˜λ°μ„ μ΄ν•΄ν•œλ‹€λŠ” 건 λ‹¨μˆœνžˆ 문법을 μ•„λŠ” 것이 μ•„λ‹ˆλΌ, κ·Έ μ½”λ“œκ°€ μ–΄λ–€ 과정을 거쳐 μ‹€μ œ κΈ°κ³„μ—μ„œ μ‹€ν–‰λ˜λŠ”μ§€λ₯Ό μ΄ν•΄ν•˜λŠ” 것이닀.

0개의 λŒ“κΈ€