์ถ์ฒ: ๊ทธ๋ฆผ์ผ๋ก ๋ฐฐ์ฐ๋ ๋ฆฌ๋ ์ค ๊ตฌ์กฐ
๋น ๋ฅธ ํ๋ก์ธ์ค ์์ฑ ์ฒ๋ฆฌ
fork() ํจ์ ๊ณ ์ํ: ์นดํผ ์จ ๋ผ์ดํธ
fork() ํจ์ ํธ์ถ ์ ๋ถ๋ชจ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์์ ํ๋ก์ธ์ค์ ๋ชจ๋ ๋ณต์ฌํ๋ ๊ฒ์ด ์๋๋ผ ํ์ด์ง ํ ์ด๋ธ๋ง ๋ณต์ฌํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ถ๋ชจ์ ์์ ์์ชฝ ๋ค ํ์ด์ง์ ์ฐ๊ธฐ ๊ถํ์ ๋ฌดํจํํ๋ค.

๋ถ๋ชจ์ ์์ ์ค ์ด๋ ํ์ชฝ์ด ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํ๋ ค๊ณ ํ๋ฉด ํ์ด์ง ๊ณต์ ๋ฅผ ํด์ ํ๊ณ , ํ๋ก์ธ์ค๋ง๋ค ์ ์ฉ ํ์ด์ง๋ฅผ ๋ง๋ ๋ค.
<์์ ํ๋ก์ธ์ค๊ฐ ํ์ด์ง ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํ๋ฉด ์ผ์ด๋๋ ์ผ>


ํ์ด์ง์ ์ฒ์์ผ๋ก ์ฐ๊ธฐ๋ฅผ ํ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๊ธฐ ๋๋ฌธ์ Copy On Write(CoW)
๋ผ๊ณ ๋ถ๋ฅธ๋ค.
โ fork() ํจ์๋ฅผ ํธ์ถํ ์๊ฐ์๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋ถ ๋ณต์ฌํ์ง ์์๋ ๋๋ฏ๋ก ํจ์ ์ฒ๋ฆฌ๊ฐ ๋นจ๋ผ์ง๊ณ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋๋ ์ค์ด๋ ๋ค.
RSS
๊ฐ : ํ์ด์ง ํ
์ด๋ธ ๋ด๋ถ์์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ ํฉ๊ณ
๐กํ๋ก์ธ์ค๊ฐ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ๊ณต์ ํ๋์ง ์ฌ๋ถ๋ฅผ ๋ฐ์ง์ง ์๋๋ค. ๊ทธ๋์ย ps ๋ช ๋ น์ด๋ก ํ์ธํ ๋ชจ๋ ํ๋ก์ธ์ค์ RSS ๊ฐ์ ํฉ์น๋ฉด ์ ์ฒด ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ์ฉ๋์ ๋๋ ๊ฒฝ์ฐ๋ ์๋ค.
execve() ํจ์์ ๊ณ ์ํ : Demand paging
์ค์ ๋ก ์ฌ์ฉ ์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ Demand paging
์ ํ๋ก์ธ์ค์ ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ ๋นํ ๋๋ฟ๋ง ์๋๋ผ exevce()
ํจ์ ํธ์ถ์๋ ์ ์ด์ธ๋ฆฌ๋ ๊ธฐ๋ฅ์ด๋ค.
execve()
ํจ์ ํธ์ถ ์งํ๋ผ๋ฉด ํ๋ก์ธ์ค์ฉ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ ์์ง ํ ๋น๋์ง ์์๋ค.

์ดํ์ ํ๋ก๊ทธ๋จ์ด ์ํธ๋ฆฌ ํฌ์ธํธ์์ ์คํ์ ์์ํ๋ฉด ์ํธ๋ฆฌ ํฌ์ธํธ์ ๋์ํ๋ ํ์ด์ง๊ฐ ์กด์ฌํ์ง ์์ผ๋ฏ๋ก ํ์ด์ง ํดํธ๊ฐ ๋ฐ์ํ๋ค.

ํ์ด์ง ํดํธ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ๋ก ํ๋ก์ธ์ค์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๋ค.
ํ๋ก์ธ์ค ํต์
ํ๋ก์ธ์ค ํต์
: ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๊ธฐ์ํ OS๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ
๊ณต์ ๋ฉ๋ชจ๋ฆฌ


fork()
ํจ์๋ฅผ ํธ์ถํ ์ดํ์ ๋ถ๋ชจ์ ์์ ํ๋ก์ธ์ค๋ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ด๋ค ํ์ชฝ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํ๋๋ผ๋ ๋ค๋ฅธ ์ชฝ ํ๋ก์ธ์ค์ ์๋ ๋ฐ์ดํฐ์๋ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
CoW
๊ธฐ๋ฅ์ผ๋ก ์ฐ๊ธฐ ์์
์ ํ๋ฉด ๋ณ๋์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋๊ธฐ ๋๋ฌธ.
โ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ฐฉ์
์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ํ๋ก์ธ์ค์ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์์ญ ๋งคํ ๊ฐ๋ฅ


shared-memory.py
#!/usr/bin/python3 import os import sys import mmap from sys import byteorder PAGE_SIZE = 4096 data = 1000 print("์์ ํ๋ก์ธ์ค ์์ฑ ์ ๋ฐ์ดํฐ ๊ฐ: {}".format(data)) shared_memory = mmap.mmap(-1, PAGE_SIZE, flags=mmap.MAP_SHARED) shared_memory[0:8] = data.to_bytes(8, byteorder) pid = os.fork() if pid < 0: print("fork()์ ์คํจํ์ต๋๋ค", file=os.stderr) elif pid == 0: data = int.from_bytes(shared_memory[0:8], byteorder) data *= 2 shared_memory[0:8] = data.to_bytes(8, byteorder) sys.exit(0) os.wait() data = int.from_bytes(shared_memory[0:8], byteorder) print("์์ ํ๋ก์ธ์ค ์ข ๋ฃ ํ ๋ฐ์ดํฐ ๊ฐ: {}".format(data))

์๊ทธ๋
POSIX
์๋ SIGUSR1
๊ณผ SIGUSR2
์ฒ๋ผ ํ๋ก๊ทธ๋๋จธ๊ฐ ์์ ๋กญ๊ฒ ์ฉ๋๋ฅผ ์ ํ๋ฉด ๋๋ ์๊ทธ๋์ด ์๋ค.
์ด๋ฐ ์๊ทธ๋์ ํ์ฉํด์ ๋ ํ๋ก์ธ์ค๊ฐ ์๋ก ์๊ทธ๋์ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ ์งํ ์ ๋๋ฅผ ํ์ธํ๋ฉด์ ์ฒ๋ฆฌ๋ฅผ ์งํํ ์ ์๋ค. ๋ค๋ง ์๊ทธ๋์ ์์์ ์ธ ๊ตฌ์กฐ๋ผ ๋ณต์กํ์ง ์์ ๋จ์ํ ์ผ์ ํ ๋๋ง ์ฌ์ฉํ๋ค.
๐กdd ๋ช ๋ น์ด์ SIGUSR1์ ๋ณด๋ด๋ฉด ์ง์ฒ ์ํฉ์ ํ์ํ๋ ์จ์ ๊ธฐ๋ฅ์ด ์๋ค.
ํ์ดํ
ํ๋ก์ธ์ค๋ ํ์ดํ
๋ฅผ ํตํด ํต์ ํ ์ ์๋ค.
ex) bash ๊ฐ์ ์ ์์ | ๋ฌธ์๋ก ํ๋ก๊ทธ๋จ๋ผ๋ฆฌ ์ฒ๋ฆฌ ๊ฒฐ๊ณผ ์ฐ๊ณ
free | awk '(NR==2){print $2}'
์ด์ธ์๋ ์๋ฐฉํฅ ํต์ ๋ ๊ฐ๋ฅํ๊ณ ํ์ผ์ ์ฌ์ฉํด์ ํ๋ก์ธ์ค๋ฅผ ์ฐ๊ฒฐํ๋ ๋ฑ ๋ค์ํ ์ผ์ ํ ์ ์๋ค.
์์ผ
= ๋ ํ๋ก๊ทธ๋จ(ํ๋ก์ธ์ค)์ด ํต์ ํ๊ธฐ ์ํ ๊ฐ์ฒด.
ํด๋ผ์ด์ธํธ, ์๋ฒ ์์ผ์ด ์๋ค. ํ๋ก์ธ์ค๊ฐ InputStream, OutputStream ์ฐ๊ฒฐํ๋ ๊ฒ
- ์ ๋์ค ๋๋ฉ์ธ ์์ผ : ๊ฐ์ ๊ธฐ๊ธฐ์ ์๋ ํ๋ก์ธ์ค ์ฌ์ด์์๋ง ํต์ ํ๋ ๋ฐฉ๋ฒ
- TCP ์์ผ, UDP ์์ผ : ์ธํฐ๋ท์์ ์ฌ์ฉ. ๋ค๋ฅธ ๊ธฐ๊ธฐ์ ์๋ ํ๋ก์ธ์ค ์ฌ์ด์์๋ ํต์ ์ด ๊ฐ๋ฅํ๋ค.(1๋ณด๋ค๋ ๋๋ฆผ)

๋ฐฐํ์ ์ ์ด
๋ฐฐํ์ ์ ์ด : ์์์ ํ ๋ฒ์ ํ๋์ ์ฒ๋ฆฌ๋ง ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ฒ
(๊ทธ๋ฅ ๋ฐฐํ๋ฝ, ์ฐ๊ธฐ๋ฝ)
<์ํธ ๋ฐฐ์ >
- ํฌ๋ฆฌํฐ์ปฌ ์น์ (์๊ณ ๊ตฌ์ญ) : ๋์์ ์คํ๋๋ฉด ์ ๋๋ ์ฒ๋ฆฌ ํ๋ฆ โ ๊ฑ ์๊ณ ์์ญ
- ์ํ ๋ฏน ์ฒ๋ฆฌ : ํ๋์ ์ฒ๋ฆฌ๋ก ๋ค๋ฃจ์ด์ผ ํ๋ ์ฒ๋ฆฌ ํ๋ฆ
File lock์ ํตํด ์ํ ๋ฏน ์ฒ๋ฆฌํ ์ ์์.
: flock()์ด๋ fcntl() ์์คํ ์ฝ์ ์ฌ์ฉํด ํ์ผ์ lock/unlock ์ํ๋ฅผ ๋ณ๊ฒฝํ๋ค.
๋๊ณ ๋๋ ๋ฐฐํ์ ์ ์ด
File lock์ ๊ธฐ๊ณ์ด๋ก ๊ตฌํํ๋ค.(C์ธ์ด ๊ฐ์ ๊ณ ๊ธ ์ธ์ด๋ก ใดใด)
lock
= 1
unlock
= 0
start:
load r0 mem // mem ์ฃผ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฝ์ด์ ๋ ์ง์คํฐ์ ์ ์ฅ.
test r0 // r0์ด 0์ธ์ง ํ์ธ
jmpz enter // r0์ด 0์ด๋ฉด enter ๋ ์ด๋ธ๋ก ์ ํ
jmp start // r0์ด 0์ด ์๋๋ผ๋ฉด start ๋ ์ด๋ธ๋ก ๋์๊ฐ
enter:
store mem 1 // mem์ 1์ ์ฐ๊ธฐ. ์ด๋ lock ์ํ๊ฐ ๋จ
...
<ํฌ๋ฆฌํฐ์ปฌ ์น์
>
...
store mem 0
๊ฐ์ ๋ค๋ฅธ ์ฒ๋ฆฌ์์ 1์ ๋์์ ์คํ ์ ๋ ๋ค ํฌ๋ฆฌํฐ์ปฌ ์น์ ์ ๋ค์ด๊ฐ๋ ๋๋ค๊ธฐ ํ๋จํ๊ธฐ ๋๋ฌธ์ ์์ ์ฝ๋๋ ๋ฌธ์ ๊ฐ ์๋ค.
1-5๋ฅผ ์ํ ๋ฏน ์ฒ๋ฆฌํด์ผ ํจ.
โ p.164 ์ฐธ๊ณ
๋ฉํฐ ํ๋ก์ธ์ค์ ๋ฉํฐ ์ค๋ ๋
๋ฉํฐ ํ๋ก์ธ์ค
: fork()๋ execve()๋ฅผ ์ด์ฉํด ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๊ณ ํต์ ๊ธฐ๋ฅ์ ์ฌ์ฉํด์ ์ฒ๋ฆฌ
๋ฉํฐ ์ค๋ ๋
: ํ๋ก์ธ์ค ๋ด๋ถ์ ์ฌ๋ฌ ๊ฐ์ ํ๋ฆ์ ์์ฑ

<๋ฉํฐ ์ค๋ ๋์ ์ฅ์ >
- ํ์ด์ง ํ ์ด๋ธ ๋ณต์ฌ๊ฐ ํ์ ์์ด์ ์์ฑ ์๊ฐ์ด ์งง๋ค.
- ๋ค์ํ ์์์ ๋์ผํ ํ๋ก์ธ์ค ๋ด๋ถ์ ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋น๋กฏํ ์์ ์๋น๋์ด ์ ๋ค.
- ๋ชจ๋ ์ค๋ ๋๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๋ฏ๋ก ํ์กฐํด์ ๋์ํ๊ธฐ ์ฝ๋ค.
<๋ฉํฐ ์ค๋ ๋ ๋จ์ >

Column) ์ปค๋ ์ค๋ ๋์ ์ฌ์ฉ์ ์ค๋ ๋
: ps -eLF
์ฑ ๋ณด๊ธฐ
Uploaded by N2T