Sam Baek, The Dev's Corner

๐Ÿ’ป ์šด์˜์ฒด์ œ(OS) ๊ธฐ๋ณธ ์›๋ฆฌ ์ดํ•ดํ•˜๊ธฐ

29 Oct 2025

์šด์˜์ฒด์ œ๋ž€ ๋ฌด์—‡์ธ๊ฐ€


์ปดํ“จํ„ฐ๋ฅผ ์ผœ๋ฉด ๊ฐ€์žฅ ๋จผ์ € ๋งŒ๋‚˜๋Š” ๊ฒƒ์ด ์šด์˜์ฒด์ œ๋‹ค.
Windows, macOS, Linux ๋“ฑ ์šฐ๋ฆฌ๊ฐ€ ๋งค์ผ ์‚ฌ์šฉํ•˜๋Š” ์ด ํ”„๋กœ๊ทธ๋žจ๋“ค์€
๋‹จ์ˆœํžˆ ์˜ˆ์œ ํ™”๋ฉด์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ ์ด์ƒ์˜ ์—ญํ• ์„ ํ•œ๋‹ค.

์šด์˜์ฒด์ œ๋ฅผ ๋น„์œ ํ•˜์ž๋ฉด ๊ฑด๋ฌผ์˜ ๊ด€๋ฆฌ์ธ๊ณผ๋„ ๊ฐ™๋‹ค.
๊ฑด๋ฌผ์— ์ž…์ฃผํ•œ ์—ฌ๋Ÿฌ ํšŒ์‚ฌ(์‘์šฉ ํ”„๋กœ๊ทธ๋žจ)๋“ค์ด
์ „๊ธฐ(CPU), ๋ฌผ(๋ฉ”๋ชจ๋ฆฌ), ๊ณต๊ฐ„(์ €์žฅ์žฅ์น˜) ๋“ฑ์˜ ์ž์›์„
ํšจ์œจ์ ์œผ๋กœ ๋‚˜๋ˆ  ์“ธ ์ˆ˜ ์žˆ๋„๋ก ์ค‘์žฌํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

์ฒ˜์Œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๋ฐฐ์šธ ๋•Œ๋Š” ์šด์˜์ฒด์ œ์˜ ์กด์žฌ๋ฅผ ํฌ๊ฒŒ ์˜์‹ํ•˜์ง€ ์•Š๋Š”๋‹ค.
๊ทธ์ € ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜จ๋‹ค.
ํ•˜์ง€๋งŒ ์กฐ๊ธˆ ๋” ๊นŠ์ด ๋“ค์–ด๊ฐ€๋‹ค ๋ณด๋ฉด
์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ์‹ค์ œ๋กœ ์–ด๋–ป๊ฒŒ ์‹คํ–‰๋˜๋Š”์ง€,
๋ฉ”๋ชจ๋ฆฌ๋Š” ์–ด๋–ป๊ฒŒ ๊ด€๋ฆฌ๋˜๋Š”์ง€, ํŒŒ์ผ์€ ์–ด๋–ป๊ฒŒ ์ €์žฅ๋˜๋Š”์ง€
๊ถ๊ธˆํ•ด์ง€๋Š” ์ˆœ๊ฐ„์ด ์˜จ๋‹ค.

์™œ ์šด์˜์ฒด์ œ๋ฅผ ์ดํ•ดํ•ด์•ผ ํ• ๊นŒ?


๊ฐœ๋ฐœ์ž๋ผ๋ฉด ์šด์˜์ฒด์ œ์˜ ๊ธฐ๋ณธ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

์ฒซ์งธ, ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ์˜ ์ฐจ์ด๋ฅผ ์•Œ๋ฉด ๋ฉ€ํ‹ฐํƒœ์Šคํ‚น์„ ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๊ณ ,
๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์›๋ฆฌ๋ฅผ ์•Œ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‘˜์งธ, ๋ฌธ์ œ ํ•ด๊ฒฐ ๋Šฅ๋ ฅ์ด ํ–ฅ์ƒ๋œ๋‹ค.
ํ”„๋กœ๊ทธ๋žจ์ด ๋А๋ ค์ง€๊ฑฐ๋‚˜ ๋ฉˆ์ถ”๋Š” ์ด์œ ๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ณ ,
๋ฐ๋“œ๋ฝ์ด๋‚˜ ๊ฒฝ์Ÿ ์ƒํƒœ ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ์˜ˆ๋ฐฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์…‹์งธ, ์‹œ์Šคํ…œ ๋ ˆ๋ฒจ ์ดํ•ด๊ฐ€ ๊นŠ์–ด์ง„๋‹ค.
๋„คํŠธ์›Œํฌ, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค, ์„œ๋ฒ„ ๋“ฑ
๋ชจ๋“  ์ปดํ“จํŒ… ์‹œ์Šคํ…œ์˜ ๊ธฐ๋ฐ˜์ด ์šด์˜์ฒด์ œ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์šด์˜์ฒด์ œ์˜ ์ฃผ์š” ์—ญํ• 


์šด์˜์ฒด์ œ๋Š” ํฌ๊ฒŒ 4๊ฐ€์ง€ ํ•ต์‹ฌ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๐ŸŸข ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ (Process Management)


ํ”„๋กœ์„ธ์Šค๋Š” ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์„ ์˜๋ฏธํ•œ๋‹ค.
์šด์˜์ฒด์ œ๋Š” ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ CPU๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋‚˜๋ˆ  ์“ธ ์ˆ˜ ์žˆ๋„๋ก
์Šค์ผ€์ค„๋ง(Scheduling)์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์Œ์•…์„ ๋“ค์œผ๋ฉด์„œ ๋ฌธ์„œ ์ž‘์„ฑ์„ ํ•˜๊ณ 
๋™์‹œ์— ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š”
์šด์˜์ฒด์ œ๊ฐ€ ๊ฐ ํ”„๋กœ์„ธ์Šค์— CPU ์‹œ๊ฐ„์„ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ํ• ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ”„๋กœ์„ธ์Šค์˜ ์ƒ๋ช… ์ฃผ๊ธฐ:

  1. ์ƒ์„ฑ(New): ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋Š” ๋‹จ๊ณ„
  2. ์ค€๋น„(Ready): CPU๋ฅผ ํ• ๋‹น๋ฐ›๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‹จ๊ณ„
  3. ์‹คํ–‰(Running): CPU์—์„œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ๋‹จ๊ณ„
  4. ๋Œ€๊ธฐ(Waiting): I/O ์ž‘์—…์ด๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋‹จ๊ณ„
  5. ์ข…๋ฃŒ(Terminated): ์‹คํ–‰์ด ์™„๋ฃŒ๋œ ๋‹จ๊ณ„

๐ŸŸข ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ (Memory Management)


๋ฉ”๋ชจ๋ฆฌ๋Š” ์ปดํ“จํ„ฐ์˜ ์ž‘์—… ๊ณต๊ฐ„์ด๋‹ค.
์šด์˜์ฒด์ œ๋Š” ํ•œ์ •๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€
ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ด€๋ฆฌํ•œ๋‹ค.

์ฃผ์š” ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ๊ธฐ๋ฒ•:

๊ธฐ๋ฒ• ์„ค๋ช…
์Šค์™‘(Swap) ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•  ๋•Œ ๋””์Šคํฌ๋ฅผ ๋ณด์กฐ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์‚ฌ์šฉ
ํŽ˜์ด์ง•(Paging) ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณ ์ • ํฌ๊ธฐ ๋ธ”๋ก์œผ๋กœ ๋‚˜๋ˆ„์–ด ๊ด€๋ฆฌ
์„ธ๊ทธ๋จผํ…Œ์ด์…˜(Segmentation) ๋…ผ๋ฆฌ์  ๋‹จ์œ„๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ถ„ํ• 
๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ(Virtual Memory) ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ณด๋‹ค ํฐ ์ฃผ์†Œ ๊ณต๊ฐ„ ์ œ๊ณต


๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํŠนํžˆ ์ค‘์š”ํ•œ ๊ฐœ๋…์ด๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด, 8GB RAM์„ ๊ฐ€์ง„ ์ปดํ“จํ„ฐ์—์„œ
10GB ํฌ๊ธฐ์˜ ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ๋Š”
๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ๋•๋ถ„์ด๋‹ค.

์šด์˜์ฒด์ œ๋Š” ํ˜„์žฌ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ถ€๋ถ„์„
๋””์Šคํฌ์— ์ž„์‹œ ์ €์žฅ(์Šค์™‘ ์•„์›ƒ)ํ•˜๊ณ ,
ํ•„์š”ํ•  ๋•Œ ๋‹ค์‹œ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๊ฐ€์ ธ์˜จ๋‹ค(์Šค์™‘ ์ธ).

๐ŸŸข ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ด€๋ฆฌ (File System Management)


ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ์ฒด๊ณ„๋‹ค.
์šด์˜์ฒด์ œ๋Š” ํŒŒ์ผ์˜ ์ƒ์„ฑ, ์ฝ๊ธฐ, ์“ฐ๊ธฐ, ์‚ญ์ œ ๋“ฑ์„ ๊ด€๋ฆฌํ•˜๊ณ 
ํŒŒ์ผ์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ œ์–ดํ•œ๋‹ค.

์ฃผ์š” ํŒŒ์ผ ์‹œ์Šคํ…œ:

  • NTFS (Windows): ๊ถŒํ•œ ๊ด€๋ฆฌ, ์•”ํ˜ธํ™”, ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ์ง€์›
  • APFS (macOS): SSD ์ตœ์ ํ™”, ์Šค๋ƒ…์ƒท ๊ธฐ๋Šฅ
  • ext4 (Linux): ์ €๋„๋ง, ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ ์‹œ์Šคํ…œ
  • FAT32: ํ˜ธํ™˜์„ฑ์ด ๋†’์ง€๋งŒ 4GB ํŒŒ์ผ ํฌ๊ธฐ ์ œํ•œ

ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ๋‹จ์ˆœํžˆ ํŒŒ์ผ์„ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ
๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(ํŒŒ์ผ ์ด๋ฆ„, ํฌ๊ธฐ, ๊ถŒํ•œ, ์ˆ˜์ • ๋‚ ์งœ ๋“ฑ)๋„ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•œ๋‹ค.

๐ŸŸข ์ž…์ถœ๋ ฅ ๊ด€๋ฆฌ (I/O Management)


ํ‚ค๋ณด๋“œ, ๋งˆ์šฐ์Šค, ๋ชจ๋‹ˆํ„ฐ, ํ”„๋ฆฐํ„ฐ, ํ•˜๋“œ๋””์Šคํฌ ๋“ฑ
๋‹ค์–‘ํ•œ ํ•˜๋“œ์›จ์–ด ์žฅ์น˜์™€์˜ ํ†ต์‹ ์„ ๊ด€๋ฆฌํ•œ๋‹ค.

์šด์˜์ฒด์ œ๋Š” ๊ฐ ์žฅ์น˜๋งˆ๋‹ค ๋‹ค๋ฅธ ํŠน์„ฑ์„ ์ถ”์ƒํ™”ํ•˜์—ฌ
์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์ผ๊ด€๋œ ๋ฐฉ์‹์œผ๋กœ ์žฅ์น˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.
์ด๋ฅผ ์œ„ํ•ด ๋””๋ฐ”์ด์Šค ๋“œ๋ผ์ด๋ฒ„(Device Driver)๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ์˜ ์ฐจ์ด


ํ”„๋กœ์„ธ์Šค์™€ ์Šค๋ ˆ๋“œ๋Š” ํ—ท๊ฐˆ๋ฆฌ๊ธฐ ์‰ฌ์šด ๊ฐœ๋…์ด๋‹ค.

ํ”„๋กœ์„ธ์Šค (Process)


ํ”„๋กœ์„ธ์Šค๋Š” ๋…๋ฆฝ์ ์ธ ์‹คํ–‰ ๋‹จ์œ„๋‹ค.
๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ์ž์‹ ๋งŒ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ฐ–๊ณ  ์žˆ์–ด
๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, Chrome ๋ธŒ๋ผ์šฐ์ €์™€ VSCode๋Š”
๊ฐ๊ฐ ๋ณ„๋„์˜ ํ”„๋กœ์„ธ์Šค๋กœ ์‹คํ–‰๋œ๋‹ค.
ํ•˜๋‚˜๊ฐ€ ์ถฉ๋Œํ•ด๋„ ๋‹ค๋ฅธ ๊ฒƒ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

ํ”„๋กœ์„ธ์Šค์˜ ํŠน์ง•:

  • ๋…๋ฆฝ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ (Code, Data, Stack, Heap)
  • ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ (IPC)์ด ํ•„์š”
  • ์ƒ์„ฑ๊ณผ ์ „ํ™˜ ๋น„์šฉ์ด ํฌ๋‹ค

์Šค๋ ˆ๋“œ (Thread)


์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ ์‹คํ–‰ ๋‹จ์œ„๋‹ค.
๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ ์Šค๋ ˆ๋“œ๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ์›น ๋ธŒ๋ผ์šฐ์ € ํ•œ ๊ฐœ(ํ”„๋กœ์„ธ์Šค) ์•ˆ์—์„œ
์—ฌ๋Ÿฌ ํƒญ(์Šค๋ ˆ๋“œ)์ด ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค.
ํ•œ ํƒญ์—์„œ ์˜์ƒ์„ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋™์•ˆ
๋‹ค๋ฅธ ํƒญ์—์„œ ์›น์„œํ•‘์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์Šค๋ ˆ๋“œ์˜ ํŠน์ง•:

  • ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต์œ 
  • ๋น ๋ฅธ ์ƒ์„ฑ๊ณผ ์ „ํ™˜
  • ๋™๊ธฐํ™” ๋ฌธ์ œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ (๊ฒฝ์Ÿ ์ƒํƒœ, ๋ฐ๋“œ๋ฝ)

๋น„๊ตํ‘œ:

ํŠน์„ฑ ํ”„๋กœ์„ธ์Šค ์Šค๋ ˆ๋“œ
๋ฉ”๋ชจ๋ฆฌ ๋…๋ฆฝ์  ๊ณต์œ 
์ƒ์„ฑ ๋น„์šฉ ๋†’์Œ ๋‚ฎ์Œ
ํ†ต์‹  IPC ํ•„์š” ์ง์ ‘ ํ†ต์‹ 
์•ˆ์ •์„ฑ ๋†’์Œ ๋‚ฎ์Œ


CPU ์Šค์ผ€์ค„๋ง ์•Œ๊ณ ๋ฆฌ์ฆ˜


CPU ์Šค์ผ€์ค„๋ง์€ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค ์ค‘
์–ด๋–ค ํ”„๋กœ์„ธ์Šค์— CPU๋ฅผ ํ• ๋‹นํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๐Ÿท๏ธ FCFS (First-Come, First-Served)


๋จผ์ € ๋„์ฐฉํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•œ๋‹ค.
์€ํ–‰ ์ฐฝ๊ตฌ์—์„œ ์ค„์„ ์„œ๋Š” ๊ฒƒ๊ณผ ๊ฐ™๋‹ค.

์žฅ์ : ๊ตฌํ˜„์ด ๊ฐ„๋‹จํ•˜๊ณ  ๊ณตํ‰ํ•˜๋‹ค
๋‹จ์ : ๊ธด ์ž‘์—…์ด ๋จผ์ € ์˜ค๋ฉด ์งง์€ ์ž‘์—…๋“ค์ด ์˜ค๋ž˜ ๊ธฐ๋‹ค๋ฆฐ๋‹ค (Convoy Effect)

๐Ÿท๏ธ SJF (Shortest Job First)


์‹คํ–‰ ์‹œ๊ฐ„์ด ๊ฐ€์žฅ ์งง์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•œ๋‹ค.
ํ‰๊ท  ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

์žฅ์ : ํ‰๊ท  ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์งง๋‹ค
๋‹จ์ : ์‹คํ–‰ ์‹œ๊ฐ„์„ ๋ฏธ๋ฆฌ ์•Œ๊ธฐ ์–ด๋ ต๊ณ , ๊ธด ์ž‘์—…์€ ๊ณ„์† ๋ฐ€๋ฆด ์ˆ˜ ์žˆ๋‹ค (Starvation)

๐Ÿท๏ธ RR (Round Robin)


๊ฐ ํ”„๋กœ์„ธ์Šค์— ๋™์ผํ•œ ์‹œ๊ฐ„(Time Quantum)์„ ํ• ๋‹นํ•˜๊ณ 
์ˆœํ™˜ํ•˜๋ฉฐ ์‹คํ–‰ํ•œ๋‹ค.

์žฅ์ : ๊ณตํ‰ํ•˜๊ณ  ์‘๋‹ต ์‹œ๊ฐ„์ด ๋น ๋ฅด๋‹ค
๋‹จ์ : ๋ฌธ๋งฅ ๊ตํ™˜(Context Switch) ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค

๐Ÿท๏ธ Priority Scheduling


๊ฐ ํ”„๋กœ์„ธ์Šค์— ์šฐ์„ ์ˆœ์œ„๋ฅผ ๋ถ€์—ฌํ•˜๊ณ 
์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋จผ์ € ์‹คํ–‰ํ•œ๋‹ค.

์žฅ์ : ์ค‘์š”ํ•œ ์ž‘์—…์„ ๋จผ์ € ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค
๋‹จ์ : ๋‚ฎ์€ ์šฐ์„ ์ˆœ์œ„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ธฐ์•„ ์ƒํƒœ(Starvation)์— ๋น ์งˆ ์ˆ˜ ์žˆ๋‹ค

๋™๊ธฐํ™” ๋ฌธ์ œ์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•


์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๋‚˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ๋•Œ
๋™๊ธฐํ™” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ฒฝ์Ÿ ์ƒํƒœ (Race Condition)


๋‘ ๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ๊ณต์œ  ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜์—ฌ
๊ฒฐ๊ณผ๊ฐ€ ์‹คํ–‰ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ์ƒํ™ฉ์ด๋‹ค.

์˜ˆ์‹œ:

# ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— count๋ฅผ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค
count = 0

def increment():
    global count
    temp = count
    temp = temp + 1
    count = temp

# Thread 1๊ณผ Thread 2๊ฐ€ ๋™์‹œ ์‹คํ–‰
# ๊ธฐ๋Œ€: count = 2
# ์‹ค์ œ: count = 1 (๊ฒฝ์Ÿ ์ƒํƒœ ๋ฐœ์ƒ ๊ฐ€๋Šฅ)


์ž„๊ณ„ ์˜์—ญ (Critical Section)


์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณต์œ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ ‘๊ทผํ•˜๋Š” ์ฝ”๋“œ ์˜์—ญ์ด๋‹ค.
์ž„๊ณ„ ์˜์—ญ์—๋Š” ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์ž„๊ณ„ ์˜์—ญ ๋ฌธ์ œ์˜ ํ•ด๊ฒฐ ์กฐ๊ฑด:

  1. ์ƒํ˜ธ ๋ฐฐ์ œ(Mutual Exclusion): ํ•œ ๋ฒˆ์— ํ•˜๋‚˜๋งŒ ์‹คํ–‰
  2. ์ง„ํ–‰(Progress): ์ž„๊ณ„ ์˜์—ญ์— ์•„๋ฌด๋„ ์—†์œผ๋ฉด ์ง„์ž… ํ—ˆ์šฉ
  3. ์œ ํ•œ ๋Œ€๊ธฐ(Bounded Waiting): ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ๊ฐ„์ด ์œ ํ•œํ•ด์•ผ ํ•จ

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•


๐Ÿ”’ ๋ฎคํ…์Šค (Mutex)


๋ฎคํ…์Šค๋Š” ์ƒํ˜ธ ๋ฐฐ์ œ(Mutual Exclusion)์˜ ์ค„์ž„๋ง๋กœ,
์ž„๊ณ„ ์˜์—ญ์— ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ๋งŒ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์ž ๊ธˆ ์žฅ์น˜๋‹ค.

import threading

lock = threading.Lock()
count = 0

def increment():
    global count
    lock.acquire()  # ์ž ๊ธˆ ํš๋“
    try:
        count += 1
    finally:
        lock.release()  # ์ž ๊ธˆ ํ•ด์ œ


๐Ÿ”’ ์„ธ๋งˆํฌ์–ด (Semaphore)


์„ธ๋งˆํฌ์–ด๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ž์›์˜ ๊ฐœ์ˆ˜๋ฅผ ์ œํ•œํ•œ๋‹ค.
์ฃผ์ฐจ์žฅ์˜ ๊ฐ€์šฉ ๊ณต๊ฐ„๊ณผ ๋น„์Šทํ•œ ๊ฐœ๋…์ด๋‹ค.

import threading

semaphore = threading.Semaphore(3)  # ์ตœ๋Œ€ 3๊ฐœ์˜ ์Šค๋ ˆ๋“œ ํ—ˆ์šฉ

def access_resource():
    semaphore.acquire()
    try:
        # ๊ณต์œ  ์ž์› ์‚ฌ์šฉ
        print("์ž์› ์‚ฌ์šฉ ์ค‘")
    finally:
        semaphore.release()


๐Ÿ”’ ๋ชจ๋‹ˆํ„ฐ (Monitor)


๋ชจ๋‹ˆํ„ฐ๋Š” ๋ฎคํ…์Šค์™€ ์กฐ๊ฑด ๋ณ€์ˆ˜๋ฅผ ๊ฒฐํ•ฉํ•œ ์ƒ์œ„ ์ˆ˜์ค€์˜ ๋™๊ธฐํ™” ๋„๊ตฌ๋‹ค.
์ž๋ฐ”์˜ synchronized ํ‚ค์›Œ๋“œ๊ฐ€ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ๋‹ค.

๋ฐ๋“œ๋ฝ (Deadlock)


๋ฐ๋“œ๋ฝ์€ ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€
์„œ๋กœ๊ฐ€ ๊ฐ€์ง„ ์ž์›์„ ๊ธฐ๋‹ค๋ฆฌ๋ฉฐ ๋ฌดํ•œ์ • ๋Œ€๊ธฐํ•˜๋Š” ์ƒํƒœ๋ฅผ ๋งํ•œ๋‹ค.

์ผ์ƒ ์ƒํ™œ์˜ ๋น„์œ : A์™€ B๊ฐ€ ์ข์€ ๋‹ค๋ฆฌ์—์„œ ๋งˆ์ฃผ์ณค๋Š”๋ฐ,
A๋Š” B๊ฐ€ ๋น„์ผœ์ฃผ๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ณ 
B๋Š” A๊ฐ€ ๋น„์ผœ์ฃผ๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํ™ฉ์ด๋‹ค.

๋ฐ๋“œ๋ฝ ๋ฐœ์ƒ ์กฐ๊ฑด (4๊ฐ€์ง€ ๋ชจ๋‘ ์ถฉ์กฑ)


  1. ์ƒํ˜ธ ๋ฐฐ์ œ(Mutual Exclusion): ์ž์›์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ์‚ฌ์šฉ
  2. ์ ์œ ์™€ ๋Œ€๊ธฐ(Hold and Wait): ์ž์›์„ ๊ฐ€์ง„ ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ ์ž์›์„ ๊ธฐ๋‹ค๋ฆผ
  3. ๋น„์„ ์ (No Preemption): ์ž์›์„ ๊ฐ•์ œ๋กœ ๋นผ์•—์„ ์ˆ˜ ์—†์Œ
  4. ์ˆœํ™˜ ๋Œ€๊ธฐ(Circular Wait): ํ”„๋กœ์„ธ์Šค๋“ค์ด ์ˆœํ™˜ ํ˜•ํƒœ๋กœ ์ž์›์„ ๊ธฐ๋‹ค๋ฆผ

๋ฐ๋“œ๋ฝ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•


๐Ÿท๏ธ ์˜ˆ๋ฐฉ(Prevention)

4๊ฐ€์ง€ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๋ฅผ ๋ถˆ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค.
์˜ˆ: ๋ชจ๋“  ์ž์›์„ ํ•œ ๋ฒˆ์— ์š”์ฒญํ•˜๋„๋ก ๊ฐ•์ œ

๐Ÿท๏ธ ํšŒํ”ผ(Avoidance)

์ž์› ํ• ๋‹น ์‹œ ๋ฐ๋“œ๋ฝ ๊ฐ€๋Šฅ์„ฑ์„ ๋ฏธ๋ฆฌ ๊ฒ€์‚ฌํ•œ๋‹ค.
์˜ˆ: ์€ํ–‰์› ์•Œ๊ณ ๋ฆฌ์ฆ˜(Bankerโ€™s Algorithm)

๐Ÿท๏ธ ํƒ์ง€ ๋ฐ ํšŒ๋ณต(Detection & Recovery)

๋ฐ๋“œ๋ฝ ๋ฐœ์ƒ์„ ํ—ˆ์šฉํ•˜๋˜, ํƒ์ง€ ํ›„ ํšŒ๋ณตํ•œ๋‹ค.
์˜ˆ: ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ•์ œ ์ข…๋ฃŒํ•˜๊ฑฐ๋‚˜ ์ž์›์„ ์„ ์ 

๐Ÿท๏ธ ๋ฌด์‹œ

๋ฐ๋“œ๋ฝ ๋ฐœ์ƒ ํ™•๋ฅ ์ด ๋‚ฎ์œผ๋ฉด ๋ฌด์‹œํ•œ๋‹ค.
๋Œ€๋ถ€๋ถ„์˜ ์šด์˜์ฒด์ œ๊ฐ€ ์ฑ„ํƒํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์‹ฌํ™”


ํŽ˜์ด์ง€ ๊ต์ฒด ์•Œ๊ณ ๋ฆฌ์ฆ˜


๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ์—์„œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•  ๋•Œ
์–ด๋–ค ํŽ˜์ด์ง€๋ฅผ ๋””์Šคํฌ๋กœ ๋‚ด๋ณด๋‚ผ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

๐Ÿท๏ธ FIFO (First In First Out)

๊ฐ€์žฅ ๋จผ์ € ๋“ค์–ด์˜จ ํŽ˜์ด์ง€๋ฅผ ๊ต์ฒดํ•œ๋‹ค.
๊ตฌํ˜„์€ ๊ฐ„๋‹จํ•˜์ง€๋งŒ ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š๋‹ค.

๐Ÿท๏ธ LRU (Least Recently Used)

๊ฐ€์žฅ ์˜ค๋žซ๋™์•ˆ ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ํŽ˜์ด์ง€๋ฅผ ๊ต์ฒดํ•œ๋‹ค.
์‹ค์ œ๋กœ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

๐Ÿท๏ธ LFU (Least Frequently Used)

์‚ฌ์šฉ ๋นˆ๋„๊ฐ€ ๊ฐ€์žฅ ๋‚ฎ์€ ํŽ˜์ด์ง€๋ฅผ ๊ต์ฒดํ•œ๋‹ค.

๐Ÿท๏ธ Optimal

๋ฏธ๋ž˜์— ๊ฐ€์žฅ ์˜ค๋žซ๋™์•ˆ ์‚ฌ์šฉ๋˜์ง€ ์•Š์„ ํŽ˜์ด์ง€๋ฅผ ๊ต์ฒดํ•œ๋‹ค.
์ด๋ก ์ ์œผ๋กœ ๊ฐ€์žฅ ์ข‹์ง€๋งŒ ๋ฏธ๋ž˜๋ฅผ ์•Œ ์ˆ˜ ์—†์–ด ๊ตฌํ˜„ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.

ํŽ˜์ด์ง€ ํดํŠธ (Page Fault)


ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ ‘๊ทผํ•˜๋ ค๋Š” ํŽ˜์ด์ง€๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์—†์„ ๋•Œ ๋ฐœ์ƒํ•œ๋‹ค.

์ฒ˜๋ฆฌ ๊ณผ์ •:

  1. CPU๊ฐ€ ํŽ˜์ด์ง€ ์ ‘๊ทผ ์‹œ๋„
  2. ํŽ˜์ด์ง€๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์—†์Œ์„ ๊ฐ์ง€
  3. ์šด์˜์ฒด์ œ์— ํŽ˜์ด์ง€ ํดํŠธ ์ธํ„ฐ๋ŸฝํŠธ ๋ฐœ์ƒ
  4. ๋””์Šคํฌ์—์„œ ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ์ฐพ์Œ
  5. ๋นˆ ํ”„๋ ˆ์ž„์— ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œ (ํ•„์š”์‹œ ํŽ˜์ด์ง€ ๊ต์ฒด)
  6. ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ์—…๋ฐ์ดํŠธ
  7. ํ”„๋กœ์„ธ์Šค ์žฌ๊ฐœ

ํŽ˜์ด์ง€ ํดํŠธ๊ฐ€ ์ž์ฃผ ๋ฐœ์ƒํ•˜๋ฉด ์Šค๋ž˜์‹ฑ(Thrashing)์ด ๋ฐœ์ƒํ•˜์—ฌ
์‹œ์Šคํ…œ ์„ฑ๋Šฅ์ด ๊ธ‰๊ฒฉํžˆ ์ €ํ•˜๋œ๋‹ค.

์‹ค์ „ ์˜ˆ์‹œ: Python์—์„œ์˜ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ


์šด์˜์ฒด์ œ ๊ฐœ๋…์„ ์‹ค์ œ๋กœ ํ™œ์šฉํ•˜๋Š” ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž.

import threading
import time

# ๊ณต์œ  ์ž์›
counter = 0
lock = threading.Lock()

def increment_with_lock(name):
    """์ž ๊ธˆ์„ ์‚ฌ์šฉํ•œ ์•ˆ์ „ํ•œ ์ฆ๊ฐ€"""
    global counter
    for _ in range(100000):
        lock.acquire()
        try:
            counter += 1
        finally:
            lock.release()
    print(f"{name} ์™„๋ฃŒ")

def increment_without_lock(name):
    """์ž ๊ธˆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ์œ„ํ—˜ํ•œ ์ฆ๊ฐ€"""
    global counter
    for _ in range(100000):
        counter += 1
    print(f"{name} ์™„๋ฃŒ")

# ์ž ๊ธˆ ์‚ฌ์šฉ ์˜ˆ์ œ
print("=== ์ž ๊ธˆ ์‚ฌ์šฉ ===")
counter = 0
threads = []
for i in range(5):
    t = threading.Thread(target=increment_with_lock, args=(f"Thread-{i}",))
    threads.append(t)
    t.start()

for t in threads:
    t.join()

print(f"์ตœ์ข… counter ๊ฐ’: {counter}")  # 500000 (์ •ํ™•ํ•จ)

# ์ž ๊ธˆ ๋ฏธ์‚ฌ์šฉ ์˜ˆ์ œ
print("\n=== ์ž ๊ธˆ ๋ฏธ์‚ฌ์šฉ ===")
counter = 0
threads = []
for i in range(5):
    t = threading.Thread(target=increment_without_lock, args=(f"Thread-{i}",))
    threads.append(t)
    t.start()

for t in threads:
    t.join()

print(f"์ตœ์ข… counter ๊ฐ’: {counter}")  # 500000๋ณด๋‹ค ์ž‘์„ ์ˆ˜ ์žˆ์Œ (๊ฒฝ์Ÿ ์ƒํƒœ)


์ด ์˜ˆ์ œ๋Š” ๋™๊ธฐํ™”์˜ ์ค‘์š”์„ฑ์„ ๋ณด์—ฌ์ค€๋‹ค.
์ž ๊ธˆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฒฝ์Ÿ ์ƒํƒœ๋กœ ์ธํ•ด
์˜ˆ์ƒ๊ณผ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

์šด์˜์ฒด์ œ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง


์‹ค๋ฌด์—์„œ ์šด์˜์ฒด์ œ ์„ฑ๋Šฅ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•˜๋‹ค.

๐Ÿท๏ธ ์ฃผ์š” ์„ฑ๋Šฅ ์ง€ํ‘œ


์ง€ํ‘œ ์„ค๋ช… ํ™•์ธ ๋ฐฉ๋ฒ•
CPU ์‚ฌ์šฉ๋ฅ  CPU๊ฐ€ ์–ผ๋งˆ๋‚˜ ๋ฐ”์œ์ง€ top, htop (Linux), ์ž‘์—… ๊ด€๋ฆฌ์ž (Windows)
๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ  RAM ์‚ฌ์šฉ ์ •๋„ free, vmstat (Linux), ์ž‘์—… ๊ด€๋ฆฌ์ž
๋””์Šคํฌ I/O ๋””์Šคํฌ ์ฝ๊ธฐ/์“ฐ๊ธฐ ์†๋„ iostat, iotop (Linux)
๋„คํŠธ์›Œํฌ ๋Œ€์—ญํญ ๋„คํŠธ์›Œํฌ ์‚ฌ์šฉ๋Ÿ‰ iftop, nethogs (Linux)
์ปจํ…์ŠคํŠธ ์Šค์œ„์น˜ ํ”„๋กœ์„ธ์Šค ์ „ํ™˜ ๋นˆ๋„ vmstat (Linux)


Linux ๋ช…๋ น์–ด ์˜ˆ์‹œ:

# CPU์™€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋ฅ  ํ™•์ธ
top

# ๋ฉ”๋ชจ๋ฆฌ ์ƒ์„ธ ์ •๋ณด
free -h

# ๋””์Šคํฌ I/O ํ†ต๊ณ„
iostat -x 1

# ํ”„๋กœ์„ธ์Šค๋ณ„ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰
ps aux --sort=-%mem | head -10

# ์‹œ์Šคํ…œ ์ „์ฒด ์„ฑ๋Šฅ ์š”์•ฝ
vmstat 1 10


๋งˆ๋ฌด๋ฆฌ


์šด์˜์ฒด์ œ๋Š” ์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์˜ ํ•ต์‹ฌ์ด๋‹ค.
ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ, ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ, ํŒŒ์ผ ์‹œ์Šคํ…œ, I/O ๊ด€๋ฆฌ ๋“ฑ
๋ชจ๋“  ์ปดํ“จํŒ… ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•œ๋‹ค.

๊ฐœ๋ฐœ์ž๋กœ์„œ ์šด์˜์ฒด์ œ์˜ ๊ธฐ๋ณธ ์›๋ฆฌ๋ฅผ ์ดํ•ดํ•˜๋ฉด
๋” ํšจ์œจ์ ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ณ ,
์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ๋น ๋ฅด๊ฒŒ ์ง„๋‹จํ•˜๊ณ  ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฒ˜์Œ์—” ๋ณต์žกํ•ด ๋ณด์ด์ง€๋งŒ,
์‹ค์ œ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋‹ค ๋ณด๋ฉด
์šด์˜์ฒด์ œ์˜ ๊ฐœ๋…๋“ค์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ดํ•ด๋  ๊ฒƒ์ด๋‹ค.

์ด ๊ธ€์ด ์šด์˜์ฒด์ œ๋ฅผ ์ดํ•ดํ•˜๋Š” ์‹œ์ž‘์ ์ด ๋˜๊ธธ ๋ฐ”๋ž€๋‹ค.