๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์šด์˜์ฒด์ œ

IPC(Inter-Process Communication, ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ )

by ์„œ์•„๋ž‘๐Ÿ˜ 2023. 8. 29.

 

 

 

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)์˜ ํ•œ ํ˜•ํƒœ์ž…๋‹ˆ๋‹ค. ์†Œ์ผ“์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ๋‚˜ ๊ฐ™์€ ์ปดํ“จํ„ฐ์˜ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†Œ์ผ“์„ ์ด์šฉํ•œ ํ†ต์‹ ์€ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๋ชจ๋ธ๋กœ ์ž‘๋™ํ•˜๋ฉฐ, ๋„คํŠธ์›Œํฌ ์ƒ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ณ  ์ˆ˜์‹ ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

 

์ถœ์ฒ˜: https://12bme.tistory.com/228

 


์†Œ์ผ“ ํ†ต์‹ ์˜ ํŠน์ง•์ž…๋‹ˆ๋‹ค.

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๋“ฑ ์‚ด์ง ์‘์šฉ๊ธฐ์ˆ ์€ ๋”ฐ๋กœ ๋‹ค๋ฃจ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.๐Ÿ˜Š

 

 

๋Œ“๊ธ€