์ด์์ฒด์ ๋ ๋ฌด์์ธ๊ฐ
์ปดํจํฐ๋ฅผ ์ผ๋ฉด ๊ฐ์ฅ ๋จผ์ ๋ง๋๋ ๊ฒ์ด ์ด์์ฒด์ ๋ค.
Windows, macOS, Linux ๋ฑ ์ฐ๋ฆฌ๊ฐ ๋งค์ผ ์ฌ์ฉํ๋ ์ด ํ๋ก๊ทธ๋จ๋ค์
๋จ์ํ ์์ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ๊ฒ ์ด์์ ์ญํ ์ ํ๋ค.
์ด์์ฒด์ ๋ฅผ ๋น์ ํ์๋ฉด ๊ฑด๋ฌผ์ ๊ด๋ฆฌ์ธ๊ณผ๋ ๊ฐ๋ค.
๊ฑด๋ฌผ์ ์
์ฃผํ ์ฌ๋ฌ ํ์ฌ(์์ฉ ํ๋ก๊ทธ๋จ)๋ค์ด
์ ๊ธฐ(CPU), ๋ฌผ(๋ฉ๋ชจ๋ฆฌ), ๊ณต๊ฐ(์ ์ฅ์ฅ์น) ๋ฑ์ ์์์
ํจ์จ์ ์ผ๋ก ๋๋ ์ธ ์ ์๋๋ก ์ค์ฌํ๊ณ ๊ด๋ฆฌํ๋ ์ญํ ์ ํ๋ค.
์ฒ์ ํ๋ก๊ทธ๋๋ฐ์ ๋ฐฐ์ธ ๋๋ ์ด์์ฒด์ ์ ์กด์ฌ๋ฅผ ํฌ๊ฒ ์์ํ์ง ์๋๋ค.
๊ทธ์ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์คํํ๋ฉด ๊ฒฐ๊ณผ๊ฐ ๋์จ๋ค.
ํ์ง๋ง ์กฐ๊ธ ๋ ๊น์ด ๋ค์ด๊ฐ๋ค ๋ณด๋ฉด
์ฐ๋ฆฌ๊ฐ ์์ฑํ ํ๋ก๊ทธ๋จ์ด ์ค์ ๋ก ์ด๋ป๊ฒ ์คํ๋๋์ง,
๋ฉ๋ชจ๋ฆฌ๋ ์ด๋ป๊ฒ ๊ด๋ฆฌ๋๋์ง, ํ์ผ์ ์ด๋ป๊ฒ ์ ์ฅ๋๋์ง
๊ถ๊ธํด์ง๋ ์๊ฐ์ด ์จ๋ค.
์ ์ด์์ฒด์ ๋ฅผ ์ดํดํด์ผ ํ ๊น?
๊ฐ๋ฐ์๋ผ๋ฉด ์ด์์ฒด์ ์ ๊ธฐ๋ณธ ์๋ฆฌ๋ฅผ ์ดํดํ๋ ๊ฒ์ด ์ค์ํ๋ค.
์ฒซ์งธ, ์ฑ๋ฅ ์ต์ ํ๋ฅผ ํ ์ ์๋ค.
ํ๋ก์ธ์ค์ ์ค๋ ๋์ ์ฐจ์ด๋ฅผ ์๋ฉด ๋ฉํฐํ์คํน์ ํจ์จ์ ์ผ๋ก ๊ตฌํํ ์ ์๊ณ ,
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์๋ฆฌ๋ฅผ ์๋ฉด ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ๋ฐฉ์งํ ์ ์๋ค.
๋์งธ, ๋ฌธ์ ํด๊ฒฐ ๋ฅ๋ ฅ์ด ํฅ์๋๋ค.
ํ๋ก๊ทธ๋จ์ด ๋๋ ค์ง๊ฑฐ๋ ๋ฉ์ถ๋ ์ด์ ๋ฅผ ํ์
ํ ์ ์๊ณ ,
๋ฐ๋๋ฝ์ด๋ ๊ฒฝ์ ์ํ ๊ฐ์ ๋ฌธ์ ๋ฅผ ์๋ฐฉํ ์ ์๋ค.
์
์งธ, ์์คํ
๋ ๋ฒจ ์ดํด๊ฐ ๊น์ด์ง๋ค.
๋คํธ์ํฌ, ๋ฐ์ดํฐ๋ฒ ์ด์ค, ์๋ฒ ๋ฑ
๋ชจ๋ ์ปดํจํ
์์คํ
์ ๊ธฐ๋ฐ์ด ์ด์์ฒด์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
์ด์์ฒด์ ์ ์ฃผ์ ์ญํ
์ด์์ฒด์ ๋ ํฌ๊ฒ 4๊ฐ์ง ํต์ฌ ์ญํ ์ ์ํํ๋ค.
๐ข ํ๋ก์ธ์ค ๊ด๋ฆฌ (Process Management)
ํ๋ก์ธ์ค๋ ์คํ ์ค์ธ ํ๋ก๊ทธ๋จ์ ์๋ฏธํ๋ค.
์ด์์ฒด์ ๋ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ CPU๋ฅผ ํจ์จ์ ์ผ๋ก ๋๋ ์ธ ์ ์๋๋ก
์ค์ผ์ค๋ง(Scheduling)์ ์ํํ๋ค.
์๋ฅผ ๋ค์ด, ์์
์ ๋ค์ผ๋ฉด์ ๋ฌธ์ ์์ฑ์ ํ๊ณ
๋์์ ํ์ผ์ ๋ค์ด๋ก๋๋ฐ์ ์ ์๋ ์ด์ ๋
์ด์์ฒด์ ๊ฐ ๊ฐ ํ๋ก์ธ์ค์ CPU ์๊ฐ์ ๋ฒ๊ฐ์๊ฐ๋ฉฐ ํ ๋นํ๊ธฐ ๋๋ฌธ์ด๋ค.
ํ๋ก์ธ์ค์ ์๋ช ์ฃผ๊ธฐ:
- ์์ฑ(New): ํ๋ก์ธ์ค๊ฐ ๋ง๋ค์ด์ง๋ ๋จ๊ณ
- ์ค๋น(Ready): CPU๋ฅผ ํ ๋น๋ฐ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋จ๊ณ
- ์คํ(Running): CPU์์ ๋ช
๋ น์ ์คํํ๋ ๋จ๊ณ
- ๋๊ธฐ(Waiting): I/O ์์
์ด๋ ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ๋จ๊ณ
- ์ข
๋ฃ(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)
์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๊ณต์ ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ทผํ๋ ์ฝ๋ ์์ญ์ด๋ค.
์๊ณ ์์ญ์๋ ํ ๋ฒ์ ํ๋์ ํ๋ก์ธ์ค๋ง ๋ค์ด๊ฐ ์ ์์ด์ผ ํ๋ค.
์๊ณ ์์ญ ๋ฌธ์ ์ ํด๊ฒฐ ์กฐ๊ฑด:
- ์ํธ ๋ฐฐ์ (Mutual Exclusion): ํ ๋ฒ์ ํ๋๋ง ์คํ
- ์งํ(Progress): ์๊ณ ์์ญ์ ์๋ฌด๋ ์์ผ๋ฉด ์ง์
ํ์ฉ
- ์ ํ ๋๊ธฐ(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๊ฐ์ง ๋ชจ๋ ์ถฉ์กฑ)
- ์ํธ ๋ฐฐ์ (Mutual Exclusion): ์์์ ํ ๋ฒ์ ํ๋์ ํ๋ก์ธ์ค๋ง ์ฌ์ฉ
- ์ ์ ์ ๋๊ธฐ(Hold and Wait): ์์์ ๊ฐ์ง ์ํ์์ ๋ค๋ฅธ ์์์ ๊ธฐ๋ค๋ฆผ
- ๋น์ ์ (No Preemption): ์์์ ๊ฐ์ ๋ก ๋นผ์์ ์ ์์
- ์ํ ๋๊ธฐ(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)
ํ๋ก์ธ์ค๊ฐ ์ ๊ทผํ๋ ค๋ ํ์ด์ง๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์์ ๋ ๋ฐ์ํ๋ค.
์ฒ๋ฆฌ ๊ณผ์ :
- CPU๊ฐ ํ์ด์ง ์ ๊ทผ ์๋
- ํ์ด์ง๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์์์ ๊ฐ์ง
- ์ด์์ฒด์ ์ ํ์ด์ง ํดํธ ์ธํฐ๋ฝํธ ๋ฐ์
- ๋์คํฌ์์ ํด๋น ํ์ด์ง๋ฅผ ์ฐพ์
- ๋น ํ๋ ์์ ํ์ด์ง๋ฅผ ๋ก๋ (ํ์์ ํ์ด์ง ๊ต์ฒด)
- ํ์ด์ง ํ
์ด๋ธ ์
๋ฐ์ดํธ
- ํ๋ก์ธ์ค ์ฌ๊ฐ
ํ์ด์ง ํดํธ๊ฐ ์์ฃผ ๋ฐ์ํ๋ฉด ์ค๋์ฑ(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 ๊ด๋ฆฌ ๋ฑ
๋ชจ๋ ์ปดํจํ
์์์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ค.
๊ฐ๋ฐ์๋ก์ ์ด์์ฒด์ ์ ๊ธฐ๋ณธ ์๋ฆฌ๋ฅผ ์ดํดํ๋ฉด
๋ ํจ์จ์ ์ธ ํ๋ก๊ทธ๋จ์ ์์ฑํ ์ ์๊ณ ,
์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ๋น ๋ฅด๊ฒ ์ง๋จํ๊ณ ํด๊ฒฐํ ์ ์๋ค.
์ฒ์์ ๋ณต์กํด ๋ณด์ด์ง๋ง,
์ค์ ๋ก ์ฝ๋๋ฅผ ์์ฑํ๊ณ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค ๋ณด๋ฉด
์ด์์ฒด์ ์ ๊ฐ๋
๋ค์ด ์์ฐ์ค๋ฝ๊ฒ ์ดํด๋ ๊ฒ์ด๋ค.
์ด ๊ธ์ด ์ด์์ฒด์ ๋ฅผ ์ดํดํ๋ ์์์ ์ด ๋๊ธธ ๋ฐ๋๋ค.