๐Operating System 001
Originial Repository: https://github.com/gyoogle/tech-interview-for-developer๋ฅผ ๊ณต๋ถํ๋ฉฐ 2์ฐจ ํธ์งํ ๋ด์ฉ์ ๋๋ค.
Operating System 001
- ์ด์์ฒด์ ๋
- ํ๋ก์ธ์ค vs ์ค๋ ๋
- ํ๋ก์ธ์ค ์ฃผ์ ๊ณต๊ฐ
- ์ธํฐ๋ฝํธ(Interrupt)
- ์์คํ
์ฝ(System Call)
- PCB์ Context Switching
- IPC(Inter Process Communication)
์ด์์ฒด์ ๋
- ์ด์ ์ฒด์ (OS, Operating System)
ํ๋์จ์ด๋ฅผ ๊ด๋ฆฌํ๊ณ , ์ปดํจํฐ ์์คํ ์ ์์๋ค์ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ, ์์ฉ ํ๋ก๊ทธ๋จ๊ณผ ํ๋์จ์ด ๊ฐ์ ์ธํฐํ์ด์ค๋ก์จ ๋ค๋ฅธ ์์ฉ ํ๋ก๊ทธ๋จ์ด ์ ์ฉํ ์์ ์ ํ ์ ์๋๋ก ํ๊ฒฝ์ ์ ๊ณตํด์ค๋ค.
์ฆ, ์ด์ ์ฒด์ ๋ ์ฌ์ฉ์๊ฐ ์ปดํจํฐ๋ฅผ ํธ๋ฆฌํ๊ณ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋๋ก ํ๊ฒฝ์ ์ ๊ณตํ๋ ์์คํ ์ํํธ์จ์ด๋ผ๊ณ ํ ์ ์๋ค.
(์ข ๋ฅ๋ก๋ Windows, Linux, UNIX, MS-DOS ๋ฑ์ด ์์ผ๋ฉฐ, ์์คํ ์ ์ญํ ๊ตฌ๋ถ์ ๋ฐ๋ผ ๊ฐ๊ฐ ์ฉ์ด์ ์ด ์๋ค.)
์ด์์ฒด์ ์ ์ญํ
1. ํ๋ก์ธ์ค ๊ด๋ฆฌ | 2. ์ ์ฅ์ฅ์น ๊ด๋ฆฌ | 3. ๋คํธ์ํน | 4. ์ฌ์ฉ์ ๊ด๋ฆฌ | 5. ๋๋ฐ์ด์ค ๋๋ผ์ด๋ฒ |
---|---|---|---|---|
ํ๋ก์ธ์ค, ์ค๋ ๋ ์ค์ผ์ค๋ง ๋๊ธฐํ IPC ํต์ |
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ํ์ผ ์์คํ |
TCP/IP ๊ธฐํ ํ๋กํ ์ฝ |
๊ณ์ ๊ด๋ฆฌ ์ ๊ทผ๊ถํ ๊ด๋ฆฌ |
์์ฐจ์ ๊ทผ ์ฅ์น ์์์ ๊ทผ ์ฅ์น ๋คํธ์ํฌ ์ฅ์น |
๊ฐ ์ญํ ์ ๋ํ ์์ธํ ์ค๋ช
ํ๋ก์ธ์ค vs ์ค๋ ๋
ํ๋ก์ธ์ค : ํ๋ก๊ทธ๋จ์ ๋ฉ๋ชจ๋ฆฌ ์์์ ์คํ์ค์ธ ์์
์ค๋ ๋ : ํ๋ก์ธ์ค ์์์ ์คํ๋๋ ์ฌ๋ฌ ํ๋ฆ ๋จ์
๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ก์ธ์ค๋ง๋ค ์ต์ 1๊ฐ์ ์ค๋ ๋ ์์ (๋ฉ์ธ ์ค๋ ๋ ํฌํจ)
ํ๋ก์ธ์ค๋ ๊ฐ๊ฐ ๋ณ๋์ ์ฃผ์๊ณต๊ฐ ํ ๋น (๋ ๋ฆฝ์ )
- Code : ์ฝ๋ ์์ฒด๋ฅผ ๊ตฌ์ฑํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ(ํ๋ก๊ทธ๋จ ๋ช ๋ น)
- Data : ์ ์ญ๋ณ์, ์ ์ ๋ณ์, ๋ฐฐ์ด ๋ฑ
- ์ด๊ธฐํ ๋ ๋ฐ์ดํฐ๋ data ์์ญ์ ์ ์ฅ
- ์ด๊ธฐํ ๋์ง ์์ ๋ฐ์ดํฐ๋ bss ์์ญ์ ์ ์ฅ
- Heap : ๋์ ํ ๋น ์ ์ฌ์ฉ (new(), malloc() ๋ฑ)
- Stack : ์ง์ญ๋ณ์, ๋งค๊ฐ๋ณ์, ๋ฆฌํด ๊ฐ (์์ ๋ฉ๋ชจ๋ฆฌ ์์ญ)
์ค๋ ๋๋ Stack๋ง ๋ฐ๋ก ํ ๋น ๋ฐ๊ณ ๋๋จธ์ง ์์ญ์ ์๋ก ๊ณต์
- Stack ์์ญ๋ง ๋ฐ๋ก ํ ๋น ๋ฐ๋ ์ด์
- ์ฐ๋ ๋๋ ๋ ๋ฆฝ์ ์ธ ๋์์ ์ํํ๊ธฐ ์ํด ์กด์ฌ ํ๋ค
- ์ฆ ๋ ๋ฆฝ์ ์ผ๋ก ํจ์๋ฅผ ํธ์ถ ํ ์ ์์ด์ผ ํ๋ค
- ๋๋ฌธ์ ํจ์์ ๋งค๊ฐ๋ณ์, ์ง์ญ๋ณ์๋ฑ์ ์ ์ฅํ๋ ์คํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ ๋ฆฝ์ ์ผ๋ก ํ ๋น ๋ฐ์์ผ ํ๋ค
ํ๋์ ํ๋ก์ธ์ค๊ฐ ์์ฑ๋ ๋, ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋์ ์ค๋ ๋ ๊ฐ์ด ์์ฑ
ํ๋ก์ธ์ค๋ ์์ ๋ง์ ๊ณ ์ ๊ณต๊ฐ๊ณผ ์์์ ํ ๋น๋ฐ์ ์ฌ์ฉํ๋๋ฐ ๋ฐํด, ์ค๋ ๋๋ ๋ค๋ฅธ ์ค๋ ๋์ ๊ณต๊ฐ, ์์์ ๊ณต์ ํ๋ฉด์ ์ฌ์ฉํ๋ ์ฐจ์ด๊ฐ ์กด์ฌํจ
๋ฉํฐ ํ๋ก์ธ์ค
ํ๋์ ํ๋ก๊ทธ๋จ์ ์ฌ๋ฌ๊ฐ์ ํ๋ก์ธ์ค๋ก ๊ตฌ์ฑํ์ฌ ๊ฐ ํ๋ก์ธ์ค๊ฐ ๋ณ๋ ฌ์ ์ผ๋ก ์์ ์ ์ํํ๋ ๊ฒ
์ฅ์ : ์์ ์ฑ (๋ฉ๋ชจ๋ฆฌ ์นจ๋ฒ ๋ฌธ์ ๋ฅผ OS ์ฐจ์์์ ํด๊ฒฐ)
๋จ์ : ๊ฐ๊ฐ ๋ ๋ฆฝ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ฐ๊ณ ์์ด, ์์ ๋ ๋ง์ ์๋ก ์ค๋ฒํค๋ ๋ฐ์. Context Switching์ผ๋ก ์ธํ ์ฑ๋ฅ ์ ํ
Context Switching์ด๋?
ํ๋ก์ธ์ค์ ์ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๊ณ ๋ณต์ํ๋ ์ผ๋ จ์ ๊ณผ์
์ฆ, ๋์ ์ค์ธ ํ๋ก์ธ์ค๊ฐ ๋๊ธฐํ๋ฉด์ ํด๋น ํ๋ก์ธ์ค์ ์ํ๋ฅผ ๋ณด๊ดํ๊ณ , ๋๊ธฐํ๊ณ ์๋ ๋ค์ ์๋ฒ์ ํ๋ก์ธ์ค๊ฐ ๋์ํ๋ฉด์ ์ด์ ์ ๋ณด๊ดํ๋ ํ๋ก์ธ์ค ์ํ๋ฅผ ๋ณต๊ตฌํ๋ ๊ณผ์ ์ ๋งํจ
โ ํ๋ก์ธ์ค๋ ๊ฐ ๋ ๋ฆฝ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ ๋น๋ฐ์ ์ฌ์ฉ๋๋ฏ๋ก, ์บ์ ๋ฉ๋ชจ๋ฆฌ ์ด๊ธฐํ์ ๊ฐ์ ๋ฌด๊ฑฐ์ด ์์ ์ด ์งํ๋์์ ๋ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ๋ฌธ์ ๊ฐ ์กด์ฌํจ
๋ฉํฐ ์ค๋ ๋
ํ๋์ ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ๊ตฌ์ฑํด ๊ฐ ์ค๋ ๋๊ฐ ํ๋์ ์์ ์ ์ฒ๋ฆฌํ๋ ๊ฒ
์ค๋ ๋๋ค์ด ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํตํด ๋ค์์ ์์ ์ ๋์์ ์ฒ๋ฆฌํ๋๋ก ํด์ค
์ฅ์ : ๋ ๋ฆฝ์ ์ธ ํ๋ก์ธ์ค์ ๋นํด ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋งํผ์ ์๊ฐ, ์์ ์์ค์ด ๊ฐ์ ์ ์ญ ๋ณ์์ ์ ์ ๋ณ์์ ๋ํ ์๋ฃ ๊ณต์ ๊ฐ๋ฅ
๋จ์ : ์์ ์ฑ ๋ฌธ์ . ํ๋์ ์ค๋ ๋๊ฐ ๋ฐ์ดํฐ ๊ณต๊ฐ ๋ง๊ฐ๋จ๋ฆฌ๋ฉด, ๋ชจ๋ ์ค๋ ๋๊ฐ ์๋ ๋ถ๋ฅ ์ํ (๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ)
๋ฉํฐ์ค๋ ๋์ ์์ ์ฑ์ ๋ํ ๋จ์ ์ Critical Section ๊ธฐ๋ฒ์ ํตํด ๋๋นํจ
ํ๋์ ์ค๋ ๋๊ฐ ๊ณต์ ๋ฐ์ดํฐ ๊ฐ์ ๋ณ๊ฒฝํ๋ ์์ ์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๊ทธ ๊ฐ์ ์ฝ์ผ๋ คํ ๋ ๋ฐ์ํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋๊ธฐํ ๊ณผ์
์ํธ ๋ฐฐ์ , ์งํ, ํ์ ๋ ๋๊ธฐ๋ฅผ ์ถฉ์กฑํด์ผํจ
ํ๋ก์ธ์ค ์ฃผ์ ๊ณต๊ฐ
ํ๋ก๊ทธ๋จ์ด CPU์ ์ํด ์คํ๋จ โ ํ๋ก์ธ์ค๊ฐ ์์ฑ๋๊ณ ๋ฉ๋ชจ๋ฆฌ์ โํ๋ก์ธ์ค ์ฃผ์ ๊ณต๊ฐโ์ด ํ ๋น๋จ
ํ๋ก์ธ์ค ์ฃผ์ ๊ณต๊ฐ์๋ ์ฝ๋, ๋ฐ์ดํฐ, ์คํ์ผ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค.
- ์ฝ๋ Segment : ํ๋ก๊ทธ๋จ ์์ค ์ฝ๋ ์ ์ฅ
- ๋ฐ์ดํฐ Segment : ์ ์ญ ๋ณ์ ์ ์ฅ
- ์คํ Segment : ํจ์, ์ง์ญ ๋ณ์ ์ ์ฅ
ํ๋ก๊ทธ๋จ์ ํจ์์ ์ง์ญ ๋ณ์๋, LIFO(๊ฐ์ฅ ๋์ค์ ๋ค์ด๊ฐ๊ฒ ๋จผ์ ๋์ด)ํน์ฑ์ ๊ฐ์ง ์คํ์์ ์คํ๋๋ค.
๋ฐ๋ผ์ ์ด ํจ์๋ค ์์์ ๊ณตํต์ผ๋ก ์ฌ์ฉํ๋ '์ ์ญ ๋ณ์'๋ ๋ฐ๋ก ์ง์ ํด์ฃผ๋ฉด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋ ์ ์๋ค.
์ธํฐ๋ฝํธ(Interrupt)
ํ๋ก๊ทธ๋จ์ ์คํํ๋ ๋์ค์ ์๊ธฐ์น ์์ ์ํฉ์ด ๋ฐ์ํ ๊ฒฝ์ฐ ํ์ฌ ์คํ ์ค์ธ ์์ ์ ์ฆ์ ์ค๋จํ๊ณ , ๋ฐ์๋ ์ํฉ์ ๋ํ ์ฐ์ ์ฒ๋ฆฌ๊ฐ ํ์ํจ์ CPU์๊ฒ ์๋ฆฌ๋ ๊ฒ
์ง๊ธ ์ํ ์ค์ธ ์ผ๋ณด๋ค ๋ ์ค์ํ ์ผ(ex. ์ ์ถ๋ ฅ, ์ฐ์ ์์ ์ฐ์ฐ ๋ฑ)์ด ๋ฐ์ํ๋ฉด ๊ทธ ์ผ์ ๋จผ์ ์ฒ๋ฆฌํ๊ณ ๋์ ํ๋ ์ผ์ ๊ณ์ํด์ผํ๋ค.
- ์ธ๋ถ/๋ด๋ถ ์ธํฐ๋ฝํธ๋
CPU์ ํ๋์จ์ด ์ ํธ์ ์ํด ๋ฐ์
- ์ํํธ์จ์ด ์ธํฐ๋ฝํธ๋
๋ช ๋ น์ด์ ์ํ์ ์ํด ๋ฐ์
์ธ๋ถ ์ธํฐ๋ฝํธ
์ ์ถ๋ ฅ ์ฅ์น, ํ์ด๋ฐ ์ฅ์น, ์ ์ ๋ฑ ์ธ๋ถ์ ์ธ ์์ธ์ผ๋ก ๋ฐ์
์ ์ ์ด์, ๊ธฐ๊ณ ์ฐฉ์ค, ์ธ๋ถ ์ ํธ, ์ ์ถ๋ ฅ
๋ด๋ถ ์ธํฐ๋ฝํธ
Trap์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ์๋ชป๋ ๋ช ๋ น์ด๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ์
0์ผ๋ก ๋๋๊ธฐ๊ฐ ๋ฐ์, ์ค๋ฒํ๋ก์ฐ, ๋ช ๋ น์ด๋ฅผ ์๋ชป ์ฌ์ฉํ ๊ฒฝ์ฐ (Exception)
์ํํธ์จ์ด ์ธํฐ๋ฝํธ
ํ๋ก๊ทธ๋จ ์ฒ๋ฆฌ ์ค ๋ช ๋ น์ ์์ฒญ์ ์ํด ๋ฐ์ํ ๊ฒ (SVC ์ธํฐ๋ฝํธ)
์ฌ์ฉ์๊ฐ ํ๋ก๊ทธ๋จ์ ์คํ์ํฌ ๋ ๋ฐ์
์ํํธ์จ์ด ์ด์ฉ ์ค์ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ฅผ ์คํ์ํค๋ฉด ์๋ถํ ์ฒ๋ฆฌ๋ฅผ ์ํด ์์ ํ ๋น ๋์์ด ์ํ๋๋ค.
์ธํฐ๋ฝํธ ๋ฐ์ ์ฒ๋ฆฌ ๊ณผ์
์ฃผ ํ๋ก๊ทธ๋จ์ด ์คํ๋๋ค๊ฐ ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ๋ค.
ํ์ฌ ์ํ ์ค์ธ ํ๋ก๊ทธ๋จ์ ๋ฉ์ถ๊ณ , ์ํ ๋ ์ง์คํฐ์ PC ๋ฑ์ ์คํ์ ์ ์ ์ ์ฅํ ๋ค์ ์ธํฐ๋ฝํธ ์๋น์ค ๋ฃจํด์ผ๋ก ๊ฐ๋ค.
(์ ์ ์ ์ฅํ๋ ์ด์ ๋, ์ธํฐ๋ฝํธ ์๋น์ค ๋ฃจํด์ด ๋๋ ๋ค ๋ค์ ์๋ ์์ ์ผ๋ก ๋์์์ผ ํ๊ธฐ ๋๋ฌธ)
๋ง์ฝ ์ธํฐ๋ฝํธ ๊ธฐ๋ฅ์ด ์์๋ค๋ฉด, ์ปจํธ๋กค๋ฌ๋ ํน์ ํ ์ด๋ค ์ผ์ ํ ์๊ธฐ๋ฅผ ์๊ธฐ ์ํด ๊ณ์ ์ฒดํฌ๋ฅผ ํด์ผ ํ๋ค.
(์ด๋ฅผ ํด๋ง(Polling)์ด๋ผ๊ณ ํ๋ค)
ํด๋ง์ ํ๋ ์๊ฐ์๋ ์๋ ํ๋ ์ผ์ ์ง์คํ ์๊ฐ ์๊ฒ ๋์ด ๋ง์ ๊ธฐ๋ฅ์ ์ ๋๋ก ์ํํ์ง ๋ชปํ๋ ๋จ์ ์ด ์์๋ค.
์ฆ, ์ปจํธ๋กค๋ฌ๊ฐ ์ ๋ ฅ์ ๋ฐ์๋ค์ด๋ ๋ฐฉ๋ฒ(์ฐ์ ์์ ํ๋ณ๋ฐฉ๋ฒ)์๋ ๋๊ฐ์ง๊ฐ ์๋ค.
- ํด๋ง ๋ฐฉ์
- ์ฌ์ฉ์๊ฐ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด ์ ๋ ฅ ํ์ ๊ฐ์ ๊ณ์ ์ฝ์ด ๋ณํ๋ฅผ ์์๋ด๋ ๋ฐฉ์
- ์ธํฐ๋ฝํธ ์์ฒญ ํ๋๊ทธ๋ฅผ ์ฐจ๋ก๋ก ๋น๊ตํ์ฌ ์ฐ์ ์์๊ฐ ๊ฐ์ฅ ๋์ ์ธํฐ๋ฝํธ ์์์ ์ฐพ์ ์ด์ ๋ง๋ ์ธํฐ๋ฝํธ ์๋น์ค ๋ฃจํด์ ์ํํ๋ค. (ํ๋์จ์ด์ ๋นํด ์๋ ๋๋ฆผ)
- ์ธํฐ๋ฝํธ ๋ฐฉ์
- MCU ์์ฒด๊ฐ ํ๋์จ์ด์ ์ผ๋ก ๋ณํ๋ฅผ ์ฒดํฌํ์ฌ ๋ณํ ์์๋ง ์ผ์ ํ ๋์์ ํ๋ ๋ฐฉ์
- Daisy Chain
- ๋ณ๋ ฌ ์ฐ์ ์์ ๋ถ์ฌ
์ธํฐ๋ฝํธ ๋ฐฉ์์ ํ๋์จ์ด๋ก ์ง์์ ๋ฐ์์ผ ํ๋ ์ ์ฝ์ด ์์ง๋ง, ํด๋ง์ ๋นํด ์ ์ํ๊ฒ ๋์ํ๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค. ๋ฐ๋ผ์ โ์ค์๊ฐ ๋์โ์ด ํ์ํ ๋๋ ํ์์ ์ธ ๊ธฐ๋ฅ์ด๋ค.
์ฆ, ์ธํฐ๋ฝํธ๋ ๋ฐ์์๊ธฐ๋ฅผ ์์ธกํ๊ธฐ ํ๋ ๊ฒฝ์ฐ์ ์ปจํธ๋กค๋ฌ๊ฐ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ๋์ํ ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค.
์์คํ ์ฝ(System Call)
fork( )
, exec( )
, wait( )
์ ๊ฐ์ ๊ฒ๋ค์ Process ์์ฑ๊ณผ ์ ์ด๋ฅผ ์ํ System call์.
- fork, exec๋ ์๋ก์ด Process ์์ฑ๊ณผ ๊ด๋ จ์ด ๋์ด ์๋ค.
- wait๋ Process (Parent)๊ฐ ๋ง๋ ๋ค๋ฅธ Process(child) ๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ๋ช ๋ น์ด์.
Fork
์๋ก์ด Process๋ฅผ ์์ฑํ ๋ ์ฌ์ฉ.
๊ทธ๋ฌ๋, ์ด์ํ ๋ฐฉ์์.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char *argv[]) {
printf("pid : %d", (int) getpid()); // pid : 29146
int rc = fork(); // ์ฃผ๋ชฉ
if (rc < 0) {
exit(1);
} // (1) fork ์คํจ
else if (rc == 0) { // (2) child ์ธ ๊ฒฝ์ฐ (fork ๊ฐ์ด 0)
printf("child (pid : %d)", (int) getpid());
}
else { // (3) parent case
printf("parent of %d (pid : %d)", rc, (int)getpid());
}
}
pid : 29146
parent of 29147 (pid : 29146)
child (pid : 29147)
์ ์ถ๋ ฅํจ (parent์ child์ ์์๋ non-deterministicํจ. ์ฆ, ํ์ ํ ์ ์์. scheduler๊ฐ ๊ฒฐ์ ํ๋ ์ผ์.)
[ํด์]
PID : ํ๋ก์ธ์ค ์๋ณ์. UNIX ์์คํ ์์๋ PID๋ ํ๋ก์ธ์ค์๊ฒ ๋ช ๋ น์ ํ ๋ ์ฌ์ฉํจ.
Fork()๊ฐ ์คํ๋๋ ์๊ฐ. ํ๋ก์ธ์ค๊ฐ ํ๋ ๋ ์๊ธฐ๋๋ฐ, ์ด ๋ ์๊ธด ํ๋ก์ธ์ค(Child)๋ fork๋ฅผ ๋ง๋ ํ๋ก์ธ์ค(Parent)์ (almost) ๋์ผํ ๋ณต์ฌ๋ณธ์ ๊ฐ๊ฒ ๋๋ค. ์ด ๋ OS๋ ์์ ๋๊ฐ์ 2๊ฐ์ ํ๋ก๊ทธ๋จ์ด ๋์ํ๋ค๊ณ ์๊ฐํ๊ณ , fork()๊ฐ return๋ ์ฐจ๋ก๋ผ๊ณ ์๊ฐํ๋ค. ๊ทธ ๋๋ฌธ์ ์๋ก ์์ฑ๋ Process (child)๋ main์์ ์์ํ์ง ์๊ณ , if ๋ฌธ๋ถํฐ ์์ํ๊ฒ ๋๋ค.
๊ทธ๋ฌ๋, ์ฐจ์ด์ ์ด ์์๋ค. ๋ฐ๋ก child์ parent์ fork() ๊ฐ์ด ๋ค๋ฅด๋ค๋ ์ ์ด๋ค. ๋ฐ๋ผ์, ์์ ํ ๋์ผํ ๋ณต์ฌ๋ณธ์ด๋ผ ํ ์ ์๋ค.
Parent์ fork()๊ฐ => child์ pid ๊ฐ
Child์ fork()๊ฐ => 0
Parent์ child์ fork ๊ฐ์ด ๋ค๋ฅด๋ค๋ ์ ์ ๋งค์ฐ ์ ์ฉํ ๋ฐฉ์์ด๋ค.
๊ทธ๋ฌ๋! Scheduler๊ฐ ๋ถ๋ชจ๋ฅผ ๋จผ์ ์ํํ ์ง ์๋์ง ํ์ ํ ์ ์๋ค. ๋ฐ๋ผ์ ์๋์ ๊ฐ์ด ์ถ๋ ฅ๋ ์ ์๋ค.
pid : 29146
child (pid : 29147)
parent of 29147 (pid : 29146)
wait
child ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๋ ์์
์์ ์์์ int wc = wait(NULL)๋ง ์ถ๊ฐํจ.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, char *argv[]) {
printf("pid : %d", (int) getpid()); // pid : 29146
int rc = fork(); // ์ฃผ๋ชฉ
if (rc < 0) {
exit(1);
} // (1) fork ์คํจ
else if (rc == 0) { // (2) child ์ธ ๊ฒฝ์ฐ (fork ๊ฐ์ด 0)
printf("child (pid : %d)", (int) getpid());
}
else { // (3) parent case
int wc = wait(NULL) // ์ถ๊ฐ๋ ๋ถ๋ถ
printf("parent of %d (wc : %d / pid : %d)", wc, rc, (int)getpid());
}
}
pid : 29146
child (pid : 29147)
parent of 29147 (wc : 29147 / pid : 29146)
wait๋ฅผ ํตํด์, child์ ์คํ์ด ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ค์ค. parent๊ฐ ๋จผ์ ์คํ๋๋๋ผ๋, wait ()๋ child๊ฐ ๋๋๊ธฐ ์ ์๋ returnํ์ง ์์ผ๋ฏ๋ก, ๋ฐ๋์ child๊ฐ ๋จผ์ ์คํ๋จ.
exec
๋จ์ fork๋ ๋์ผํ ํ๋ก์ธ์ค์ ๋ด์ฉ์ ์ฌ๋ฌ ๋ฒ ๋์ํ ๋ ์ฌ์ฉํจ.
child์์๋ parent์ ๋ค๋ฅธ ๋์์ ํ๊ณ ์ถ์ ๋๋ exec๋ฅผ ์ฌ์ฉํ ์ ์์.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/wait.h>
int main(int argc, char *argv[]) {
printf("pid : %d", (int) getpid()); // pid : 29146
int rc = fork(); // ์ฃผ๋ชฉ
if (rc < 0) {
exit(1);
} // (1) fork ์คํจ
else if (rc == 0) { // (2) child ์ธ ๊ฒฝ์ฐ (fork ๊ฐ์ด 0)
printf("child (pid : %d)", (int) getpid());
char *myargs[3];
myargs[0] = strdup("wc"); // ๋ด๊ฐ ์คํํ ํ์ผ ์ด๋ฆ
myargs[1] = strdup("p3.c"); // ์คํํ ํ์ผ์ ๋๊ฒจ์ค argument
myargs[2] = NULL; // end of array
execvp(myarges[0], myargs); // wc ํ์ผ ์คํ.
printf("this shouldn't print out") // ์คํ๋์ง ์์.
}
else { // (3) parent case
int wc = wait(NULL) // ์ถ๊ฐ๋ ๋ถ๋ถ
printf("parent of %d (wc : %d / pid : %d)", wc, rc, (int)getpid());
}
}
exec๊ฐ ์คํ๋๋ฉด,
execvp( ์คํ ํ์ผ, ์ ๋ฌ ์ธ์ ) ํจ์๋, code segment ์์ญ์ ์คํ ํ์ผ์ ์ฝ๋๋ฅผ ์ฝ์ด์์ ๋ฎ์ด ์์ด๋ค.
์์ด ์ดํ์๋, heap, stack, ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด ์ด๊ธฐํ๋๊ณ , OS๋ ๊ทธ๋ฅ ์คํํ๋ค. ์ฆ, ์๋ก์ด Process๋ฅผ ์์ฑํ์ง ์๊ณ , ํ์ฌ ํ๋ก๊ทธ๋จ์ wc๋ผ๋ ํ์ผ์ ์คํํ๋ค. ๊ทธ๋ก์ธํด์, execvp() ์ดํ์ ๋ถ๋ถ์ ์คํ๋์ง ์๋๋ค.
PCB์ Context Switching
Process Management
CPU๊ฐ ํ๋ก์ธ์ค๊ฐ ์ฌ๋ฌ๊ฐ์ผ ๋, CPU ์ค์ผ์ค๋ง์ ํตํด ๊ด๋ฆฌํ๋ ๊ฒ์ ๋งํจ
์ด๋, CPU๋ ๊ฐ ํ๋ก์ธ์ค๋ค์ด ๋๊ตฐ์ง ์์์ผ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํจ
ํ๋ก์ธ์ค๋ค์ ํน์ง์ ๊ฐ๊ณ ์๋ ๊ฒ์ด ๋ฐ๋ก Process Metadata
- Process Metadata
- Process ID
- Process State
- Process Priority
- CPU Registers
- Owner
- CPU Usage
- Memeory Usage
์ด ๋ฉํ๋ฐ์ดํฐ๋ ํ๋ก์ธ์ค๊ฐ ์์ฑ๋๋ฉด PCB(Process Control Block)
์ด๋ผ๋ ๊ณณ์ ์ ์ฅ๋จ
PCB(Process Control Block)
ํ๋ก์ธ์ค ๋ฉํ๋ฐ์ดํฐ๋ค์ ์ ์ฅํด ๋๋ ๊ณณ, ํ PCB ์์๋ ํ ํ๋ก์ธ์ค์ ์ ๋ณด๊ฐ ๋ด๊น
๋ค์ ์ ๋ฆฌํด๋ณด๋ฉด?
ํ๋ก๊ทธ๋จ ์คํ โ ํ๋ก์ธ์ค ์์ฑ โ ํ๋ก์ธ์ค ์ฃผ์ ๊ณต๊ฐ์ (์ฝ๋, ๋ฐ์ดํฐ, ์คํ) ์์ฑ
โ ์ด ํ๋ก์ธ์ค์ ๋ฉํ๋ฐ์ดํฐ๋ค์ด PCB์ ์ ์ฅ
PCB๊ฐ ์ ํ์ํ๊ฐ์?
CPU์์๋ ํ๋ก์ธ์ค์ ์ํ์ ๋ฐ๋ผ ๊ต์ฒด์์ ์ด ์ด๋ฃจ์ด์ง๋ค. (interrupt๊ฐ ๋ฐ์ํด์ ํ ๋น๋ฐ์ ํ๋ก์ธ์ค๊ฐ waiting ์ํ๊ฐ ๋๊ณ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ฅผ running์ผ๋ก ๋ฐ๊ฟ ์ฌ๋ฆด ๋)
์ด๋, ์์ผ๋ก ๋ค์ ์ํํ ๋๊ธฐ ์ค์ธ ํ๋ก์ธ์ค์ ๊ดํ ์ ์ฅ ๊ฐ์ PCB์ ์ ์ฅํด๋๋ ๊ฒ์ด๋ค.
PCB๋ ์ด๋ป๊ฒ ๊ด๋ฆฌ๋๋์?
Linked List ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํจ
PCB List Head์ PCB๋ค์ด ์์ฑ๋ ๋๋ง๋ค ๋ถ๊ฒ ๋๋ค. ์ฃผ์๊ฐ์ผ๋ก ์ฐ๊ฒฐ์ด ์ด๋ฃจ์ด์ ธ ์๋ ์ฐ๊ฒฐ๋ฆฌ์คํธ์ด๊ธฐ ๋๋ฌธ์ ์ฝ์ ์ญ์ ๊ฐ ์ฉ์ดํจ.
์ฆ, ํ๋ก์ธ์ค๊ฐ ์์ฑ๋๋ฉด ํด๋น PCB๊ฐ ์์ฑ๋๊ณ ํ๋ก์ธ์ค ์๋ฃ์ ์ ๊ฑฐ๋จ
์ด๋ ๊ฒ ์ํ ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ๋ณ๊ฒฝํ ๋, CPU์ ๋ ์ง์คํฐ ์ ๋ณด๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ Context Switching
์ด๋ผ๊ณ ํ๋ค.
Context Switching
CPU๊ฐ ์ด์ ์ ํ๋ก์ธ์ค ์ํ๋ฅผ PCB์ ๋ณด๊ดํ๊ณ , ๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ ๋ณด๋ฅผ PCB์ ์ฝ์ด ๋ ์ง์คํฐ์ ์ ์ฌํ๋ ๊ณผ์
๋ณดํต ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ๊ฑฐ๋, ์คํ ์ค์ธ CPU ์ฌ์ฉ ํ๊ฐ์๊ฐ์ ๋ชจ๋ ์๋ชจํ๊ฑฐ๋, ์ ์ถ๋ ฅ์ ์ํด ๋๊ธฐํด์ผ ํ๋ ๊ฒฝ์ฐ์ Context Switching์ด ๋ฐ์
์ฆ, ํ๋ก์ธ์ค๊ฐ Ready โ Running, Running โ Ready, Running โ Waiting์ฒ๋ผ ์ํ ๋ณ๊ฒฝ ์ ๋ฐ์!
Context Switching์ OverHead๋?
overhead๋ ๊ณผ๋ถํ๋ผ๋ ๋ป์ผ๋ก ๋ณดํต ์์ข์ ๋ง๋ก ๋ง์ด ์ฐ์ธ๋ค.
ํ์ง๋ง ํ๋ก์ธ์ค ์์ ์ค์๋ OverHead๋ฅผ ๊ฐ์ํด์ผ ํ๋ ์ํฉ์ด ์๋ค.
ํ๋ก์ธ์ค๋ฅผ ์ํํ๋ค๊ฐ ์
์ถ๋ ฅ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํด์ ๋๊ธฐ ์ํ๋ก ์ ํ์ํด
์ด๋, CPU๋ฅผ ๊ทธ๋ฅ ๋๊ฒ ๋๋๋ ๊ฒ๋ณด๋ค ๋ค๋ฅธ ํ๋ก์ธ์ค๋ฅผ ์ํ์ํค๋ ๊ฒ์ด ํจ์จ์
์ฆ, CPU์ ๊ณ์ ํ๋ก์ธ์ค๋ฅผ ์ํ์ํค๋๋ก ํ๊ธฐ ์ํด์ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ฅผ ์คํ์ํค๊ณ Context Switching ํ๋ ๊ฒ
CPU๊ฐ ๋์ง ์๋๋ก ๋ง๋ค๊ณ , ์ฌ์ฉ์์๊ฒ ๋น ๋ฅด๊ฒ ์ผ์ฒ๋ฆฌ๋ฅผ ์ ๊ณตํด์ฃผ๊ธฐ ์ํ ๊ฒ์ด๋ค.
IPC(Inter Process Communication)
ํ๋ก์ธ์ค๋ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋๋ค.
์ฆ, ๋ ๋ฆฝ ๋์ด์๋ค๋ ๊ฒ์ ๋ค๋ฅธ ํ๋ก์ธ์ค์๊ฒ ์ํฅ์ ๋ฐ์ง ์๋๋ค๊ณ ๋งํ ์ ์๋ค. (์ค๋ ๋๋ ํ๋ก์ธ์ค ์์์ ์์์ ๊ณต์ ํ๋ฏ๋ก ์ํฅ์ ๋ฐ๋๋ค)
์ด๋ฐ ๋ ๋ฆฝ์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ํ๋ก์ธ์ค ๊ฐ์ ํต์ ์ ํด์ผ ํ๋ ์ํฉ์ด ์์ ๊ฒ์ด๋ค. ์ด๋ฅผ ๊ฐ๋ฅํ๋๋ก ํด์ฃผ๋ ๊ฒ์ด ๋ฐ๋ก IPC ํต์ ์ด๋ค.
ํ๋ก์ธ์ค๋ ์ปค๋์ด ์ ๊ณตํ๋ IPC ์ค๋น๋ฅผ ์ด์ฉํด ํ๋ก์ธ์ค๊ฐ ํต์ ์ ํ ์ ์๊ฒ ๋๋ค.
์ปค๋์ด๋?
์ด์์ฒด์ ์ ํต์ฌ์ ์ธ ๋ถ๋ถ์ผ๋ก, ๋ค๋ฅธ ๋ชจ๋ ๋ถ๋ถ์ ์ฌ๋ฌ ๊ธฐ๋ณธ์ ์ธ ์๋น์ค๋ฅผ ์ ๊ณตํด์ค
IPC ์ค๋น ์ข ๋ฅ๋ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋ค. ํ์์ ๋ฐ๋ผ IPC ์ค๋น๋ฅผ ์ ํํด์ ์ฌ์ฉํด์ผ ํ๋ค.
IPC ์ข ๋ฅ
์ต๋ช PIPE
ํ์ดํ๋ ๋ ๊ฐ์ ํ๋ก์ธ์ค๋ฅผ ์ฐ๊ฒฐํ๋๋ฐ ํ๋์ ํ๋ก์ธ์ค๋ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ธฐ๋ง ํ๊ณ , ๋ค๋ฅธ ํ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ๋ง ํ ์ ์๋ค.
ํ์ชฝ ๋ฐฉํฅ์ผ๋ก๋ง ํต์ ์ด ๊ฐ๋ฅํ ๋ฐ์ด์ค ํต์ ์ด๋ผ๊ณ ๋ ๋ถ๋ฅธ๋ค.
๋ฐ๋ผ์ ์์ชฝ์ผ๋ก ๋ชจ๋ ์ก/์์ ์ ํ๊ณ ์ถ์ผ๋ฉด 2๊ฐ์ ํ์ดํ๋ฅผ ๋ง๋ค์ด์ผ ํ๋ค.
๋งค์ฐ ๊ฐ๋จํ๊ฒ ์ฌ์ฉํ ์ ์๋ ์ฅ์ ์ด ์๊ณ , ๋จ์ํ ๋ฐ์ดํฐ ํ๋ฆ์ ๊ฐ์ง ๋ ํ์ดํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์จ์ ์ด๋ค. ๋จ์ ์ผ๋ก๋ ์ ์ด์ค ํต์ ์ ์ํด 2๊ฐ๋ฅผ ๋ง๋ค์ด์ผ ํ ๋๋ ๊ตฌํ์ด ๋ณต์กํด์ง๊ฒ ๋๋ค.
Named PIPE(FIFO)
์ต๋ช ํ์ดํ๋ ํต์ ํ ํ๋ก์ธ์ค๋ฅผ ๋ช ํํ ์ ์ ์๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค. (๋ถ๋ชจ-์์ ํ๋ก์ธ์ค ๊ฐ ํต์ ์ฒ๋ผ)
Named ํ์ดํ๋ ์ ํ ๋ชจ๋ฅด๋ ์ํ์ ํ๋ก์ธ์ค๋ค ์ฌ์ด ํต์ ์ ์ฌ์ฉํ๋ค.
์ฆ, ์ต๋ช ํ์ดํ์ ํ์ฅ๋ ์ํ๋ก ๋ถ๋ชจ ํ๋ก์ธ์ค์ ๋ฌด๊ดํ ๋ค๋ฅธ ํ๋ก์ธ์ค๋ ํต์ ์ด ๊ฐ๋ฅํ ๊ฒ (ํต์ ์ ์ํด ์ด๋ฆ์๋ ํ์ผ์ ์ฌ์ฉ)
ํ์ง๋ง, Named ํ์ดํ ์ญ์ ์ฝ๊ธฐ/์ฐ๊ธฐ ๋์์ ๋ถ๊ฐ๋ฅํจ. ๋ฐ๋ผ์ ์ ์ด์ค ํต์ ์ ์ํด์๋ ์ต๋ช ํ์ดํ์ฒ๋ผ 2๊ฐ๋ฅผ ๋ง๋ค์ด์ผ ๊ฐ๋ฅ
Message Queue
์ ์ถ๋ ฅ ๋ฐฉ์์ Named ํ์ดํ์ ๋์ผํจ
๋ค๋ฅธ์ ์ ๋ฉ์์ง ํ๋ ํ์ดํ์ฒ๋ผ ๋ฐ์ดํฐ์ ํ๋ฆ์ด ์๋๋ผ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด๋ค.
์ฌ์ฉํ ๋ฐ์ดํฐ์ ๋ฒํธ๋ฅผ ๋ถ์ด๋ฉด์ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๋์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ๋ค๋ฃฐ ์ ์๋ค.
๊ณต์ ๋ฉ๋ชจ๋ฆฌ
ํ์ดํ, ๋ฉ์์ง ํ๊ฐ ํต์ ์ ์ด์ฉํ ์ค๋น๋ผ๋ฉด, ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ฐ์ดํฐ ์์ฒด๋ฅผ ๊ณต์ ํ๋๋ก ์ง์ํ๋ ์ค๋น๋ค.
ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ์ง๋ฉฐ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์ ๊ทผํ์ง ๋ชปํ๋๋ก ๋ฐ๋์ ๋ณดํธ๋ผ์ผํ๋ค. ํ์ง๋ง ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋๋ก ํด์ผํ๋ ์ํฉ๋ ํ์ํ ๊ฒ์ด๋ค. ํ์ดํ๋ฅผ ์ด์ฉํด ํต์ ์ ํตํด ๋ฐ์ดํฐ ์ ๋ฌ๋ ๊ฐ๋ฅํ์ง๋ง, ์ค๋ ๋์ฒ๋ผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๋๋ก ํด์ค๋ค๋ฉด ๋์ฑ ํธํ ๊ฒ์ด๋ค.
๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ ํ๋ก์ธ์ค๊ฐ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ณต์ ํด์ ์ฌ์ฉํ ์ ์๋๋ก ํ์ฉํด์ค๋ค.
ํ๋ก์ธ์ค๊ฐ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ปค๋์ ์์ฒญํ๋ฉด, ์ปค๋์ ํด๋น ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํ ๋นํด์ฃผ๊ณ ์ดํ ๋ชจ๋ ํ๋ก์ธ์ค๋ ํด๋น ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ๊ทผํ ์ ์๊ฒ ๋๋ค.
- ์ค๊ฐ์ ์์ด ๊ณง๋ฐ๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ ์ ์์ด์ IPC ์ค์ ๊ฐ์ฅ ๋น ๋ฅด๊ฒ ์๋ํจ
๋ฉ๋ชจ๋ฆฌ ๋งต
๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ฒ๋ผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํด์ค๋ค. ๋ฉ๋ชจ๋ฆฌ ๋งต์ ์ด๋ฆฐ ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ์ ๋งตํ์์ผ์ ๊ณต์ ํ๋ ๋ฐฉ์์ด๋ค. (์ฆ ๊ณต์ ๋งค๊ฐ์ฒด๊ฐ ํ์ผ+๋ฉ๋ชจ๋ฆฌ)
์ฃผ๋ก ํ์ผ๋ก ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํด์ผ ํ ๋ ์ฌ์ฉํ๋ค.
์์ผ
๋คํธ์ํฌ ์์ผ ํต์ ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ค.
ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์์ผ์ ํตํด์ ํต์ ํ๋ ๊ตฌ์กฐ๋ก, ์๊ฒฉ์์ ํ๋ก์ธ์ค ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ๋ ์ฌ์ฉํ๋ค.
์๋ฒ(bind, listen, accept), ํด๋ผ์ด์ธํธ(connect)
์ด๋ฌํ IPC ํต์ ์์ ํ๋ก์ธ์ค ๊ฐ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํํ๊ณ ๋ณดํธํ๊ธฐ ์ํด ์ธ๋งํฌ์ด์ ๋ฎคํ ์ค๋ฅผ ์ฌ์ฉํ๋ค. (๊ณต์ ๋ ์์์ ํ๋ฒ์ ํ๋์ ํ๋ก์ธ์ค๋ง ์ ๊ทผ์ํฌ ๋)