IPC(Inter-Process Communication) ์ด๋?
ํ๋ก์ธ์ค ๊ฐ ํต์ (Inter-Process Communication, IPC)์ ๋ค๋ฅธ ํ๋ก์ธ์ค ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ฑฐ๋ ์ํธ์์ฉํ๊ธฐ ์ํ ๋ฉ์ปค๋์ฆ์ ๋งํฉ๋๋ค. ๋ค์ํ IPC ๊ธฐ๋ฒ์ด ์กด์ฌํ๋ฉฐ, ๊ฐ๊ฐ์ ๊ธฐ๋ฒ์ ๋ค๋ฅธ ์ํฉ์ด๋ ์๊ตฌ์ ๋ง๊ฒ ์ ํ๋์ด ์ฌ์ฉ๋ฉ๋๋ค. ๋ฉํฐ์ค๋ ๋์ ํจ๊ป ๋ฉํฐ ํ๋ก์ธ์ค์ ๋ฐ์ดํฐ ์ ์ก ๊ธฐ์ ์ ๋๋ค.
๋ค์์ ๋ํ์ ์ธ IPC ๋ฐฉ๋ฒ์
๋๋ค.
1. ํ์ดํ(Pipes): ํ์ดํ๋ ํ ํ๋ก์ธ์ค๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฐ๊ณ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ๊ทธ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์๋ ๋จ๋ฐฉํฅ ํต์ ๋ฉ์ปค๋์ฆ์
๋๋ค. ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์์ ํ๋ก์ธ์ค ์ฌ์ด์์ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
2. ๋ช
๋ช
๋ ํ์ดํ(Named Pipes): ๋ช
๋ช
๋ ํ์ดํ๋ ํ์ผ ์์คํ
๋ด์ ํน๋ณํ ํ์ผ๋ก ์์ฑ๋๋ฉฐ, ๋ค๋ฅธ ํ๋ก์ธ์ค ๊ฐ์ ์๋ฐฉํฅ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๋์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
3. ๋ฉ์์ง ํ(Message Queues): ๋ฉ์์ง ํ๋ ํ๋ก์ธ์ค ์ฌ์ด์ ๋ฉ์์ง๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์ ๋ฌํ๋ ๊ธฐ๋ฒ์
๋๋ค. ๋ฉ์์ง ํ๋ ์ด์์ฒด์ ์์ ์ ๊ณตํ๋ ํต์ ๋งค์ฒด๋ก, ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ ๋ฐ๋ ์์๋๋ก ๋ฉ์์ง๊ฐ ์ฒ๋ฆฌ๋ฉ๋๋ค.
4. ๊ณต์ ๋ฉ๋ชจ๋ฆฌ(Shared Memory): ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ณต์ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ฝ๊ณ ์ธ ์ ์๋ ๊ธฐ๋ฒ์
๋๋ค. ์ด๋ ๋น ๋ฅธ ๋ฐ์ดํฐ ๊ตํ์ ๊ฐ๋ฅํ๊ฒ ํ์ง๋ง ๋๊ธฐํ์ ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ ์ฃผ์ํด์ผ ํฉ๋๋ค.
5. ์์ผ(Sockets): ์์ผ์ ๋คํธ์ํฌ๋ฅผ ํตํ ํ๋ก์ธ์ค ๊ฐ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ๊ธฐ์ ์
๋๋ค. ์์ผ์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ปดํจํฐ ๋๋ ๊ฐ์ ์ปดํจํฐ์ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ๋ฐ์ดํฐ๋ฅผ ๊ตํํ ์ ์์ต๋๋ค.
6. RPC(Remote Procedure Call): RPC๋ ์๊ฒฉ ํ๋ก์์ ํธ์ถ์ ํตํด ๋ค๋ฅธ ์ปดํจํฐ๋ ํ๋ก์ธ์ค์์ ํจ์๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ ์๋ ๊ธฐ๋ฒ์
๋๋ค. ๋ง์น ๋ก์ปฌ ํจ์ ํธ์ถ์ฒ๋ผ ์๊ฒฉ์์ ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
7. ํ์ผ(Files): ํ์ผ์ ์ฌ์ฉํ์ฌ ํ๋ก์ธ์ค ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๊ฑฐ๋ ํต์ ํ๋ ๋ฐฉ๋ฒ๋ ์์ต๋๋ค. ํ์ผ์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ธ ์ ์์ผ๋ฉฐ, ํ์ผ ๋ฝ(ํ์ผ ์ ๊ธ)์ ์ฌ์ฉํ์ฌ ๋๊ธฐํ๋ฅผ ํ ์๋ ์์ต๋๋ค.
ํ์ดํ(Pipe)
ํ์ดํ(Pipe) ํต์ ์ ํ๋ก์ธ์ค ๊ฐ์ ๋จ๋ฐฉํฅ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ IPC(Inter-Process Communication) ๋ฉ์ปค๋์ฆ ์ค ํ๋์
๋๋ค. ์ด๋ ์ด์์ฒด์ ์์ ์ ๊ณตํ๋ ํน๋ณํ ํ์ผ ๊ธฐ๋ฐ์ ํต์ ๋ฐฉ๋ฒ์ผ๋ก, ์ฃผ๋ก ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์์ ํ๋ก์ธ์ค ๊ฐ์ ํต์ ์ ์ฌ์ฉ๋ฉ๋๋ค. ํ์ดํ๋ ๋ฐ์ดํฐ์ ํ๋ฆ์ด ์ผ๋ฐฉํฅ์ ์ด๊ธฐ ๋๋ฌธ์ ๋จ์ผ ๋ฐฉํฅ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
ํ์ดํ ํต์ ์ ์ฃผ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1. ๋จ๋ฐฉํฅ ํต์ : ํ์ดํ๋ ๋จ๋ฐฉํฅ ํต์ ๋ฉ์ปค๋์ฆ์ด๋ฏ๋ก ๋ฐ์ดํฐ์ ํ๋ฆ์ ํ ๋ฐฉํฅ์ผ๋ก๋ง ๊ฐ๋ฅํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ์ชฝ๊ณผ ๋ฐ๋ ์ชฝ์ด ๋ถ๋ฆฌ๋์ด ์์ต๋๋ค.
2. ๋ถ๋ชจ-์์ ํ๋ก์ธ์ค ๊ฐ ํต์ : ์ฃผ๋ก ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์์ ํ๋ก์ธ์ค ์ฌ์ด์์ ์ฌ์ฉ๋ฉ๋๋ค. ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ํ์ดํ๋ฅผ ์์ฑํ๊ณ , ์์ ํ๋ก์ธ์ค์์ ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋ ์ธ ์ ์์ต๋๋ค.
3. ํ์ผ ๊ธฐ๋ฐ ํต์ : ํ์ดํ๋ ํ์ผ์ฒ๋ผ ์ทจ๊ธ๋๊ธฐ ๋๋ฌธ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ(File Descriptor)๋ฅผ ํตํด ์ด๊ณ ๋ซ์ ์ ์์ต๋๋ค. ํ์ดํ์ ์ฝ๊ธฐ ์ธก๊ณผ ์ฐ๊ธฐ ์ธก ๊ฐ๊ฐ์ ๋ํ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ํ์ํฉ๋๋ค.
4. ๋จ์ํ ๋ฐ์ดํฐ ์ ๋ฌ: ํ์ดํ๋ ๋จ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ธฐ ์ํ ์ฉ๋๋ก ์ฌ์ฉ๋๋ฉฐ, ๋ณต์กํ ๊ตฌ์กฐ์ ๋ฐ์ดํฐ ์ ์ก์ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
ํ์ดํ ํต์ ์ ๋ค์๊ณผ ๊ฐ์ ๋จ๊ณ๋ก ์ด๋ฃจ์ด์ง๋๋ค:
1. ํ์ดํ ์์ฑ: ๋ถ๋ชจ ํ๋ก์ธ์ค๋ ์ด์์ฒด์ ์๊ฒ ํ์ดํ๋ฅผ ์์ฑํ๋๋ก ์์ฒญํฉ๋๋ค.
2. ๋ฐ์ดํฐ ์ฐ๊ธฐ: ๋ถ๋ชจ ํ๋ก์ธ์ค๋ ์์ฑ๋ ํ์ดํ์ ์ฐ๊ธฐ ์ธก ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ธ ์ ์์ต๋๋ค.
3. ๋ฐ์ดํฐ ์ฝ๊ธฐ: ์์ ํ๋ก์ธ์ค๋ ์์ฑ๋ ํ์ดํ์ ์ฝ๊ธฐ ์ธก ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ถ๋ชจ ํ๋ก์ธ์ค๊ฐ ๋ณด๋ธ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค.
import os
def parent_child_communication():
# ํ์ดํ ์์ฑ
parent_pipe, child_pipe = os.pipe()
# ์์ ํ๋ก์ธ์ค ์์ฑ
pid = os.fork()
if pid == 0: # ์์ ํ๋ก์ธ์ค
os.close(parent_pipe) # ์์์ ์ฐ๊ธฐ ์ธก ๋ซ์
child_message = "Hello from child!"
os.write(child_pipe, child_message.encode()) # ์์์ด ํ์ดํ๋ฅผ ํตํด ๋ฐ์ดํฐ ์ ์ก
os.close(child_pipe)
else: # ๋ถ๋ชจ ํ๋ก์ธ์ค
os.close(child_pipe) # ๋ถ๋ชจ๋ ์ฝ๊ธฐ ์ธก ๋ซ์
parent_message = os.read(parent_pipe, 1024).decode() # ๋ถ๋ชจ๊ฐ ํ์ดํ๋ฅผ ํตํด ๋ฐ์ดํฐ ์์
print("Parent received:", parent_message)
os.close(parent_pipe)
parent_child_communication()
์ ์์ ๋ ํ์ด์ฌ์ผ๋ก ๋ถ๋ชจ ํ๋ก์ธ์ค์ ์์ ํ๋ก์ธ์ค ์ฌ์ด์์ ํ์ดํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋จํ ๋ฌธ์์ด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. os.pipe() ํจ์๋ก ํ์ดํ๋ฅผ ์์ฑํ๊ณ , os.fork() ํจ์๋ก ์์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํฉ๋๋ค. ์์ ํ๋ก์ธ์ค๋ ํ์ดํ์ ์ฐ๊ธฐ ์ธก์ ๋ซ์ ๋ค ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ณ , ๋ถ๋ชจ ํ๋ก์ธ์ค๋ ํ์ดํ์ ์ฝ๊ธฐ ์ธก์ ๋ซ์ ๋ค ๋ฐ์ดํฐ๋ฅผ ์์ ํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ Named Pipe๋ Pipe์ ๋จ์ ์ ํด๊ฒฐํ, Pipe์ ํ์ฅ์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค. Pipe๊ฐ ์ด๋ฆ์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ์ด๋ฆ๋ง ์๋ฉด ์๋ฐฉํฅ ํต์ ์ด ๊ฐ๋ฅํฉ๋๋ค. ๋ค๋ง ์ฝ๊ธฐ/์ฐ๊ธฐ๊ฐ ๋์์ ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ํ์ชฝ์์๋ Read only, ํ์ชฝ์์๋ Write only๋ง ๊ฐ๋ฅํฉ๋๋ค.
ํ์ดํ ํต์ ์ ๋จ์ํ ๋ฐ์ดํฐ ์ ๋ฌ์ ์ํ ๊ฐ๋จํ ๋ฉ์ปค๋์ฆ์ด๋ฉฐ, ์ฌ๋ฌ ํ๋ก์ธ์ค ๊ฐ์ ๋ณต์กํ ํต์ ์ ์ํด์๋ ๋ค๋ฅธ IPC ๊ธฐ๋ฒ๋ค์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ์ ํฉํ ์ ์์ต๋๋ค.
๋ฉ์ธ์ง ํ(Message Queue)
๋ฉ์์ง ํ๋ ํ๋ก์ธ์ค๊ฐ ๋ฉ์์ง๋ฅผ ์์ฑํ๊ณ ์ ์กํ์ฌ ๋ค๋ฅธ ํ๋ก์ธ์ค๊ฐ ์ด๋ฅผ ์์ ํ๋ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ๋ฉ์์ง ํ๋ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ฏ๋ก, ๋ฐ์ดํฐ๋ฅผ ์์ฐํ๋ ํ๋ก์ธ์ค์ ๋ฐ์ดํฐ๋ฅผ ์๋นํ๋ ํ๋ก์ธ์ค๊ฐ ์ค์๊ฐ์ผ๋ก ๋์ํ์ง ์์๋ ๋๋ ์ํฉ์์ ์ ์ฉํฉ๋๋ค.(ํ์ดํ์ ์ ์ฌ) ์์ฝํ๋ฉด ๋น๋๊ธฐ ๋จ ๋ฐฉํฅ ๋ฉ์ธ์ง ๋ฐฉ์์ IPC๋ผ๊ณ ๋ณด๋ฉด ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ฉ์์ง ํ์ ์ฃผ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ๋น๋๊ธฐ ํต์ : ๋ฉ์์ง ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋น๋๊ธฐ์ ์ผ๋ก ์ ๋ฌํฉ๋๋ค. ๋ฉ์์ง๋ฅผ ์์ฑํ๋ ํ๋ก์ธ์ค์ ์์ ํ๋ ํ๋ก์ธ์ค๊ฐ ์ค์๊ฐ์ผ๋ก ๋์ํ์ง ์์๋ ๋ฉ๋๋ค. ๋ฐ๋ผ์ Producer-Consumer ํจํด์ ๋ฉํฐ ํ๋ก์ธ์ค๋ก ํ์ฉํ ๋ ๋ฉ์ธ์ง ํ๋ฅผ ํ์ฉํฉ๋๋ค. ๋ฐ์ดํฐ๋ฅผ Producer๊ฐ Queue์ ๋ฃ๊ณ ์ฌ๋ฌ ๊ฐ์ Consumer processes๊ฐ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์
๋๋ค.
2. ๋ฉ์์ง ์งํฅ: ๋ฉ์์ง ํ๋ ๋ฉ์์ง ๋จ์๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํฉ๋๋ค. ๊ฐ ๋ฉ์์ง๋ ๋ฐ์ดํฐ์ ํจ๊ป ๋ฉ์์ง ์๋ณ์๋ฅผ ํฌํจํ๋ฉฐ, ์ด๋ฅผ ํตํด ํ๋ก์ธ์ค ๊ฐ์ ํน์ ํ์์ ๋ฉ์์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์ต๋๋ค.
3. ๋ฒํผ๋ง: ๋ฉ์์ง ํ๋ ๋ด๋ถ์ ์ผ๋ก ๋ฒํผ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์์ง๋ฅผ ์ ์ฅํ๊ณ ์ ๋ฌํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฉ์์ง ์๋น์๊ฐ ๋ฉ์์ง๋ฅผ ์ฆ์ ์ฒ๋ฆฌํ์ง ์๋๋ผ๋ ๋ฐ์ดํฐ์ ์ ์ค์ด๋ ์ง์ฐ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
4. ์ฐ์ ์์: ์ผ๋ถ ๋ฉ์์ง ํ ์์คํ
์ ๋ฉ์์ง์ ์ฐ์ ์์๋ฅผ ๋ถ์ฌํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ค์ํ ๋ฉ์์ง๋ฅผ ๋จผ์ ์ฒ๋ฆฌํ๋๋ก ์กฐ์ ํ ์ ์์ต๋๋ค.
์๋๋ ํ์ด์ฌ์ multiprocessing ๋ชจ๋์ ์ฌ์ฉํ ๋ฉ์์ง ํ ์์ ์
๋๋ค.
from multiprocessing import Process, Queue
def producer(queue):
for i in range(5):
message = f"Message {i}"
queue.put(message)
print(f"Produced: {message}")
def consumer(queue):
while True:
message = queue.get()
if message == 'STOP':
break
print(f"Consumed: {message}")
if __name__ == "__main__":
message_queue = Queue()
producer_process = Process(target=producer, args=(message_queue,))
consumer_process = Process(target=consumer, args=(message_queue,))
producer_process.start()
consumer_process.start()
producer_process.join()
message_queue.put('STOP') # ์ข
๋ฃ๋ฅผ ์ํ ํน๋ณํ ๋ฉ์์ง ์ ์ก
consumer_process.join()
์ด ์์ ์์๋ ๋ ๊ฐ์ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ์ฌ ๋ฉ์์ง ํ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํฉ๋๋ค. Queue ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ์์ง ํ๋ฅผ ์์ฑํ๊ณ , ํ๋ก๋์ ํ๋ก์ธ์ค๋ ๋ฉ์์ง๋ฅผ ์์ฑํ๊ณ ํ์ ๋ฃ๊ณ , ์ปจ์๋จธ ํ๋ก์ธ์ค๋ ํ์์ ๋ฉ์์ง๋ฅผ ๊บผ๋ด ์๋นํฉ๋๋ค. ์ข
๋ฃ๋ฅผ ์ํด ํน๋ณํ ๋ฉ์์ง STOP์ ์ ๋ฌํ์ฌ ์ปจ์๋จธ ํ๋ก์ธ์ค๋ฅผ ์ข
๋ฃํฉ๋๋ค.
๊ณต์ ๋ฉ๋ชจ๋ฆฌ(Shared Memory)
๊ณต์ ๋ฉ๋ชจ๋ฆฌ(Shared Memory)๋ ๋ค๋ฅธ ํ๋ก์ธ์ค ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ณต์ ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ง์ ์ฃผ๊ณ ๋ฐ๋ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์ด๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๊ฑฐ๋ ์ค๊ฐ ๋งค๊ฐ์ฒด๋ฅผ ๊ฑฐ์น์ง ์๊ณ ๋น ๋ฅด๊ฒ ํต์ ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋๊ธฐํ์ ๊ด๋ จ๋ ๋ฌธ์ ์ ์ ์ํด์ผ ํฉ๋๋ค.
๊ณต์ ๋ฉ๋ชจ๋ฆฌ IPC์ ์ฃผ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1. ๋น ๋ฅธ ๋ฐ์ดํฐ ์ ์ก: ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋ณต์ฌํ์ง ์๊ณ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ์ ์ก ์๋๊ฐ ๋น ๋ฆ
๋๋ค.
2. ๊ฐ๋จํ ๊ตฌํ: ์ผ๋ฐ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๋งตํ(Memory Mapping) ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๊ตฌํ๋๋ฉฐ, ํ๋ก์ธ์ค ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ๊ณ ์ ๊ทผํ๋ ๊ฒ์ด ๋น๊ต์ ๊ฐ๋จํฉ๋๋ค.
3. ๋๊ธฐํ ํ์: ์ฌ๋ฌ ํ๋ก์ธ์ค๊ฐ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์์ ์ ๊ทผํ ๋ ๋๊ธฐํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ธ๋งํฌ์ด, ๋ฎคํ
์ค ๋ฑ์ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์๋๋ ํ์ด์ฌ์ multiprocessing ๋ชจ๋์ ์ฌ์ฉํ์ฌ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํตํ ๋ฐ์ดํฐ ๊ตํ ์์ ์
๋๋ค:
from multiprocessing import Process, Value, Array
def writer(value, arr):
value.value = 10
for i in range(len(arr)):
arr[i] = i * 2
def reader(value, arr):
print("Value:", value.value)
print("Array:", arr[:])
if __name__ == "__main__":
shared_value = Value('i', 0) # ์ ์ํ ๊ณต์ ๋ณ์
shared_array = Array('i', range(10)) # ์ ์ํ ๋ฐฐ์ด
writer_process = Process(target=writer, args=(shared_value, shared_array))
reader_process = Process(target=reader, args=(shared_value, shared_array))
writer_process.start()
writer_process.join()
reader_process.start()
reader_process.join()
์ด ์์ ์์๋ ๊ณต์ ๋ณ์(Value)์ ๊ณต์ ๋ฐฐ์ด(Array)์ ์ฌ์ฉํ์ฌ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ง๋ญ๋๋ค. ํ๋ก๋์ ํ๋ก์ธ์ค(writer)๋ ๊ณต์ ๋ณ์์ ๋ฐฐ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ , ์ปจ์๋จธ ํ๋ก์ธ์ค(reader)๋ ๊ณต์ ๋ณ์์ ๋ฐฐ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ต๋๋ค. ๋ฐ์ดํฐ๊ฐ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํตํด ์ง์ ์ฃผ๊ณ ๋ฐ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์์ผ(Socket)
์์ผ(Socket) ํต์ ์ ๋คํธ์ํฌ๋ฅผ ํตํด ํ๋ก์ธ์ค ๊ฐ ํต์ ์ ๊ฐ๋ฅํ๊ฒ ํ๋ IPC(Inter-Process Communication)์ ํ ํํ์ ๋๋ค. ์์ผ์ ์ฌ์ฉํ๋ฉด ๋ค๋ฅธ ์ปดํจํฐ๋ ๊ฐ์ ์ปดํจํฐ์ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์ต๋๋ค. ์์ผ์ ์ด์ฉํ ํต์ ์ ํด๋ผ์ด์ธํธ-์๋ฒ ๋ชจ๋ธ๋ก ์๋ํ๋ฉฐ, ๋คํธ์ํฌ ์์์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ณ ์์ ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์์ผ ํต์ ์ ํน์ง์
๋๋ค.
1. ๋คํธ์ํฌ ํต์ : ์์ผ์ ๋คํธ์ํฌ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์๋ก ๋ค๋ฅธ ์ปดํจํฐ ๊ฐ์ ํต์ ์ด ๊ฐ๋ฅํฉ๋๋ค.
2. ํด๋ผ์ด์ธํธ-์๋ฒ ๋ชจ๋ธ: ์ผ๋ฐ์ ์ผ๋ก ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ด๊ณ , ์๋ฒ๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
3. ํ๋กํ ์ฝ ์ง์ : ์์ผ ํต์ ์๋ ์ฌ๋ฌ ํ๋กํ ์ฝ(์: TCP, UDP)์ ์ฌ์ฉํ ์ ์์ต๋๋ค. TCP๋ ์ ๋ขฐ์ฑ ์๋ ์ฐ๊ฒฐ ์งํฅ ํต์ ์ ์ ๊ณตํ๋ฉฐ, UDP๋ ๋น์ฐ๊ฒฐ์ฑ ํ๋กํ ์ฝ๋ก ๋ฐ์ดํฐ ์ ์ก ์๋๊ฐ ๋น ๋ฆ
๋๋ค.
4. ๋๊ธฐ ๋ฐ ๋น๋๊ธฐ ํต์ : ์์ผ ํต์ ์ ๋๊ธฐ์ ์ธ ๋ฐฉ์๊ณผ ๋น๋๊ธฐ์ ์ธ ๋ฐฉ์์ ๋ชจ๋ ์ง์ํฉ๋๋ค. ๋๊ธฐ ํต์ ์ ๋ฐ์ดํฐ ์ก์์ ์ด ๋ธ๋กํน๋ ์ ์์ง๋ง, ๋น๋๊ธฐ ํต์ ์ ๋ธ๋กํน๋์ง ์๊ณ ๋์์ ์ฌ๋ฌ ์์
์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
์๋๋ ํ์ด์ฌ์ socket ๋ชจ๋์ ์ฌ์ฉํ์ฌ ํด๋ผ์ด์ธํธ์ ์๋ฒ ๊ฐ์ ์์ผ ํต์ ์์ ์
๋๋ค.
์๋ฒ ์ธก
import socket
def server():
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind(("127.0.0.1", 12345))
server_socket.listen(1)
print("Server is listening...")
conn, addr = server_socket.accept()
print("Connected by", addr)
data = conn.recv(1024).decode()
print("Received:", data)
conn.send("Hello from server!".encode())
conn.close()
server()
ํด๋ผ์ด์ธํธ ์ธก
import socket
def client():
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
client_socket.connect(("127.0.0.1", 12345))
client_socket.send("Hello from client!".encode())
data = client_socket.recv(1024).decode()
print("Received:", data)
client_socket.close()
client()
์ด ์์ ์์ ์๋ฒ๋ socket ๋ชจ๋์ ์ฌ์ฉํ์ฌ ์์ผ์ ์์ฑํ๊ณ ๋ฐ์ธ๋ฉํ ๋ค ํด๋ผ์ด์ธํธ์ ์ฐ๊ฒฐ์ ๊ธฐ๋ค๋ฆฝ๋๋ค. ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ ์ฐ๊ฒฐํ ๋ค ๋ฉ์์ง๋ฅผ ๋ณด๋ด๊ณ ์๋ฒ๋ก๋ถํฐ ์๋ต์ ๋ฐ์ต๋๋ค.
์์ผ ํต์ ์ ๋ค๋ฅธ ์์คํ ๊ฐ ์ ๋ฐฉํฅ ํต์ ์ด ๊ฐ๋ฅํฉ๋๋ค. ํ์ดํ, ๋ฉ์ธ์ง ํ, ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ ๋ชจ๋ ๊ฐ์ ์์คํ (์ปดํจํฐ) ๋ด ๋ค๋ฅธ ํ๋ก์ธ์ค ๋ผ๋ฆฌ์ ํต์ ๋ง ๊ฐ๋ฅํ๋ค๋ฉด, ์์ผ์ ๊ฒฝ์ฐ ๋คํธ์ํฌ๋ฅผ ํ์ฉํ์ฌ ์ธ๋ถ ์์คํ ๊ณผ๋ ํต์ ์ด ๊ฐ๋ฅํฉ๋๋ค. HTTP๋ฅผ ํ์ฉํ ์น ํต์ ๋ํ ์์ผ ํต์ ์ด๋ผ๊ณ ๋ณด๋ฉด ๋ฉ๋๋ค. ๋ค๋ง IPC์์์ ์์ผ ํต์ ์ HTTP์ ๊ตญํ๋์ง ์์ผ๋ฉฐ ๋ค์ํ ํ๋กํ ์ฝ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ์กํฉ๋๋ค.
RPC์ Kafka๋ฑ ์ด์ง ์์ฉ๊ธฐ์ ์ ๋ฐ๋ก ๋ค๋ฃจ๋๋ก ํ๊ฒ ์ต๋๋ค.๐
'์ด์์ฒด์ ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
ํฐ๋ ธ์ด๋ง ๊ตฌ์กฐ๋? (0) | 2023.09.05 |
---|---|
ํ๋ก์ธ์ค ์ ์ด ๋ธ๋ก(PCB, Process Control Block) (0) | 2023.08.30 |
Context Switching(๋ฌธ๋งฅ ๊ตํ) (0) | 2023.08.28 |
OS๊ฐ ๊ด๋ฆฌํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ (0) | 2023.08.27 |
๊ฐ์๋ฉ๋ชจ๋ฆฌ(Virtual Memory)๋ ๋ฌด์์ผ๊น? (0) | 2023.08.23 |
๋๊ธ