๐Ÿง  ํ”„๋กœ์„ธ์Šค ๊ด€๋ฆฌ ์‘์šฉํŽธ: ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ™œ์šฉํ•œ ๊ณ ์† ํ”„๋กœ์„ธ์Šค์™€ ํ†ต์‹ ์˜ ๊ธฐ์ˆ 

GoldenDuskยท2025๋…„ 4์›” 15์ผ
2

Linux

๋ชฉ๋ก ๋ณด๊ธฐ
4/4
post-thumbnail

๐Ÿง  ์นดํ”ผ ์˜จ ๋ผ์ดํŠธ(Copy-on-Write): ์ง„์งœ ๋ณต์‚ฌ๋Š” ๋‚˜์ค‘์—!

1) fork()์˜ ์˜คํ•ด์™€ ์ง„์‹ค

๐Ÿ“Œ ๊ธฐ๋ณธ ๋™์ž‘

๋ฆฌ๋ˆ…์Šค์—์„œ fork() ํ•จ์ˆ˜๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ •๋ง๋กœ "๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ"๋ฅผ ๋ณต์‚ฌํ• ๊นŒ์š”?

โŒ ์•„๋‹ˆ์š”! fork()๋Š” ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฐ”๋กœ ๋ณต์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
โœ… ๋Œ€์‹ , ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”๋งŒ ๋ณต์‚ฌํ•˜๊ณ , ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋Š” ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

๋ฆฌ๋ˆ…์Šค์—์„œ fork() ํ•จ์ˆ˜๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณต์ œํ•˜์—ฌ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ๊นŒ์ง€ ์ „๋ถ€ ๋ณต์‚ฌํ•˜๋ฉด ๋„ˆ๋ฌด ๋А๋ฆฌ๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„๊ฒ ์ฃ ? ๊ทธ๋ž˜์„œ ๋ฆฌ๋ˆ…์Šค๋Š” ์นดํ”ผ ์˜จ ๋ผ์ดํŠธ(Copy-on-Write, CoW) ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿงฉ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”๋งŒ ๋ณต์‚ฌ๋œ ์ƒํƒœ ์˜ˆ์‹œ

ํ”„๋กœ์„ธ์Šค๊ฐ€์ƒ ์ฃผ์†Œ๋ฌผ๋ฆฌ ์ฃผ์†Œ์“ฐ๊ธฐ ๊ถŒํ•œ
๋ถ€๋ชจ0~100500~600โŒ
๋ถ€๋ชจ100~200600~700โŒ
์ž์‹0~100500~600โŒ
์ž์‹100~200600~700โŒ

๋ถ€๋ชจ์™€ ์ž์‹ ๋ชจ๋‘ ๊ฐ™์€ ๋ฌผ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฐธ์กฐํ•˜์ง€๋งŒ, ์“ฐ๊ธฐ ๊ถŒํ•œ์€ ์ œ๊ฑฐ๋œ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

์ด ๋ฐฉ์‹ ๋•๋ถ„์—:

  • fork() ์‹คํ–‰์ด ๋งค์šฐ ๋น ๋ฆ…๋‹ˆ๋‹ค โœ…
  • ๋ฉ”๋ชจ๋ฆฌ๋„ ๋งŽ์ด ์ ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค โœ…

2) ์“ฐ๋ ค๊ณ  ํ•˜๋ฉด ์ƒ๊ธฐ๋Š” ์ผ: ์ง„์งœ ๋ณต์‚ฌ, ๋“ฑ์žฅ!

โœจ Copy-on-Write(CoW)๋ž€?

fork() ์งํ›„ ๋ถ€๋ชจ์™€ ์ž์‹์€ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜์ง€๋งŒ, ์“ฐ๊ธฐ ์‹œ๋„ ์ˆœ๊ฐ„ ๋ณต์‚ฌ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒŒ ๋ฐ”๋กœ Copy-on-Write์ž…๋‹ˆ๋‹ค.

ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ์—”ํŠธ๋ฆฌ ๋‚ด๋ถ€์—๋Š” ํŽ˜์ด์ง€์— ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ๊ด€๋ฆฌํ•˜๋Š” ํ•„๋“œ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋•Œ ๋ถ€๋ชจ์™€ ์ž์‹ ์–‘์ชฝ์„ ๋Œ€์ƒ์œผ๋กœ ๋ชจ๋“  ํŽ˜์ด์ง€์— ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ๋ฌดํšจํ™”ํ•ฉ๋‹ˆ๋‹ค.

๋ถ€๋ชจ์™€ ์ž์‹: "์šฐ๋ฆฐ ๊ฐ™์€ ์ฑ…์„ ์ฝ๊ณ  ์žˆ์–ด์š”(์ฝ๊ธฐ ์ „์šฉ)"
์ž์‹: "์—ฌ๊ธฐ ์ข€ ๊ณ ์ณ์•ผ๊ฒ ์–ด!" โžœ ํŽ˜์ด์ง€ ํดํŠธ ๋ฐœ์ƒ!
์ปค๋„: "์ž, ์ƒˆ ์ฑ… ์ค„๊ฒŒ. ๊ฑฐ๊ธฐ๋‹ค ์จ!"

๐Ÿ” ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์—์„œ ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ๋ฌดํšจํ™”ํ•˜๋Š” ์ด์œ 

1) ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”(Page Table)๊ณผ ๊ถŒํ•œ ํ•„๋“œ

์šด์˜์ฒด์ œ๋Š” ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”(Page Table)์„ ํ†ตํ•ด ๊ฐ€์ƒ ์ฃผ์†Œ๋ฅผ ๋ฌผ๋ฆฌ ์ฃผ์†Œ๋กœ ๋ณ€ํ™˜ํ•  ๋ฟ ์•„๋‹ˆ๋ผ, ๊ฐ ํŽ˜์ด์ง€์— ๋Œ€ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ(์ฝ๊ธฐ/์“ฐ๊ธฐ/์‹คํ–‰ ๋“ฑ)๋„ ํ•จ๊ป˜ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์˜ ๊ฐ ํ•ญ๋ชฉ์„ Page Table Entry(PTE)๋ผ๊ณ  ๋ถ€๋ฅด๋Š”๋ฐ, ์—ฌ๊ธฐ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์–ด์š”:

ํ•„๋“œ๋ช…์„ค๋ช…
Physical Address๋งคํ•‘๋œ ๋ฌผ๋ฆฌ ์ฃผ์†Œ
R (Read)์ฝ๊ธฐ ๊ถŒํ•œ
W (Write)์“ฐ๊ธฐ ๊ถŒํ•œ
X (Execute)์‹คํ–‰ ๊ถŒํ•œ
...๊ธฐํƒ€ ์บ์‹œ, ์ ‘๊ทผ ์—ฌ๋ถ€ ๋“ฑ

2) ์™œ fork() ํ›„์— ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ์—†์•จ๊นŒ?

fork()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ์ž์‹์€ ๋ถ€๋ชจ์˜ ๋ณต์‚ฌ๋ณธ์ด ๋˜์ง€๋งŒ, ์ง„์งœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ณต์‚ฌํ•˜์ง€๋Š” ์•Š์•„์š”.

๋Œ€์‹  ๋ถ€๋ชจ์™€ ์ž์‹ ๋ชจ๋‘ ๊ฐ™์€ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด ์ƒํƒœ์—์„œ ๋ˆ„๊ตฐ๊ฐ€ ๊ทธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•ด๋ฒ„๋ฆฌ๋ฉด?
โ†’ ๊ณต์œ  ์ค‘์ด๋˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ง๊ฐ€์งˆ ์ˆ˜ ์žˆ์–ด์š”.

๊ทธ๋ž˜์„œ!

โœ… ๋ถ€๋ชจ์™€ ์ž์‹์˜ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ๋ชจ๋‘์—์„œ "์“ฐ๊ธฐ ๊ถŒํ•œ"์„ ์ œ๊ฑฐํ•ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.
์ฆ‰, ์ฝ๊ธฐ ์ „์šฉ(read-only)์œผ๋กœ ๋งŒ๋“ค์–ด๋ฒ„๋ฆฌ๋Š” ๊ฑฐ์ฃ .

๐Ÿง  ๋‚ด๋ถ€ ๋™์ž‘ ์š”์•ฝ

์ดํ›„์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ์„ ๋•Œ ๋ถ€๋ชจ์™€ ์ž์‹ ์‚ฌ์ด์— ๊ณต์œ ๋œ ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

ํ•œํŽธ, ๋ถ€๋ชจ์™€ ์ž์‹ ์ค‘ ์–ด๋А ์ชฝ์ด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ํŽ˜์ด์ง€ ๊ณต์œ ๋ฅผ ํ•ด์ œํ•˜๊ณ , ํ”„๋กœ์„ธ์Šค๋งˆ๋‹ค ์ „์šฉ ํŽ˜์ด์ง€๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํŽ˜์ด์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ์ผ์ด ์ผ์–ด๋‚ฉ๋‹ˆ๋‹ค.

  1. ์ž์‹์ด ์–ด๋–ค ํŽ˜์ด์ง€์— ์“ฐ๊ธฐ ์‹œ๋„
  2. ์“ฐ๊ธฐ ๊ถŒํ•œ ์—†์Œ โ†’ CPU์—์„œ ํŽ˜์ด์ง€ ํดํŠธ(Page Fault) ๋ฐœ์ƒ
  3. CPU๊ฐ€ ์ปค๋„ ๋ชจ๋“œ๋กœ ๋ฐ”๋€Œ๊ณ  ์ปค๋„์˜ ํŽ˜์ด์ง€ ํดํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋™์ž‘
  4. ํŽ˜์ด์ง€ ํดํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ์ ‘์†ํ•œ ํŽ˜์ด์ง€๋ฅผ ๋ณ„๋„์˜ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์— ๋ณต์‚ฌ
  5. ์ž์‹์˜ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ๋กœ ์—…๋ฐ์ดํŠธ
  6. ์ด์ œ๋ถ€ํ„ฐ ๋ถ€๋ชจ์™€ ์ž์‹์€ ๊ฐ์ž์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ

โœ… ์ฆ‰, ์ฒ˜์Œ ์“ฐ๋Š” ์ˆœ๊ฐ„์—๋งŒ ๋ณต์‚ฌํ•˜๊ณ , ๊ทธ์ „๊นŒ์ง€๋Š” ๊ณต์œ ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

fork() ์งํ›„ ๋ถ€๋ชจ-์ž์‹ ๋ชจ๋‘ ์“ฐ๊ธฐ ๊ถŒํ•œ์„ ์ œ๊ฑฐํ•˜๋Š” ์ด์œ ๋Š”, ์“ฐ๊ธฐ ์‹œ๋„ ์‹œ์ ๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ์˜ˆ์š”!

์‹œ์ ์ƒํƒœ์„ค๋ช…
fork() ์งํ›„๋ถ€๋ชจ์™€ ์ž์‹์˜ ํŽ˜์ด์ง€์— ๋ชจ๋‘ ์“ฐ๊ธฐ ๊ถŒํ•œ โŒ๋ฉ”๋ชจ๋ฆฌ๋Š” ๊ณต์œ  ์ค‘
์ž์‹์ด ์“ฐ๊ธฐ ์‹œ๋„ํŽ˜์ด์ง€ ํดํŠธ ๋ฐœ์ƒ โ†’ ๋ณต์‚ฌ ๋ฐœ์ƒ์ด์ œ๋ถ€ํ„ฐ ์ž์‹์€ ๋…๋ฆฝ๋œ ๋ฉ”๋ชจ๋ฆฌ
๋ถ€๋ชจ๋Š” ๊ทธ๋Œ€๋กœ์•„์ง ์“ฐ๊ธฐ ์•ˆ ํ•˜๋ฉด ์—ฌ์ „ํžˆ ๊ณต์œ  ์ค‘ํšจ์œจ์  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

3) ์‹คํ—˜ ์ฝ”๋“œ: CoW ์‹ค์ œ ํ™•์ธํ•ด๋ณด๊ธฐ (cow.py)

๐Ÿ“œ ์‹คํ—˜ ๊ฐœ์š”

  1. 100MiB ๋ฉ”๋ชจ๋ฆฌ ํ™•๋ณด ํ›„ fork()

  2. fork ์งํ›„ ์ž์‹ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ํ™•์ธ

  • ์‹œ์Šคํ…œ ์ „์ฒด์˜ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰, ํ”„๋กœ์„ธ์Šค์˜ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰, ๋ฉ”์ด์ € ํดํŠธ ํšŸ์ˆ˜, ๋งˆ์ด๋„ˆ ํดํŠธ ํšŸ์ˆ˜๋ฅผ ์ถœ๋ ฅ
  1. fork() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ

  2. ์ž์‹์ด ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ(์“ฐ๊ธฐ) โ†’ ๋‹ค์‹œ ํ™•์ธ

  • ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ๋ฅผ ๋Œ€๊ธฐ.
  • ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋Œ€์ƒ์œผ๋กœ 2์™€ ๋™์ผํ•œ ์ •๋ณด๋ฅผ ์ถœ๋ ฅ
  • 1์—์„œ ํ™•๋ณดํ•œ ์˜์—ญ์˜ ๋ชจ๋“  ํŽ˜์ด์ง€์— ์ ‘๊ทผ
  • ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋Œ€์ƒ์œผ๋กœ 2์™€ ๋™์ผํ•œ ์ •๋ณด๋ฅผ ์ถœ๋ ฅ

๐Ÿ“ฆ ํ•ต์‹ฌ ์ฝ”๋“œ

import mmap, os, subprocess, sys

ALLOC_SIZE = 100*1024*1024
PAGE_SIZE = 4096

def access(data):
    for i in range(0, ALLOC_SIZE, PAGE_SIZE):
        data[i] = 0

def show_meminfo(msg, who):
    print(msg)
    subprocess.run("free")
    subprocess.run(["ps", "-orss,maj_flt,min_flt", str(os.getpid())])
    print()

data = mmap.mmap(-1, ALLOC_SIZE, flags=mmap.MAP_PRIVATE)
access(data)

show_meminfo("*** ์ž์‹ ์ƒ์„ฑ ์ „ ***", "๋ถ€๋ชจ")
pid = os.fork()

if pid == 0:
    show_meminfo("*** ์ž์‹ ์ƒ์„ฑ ์งํ›„ ***", "์ž์‹")
    access(data)
    show_meminfo("*** ์ž์‹ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํ›„ ***", "์ž์‹")
    sys.exit(0)

os.wait()

4) ์‹คํ—˜ ๊ฒฐ๊ณผ ํ•ด์„

์‹œ์ ์‹œ์Šคํ…œ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ๋ณ€ํ™”RSS ๋ณ€ํ™”๋งˆ์ด๋„ˆ ํดํŠธ ์ˆ˜
์ž์‹ ์ƒ์„ฑ ์งํ›„์•ฝ 1MiB ์ฆ๊ฐ€๊ฑฐ์˜ ๋™์ผ์ ์Œ
์ž์‹ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ํ›„์•ฝ 100MiB ์ฆ๊ฐ€์œ ์‚ฌ๋งค์šฐ ๋งŽ์Œ
  • ์นดํ”ผ ์˜จ ๋ผ์ดํŠธ๋ฅผ ์ด์šฉํ•˜๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ fork() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ์ˆœ๊ฐ„์—๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ „๋ถ€ ๋ณต์‚ฌํ•˜์ง€ ์•Š์•„๋„ ๋˜๋ฏ€๋กœ fork() ํ•จ์ˆ˜ ์ฒ˜๋ฆฌ๊ฐ€ ๋นจ๋ผ์ง€๊ณ  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰๋„ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.
  • ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•ด๋„ ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ์— ์“ฐ๊ธฐ ์ž‘์—…์ด ๋ฐœ์ƒํ•˜๋Š” ๊ฑด ๊ทนํžˆ ๋“œ๋ฌธ ์ผ์ด๋ฏ€๋กœ ์‹œ์Šคํ…œ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ
    ์‚ฌ์šฉ๋Ÿ‰๋„ ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.

๐Ÿ“Œ ์š”์  ์ •๋ฆฌ:

  • ์ž์‹ ์ƒ์„ฑ๋งŒ์œผ๋กœ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ฑฐ์˜ ์‚ฌ์šฉ ์•ˆ ํ•จ
  • ์“ฐ๊ธฐ ์ดํ›„์—๋งŒ ์‹ค์ œ RAM ๋ณต์‚ฌ ๋ฐœ์ƒ
  • RSS๋Š” ๊ณต์œ  ์—ฌ๋ถ€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๋œ ์ดํ•ฉ์„ ๋ณด์—ฌ์คŒ

RSS ์ฐธ๊ณ 

์ฐธ๊ณ  : RSS(Resident Set Size) ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹ค์ œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ(RAM)์—์„œ ์ฐจ์ง€ํ•˜๊ณ  ์žˆ๋Š” ํฌ๊ธฐ๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธฐ์— RSS๋Š” โ€˜์‹ค์ œ ์ ์œ  ์ค‘์ธ ๋ฉ”๋ชจ๋ฆฌ'์ด๋ผ๊ธฐ๋ณด๋‹ค๋Š” RSS๋Š” ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ ์ ์œ ๋Ÿ‰์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ๊ณต์œ ๋œ ๋ฉ”๋ชจ๋ฆฌ๋„ ํฌํ•จ๋˜์–ด ์žˆ์–ด์„œ, ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ(์˜ˆ: ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)๋ฅผ ์“ฐ๊ณ  ์žˆ์–ด๋„ ๊ฐ์ž ๋”ฐ๋กœ๋”ฐ๋กœ ๊ณ„์‚ฐํ•ด์š”.

๐Ÿ“Œ ๊ทธ๋ž˜์„œ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค์˜ RSS ๊ฐ’์„ ๋‹ค ๋”ํ•˜๋ฉด ์‹ค์ œ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ์ดํ•ฉ๋ณด๋‹ค ํ›จ์”ฌ ํด ์ˆ˜๋„ ์žˆ์–ด์š”!

์ฆ‰, RSS ๊ฐ’์€ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์˜ "๊ณต์œ  ์ƒํƒœ"๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์˜ˆ์‹œ๋กœ ์ดํ•ดํ•˜๊ธฐ

$ ps -o pid,rss,cmd -p 1234
  PID   RSS CMD
1234  20480 /usr/bin/python3 myscript.py

โ†’ ์ด๊ฑด 1234๋ฒˆ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์•ฝ 20MB์˜ RAM์„ ์ ์œ  ์ค‘์ด๋ผ๋Š” ๋œป์ด์ง€๋งŒ,
๊ทธ ์ค‘ ์ผ๋ถ€๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์™€ ๊ณต์œ ํ•˜๊ณ  ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ์ ์„ ์žŠ์ง€ ๋งˆ์„ธ์š”!

๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์ง€ํ‘œ๋“ค๊ณผ ๋น„๊ต

์ถœ์ฒ˜ : https://blog.naver.com/ya3344/221599131853?viewType=pc

์ง€ํ‘œ์„ค๋ช…
VSZ (Virtual Set Size)ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์˜ˆ์•ฝ๋œ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์ „์ฒด ํฌ๊ธฐ
RSS (Resident Set Size)์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ผ๊ฐ„ ํฌ๊ธฐ (๊ณต์œ  ํฌํ•จ)
PSS (Proportional Set Size)๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ ํ”„๋กœ์„ธ์Šค์— ๋น„๋ก€ํ•ด์„œ ๋‚˜๋ˆ  ๊ณ„์‚ฐํ•œ ๊ฐ’ (์ •ํ™•ํ•จ)

๐Ÿ“Œ ps ๋ช…๋ น์–ด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ RSS๋งŒ ๋ณด์—ฌ์ฃผ์ง€๋งŒ, ๋” ์ •ํ™•ํ•œ ๊ฐ’์„ ์›ํ•˜๋ฉด smem์ด๋‚˜ procfs์—์„œ PSS๋ฅผ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ์ข‹์•„์š”!

5) ์‹œ๊ฐ ์ž๋ฃŒ: Copy-on-Write ์‹œ๋‚˜๋ฆฌ์˜ค

[๋ถ€๋ชจ & ์ž์‹ ํ”„๋กœ์„ธ์Šค]
   ๐Ÿ‘จ โžก๏ธ fork() โžก๏ธ ๐Ÿ‘ถ

[์ดˆ๊ธฐ ์ƒํƒœ]
  ๊ฐ€์ƒ ์ฃผ์†Œ: ๋™์ผ
  ๋ฌผ๋ฆฌ ์ฃผ์†Œ: ๋™์ผ
  ์“ฐ๊ธฐ ๊ถŒํ•œ: โŒ

[์ž์‹์ด ์“ฐ๊ธฐ๋ฅผ ์‹œ๋„]
  โ›” ํŽ˜์ด์ง€ ํดํŠธ ๋ฐœ์ƒ
  ๐Ÿ” ์ปค๋„: ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ
  โœ… ์ž์‹ ์ „์šฉ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์—…๋ฐ์ดํŠธ

โœ… ํ•œ ์ค„ ์š”์•ฝ

Copy-on-Write๋Š” ์“ฐ๊ธฐํ•  ๋•Œ๋งŒ ์ง„์งœ ๋ณต์‚ฌ๋ฅผ ํ•˜๋Š” ๋˜‘๋˜‘ํ•œ ์ „๋žต์ด๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์ฐธ๊ณ  ์‚ฌ์ง„

์ถœ์ฒ˜ : https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.alibabacloud.com%2Fhelp%2Fen%2Farms%2Fapplication-monitoring%2Fdeveloper-reference%2Fmemory-metrics&psig=AOvVaw2-VxYDaw7nN9hnu9SW34rT&ust=1744677892712000&source=images&cd=vfe&opi=89978449&ved=0CBcQjhxqFwoTCNimluKl1owDFQAAAAAdAAAAABAT

๐Ÿš€ execve()์™€ Demand Paging: ๋ฉ”๋ชจ๋ฆฌ๋Š” โ€˜์ง„์งœโ€™ ์“ธ ๋•Œ ์ฃผ๋Š” ๊ฑฐ์•ผ

1) Demand Paging์ด ๋ญ์˜€๋”๋ผ?

๐Ÿ’ก Demand Paging์€ ํ•„์š”ํ•  ๋•Œ๋งŒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋”ฉํ•˜๋Š” ๊ธฐ๋ฒ•์ด์—์š”.
์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค ์˜ฌ๋ฆฌ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ์ ‘๊ทผํ•  ๋•Œ ํŽ˜์ด์ง€ ํดํŠธ(Page Fault)๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๊ทธ๋•Œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•ด์š”.

์ถœ์ฒ˜ : https://www.sitesbay.com/os/os-what-is-demand-paging-in-operating-system

  • ํŽ˜์ด์ง€์— ์ ‘๊ทผ์„ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.
  • ํŽ˜์ด์ง€๊ฐ€ ์œ ํšจํ•˜๋‹ค๋ฉด(๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋‹ค๋ฉด) ์ •์ƒ์ ์œผ๋กœ ๋ช…๋ น์–ด ์ฒ˜๋ฆฌ๋ฅผ ๊ณ„์†ํ•ฉ๋‹ˆ๋‹ค.
  • ํŽ˜์ด์ง€๊ฐ€ ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉด ํŽ˜์ด์ง€ ์˜ค๋ฅ˜ ํŠธ๋žฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฉ”๋ชจ๋ฆฌ ์ฐธ์กฐ๊ฐ€ ๋ณด์กฐ ๋ฉ”๋ชจ๋ฆฌ์˜ ํŠน์ • ์œ„์น˜์— ๋Œ€ํ•œ ์œ ํšจํ•œ ์ฐธ์กฐ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค(๋ถˆ๋ฒ•์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ). ์œ ํšจํ•˜์ง€ ์•Š์œผ๋ฉด ํ•„์š”ํ•œ ํŽ˜์ด์ง€๋ฅผ ํŽ˜์ด์ง€ ์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์›ํ•˜๋Š” ํŽ˜์ด์ง€๋ฅผ ์ฃผ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์ฝ์–ด๋“ค์ด๋„๋ก ๋””์Šคํฌ ์ž‘์—…์„ ์˜ˆ์•ฝํ•ฉ๋‹ˆ๋‹ค.
  • ์šด์˜ ์ฒด์ œ ํŠธ๋žฉ์œผ๋กœ ์ธํ•ด ์ค‘๋‹จ๋œ ๋ช…๋ น์–ด๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ํฐ ์ฑ…์„ ๋นŒ๋ ธ๋Š”๋ฐ ์ฒ˜์Œ ๋ช‡ ์žฅ๋งŒ ์ฝ์„ ๊ฑฐ๋ฉด ๊ตณ์ด ์ „์ฒด๋ฅผ ๋ณต์‚ฌํ•  ํ•„์š”๊ฐ€ ์—†๊ฒ ์ฃ ? ํ•„์š”ํ•œ ์ชฝ๋งŒ ๋ณต์‚ฌํ•ด๋„ ์ถฉ๋ถ„ํ•˜๋‹ˆ๊นŒ์š”.

2) execve()์—์„œ Demand Paging์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ๊นŒ?

execve() ํ•จ์ˆ˜๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ๋กœ๋”ฉํ•  ๋•Œ ์‚ฌ์šฉ๋ผ์š”. ์ด ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด:

  1. ๊ธฐ์กด ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ „๋ถ€ ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค.
  2. ์‹คํ–‰ํ•  ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ๋งŒ ์„ค์ •๋˜๊ณ , ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ• ๋‹น๋˜์ง€ ์•Š์•„์š”!
  3. ์ดํ›„ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋ฉฐ ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•  ๋•Œ, ๊ทธ์ œ์„œ์•ผ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋ฉ๋‹ˆ๋‹ค.

์ฆ‰, "์ฝ”๋“œ๋ฅผ ์ฝ๋Š” ์ˆœ๊ฐ„๊นŒ์ง€๋„ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋Š” ํ• ๋‹น๋˜์ง€ ์•Š์€ ์ƒํƒœ"๋ผ๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : http://www.hexainclude.com/demand-paging/

ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•˜๋ ค๊ณ  ํ•  ๋•Œ, ์œ ํšจํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ํ‘œ์‹œ๋œ ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•˜๋ฉด ํŽ˜์ด์ง€ ํดํŠธ ๋˜๋Š” ํŽ˜์ด์ง€ ๋ˆ„๋ฝ ์ธํ„ฐ๋ŸฝํŠธ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. OS๋Š” ์ธํ„ฐ๋ŸฝํŠธ ์ฒ˜๋ฆฌ๊ธฐ๋กœ ์ œ์–ด๊ถŒ์„ ๋„˜๊น๋‹ˆ๋‹ค. ํŽ˜์ด์ง€ ํดํŠธ ์ธํ„ฐ๋ŸฝํŠธ์ž„์„ ํ™•์ธํ•˜๋ฉด ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ํŽ˜์ด์ง€ ํดํŠธ(pi)๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ๋ฅผ ๊ฐ€์ƒ ํ•ธ๋“ค๋Ÿฌ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ”„๋ ˆ์ž„ ๋ชฉ๋ก์„ ํ™•์ธํ•˜๊ณ  ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ์Šค์™‘ ๊ณต๊ฐ„์—์„œ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. ์ปค๋„์€ ํ•ด๋‹น ํ•ญ๋ชฉ์œผ๋กœ ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์„ ์ˆ˜์ •ํ•˜์—ฌ ํ•ด๋‹น ํŽ˜์ด์ง€๊ฐ€ ์œ ํšจํ•ด์ง€๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์ธํ„ฐ๋ŸฝํŠธ ํ•ธ๋“ค๋Ÿฌ(์˜์–ด: interrupt handler) ๋˜๋Š” ์ธํ„ฐ๋ŸฝํŠธ ์„œ๋น„์Šค ๋ฃจํ‹ด(์˜์–ด: interrupt Service Routine, ISR)์€ ์ธํ„ฐ๋ŸฝํŠธ ์ ‘์ˆ˜์— ์˜ํ•ด ๋ฐœ์ƒ๋˜๋Š” ์ธํ„ฐ๋ŸฝํŠธ์— ๋Œ€์‘ํ•˜์—ฌ ํŠน์ • ๊ธฐ๋Šฅ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๊ณ„์–ด ์ฝ”๋“œ ๋ฃจํ‹ด์ž…๋‹ˆ๋‹ค.

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

3) ๋‹จ๊ณ„๋ณ„ ํ๋ฆ„ ์ •๋ฆฌ

๐Ÿ–ผ ๊ทธ๋ฆผ 05-03: execve() ํ˜ธ์ถœ ์งํ›„

  • ๊ฐ€์ƒ ์ฃผ์†Œ๋งŒ ์กด์žฌํ•˜๊ณ , ๋ฌผ๋ฆฌ ์ฃผ์†Œ ์—ฐ๊ฒฐ์€ ์—†์Œ
  • ์•„์ง ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ ํŽ˜์ด์ง€ ํดํŠธ๋„ ์—†์Œ

๐Ÿ–ผ ๊ทธ๋ฆผ 05-04: ์—”ํŠธ๋ฆฌ ํฌ์ธํŠธ ์ ‘๊ทผ โ†’ ํŽ˜์ด์ง€ ํดํŠธ ๋ฐœ์ƒ

  • ์‹คํ–‰ ์ง€์  ์ง„์ž…
  • ํ•ด๋‹น ํŽ˜์ด์ง€๊ฐ€ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์— ์—†์œผ๋ฏ€๋กœ ํŽ˜์ด์ง€ ํดํŠธ ๋ฐœ์ƒ!

๐Ÿ–ผ ๊ทธ๋ฆผ 05-05: ํŽ˜์ด์ง€ ํดํŠธ ์ฒ˜๋ฆฌ ํ›„ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น

  • ์ปค๋„์ด ํŽ˜์ด์ง€ ํดํŠธ๋ฅผ ๊ฐ์ง€ํ•˜๊ณ 
  • ํ•„์š”ํ•œ ํŽ˜์ด์ง€๋ฅผ RAM์— ๋ณต์‚ฌ
  • ๊ฐ€์ƒ ์ฃผ์†Œ โ†” ๋ฌผ๋ฆฌ ์ฃผ์†Œ ์—ฐ๊ฒฐ ์™„๋ฃŒ

๐Ÿ–ผ ๊ทธ๋ฆผ 05-06: ๋‹ค๋ฅธ ํŽ˜์ด์ง€ ์ ‘๊ทผ โ†’ ๋ฐ˜๋ณต ์ฒ˜๋ฆฌ

  • ๊ทธ ์ดํ›„ ๋‹ค๋ฅธ ํŽ˜์ด์ง€ ์ ‘๊ทผํ•  ๋•Œ๋„ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ํŽ˜์ด์ง€ ํดํŠธ๊ฐ€ ๋ฐœ์ƒ
  • ํ•ด๋‹น ํŽ˜์ด์ง€๋งˆ๋‹ค ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์ด๋ฃจ์–ด์ง

4) Demand Paging์˜ ์žฅ์ ์€?

ํ•ญ๋ชฉ๋‚ด์šฉ
๐Ÿ”„ ์ง€์—ฐ ๋กœ๋”ฉ์‹ค์ œ๋กœ ์“ฐ๊ธฐ ์ „๊นŒ์ง€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋กœ๋”ฉํ•˜์ง€ ์•Š์Œ
๐Ÿ’พ ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝํ•„์š” ์—†๋Š” ํŽ˜์ด์ง€๋Š” ๋๊นŒ์ง€ ๋กœ๋”ฉ๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ
๐Ÿš€ ์‹คํ–‰ ์†๋„ ๊ฐœ์„ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ์‹œ์ ์—์„œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋กœ๋”ฉํ•ด์„œ ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ ๊ฐ€๋Šฅ
๐Ÿ“‰ ์บ์‹œ ํšจ์œจ์ž์ฃผ ์ ‘๊ทผํ•˜๋Š” ํŽ˜์ด์ง€๋งŒ ์œ ์ง€ํ•˜๋ฉด ์บ์‹œ ํžˆํŠธ์œจ ํ–ฅ์ƒ ๊ฐ€๋Šฅ

5) execve() + Demand Paging ํ๋ฆ„ ์š”์•ฝ

[1] execve() ํ˜ธ์ถœ
      โ†“
[2] ํ”„๋กœ๊ทธ๋žจ ๋ฉ”๋ชจ๋ฆฌ ๋งต ๊ตฌ์„ฑ (๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์•„์ง ์—†์Œ)
      โ†“
[3] ์ฝ”๋“œ ์‹คํ–‰ ์‹œ์ž‘ โ†’ ์ฒซ ํŽ˜์ด์ง€ ์ ‘๊ทผ ์‹œ ํŽ˜์ด์ง€ ํดํŠธ ๋ฐœ์ƒ
      โ†“
[4] ํ•ด๋‹น ํŽ˜์ด์ง€๋งŒ ๋ฌผ๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ์— ๋กœ๋”ฉ (๋‚˜๋จธ์ง€๋Š” ์•„์ง ์—†์Œ)
      โ†“
[5] ์ดํ›„ ํ•„์š”ํ•œ ํŽ˜์ด์ง€๋งˆ๋‹ค on-demand๋กœ ๋ฉ”๋ชจ๋ฆฌ ๋กœ๋”ฉ

๐Ÿ’ญ ๋น„์œ 

execve()๋Š” ๊ฐ€์ƒ ์ฃผ์†Œ๋งŒ ์ค€๋น„ํ•ด๋†“๊ณ , ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ๋Š” โ€˜์ ‘๊ทผํ•  ๋•Œโ€™ ํ•˜๋‚˜์”ฉ ๋ฐ›์•„์˜ค๋Š” ํšจ์œจ์ ์ธ ์‹œ์Šคํ…œ!

"์ฑ…์„ ํ•œ๊บผ๋ฒˆ์— ๋‹ค ์ฝ์ง€ ์•Š๊ณ , ํ•„์š”ํ•œ ํŽ˜์ด์ง€๋ถ€ํ„ฐ ๋„˜๊ธฐ๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”!"

๐Ÿง  ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ†ตํ•œ ํ”„๋กœ์„ธ์Šค ํ†ต์‹ : ์ž์‹๊ณผ ๋ถ€๋ชจ๊ฐ€ ๊ฐ™์€ ์ข…์ด๋ฅผ ๋ณธ๋‹ค๋ฉด?

1) ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ ๋Œ€ํ™”ํ•˜๋ ค๋ฉด?

์ปดํ“จํ„ฐ์—์„œ ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋žจ์ด ํ•จ๊ป˜ ์ผํ•˜๋ ค๋ฉด ์„œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ํ†ต์‹  ์ˆ˜๋‹จ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ IPC (Inter-Process Communication, ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ )์ด๋ผ๊ณ  ํ•ด์š”.

์ถœ์ฒ˜: https://heeonii.tistory.com/13 [์šฐ๋‹นํƒ•ํƒ• ํžˆ์˜จ์ด๋„ค:ํ‹ฐ์Šคํ† ๋ฆฌ]

์œ„ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ ํ”„๋กœ์„ธ์Šค๋Š” ์™„์ „ํžˆ ๋…๋ฆฝ๋œ ์‹คํ–‰๊ฐ์ฒด๋กœ์จ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋…๋ฆฝ๋˜์–ด ์žˆ๋Š” ๋งŒํผ ๋ณ„๋„์˜ ์„ค๋น„๊ฐ€ ์—†์ด ์„œ๋กœ๊ฐ„์˜ ํ†ต์‹ ์ด ์–ด๋ ค์›Œ,ย ์ปค๋„ ์˜์—ญ์—์„œ IPC๋ผ๋Š” ๋‚ด๋ถ€ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์„ ์ œ๊ณตํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค๋Š” ์ปค๋„์ด ์ œ๊ณตํ•˜๋Š” IPC์„ค๋น„๋ฅผ ์ด์šฉํ•ด์„œ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.ย 

๋ฆฌ๋ˆ…์Šค๋Š” ๋‹ค์–‘ํ•œ IPC ๋ฐฉ์‹์„ ์ง€์›ํ•˜๋Š”๋ฐ, ๊ทธ์ค‘์—์„œ๋„ โ€œ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ(shared memory)โ€๋Š” ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ์‹ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค.

2) ๊ณต์œ ํ•˜์ง€ ์•Š์„ ๋•Œ ์–ด๋–ค ์ผ์ด ๋ฒŒ์–ด์งˆ๊นŒ?

๋จผ์ €, ์ผ๋ฐ˜์ ์ธ fork() ์ดํ›„ ๋ฐ์ดํ„ฐ ๊ณต์œ  ์—†์ด ์ž์‹์ด ๊ฐ’์„ ๋ฐ”๊ฟจ์„ ๋•Œ๋ฅผ ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ป ์ฝ”๋“œ ์˜ˆ์‹œ: non-shared-memory.py

#!/usr/bin/python3
import os
import sys

data = 1000
print("์ž์‹ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ ์ „ ๋ฐ์ดํ„ฐ ๊ฐ’: {}".format(data))
pid = os.fork()

if pid == 0:
    data = 2  # ์ž์‹์ด ๊ฐ’์„ ๋ฐ”๊ฟˆ
    sys.exit(0)

os.wait()
print("์ž์‹ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ํ›„ ๋ฐ์ดํ„ฐ ๊ฐ’: {}".format(data))

๐Ÿงช ๊ฒฐ๊ณผ

์ž์‹ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ ์ „ ๋ฐ์ดํ„ฐ ๊ฐ’: 1000  
์ž์‹ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ํ›„ ๋ฐ์ดํ„ฐ ๊ฐ’: 1000

โ“ ์™œ ๊ฐ’์ด ์•ˆ ๋ฐ”๋€Œ์—ˆ์„๊นŒ?

fork() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ ์ดํ›„์˜ ๋ถ€๋ชจ์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ค ํ•œ์ชฝ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐฑ์‹ ํ•˜๋”๋ผ๋„ ๋‹ค๋ฅธ ์ชฝ ํ”„๋กœ์„ธ์Šค์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • fork()๋Š” ๋ถ€๋ชจ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ณต์‚ฌํ•˜์ง€๋งŒ, Copy-on-Write(CoW) ๋•Œ๋ฌธ์— ์“ฐ๊ธฐ ์‹œ๋„ ์‹œ ๋ณต์ œ๋ฉ๋‹ˆ๋‹ค.
  • ์ž์‹์ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”๊พธ๋ฉด ์ž์‹ ๋งŒ์˜ ์‚ฌ๋ณธ์„ ๊ฐ–๊ฒŒ ๋˜์–ด, ๋ถ€๋ชจ ์ž…์žฅ์—์„œ๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ชจ๋ฅด๊ฒŒ ๋˜๋Š” ๊ฑฐ์ฃ .

3) ๊ทธ๋Ÿผ ์ง„์งœ ๊ณต์œ ํ•˜๋ ค๋ฉด? โ†’ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ(mmap + MAP_SHARED)

์ด๋ฒˆ์—” ์ž์‹๊ณผ ๋ถ€๋ชจ๊ฐ€ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋ฐ”๋ผ๋ณด๋„๋ก ์„ค์ •ํ•ด๋ณผ๊ฒŒ์š”.

์ถœ์ฒ˜: https://heeonii.tistory.com/13 [์šฐ๋‹นํƒ•ํƒ• ํžˆ์˜จ์ด๋„ค:ํ‹ฐ์Šคํ† ๋ฆฌ]

๐Ÿ“ฆ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

1) ๊ธฐ๋ณธ ๊ฐœ๋…

๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ(shared memory)๋Š” ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ์„ค๋น„์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋กœ์„ธ์Šค๋Š” ์ž๊ธฐ๋งŒ์˜ ๋…๋ฆฝ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์š”. ์ปค๋„์€ ์ด๋ฅผ ๋ณดํ˜ธํ•ด์„œ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ๊ฐ„์„ญํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋•Œ๋•Œ๋กœ, ์„œ๋กœ ํ˜‘๋ ฅํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์ƒ๊ธฐ์ฃ .

2) ์™œ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ•„์š”ํ• ๊นŒ?

โ“ ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ณ  ์‹ถ๋‹ค๋ฉด?

  • ํŒŒ์ดํ”„(PIPE), ๋ฉ”์‹œ์ง€ ํ ๋“ฑ์˜ ์ „ํ†ต์ ์ธ IPC ๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐ ์ค‘๊ฐœ์ž ์—ญํ• ์„ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ˜๋ฉด, ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ค‘๊ฐœ ์—†์ด ๊ณง๋ฐ”๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค.
  • ์ด๋Š” ์Šค๋ ˆ๋“œ(Thread)์ฒ˜๋Ÿผ ๊ณตํ†ต ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๊ณต์œ ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•ด์š”.

3) ์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜์š”?

๐Ÿง  ์ž‘๋™ ํ๋ฆ„

  1. ํ”„๋กœ์„ธ์Šค A๊ฐ€ ์ปค๋„์— ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.
  2. ์ปค๋„์€ ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์— ๊ณต์œ  ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  3. ํ”„๋กœ์„ธ์Šค B๋„ ๊ฐ™์€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋งคํ•‘๋ฐ›์œผ๋ฉด,
  4. ์ด์ œ A์™€ B๋Š” ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

4) ํŠน์ง•๊ณผ ์žฅ์ 

ํ•ญ๋ชฉ์„ค๋ช…
๐Ÿงญ ์ง์ ‘ ์ ‘๊ทผ์ปค๋„์˜ ์ค‘์žฌ ์—†์ด ๋ฉ”๋ชจ๋ฆฌ์— ๊ณง๋ฐ”๋กœ ์ ‘๊ทผ ๊ฐ€๋Šฅ
โšก ๋งค์šฐ ๋น ๋ฆ„๋ชจ๋“  IPC ์ค‘์—์„œ ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ์‹
๐Ÿ“ˆ ๋ฉ”๋ชจ๋ฆฌ ์ฆ๊ฐ€ ์—†์Œ๋‹จ์ˆœํžˆ ํฌ์ธํ„ฐ๋กœ ์ ‘๊ทผํ•˜๋ฏ€๋กœ ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์€ ์ฆ๊ฐ€ํ•˜์ง€ ์•Š์Œ
๐Ÿ”„ ์–‘๋ฐฉํ–ฅ ํ†ต์‹  ๊ฐ€๋Šฅ์ฝ๊ธฐ + ์“ฐ๊ธฐ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ

5) ์–ธ์ œ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„๊นŒ?

  • ํ”„๋กœ์„ธ์Šค ๊ฐ„์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์•„์•ผ ํ•  ๋•Œ
  • ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์ด ํ•„์š”ํ•  ๋•Œ
  • ์†๋„๊ฐ€ ๋งค์šฐ ์ค‘์š”ํ•œ ์‹œ์Šคํ…œ(์˜ˆ: ๊ฒŒ์ž„ ์—”์ง„, DB ๊ณต์œ  ์บ์‹œ ๋“ฑ)

๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋Š” ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•˜๋‚˜์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ, ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” IPC ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

๐Ÿ’ป ์ฝ”๋“œ ์˜ˆ์‹œ: shared-memory.py

#!/usr/bin/python3
import os, sys, 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:
    # ์ž์‹์ด ๋ฉ”๋ชจ๋ฆฌ ์ฝ๊ณ  2๋ฐฐ๋กœ ๋งŒ๋“ค๊ธฐ
    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))

๋™์ž‘ ๋ฐฉ์‹

  1. ์ •์ˆ˜ ๋ฐ์ดํ„ฐ 1000์„ ๋งŒ๋“ค์–ด์„œ ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  2. ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์ž‘์„ฑํ•ด์„œ 1 ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์˜์—ญ ์ฒซ ๋ถ€๋ถ„์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.
  3. ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  4. ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค. ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” 2์—์„œ ๋งŒ๋“  ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์ฝ๊ณ  2๋ฐฐ๋กœ ๋งŒ๋“ค์–ด์„œ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋‹ค์‹œ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๊ณ  ๋‚˜์„œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.
  5. ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.

4) ์‹คํ—˜ ๊ฒฐ๊ณผ

์ž์‹ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ ์ „ ๋ฐ์ดํ„ฐ ๊ฐ’: 1000  
์ž์‹ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ ํ›„ ๋ฐ์ดํ„ฐ ๊ฐ’: 2000

โœ… ์ด๋ฒˆ์—” ๋ณ€๊ฒฝ๋œ ๊ฐ’์ด ๋ฐ˜์˜๋จ!

  • ์ด์œ ๋Š” ๊ฐ„๋‹จํ•ด์š”. ๋ถ€๋ชจ์™€ ์ž์‹์ด ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .
  • mmap()์„ MAP_SHARED ํ”Œ๋ž˜๊ทธ์™€ ํ•จ๊ป˜ ์“ฐ๋ฉด, ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๊ณต์œ ๋ฉ๋‹ˆ๋‹ค.

5) ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ตฌ์กฐ ์ดํ•ด

6) ์‹ค์ƒํ™œ ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ

๋งˆ์น˜ ๋ถ€๋ชจ์™€ ์ž์‹์ด ๊ฐ™์€ ์น ํŒ์„ ๋ณด๊ณ  ๊ธ€์”จ๋ฅผ ์“ฐ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•„์š”.
์ž์‹์ด 1000์„ 2000์œผ๋กœ ๋ฐ”๊ฟ” ์“ฐ๋ฉด, ๋ถ€๋ชจ๊ฐ€ ๊ทธ๊ฑธ ๊ณ ์Šค๋ž€ํžˆ ๋ณผ ์ˆ˜ ์žˆ๊ฒ ์ฃ ?

๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋ถ€๋ชจ์™€ ์ž์‹์ด ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ๋ณด๊ฒŒ ํ•ด์„œ, ๋ฐ์ดํ„ฐ๊ฐ€ ์ •๋ง๋กœ '๊ณต์œ '๋˜๋„๋ก ๋งŒ๋“ค์–ด์ค๋‹ˆ๋‹ค!

๐Ÿ”” ์‹œ๊ทธ๋„๋กœ ํ†ต์‹ ํ•œ๋‹ค๊ณ ์š”? โ€“ ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ '์‹ ํ˜ธ' ์ฃผ๊ณ ๋ฐ›๊ธฐ

1) ์‹œ๊ทธ๋„(Signal)์ด๋ž€?

์ถœ์ฒ˜ : https://hasumang.tistory.com/11

์‹œ๊ทธ๋„(Signal)์€ ๋ฆฌ๋ˆ…์Šค์—์„œ ํ”„๋กœ์„ธ์Šค ๊ฐ„์— ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹ ํ˜ธ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ์–ด๋–ค ์‚ฌ๊ฑด์ด ๋ฐœ์ƒํ–ˆ์Œ์„ ์•Œ๋ ค์ฃผ๋Š” ๊ฐ„๋‹จํ•œ ๋ฉ”์‹œ์ง€ ์—ญํ• ์„ ํ•ด์š”.

์˜ˆ์‹œ๋กœ ์ž์ฃผ ์“ฐ๋Š” ์‹œ๊ทธ๋„๋“ค:

์‹œ๊ทธ๋„ ์ด๋ฆ„์˜๋ฏธ
SIGINT์ธํ„ฐ๋ŸฝํŠธ (Ctrl+C)
SIGTERM์ข…๋ฃŒ ์š”์ฒญ
SIGKILL๊ฐ•์ œ ์ข…๋ฃŒ (kill -9)

์ด ์‹œ๊ทธ๋„๋“ค์€ ์šฉ๋„๊ฐ€ ์ •ํ•ด์ง„ ์‹œ์Šคํ…œ ์‹œ๊ทธ๋„์ด์—์š”. ์‚ฌ์šฉ์ž ํ”„๋กœ๊ทธ๋žจ์ด ์ž„์˜๋กœ ํ•ด์„ํ•˜์ง€ ์•Š๊ณ , ์‹œ์Šคํ…œ์ด ์ž๋™ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค.

2) ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ทธ๋„: SIGUSR1, SIGUSR2

์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์ •์˜ํ•ด์„œ ์“ธ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ทธ๋„๋„ ์žˆ์–ด์š”!

  • SIGUSR1, SIGUSR2๋Š” ์‚ฌ์šฉ์ž ์ •์˜ ์‹œ๊ทธ๋„์ž…๋‹ˆ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์›ํ•˜๋Š” ์˜๋ฏธ๋ฅผ ๋ถ€์—ฌํ•ด์„œ, ๋‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์„œ๋กœ ํ†ต์‹ ํ•˜๊ฑฐ๋‚˜ ์ง„ํ–‰ ์ƒํƒœ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด, ํ”„๋กœ์„ธ์Šค A๊ฐ€ B์—๊ฒŒ โ€œ์ง€๊ธˆ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์ค‘์ด์•ผโ€, ๋˜๋Š” โ€œ๋‹ค์Œ ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ€โ€๋ผ๋Š” ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋Š” ์‹์ด์ฃ .

3) ํ•˜์ง€๋งŒ... ์‹œ๊ทธ๋„์—๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์–ด์š”

ํŠน์ง•์„ค๋ช…
โš  ๋‹จ์ˆœํ•จ์‹œ๊ทธ๋„์€ ์˜ค์ง "์™”๋‹ค"๋Š” ์‚ฌ์‹ค๋งŒ ์•Œ๋ฆผ
โ›” ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ถˆ๊ฐ€์‹œ๊ทธ๋„๋งŒ์œผ๋กœ๋Š” ์ˆ˜์น˜๋‚˜ ๋ฌธ์ž์—ด ๋“ฑ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” ์ „์†ก ๋ถˆ๊ฐ€
โž• ๋ณ„๋„ ์ˆ˜๋‹จ ํ•„์š”๋”ฐ๋ผ์„œ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์œผ๋ ค๋ฉด ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ, ํŒŒ์ดํ”„ ๋“ฑ ๋‹ค๋ฅธ IPC ๋ฐฉ์‹๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

4) ๐Ÿ’ก ์‹ค์ „ ์˜ˆ์ œ: dd ๋ช…๋ น์–ด์— ์‹œ๊ทธ๋„ ๋ณด๋‚ด๊ธฐ

๋ฆฌ๋ˆ…์Šค์˜ dd ๋ช…๋ น์–ด๋Š” SIGUSR1 ์‹œ๊ทธ๋„์„ ๋ฐ›์œผ๋ฉด ๋ณต์‚ฌ ์ง„ํ–‰ ์ƒํƒœ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” ์ˆจ์€ ๊ธฐ๋Šฅ์ด ์žˆ์–ด์š”.

โ–ถ๏ธ ์‚ฌ์šฉ ์˜ˆ์‹œ

$ dd if=/dev/zero of=test bs=1 count=1G &
[1] 2992194        # ๋ฐฑ๊ทธ๋ผ์šด๋“œ PID

$ DDPID=$!         # ์ตœ๊ทผ ๋ฐฑ๊ทธ๋ผ์šด๋“œ PID ์ €์žฅ

$ kill -SIGUSR1 $DDPID
# ์ถœ๋ ฅ:
8067496+8 records in  
8067496+0 records out  
8067496 bytes (8.1 MB, 7.7 MiB) copied, 15.3716 s, 525 kB/s

๐Ÿ“Œ ํ•ด์„:

  • kill -SIGUSR1์€ dd ํ”„๋กœ์„ธ์Šค์— "์ƒํƒœ ์ถœ๋ ฅํ•ด์ค˜!"๋ผ๊ณ  ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ธ ๊ฑฐ์˜ˆ์š”.
  • ๊ทธ ๊ฒฐ๊ณผ, ํ˜„์žฌ๊นŒ์ง€ ๋ช‡ ๋ฐ”์ดํŠธ๋ฅผ ๋ณต์‚ฌํ–ˆ๋Š”์ง€ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
  • SIGUSR1์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ณด๋‚ด๋ฉด ์ค‘๊ฐ„์ค‘๊ฐ„ ์ง„ํ–‰ ์ƒํ™ฉ์„ ๊ณ„์† ์•Œ ์ˆ˜ ์žˆ์ฃ !

์‹œ๊ทธ๋„์€ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ '๋ฌด์–ธ๊ฐ€ ์ผ์–ด๋‚ฌ์–ด!'๋ผ๊ณ  ์•Œ๋ ค์ฃผ๋Š” ๋‹จ์ˆœํ•œ ์•Œ๋ฆผ ๋„๊ตฌ์ด๋ฉฐ,
๋ณต์žกํ•œ ํ†ต์‹ ๋ณด๋‹ค๋Š” ๊ฐ„๋‹จํ•œ ํŠธ๋ฆฌ๊ฑฐ์šฉ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ข‹์Šต๋‹ˆ๋‹ค! ์œ„ ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ต๋ช… ํŒŒ์ดํ”„(Anonymous Pipe)์™€ ๋ช…๋ช…๋œ ํŒŒ์ดํ”„(Named Pipe)์˜ ๊ฐœ๋…๊ณผ ์ฐจ์ด๋ฅผ ์ค‘์‹ฌ์œผ๋กœ, ๋ฐœํ‘œ๋‚˜ ๋ธ”๋กœ๊ทธ์šฉ์œผ๋กœ ๋ณด๊ธฐ ์ข‹๊ณ  ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ๋ฐฉ์‹์œผ๋กœ ์ •๋ฆฌํ•ด๋“œ๋ฆด๊ฒŒ์š”.


๐Ÿ”„ ํŒŒ์ดํ”„(PIPE)๋กœ ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ 

1) ํŒŒ์ดํ”„๋ž€?

ํŒŒ์ดํ”„(pipe)๋Š” ํ•œ ํ”„๋กœ์„ธ์Šค์˜ ์ถœ๋ ฅ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ํ†ต์‹  ์ˆ˜๋‹จ์ž…๋‹ˆ๋‹ค.

๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ์‰˜์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์ž์ฃผ ์‚ฌ์šฉํ•˜์ฃ :

$ free | awk '(NR==2){print $2}'

  • free: ๋ฉ”๋ชจ๋ฆฌ ์ •๋ณด๋ฅผ ์ถœ๋ ฅ
  • |: ํŒŒ์ดํ”„ โ†’ free์˜ ์ถœ๋ ฅ์„ awk์˜ ์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌ
  • awk: ์ „๋‹ฌ๋ฐ›์€ ์ž…๋ ฅ์—์„œ ํŠน์ • ํ•„๋“œ๋งŒ ์ถ”์ถœ

ํŒŒ์ดํ”„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ์นœ์ˆ™ํ•œ ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด
bash ๊ฐ™์€ ์…ธ์—์„œ ๋ฌธ์ž๋กœ ํ”„๋กœ๊ทธ๋žจ๋ผ๋ฆฌ ์ฒ˜๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์—ฐ๊ณ„ํ•˜๋Š” ๊ฒƒ

์ด์ฒ˜๋Ÿผ ํŒŒ์ดํ”„๋Š” ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹  ์ˆ˜๋‹จ์œผ๋กœ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ, ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ (IPC)์—์„œ๋„ ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

์Œ๋ฐฉํ†ต์‹ ์„ ์œ„ํ•ด์„œ๋Š” Write์šฉ PIPEํ•˜๋‚˜ Read PIPEํ•˜๋‚˜๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. read()์™€write()๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ block ๋ชจ๋“œ๋กœ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋กœ์„ธ์Šค๊ฐ€ read๊ฐ€ ๋Œ€๊ธฐ์ค‘์ด๋ผ๋ฉด read๊ฐ€ ๋๋‚˜๊ธฐ ์ „์—๋Š” write๋ฅผ ํ•  ์ˆ˜๊ฐ€ ์—†๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

2) ์ต๋ช… ํŒŒ์ดํ”„ (Anonymous Pipe)

โœ… ๊ฐœ์š”

ํ•ญ๋ชฉ์„ค๋ช…
ํŠน์ง•์ด๋ฆ„์ด ์—†๋Š” ์ž„์‹œ์ ์ธ ํŒŒ์ดํ”„
ํ†ต์‹  ๋ฐฉ์‹๋‹จ๋ฐฉํ–ฅ
์‚ฌ์šฉ ์กฐ๊ฑด๊ณตํ†ต ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง„ ํ”„๋กœ์„ธ์Šค ๊ฐ„ (ex. ๋ถ€๋ชจ-์ž์‹)
์ƒ์„ฑ ํ•จ์ˆ˜pipe() ์‹œ์Šคํ…œ ์ฝœ
๋ฐ์ดํ„ฐ ํ๋ฆ„FIFO (๋จผ์ € ์“ด ๊ฒŒ ๋จผ์ € ์ฝํž˜)
์ œํ•œ๊ฐ™์€ ๋ถ€๋ชจ๋ฅผ ๊ฐ€์ง„ ํ”„๋กœ์„ธ์Šค ๊ฐ„์—๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ

๐Ÿ’ก ์˜ˆ์‹œ

r, w = os.pipe()
os.write(w, b'hello')
print(os.read(r, 5))  # b'hello'

โš  ๋‹จ์ 

  • ์Œ๋ฐฉํ–ฅ ํ†ต์‹ ์ด ์–ด๋ ค์›€: write์šฉ, read์šฉ ํŒŒ์ดํ”„ 2๊ฐœ ํ•„์š”
  • block ๋ชจ๋“œ: read()๊ฐ€ ๋Œ€๊ธฐ ์ค‘์ด๋ฉด write()๋„ ๋ง‰ํž™๋‹ˆ๋‹ค

3) ๋ช…๋ช…๋œ ํŒŒ์ดํ”„ (Named Pipe, FIFO)

1) Named Pipe์˜ ๊ฐœ๋…

Named Pipe(๋ช…๋ช…๋œ ํŒŒ์ดํ”„)๋Š” ์ด๋ฆ„์ด ๋ถ€์—ฌ๋œ ํŒŒ์ผ์„ ํ†ตํ•ด ์ „ํ˜€ ๊ด€๋ จ ์—†๋Š” ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ๋„ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๋ฆฌ๋ˆ…์Šค IPC(ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ) ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

  • ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
  • FIFO (First-In-First-Out) ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
  • ํŒŒ์ผ ์‹œ์Šคํ…œ์— ๋“ฑ๋ก๋œ ์ด๋ฆ„์„ ํ†ตํ•ด ํ”„๋กœ์„ธ์Šค๋“ค์ด ์ด ํŒŒ์ดํ”„๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ•ญ๋ชฉ์„ค๋ช…
ํŠน์ง•์ด๋ฆ„์ด ์žˆ๋Š” ํŒŒ์ดํ”„ ํŒŒ์ผ์„ ํ†ตํ•ด ํ†ต์‹ 
ํ†ต์‹  ๋ฐฉ์‹๋‹จ๋ฐฉํ–ฅ
์‚ฌ์šฉ ์กฐ๊ฑด์™„์ „ํžˆ ๋…๋ฆฝ์ ์ธ ํ”„๋กœ์„ธ์Šค ๊ฐ„์—๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
์ƒ์„ฑ ๋ฐฉ๋ฒ•mkfifo() ์‹œ์Šคํ…œ ์ฝœ ๋˜๋Š” mkfifo ๋ช…๋ น์–ด
๋ฐ์ดํ„ฐ ํ๋ฆ„FIFO ๊ตฌ์กฐ
ํŒŒ์ผ ์‹œ์Šคํ…œ ์ƒ ์กด์žฌโœ” (ex. /tmp/mypipe)

2) ์ต๋ช… ํŒŒ์ดํ”„์™€์˜ ์ฐจ์ด์ 

ํ•ญ๋ชฉ์ต๋ช… ํŒŒ์ดํ”„ (Anonymous)๋ช…๋ช…๋œ ํŒŒ์ดํ”„ (Named)
์ด๋ฆ„์—†์Œ์žˆ์Œ (/tmp/mypipe ๋“ฑ)
์‚ฌ์šฉ ๋ฒ”์œ„๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ์‚ฌ์šฉ ๊ฐ€๋Šฅ์™„์ „ํžˆ ๋ณ„๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
์ƒ์„ฑ ๋ฐฉ์‹pipe() ํ•จ์ˆ˜mkfifo ๋ช…๋ น์–ด ๋˜๋Š” mkfifo() ํ•จ์ˆ˜
์กด์žฌ ์œ„์น˜๋ฉ”๋ชจ๋ฆฌ ๋‚ด๋ถ€ํŒŒ์ผ ์‹œ์Šคํ…œ ์ƒ์˜ ํŒŒ์ผ๋กœ ์ƒ์„ฑ๋จ

3) Named Pipe์˜ ์ƒ์„ฑ๊ณผ ์‚ฌ์šฉ ํ๋ฆ„

โ–ถ ์ƒ์„ฑ

$ mkfifo /tmp/mypipe
  • ์ด ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด /tmp/mypipe ๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ€์ง„ ํŒŒ์ดํ”„ ํŒŒ์ผ์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

โ–ถ ์‚ฌ์šฉ

ํ„ฐ๋ฏธ๋„ 1 (์“ฐ๊ธฐ ์ธก)

$ echo "์•ˆ๋…• ํ”„๋กœ์„ธ์Šค B!" > /tmp/mypipe

ํ„ฐ๋ฏธ๋„ 2 (์ฝ๊ธฐ ์ธก)

$ cat < /tmp/mypipe
์•ˆ๋…• ํ”„๋กœ์„ธ์Šค B!

โš  ์ฃผ์˜ํ•  ์ 

  • read()์™€ write()๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ blocking ๋ชจ๋“œ์ž…๋‹ˆ๋‹ค.
    ์ฆ‰, ํ•œ์ชฝ์ด ์ค€๋น„๋˜์ง€ ์•Š์œผ๋ฉด ๋‹ค๋ฅธ ์ชฝ๋„ ๋ฉˆ์ถ˜ ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.
  • ์Œ๋ฐฉํ–ฅ ํ†ต์‹ ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด 2๊ฐœ์˜ ํŒŒ์ดํ”„๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ: pipeAtoB, pipeBtoA

โœ… Named Pipe์˜ ํ•ต์‹ฌ ์š”์•ฝ

  • ์ด๋ฆ„ ์žˆ๋Š” ํŒŒ์ผ์„ ์ด์šฉํ•œ ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹  ์ˆ˜๋‹จ
  • ์ „ํ˜€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹  ๊ฐ€๋Šฅ
  • ๋น ๋ฅด๊ณ  ๋‹จ์ˆœํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋ ค๋ฉด ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋ธ”๋กœํ‚น์„ ๊ณ ๋ คํ•ด์•ผ ํ•จ

์ถœ์ฒ˜: https://heeonii.tistory.com/13 [์šฐ๋‹นํƒ•ํƒ• ํžˆ์˜จ์ด๋„ค:ํ‹ฐ์Šคํ† ๋ฆฌ]

๐Ÿ’ก ์˜ˆ์‹œ

# ํŒŒ์ดํ”„ ์ƒ์„ฑ
$ mkfifo mypipe

# ํ„ฐ๋ฏธ๋„ 1
$ echo "Hello" > mypipe

# ํ„ฐ๋ฏธ๋„ 2
$ cat < mypipe
Hello

โš  ๋‹จ์ 

  • ์ต๋ช… ํŒŒ์ดํ”„์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์Œ๋ฐฉํ–ฅ ํ†ต์‹ ์„ ์œ„ํ•ด 2๊ฐœ ํ•„์š”
  • ๋ธ”๋กœํ‚น(blocking) ํŠน์„ฑ: ์ฝ๊ธฐ/์“ฐ๊ธฐ๊ฐ€ ์„œ๋กœ ๊ธฐ๋‹ค๋ฆผ

4) ๋‘ ํŒŒ์ดํ”„ ๋น„๊ต ์ •๋ฆฌ

ํ•ญ๋ชฉ์ต๋ช… ํŒŒ์ดํ”„ (Anonymous Pipe)๋ช…๋ช…๋œ ํŒŒ์ดํ”„ (Named Pipe)
์ด๋ฆ„์—†์Œ์žˆ์Œ (ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์ƒ์„ฑ)
์ƒ์„ฑ ๋ฐฉ์‹pipe()mkfifo() ๋˜๋Š” ๋ช…๋ น์–ด mkfifo
์‚ฌ์šฉ ๋ฒ”์œ„๋ถ€๋ชจ-์ž์‹ ๋“ฑ ๊ด€๋ จ๋œ ํ”„๋กœ์„ธ์Šค์ „ํ˜€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค ๊ฐ„์—๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
๋ฐฉํ–ฅ์„ฑ๋‹จ๋ฐฉํ–ฅ (์Œ๋ฐฉํ–ฅ์€ 2๊ฐœ ํ•„์š”)๋‹จ๋ฐฉํ–ฅ (์Œ๋ฐฉํ–ฅ์€ 2๊ฐœ ํ•„์š”)
์—ฐ๊ฒฐํŒŒ์ผ ๊ธฐ์ˆ ์ž(File Descriptor) ๊ธฐ๋ฐ˜ํŒŒ์ผ ๊ฒฝ๋กœ(Path) ๊ธฐ๋ฐ˜

์ต๋ช… ํŒŒ์ดํ”„๋Š” ๊ด€๋ จ๋œ ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ, ๋ช…๋ช…๋œ ํŒŒ์ดํ”„๋Š” ์ด๋ฆ„๋งŒ ์•Œ๋ฉด ๋ˆ„๊ตฌ๋‚˜ ํ†ต์‹  ๊ฐ€๋Šฅ!

์ถœ์ฒ˜ : https://heeonii.tistory.com/13

๊ทธ๋ ‡๋‹ค๋ฉด ์Œ๋ฐฉํ–ฅ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋Š”? ์†Œ์ผ“

๋ณด์ถฉ ์ •๋ฆฌ : ๐Ÿ” ํŒŒ์ดํ”„์—์„œ ์Œ๋ฐฉํ–ฅ ํ†ต์‹  ๊ฐ€๋Šฅํ•œ๊ฐ€์š”?

1) ๊ธฐ๋ณธ ํŒŒ์ดํ”„(์ต๋ช…/๋ช…๋ช…๋œ ํŒŒ์ดํ”„)

ํ•ญ๋ชฉ๊ธฐ๋ณธ ํŠน์ง•
ํ†ต์‹  ๋ฐฉํ–ฅ๋‹จ๋ฐฉํ–ฅ (ํ•œ์ชฝ์€ ์“ฐ๊ธฐ, ํ•œ์ชฝ์€ ์ฝ๊ธฐ๋งŒ ๊ฐ€๋Šฅ)
์Œ๋ฐฉํ–ฅ ๊ตฌํ˜„์ฝ๊ธฐ์šฉ ํŒŒ์ดํ”„ + ์“ฐ๊ธฐ์šฉ ํŒŒ์ดํ”„ 2๊ฐœ ๋งŒ๋“ค์–ด์•ผ ํ•จ
์ฐจ๋‹จ ํŠน์„ฑ๊ธฐ๋ณธ์ ์œผ๋กœ read() / write()๋Š” ๋ธ”๋กœํ‚น I/O

โœ… ๊ทธ๋ž˜์„œ ๊ธฐ๋ณธ pipe() ๋˜๋Š” mkfifo()๋งŒ ์‚ฌ์šฉํ•˜๋ฉด ์ง„์ •ํ•œ ์Œ๋ฐฉํ–ฅ ํ†ต์‹ ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

2) ์ง„์งœ ์Œ๋ฐฉํ–ฅ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋Š”?

โœ… ์œ ๋‹‰์Šค ๋„๋ฉ”์ธ ์†Œ์ผ“(Unix Domain Socket)

ํŒŒ์ดํ”„๋ณด๋‹ค ํ•œ ๋‹จ๊ณ„ ์ง„ํ™”ํ•œ ๊ตฌ์กฐ๋กœ, ํ•˜๋‚˜์˜ ์—ฐ๊ฒฐ๋งŒ์œผ๋กœ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

ํ•ญ๋ชฉ์„ค๋ช…
์–‘๋ฐฉํ–ฅ ํ†ต์‹ O (ํ•œ ๊ฐœ์˜ ์†Œ์ผ“์œผ๋กœ read/write ๋ชจ๋‘ ๊ฐ€๋Šฅ)
ํ”„๋กœ์„ธ์Šค ๊ด€๊ณ„๊ด€๊ณ„ ์—†๋Š” ํ”„๋กœ์„ธ์Šค๋ผ๋ฆฌ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
๊ตฌํ˜„ ๋ฐฉ์‹socketpair() ๋˜๋Š” AF_UNIX ์†Œ์ผ“
์„ฑ๋Šฅ๋น ๋ฅด๊ณ , ๋ฉ”๋ชจ๋ฆฌ ๋ณต์‚ฌ๋„ ํšจ์œจ์ 

๐Ÿ“Œ ๋ฆฌ๋ˆ…์Šค์˜ socketpair(AF_UNIX, SOCK_STREAM) ํ•จ์ˆ˜๋Š” ์‹ค์ œ๋กœ ์–‘๋ฐฉํ–ฅ ํŒŒ์ดํ”„๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

3) socketpair()๊ฐ€ ๊ตฌํ˜„๋œ ์˜ˆ (C ์˜ˆ์‹œ)

int fd[2];
socketpair(AF_UNIX, SOCK_STREAM, 0, fd);

// fd[0]๊ณผ fd[1] ๋ชจ๋‘ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๊ฐ€๋Šฅ!

์œ„์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋Š” ํŒŒ์ดํ”„์ฒ˜๋Ÿผ ๋™์ž‘ํ•˜์ง€๋งŒ, ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ์ด ๊ธฐ๋ณธ์ž…๋‹ˆ๋‹ค.

โœ… ๊ฒฐ๋ก 

๊ธฐ๋ณธ PIPE๋Š” ๋‹จ๋ฐฉํ–ฅ์ด์ง€๋งŒ,
์Œ๋ฐฉํ–ฅ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ๋‹ค์Œ 2๊ฐ€์ง€ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ์จ์•ผ ํ•ด์š”:

  1. PIPE๋ฅผ 2๊ฐœ ๋งŒ๋“ค์–ด์„œ ๊ฐ๊ฐ ์ฝ๊ธฐ/์“ฐ๊ธฐ์— ์‚ฌ์šฉ
  2. Unix Domain Socket์„ ์‚ฌ์šฉํ•ด์„œ ์–‘๋ฐฉํ–ฅ์œผ๋กœ ์ฒ˜๋ฆฌ

๐Ÿงต ๋ฆฌ๋ˆ…์Šค์—์„œ์˜ ์†Œ์ผ“(Socket)์€?

1) ์†Œ์ผ“์ด๋ž€?

์†Œ์ผ“์€ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ (IPC) ๋˜๋Š” ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ์–‘๋ฐฉํ–ฅ ํ†ต์‹  ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

์†Œ์ผ“์€ ํฌ๊ฒŒ 2๊ฐ€์ง€๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค:

์ข…๋ฅ˜์šฉ๋„์„ค๋ช…
๋„คํŠธ์›Œํฌ ์†Œ์ผ“์›๊ฒฉ ํ†ต์‹ TCP/UDP๋ฅผ ์ด์šฉํ•œ IP ๊ธฐ๋ฐ˜ ํ†ต์‹ 
์œ ๋‹‰์Šค ๋„๋ฉ”์ธ ์†Œ์ผ“๋กœ์ปฌ ํ†ต์‹ ๊ฐ™์€ ๋จธ์‹  ๋‚ด์˜ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ 

2) ๋ฆฌ๋ˆ…์Šค์—์„œ ์ง€์›ํ•˜๋Š” ๋Œ€ํ‘œ ์†Œ์ผ“๋“ค

์†Œ์ผ“ ์ข…๋ฅ˜ํ”„๋กœํ† ์ฝœ์„ค๋ช…
AF_INETTCP/UDPIPv4 ๋„คํŠธ์›Œํฌ ํ†ต์‹ 
AF_INET6TCP/UDPIPv6 ๋„คํŠธ์›Œํฌ ํ†ต์‹ 
AF_UNIXlocal์œ ๋‹‰์Šค ๋„๋ฉ”์ธ ์†Œ์ผ“ (๊ฐ™์€ ๋จธ์‹  ๋‚ด ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ )
AF_NETLINK์ปค๋„ โ†” ์‚ฌ์šฉ์ž ๊ณต๊ฐ„์ฃผ๋กœ ๋ฆฌ๋ˆ…์Šค ์ปค๋„๊ณผ ์‚ฌ์šฉ์ž ๊ณต๊ฐ„ ๊ฐ„ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ
AF_PACKET์ €์ˆ˜์ค€ ํŒจํ‚ท ์ ‘๊ทผ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค ์ˆ˜์ค€์˜ ํŒจํ‚ท ํ†ต์‹ 

3) ๋ฆฌ๋ˆ…์Šค์—์„œ ์†Œ์ผ“ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์€?

C, Python, Go, Java ๋“ฑ ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด์—์„œ ๋ฆฌ๋ˆ…์Šค ์†Œ์ผ“ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”!

// C์—์„œ ์†Œ์ผ“ ์ƒ์„ฑ ์˜ˆ์‹œ
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
# Python์—์„œ TCP ํด๋ผ์ด์–ธํŠธ ์˜ˆ์‹œ
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(("127.0.0.1", 8080))

๋ฆฌ๋ˆ…์Šค๋Š” ์ด์™€ ๊ฐ™์€ ์†Œ์ผ“์„ ์‹œ์Šคํ…œ ์ฝœ๋กœ ๊ด€๋ฆฌํ•˜๋ฉฐ, /proc ์‹œ์Šคํ…œ์—์„œ๋„ ์†Œ์ผ“ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4) ์œ ๋‹‰์Šค ๋„๋ฉ”์ธ ์†Œ์ผ“๋„ ๋ฆฌ๋ˆ…์Šค์—์„œ ์™„๋ฒฝ ์ง€์›

  • AF_UNIX, AF_LOCAL๋กœ ์ •์˜
  • /tmp/mysocket ๊ฐ™์€ ์‹ค์ œ ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹  ๊ฐ€๋Šฅ
  • socketpair()๋กœ ์–‘๋ฐฉํ–ฅ ํŒŒ์ดํ”„ ๋Œ€์ฒด ๊ฐ€๋Šฅ
int fds[2];
socketpair(AF_UNIX, SOCK_STREAM, 0, fds);
// fds[0], fds[1] โ†’ ์„œ๋กœ ์ฝ๊ณ  ์“ฐ๊ธฐ ๊ฐ€๋Šฅ

๋ฆฌ๋ˆ…์Šค๋Š” ๋„คํŠธ์›Œํฌ๋“  ๋กœ์ปฌ์ด๋“ , ๋‹ค์–‘ํ•œ ์ข…๋ฅ˜์˜ ์†Œ์ผ“ ํ†ต์‹ ์„ ์™„๋ฒฝํ•˜๊ฒŒ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.
ํŒŒ์ดํ”„๋ณด๋‹ค ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•œ IPC ์ˆ˜๋‹จ์œผ๋กœ ์ž์ฃผ ์‚ฌ์šฉ๋ผ์š”!

๊ทธ ์™ธ IPC

๐Ÿ“ฌ ๋ฆฌ๋ˆ…์Šค IPC: ๋ฉ”์‹œ์ง€ ํ, ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ, ๋ฉ”๋ชจ๋ฆฌ ๋งต ์ •๋ฆฌ

์ถœ์ฒ˜ : https://heeonii.tistory.com/13

Message Queue (๋ฉ”์‹œ์ง€ ํ)

โœ… ๊ฐœ๋…

  • ํŒŒ์ดํ”„๊ฐ€ ๋‹จ์ˆœํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ํ˜๋ ค๋ณด๋‚ด๋Š” ํ†ต๋กœ๋ผ๋ฉด, ๋ฉ”์‹œ์ง€ ํ๋Š” '๋ผ๋ฒจ์ด ๋ถ™์€ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ'์ฒ˜๋Ÿผ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ ๋ฉ”์‹œ์ง€๋Š” msgtype์ด๋ผ๋Š” ID ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด, ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ์–ด์š”.
  • ๊ตฌ์กฐ์ฒด ๋‹จ์œ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋ฉฐ, FIFO ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

์ž…์ถœ๋ ฅ ๋ฐฉ์‹์œผ๋กœ๋Š” ์ต๋ช… PIPE์™€ ๋™์ผํ•˜์ง€๋งŒ, ์ปค๋„์—์„œ ๊ด€๋ฆฌํ•˜๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•œ PIPE ์ž…๋‹ˆ๋‹ค. ๊ตฌ์กฐ์ฒด ๊ธฐ๋ฐ˜์œผ๋กœ ํ†ต์‹ ์„ ํ•ฉ๋‹ˆ๋‹ค.

โœ… ๋ฆฌ๋ˆ…์Šค์—์„œ ์–ด๋–ป๊ฒŒ ์“ฐ์ด๋‚˜์š”?

  • ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” msgget(), msgsnd(), msgrcv(), msgctl() ๋“ฑ์˜ ์‹œ์Šคํ…œ ์ฝœ์„ ํ†ตํ•ด ๋ฉ”์‹œ์ง€ ํ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • ์ปค๋„์ด ๋ฉ”์‹œ์ง€ ํ๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ, ํ•œ๊ณ„(ํฌ๊ธฐ ์ œํ•œ)๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”์‹œ์ง€ ํ๊ฐ€ ๊ฝ‰ ์ฐจ๋ฉด msgsnd()๊ฐ€ ๋ธ”๋กœํ‚น๋ฉ๋‹ˆ๋‹ค.

โœ… ํŠน์ง• ์š”์•ฝ

ํ•ญ๋ชฉ๋‚ด์šฉ
ํ†ต์‹  ๋ฐฉํ–ฅ๋‹จ๋ฐฉํ–ฅ (์ผ๋ฐ˜์ ์œผ๋กœ)
๋ฐ์ดํ„ฐ ๋‹จ์œ„๊ตฌ์กฐ์ฒด ๊ธฐ๋ฐ˜ ๋ฉ”์‹œ์ง€
๊ด€๋ฆฌ ์ฃผ์ฒด์ปค๋„
ํŠน์ง•msgtype ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

Memory Map (๋ฉ”๋ชจ๋ฆฌ ๋งต)

โœ… ๊ฐœ๋…

  • Memory Map์€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ํŒŒ์ผ์„ ๋ฉ”๋ชจ๋ฆฌ์— ๋งคํ•‘ํ•ด์„œ ๊ณต์œ ํ•œ๋‹ค๋Š” ์ ์—์„œ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ™์€ ํŒŒ์ผ์„ mmap()ํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ๋ฉด, ์„œ๋กœ ๊ฐ™์€ ํŒŒ์ผ ๋‚ด์šฉ์„ ๊ณต์œ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
  • ์ปค๋„์ด ๋‚ด๋ถ€์ ์œผ๋กœ ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ๋ฉ”๋ชจ๋ฆฌ-ํŒŒ์ผ ๋งคํ•‘์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

โœ… ๋ฆฌ๋ˆ…์Šค์—์„œ ์–ด๋–ป๊ฒŒ ์“ฐ์ด๋‚˜์š”?

=

  • mmap() ์‹œ์Šคํ…œ ์ฝœ์„ ์ด์šฉํ•ด์„œ ํŒŒ์ผ์„ ํŠน์ • ๊ฐ€์ƒ ์ฃผ์†Œ ์˜์—ญ์— ๋งตํ•‘ํ•ฉ๋‹ˆ๋‹ค.
  • ๋Œ€๋ถ€๋ถ„์˜ ์šด์˜์ฒด์ œ๋Š” ์‹คํ–‰ ํŒŒ์ผ๋„ ๋ฉ”๋ชจ๋ฆฌ ๋งต ๋ฐฉ์‹์œผ๋กœ ๋กœ๋”ฉํ•ฉ๋‹ˆ๋‹ค. (execve() ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉ๋จ)
  • ๊ณต์œ  ๋ชจ๋“œ(MAP_SHARED)์™€ ๊ฐœ์ธ ๋ชจ๋“œ(MAP_PRIVATE)๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ์–ด์š”.

โœ… ํŠน์ง• ์š”์•ฝ

ํ•ญ๋ชฉ๋‚ด์šฉ
ํ†ต์‹  ๋ฐฉํ–ฅ์–‘๋ฐฉํ–ฅ (MAP_SHARED ์‚ฌ์šฉ ์‹œ)
๋ฐ์ดํ„ฐ ๋‹จ์œ„ํŒŒ์ผ ๊ธฐ๋ฐ˜
๊ด€๋ฆฌ ์ฃผ์ฒด์ปค๋„ (ํŒŒ์ผ ์‹œ์Šคํ…œ + ๋ฉ”๋ชจ๋ฆฌ ๋งคํ•‘)
ํŠน์ง•๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ๊ณต์œ ์— ์ ํ•ฉ, ํŒŒ์ผ ๊ธฐ๋ฐ˜

๐Ÿ” ์„ธ๋งˆํฌ์–ด (Semaphore)

์„ธ๋งˆํฌ์–ด๋Š” ๋ฆฌ๋ˆ…์Šค์—์„œ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” IPC ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ํŠนํžˆ, ๊ณต์œ  ์ž์›์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜์—ฌ ๋™์‹œ์„ฑ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

โœ… ๋ฆฌ๋ˆ…์Šค์—์„œ์˜ ์„ธ๋งˆํฌ์–ด ์‚ฌ์šฉ

๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ์„ธ๋งˆํฌ์–ด๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค:

  1. System V ์„ธ๋งˆํฌ์–ด: semget(), semop(), semctl() ๋“ฑ์˜ ์‹œ์Šคํ…œ ์ฝœ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  2. POSIX ์„ธ๋งˆํฌ์–ด:
    • Unnamed ์„ธ๋งˆํฌ์–ด: sem_init(), sem_wait(), sem_post(), sem_destroy() ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ฃผ๋กœ ์Šค๋ ˆ๋“œ ๊ฐ„ ๋™๊ธฐํ™”์— ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.
    • Named ์„ธ๋งˆํฌ์–ด: sem_open(), sem_close(), sem_unlink() ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋™๊ธฐํ™”์— ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”ง ์˜ˆ์ œ

#include <semaphore.h>
#include <pthread.h>

sem_t sem;

void* thread_func(void* arg) {
    sem_wait(&sem);
    // ์ž„๊ณ„ ์˜์—ญ
    sem_post(&sem);
    return NULL;
}

int main() {
    sem_init(&sem, 0, 1);
    pthread_t t1, t2;
    pthread_create(&t1, NULL, thread_func, NULL);
    pthread_create(&t2, NULL, thread_func, NULL);
    pthread_join(t1, NULL);
    pthread_join(t2, NULL);
    sem_destroy(&sem);
    return 0;
}

์ด ์˜ˆ์ œ๋Š” ๋‘ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ์„ธ๋งˆํฌ์–ด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž„๊ณ„ ์˜์—ญ์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ œ์–ดํ•˜๋Š” ๋ชจ์Šต์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๐Ÿ“ก ์›๊ฒฉ ํ”„๋กœ์‹œ์ € ํ˜ธ์ถœ (RPC)

RPC(Remote Procedure Call)๋Š” ๋‹ค๋ฅธ ์ฃผ์†Œ ๊ณต๊ฐ„์— ์žˆ๋Š” ํ”„๋กœ์‹œ์ €๋‚˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ†ต์‹  ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… ๋ฆฌ๋ˆ…์Šค์—์„œ์˜ RPC ์‚ฌ์šฉ

๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ๋‹ค์–‘ํ•œ RPC ๊ตฌํ˜„์ฒด๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ONC RPC: ๋ฆฌ๋ˆ…์Šค์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” RPC ๊ตฌํ˜„์ฒด๋กœ, rpcgen ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  • gRPC: Google์—์„œ ๊ฐœ๋ฐœํ•œ ๊ณ ์„ฑ๋Šฅ, ๋ฒ”์šฉ ์˜คํ”ˆ ์†Œ์Šค RPC ํ”„๋ ˆ์ž„์›Œํฌ๋กœ, HTTP/2์™€ Protocol Buffers๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ”ง ์˜ˆ์ œ (ONC RPC)

  1. ์ธํ„ฐํŽ˜์ด์Šค ์ •์˜ (example.x):
program EXAMPLE_PROG {
    version EXAMPLE_VERS {
        int add(int, int) = 1;
    } = 1;
} = 0x20000001;
  1. ์ฝ”๋“œ ์ƒ์„ฑ:
rpcgen example.x
  1. ์„œ๋ฒ„ ๋ฐ ํด๋ผ์ด์–ธํŠธ ๊ตฌํ˜„: ์ƒ์„ฑ๋œ ์Šคํ… ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์œผ๋กœ ๋ฆฌ๋ˆ…์Šค์—์„œ RPC๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“‹ IPC ๋ฐฉ์‹ ์š”์•ฝํ‘œ

IPC ์ข…๋ฅ˜PIPENamed PIPEMessage QueueShared MemoryMemory MapSocketSemaphoreRPC
์šฉ๋„๋ถ€๋ชจ ์ž์‹ ๊ฐ„ ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์™€ ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์™€ ๋‹จ๋ฐฉํ–ฅ ํ†ต์‹ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์™€ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์™€ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ ๊ฐ„ ์–‘๋ฐฉํ–ฅ ํ†ต์‹ ๊ณต์œ  ์ž์› ์ ‘๊ทผ ์ œ์–ด ๋ฐ ๋™๊ธฐํ™”๋‹ค๋ฅธ ์‹œ์Šคํ…œ ํ•จ์ˆ˜ ์›๊ฒฉ ํ˜ธ์ถœ
๊ณต์œ  ๋งค๊ฐœ์ฒดํŒŒ์ผํŒŒ์ผ๋ฉ”๋ชจ๋ฆฌ๋ฉ”๋ชจ๋ฆฌํŒŒ์ผ + ๋ฉ”๋ชจ๋ฆฌ์†Œ์ผ“๋ฉ”๋ชจ๋ฆฌ (์นด์šดํ„ฐ ๊ธฐ๋ฐ˜)๋„คํŠธ์›Œํฌ (TCP/IP, gRPC ๋“ฑ)
ํ†ต์‹ ๋‹จ์œ„streamstream๊ตฌ์กฐ์ฒด๊ตฌ์กฐ์ฒดํŽ˜์ด์ง€stream์ •์ˆ˜ (์นด์šดํ„ฐ, ํ”Œ๋ž˜๊ทธ)ํ•จ์ˆ˜ ํ˜ธ์ถœ (์š”์ฒญ/์‘๋‹ต ๋ฉ”์‹œ์ง€)
ํ†ต์‹ ๋ฐฉํ–ฅ๋‹จ๋ฐฉํ–ฅ๋‹จ๋ฐฉํ–ฅ๋‹จ๋ฐฉํ–ฅ์–‘๋ฐฉํ–ฅ์–‘๋ฐฉํ–ฅ์–‘๋ฐฉํ–ฅ์ œ์–ด ์ค‘์‹ฌ (๋ฐ์ดํ„ฐ ์ „๋‹ฌ X)์–‘๋ฐฉํ–ฅ
  • Semaphore๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ง์ ‘ ์ „๋‹ฌํ•˜์ง€ ์•Š์ง€๋งŒ, ์ž„๊ณ„ ์˜์—ญ ๋ณดํ˜ธ์™€ ๋™๊ธฐํ™”์— ํ•ต์‹ฌ์ ์ธ IPC ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
  • RPC๋Š” ๋‹ค๋ฅธ ์ปดํ“จํ„ฐ๋‚˜ ํ”„๋กœ์„ธ์Šค์—์„œ ์‹คํ–‰ ์ค‘์ธ ํ•จ์ˆ˜๋ฅผ ๋งˆ์น˜ ๋‚ด ํ•จ์ˆ˜์ฒ˜๋Ÿผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” IPC์ž…๋‹ˆ๋‹ค. ๋ถ„์‚ฐ ์‹œ์Šคํ…œ์—์„œ ๋งค์šฐ ์ค‘์š”ํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ผ๋‹จ, ์„ธ๋งˆํฌ์–ด๋Š” IPC ๋ฐฉ์‹์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๋…ผ์˜์‚ฌํ•ญ์ด ๋‚˜์™”๋‹ค.

๐Ÿ”’ ๋ฆฌ๋ˆ…์Šค์—์„œ์˜ ๋ฐฐํƒ€์  ์ œ์–ด(Mutual Exclusion)

โœ… ๋ฐฐ๊ฒฝ ์„ค๋ช…

์šด์˜์ฒด์ œ์—์„œ ๋™์‹œ์— ํ•˜๋‚˜ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์›์— ์ ‘๊ทผํ•˜๋ ค ํ•  ๋•Œ, ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ์‹œ๋กœ, ์šฐ๋ถ„ํˆฌ์—์„œ ์‚ฌ์šฉํ•˜๋Š” APT ํŒจํ‚ค์ง€ ์‹œ์Šคํ…œ์ด ์žˆ์–ด์š”:

  • ๋‘ ๊ฐœ ์ด์ƒ์˜ apt ๋ช…๋ น์ด ๋™์‹œ์— ์‹คํ–‰๋˜๋ฉด ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†์ƒ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ
  • ์ด๋ฅผ ๋ง‰๊ธฐ ์œ„ํ•ด ์‹œ์Šคํ…œ์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ apt๋งŒ ์‹คํ–‰๋˜๋„๋ก ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค

์ด๋Ÿฌํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์šฐ๋ฆฌ๋Š” ๋ฐฐํƒ€์  ์ œ์–ด(Exclusive Control) ๋˜๋Š” ์ƒํ˜ธ ๋ฐฐ์ œ(Mutual Exclusion) ๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค.

๐Ÿงช ์‹คํ—˜: ํŒŒ์ผ ์ฆ๊ฐ€ ์Šคํฌ๋ฆฝํŠธ inc.sh

#!/bin/bash
TMP=$(cat count)
echo $((TMP + 1)) > count
  • ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” count ํŒŒ์ผ์„ ์ฝ๊ณ  ๊ฐ’์— 1์„ ๋”ํ•ฉ๋‹ˆ๋‹ค.
  • 1000๋ฒˆ ์ˆœ์ฐจ ์‹คํ–‰ โ†’ ์ •์ƒ์ ์œผ๋กœ 1000์ด ๋จ
  • ๊ทธ๋Ÿฌ๋‚˜ ๋ณ‘๋ ฌ(&)๋กœ ์‹คํ–‰ํ•˜๋ฉด ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฒฐ๊ณผ (์˜ˆ: 18) ๊ฐ€ ์ถœ๋ ฅ๋จ

์™œ ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ• ๊นŒ์š”?

A ํ”„๋กœ์„ธ์Šค๊ฐ€ count ํŒŒ์ผ์—์„œ ์ฝ์Œ โ†’ ๊ฐ’ 0
B ํ”„๋กœ์„ธ์Šค๋„ count ํŒŒ์ผ์—์„œ ์ฝ์Œ โ†’ ๊ฐ’ 0
A๊ฐ€ count ํŒŒ์ผ์— 1 ์”€
B๋„ count ํŒŒ์ผ์— 1 ์”€
โ†’ ์ตœ์ข… ๊ฒฐ๊ณผ๋Š” '1' (๋‘˜ ๋‹ค 1์”ฉ ๋”ํ–ˆ์ง€๋งŒ ์‹ค์ œ ์ฆ๊ฐ€๋Š” 1)

์ด์ฒ˜๋Ÿผ ํŒŒ์ผ ์ž…์ถœ๋ ฅ์ด ์•„ํ† ๋ฏนํ•˜์ง€ ์•Š์•„์„œ ์ค‘๊ฐ„์— ๋ผ์–ด๋“œ๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊น๋‹ˆ๋‹ค.

๐Ÿ’ฅ ์•„ํ† ๋ฏนํ•˜์ง€ ์•Š์•„์„œ๊ฐ€ ๋ญ˜๊นŒ?

์•„ํ† ๋ฏน(Atomic)์ด๋ž€ ๋ง์€ ์›์ž์ฒ˜๋Ÿผ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๋‹จ์œ„์˜ ๋™์ž‘์ด๋ผ๋Š” ๋œป์ด์—์š”.

์ฆ‰, ์ค‘๊ฐ„์— ๋Š๊ธฐ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ž‘์—…์ด ๋ผ์–ด๋“ค ์ˆ˜ ์—†๋Š” ์—ฐ์‚ฐ์„ ๋งํ•ด์š”.

๐Ÿ“ฆ ๋น„์œ ํ•ด๋ณผ๊ฒŒ์š”

  • ์–ด๋–ค ์‚ฌ๋žŒ์ด ๋ฌธ์„ ์—ด๊ณ  ๋“ค์–ด๊ฐ€์„œ ๋‹ซ๋Š”๋‹ค๋Š” ์ž‘์—…์„ ํ•œ๋‹ค๊ณ  ํ•ด๋ด์š”.
  • ๊ทธ๋Ÿฐ๋ฐ ๋ฌธ ์—ด๊ธฐ โ†’ ๋“ค์–ด๊ฐ€๊ธฐ โ†’ ๋ฌธ ๋‹ซ๊ธฐ๊ฐ€ ํ•˜๋‚˜์˜ ์™„์ „ํ•œ ์ผ(์•„ํ† ๋ฏน)์ด์–ด์•ผ ์•ˆ์ „ํ•˜์ฃ ?

๊ทธ๋Ÿฐ๋ฐ ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋ผ์–ด๋“ค ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ฒ ์ฃ :

A๊ฐ€ ๋ฌธ์„ ์—ด์—ˆ๋Š”๋ฐ B๊ฐ€ ๋จผ์ € ๋“ค์–ด์™€๋ฒ„๋ฆผ
โ†’ A, B ๋‘˜ ๋‹ค ๋“ค์–ด๊ฐ€๊ฒŒ ๋จ โ†’ ์ถฉ๋Œ ๋ฐœ์ƒ

๐Ÿ’ป ๊ทธ๋Ÿผ ํŒŒ์ผ ์ž…์ถœ๋ ฅ์—์„œ ์™œ ๋ฌธ์ œ๊ฐ€ ๋˜๋‚˜์š”?

์ž, inc.sh ์˜ˆ์‹œ๋ฅผ ๋‹ค์‹œ ๋ณด๋ฉด:

TMP=$(cat count)       # 1๏ธโƒฃ ํŒŒ์ผ ์ฝ๊ธฐ
echo $((TMP + 1)) > count   # 2๏ธโƒฃ 1 ๋”ํ•ด์„œ ๋‹ค์‹œ ์“ฐ๊ธฐ

์ด ์ž‘์—…์€ ๊ฒ‰๋ณด๊ธฐ์—” ํ•˜๋‚˜์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ๋‘ ๊ฐœ์˜ ๋…๋ฆฝ๋œ ์ž‘์—…์ด์—์š”.

์ฆ‰, ์ฝ๊ณ (cat) โ†’ ๊ณ„์‚ฐ โ†’ ์“ฐ๊ณ (echo) ์ด 3๋‹จ๊ณ„๊ฐ€ ํ•˜๋‚˜์˜ ์•„ํ† ๋ฏน ์ž‘์—…์ด ์•„๋‹Œ ๊ฑฐ์˜ˆ์š”.

๊ทธ๋ž˜์„œ ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ผ์–ด๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

๐Ÿงช ์‹ค์ œ ๋ฌธ์ œ ์ƒํ™ฉ

# ๋‘ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋  ๋•Œ

A: cat count  # count = 0 ์ฝ์Œ
B: cat count  # count = 0 ์ฝ์Œ
A: echo 1 > count
B: echo 1 > count

๐Ÿ’ฅ ์‹ค์ œ๋กœ๋Š” ๋‘ ๋ฒˆ ์ฆ๊ฐ€ํ–ˆ์–ด์•ผ ํ•˜๋Š”๋ฐ,
โ†’ ๊ฒฐ๊ณผ๋Š” 1๋งŒ ๋ฐ˜์˜๋จ (B๊ฐ€ A๋ฅผ ๋ฎ์–ด์”€)

ํŒŒ์ผ ์ž…์ถœ๋ ฅ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ "์•„ํ† ๋ฏนํ•˜์ง€ ์•Š๋‹ค"
โ†’ ์ฆ‰, ์ค‘๊ฐ„์— ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ผ์–ด๋“ค ์ˆ˜ ์žˆ์–ด์„œ ์ถฉ๋Œ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Œ
โ†’ ๊ทธ๋ž˜์„œ flock, semaphore, mutex ๊ฐ™์€ ๋ฝ ๋„๊ตฌ๋กœ ๋ณดํ˜ธํ•ด์•ผ ํ•จ

๐Ÿšซ ์ž˜๋ชป๋œ ๋ฐฐํƒ€์  ์ œ์–ด ์˜ˆ์‹œ: inc-wrong-lock.sh

#!/bin/bash
while; do
  if [ ! -e lock ]; then  # 1) ๋ฝ ์—†๋„ค?
    break                 # 2) ๋“ค์–ด๊ฐ€์ž!
  fi
done

touch lock               # 3) ๋ฝ ๊ฑธ๊ธฐ (๋Šฆ์—ˆ์–ด์š”!)
TMP=$(cat count)
echo $((TMP + 1)) > count
rm -f lock
  • ์ด ๋ฐฉ์‹์€ lock ํŒŒ์ผ ์กด์žฌ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•œ ๋’ค ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹
  • ํ•˜์ง€๋งŒ touch lock ์ „๊นŒ์ง€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ผ์–ด๋“ค ์ˆ˜ ์žˆ์Œ
  • ๊ฒฐ๊ตญ ๋™์‹œ ์ ‘๊ทผ ๋ฐฉ์ง€์— ์‹คํŒจ
์ˆœ์„œA ํ”„๋กœ์„ธ์ŠคB ํ”„๋กœ์„ธ์Šค
1lock ํŒŒ์ผ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ โ†’ ์—†์Œlock ํŒŒ์ผ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ โ†’ ์—†์Œ
2"์ข‹์•„, ๋“ค์–ด๊ฐ„๋‹ค!""์ข‹์•„, ๋‚˜๋„ ๋“ค์–ด๊ฐ„๋‹ค!"
3touch locktouch lock
4count ์ฝ๊ณ  1 ๋”ํ•จcount ์ฝ๊ณ  1 ๋”ํ•จ
5๊ฐ™์€ ๊ฐ’์„ count์— ์”€๊ฐ™์€ ๊ฐ’์„ count์— ์”€

๊ฒฐ๊ตญ ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ๊ฒฐ๊ณผ๋งŒ ๋ฐ˜์˜๋˜๊ณ , ๋‚˜๋จธ์ง€๋Š” ๋ฎ์–ด์“ฐ๊ธฐ ๋‹นํ•จ!

์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ํ”ผํ•˜๋ ค๋ฉด count ๊ฐ’์„ ์ฝ์–ด์„œ 1์„ ๋”ํ•˜๊ณ  ๊ทธ ๊ฐ’์„ count ํŒŒ์ผ์— ๋‹ค์‹œ ์“ฐ๋Š” ์ฒ˜๋ฆฌ๊ฐ€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ inc.sh ํ”„๋กœ๊ทธ๋žจ์—์„œ๋งŒ ์‹คํ–‰๋˜๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฑธ ์‹ค์ œ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์ƒํ˜ธ ๋ฐฐ์ œ์ž…๋‹ˆ๋‹ค

โœ… ์˜ฌ๋ฐ”๋ฅธ ๋ฐฐํƒ€์  ์ œ์–ด: flock ์‚ฌ์šฉ ์˜ˆ์‹œ

โœ” flock์„ ์ด์šฉํ•œ inc-lock.sh

#!/bin/bash
flock lock ./inc.sh
  • flock ๋ช…๋ น์€ ํŒŒ์ผ์— ๋ฝ์„ ์„ค์ •ํ•ด์„œ ์ค‘๋ณต ์‹คํ–‰์„ ๋ง‰์•„์คŒ
  • ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ์ ‘๊ทผํ•ด๋„ ์ž๋™์œผ๋กœ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰๋จ
  • ๊ฒฐ๊ตญ ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ์ •ํ™•ํžˆ 1000

๐Ÿง  ๊ฐœ๋… ์ •๋ฆฌ

์šฉ์–ด์˜๋ฏธ
ํฌ๋ฆฌํ‹ฐ์ปฌ ์„น์…˜(์ž„๊ณ„๊ตฌ์—ญ)๋™์‹œ์— ์‹คํ–‰๋˜๋ฉด ์•ˆ ๋˜๋Š” ์ฝ”๋“œ ๊ตฌ๊ฐ„
์•„ํ† ๋ฏน ์ฒ˜๋ฆฌ์™ธ๋ถ€์—์„œ ๋ดค์„ ๋•Œ ํ•˜๋‚˜์˜ ์ฒ˜๋ฆฌ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ์—ฐ์‚ฐ
File LockํŠน์ • ํŒŒ์ผ์— ๋ฝ์„ ๊ฑธ์–ด ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ์ ‘๊ทผ์„ ์ œ์–ด
  • ํฌ๋ฆฌํ‹ฐ์ปฌ ์„น์…˜ : inc.sh ํ”„๋กœ๊ทธ๋žจ์ด๋ผ๋ฉด count ๊ฐ’์„ ์ฝ์–ด์„œ 1์„ ๋”ํ•˜๊ณ  count ํŒŒ์ผ์— ๋‹ค์‹œ ์“ฐ๋Š” ์ฒ˜๋ฆฌ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Œ ๋ฆฌ๋ˆ…์Šค์—์„œ ๋ฐฐํƒ€์  ์ œ์–ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•๋“ค

๋ฐฉ์‹๋ฆฌ๋ˆ…์Šค ์ง€์› ์—ฌ๋ถ€ํŠน์ง•
flock()โœ… ์ง€์›๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋ฝ
fcntl()โœ… ์ง€์›์ข€ ๋” ์ •๋ฐ€ํ•œ ๋ฝ ์ œ์–ด ๊ฐ€๋Šฅ
semaphoreโœ… ์ง€์›๋ฉ”๋ชจ๋ฆฌ ๋™๊ธฐํ™” ๊ธฐ๋ฐ˜ ๋ฝ
pthread_mutexโœ… (์Šค๋ ˆ๋“œ ์ „์šฉ)์Šค๋ ˆ๋“œ ๊ฐ„ ๋ฝ์„ ์œ„ํ•œ ๊ตฌ์กฐ์ฒด

๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” flock ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘์š”ํ•œ ์ž‘์—…์„ "ํ•œ ๋ฒˆ์— ํ•˜๋‚˜"๋งŒ ์ฒ˜๋ฆฌ๋˜๋„๋ก ๋ฐฐํƒ€์  ์ œ์–ด๋ฅผ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿง  ํŒŒ์ผ ๋ฝ(File Lock)์€ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋ ๊นŒ?

1) ๊ณ ๊ธ‰ ์–ธ์–ด ์ˆ˜์ค€์˜ ํŒŒ์ผ ๋ฝ vs CPU ์ˆ˜์ค€ ๋ฝ

์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” flock(), fcntl(), pthread_mutex_lock() ๋“ฑ์„ ์‚ฌ์šฉํ•ด ํŒŒ์ผ์ด๋‚˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฝ์œผ๋กœ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋“ค ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” CPU๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฝ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์ง„์งœ ๋ฝ์€ ๊ธฐ๊ณ„์–ด ์ˆ˜์ค€์—์„œ ๊ตฌํ˜„๋˜๋ฉฐ, ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๊ณ ๊ธ‰ API๋Š” ๊ทธ ์œ„์— ๋งŒ๋“ค์–ด์ง„ ์ถ”์ƒํ™” ๊ณ„์ธต์ผ ๋ฟ์ด์—์š”.

2) ๋ฝ์„ ๊ธฐ๊ณ„์–ด๋กœ ๊ตฌํ˜„ํ•˜๋ฉด?

์ฑ…์—์„œ๋Š” ๊ฐ€์ƒ์˜ ์–ด์…ˆ๋ธ”๋ฆฌ ์–ธ์–ด๋ฅผ ํ†ตํ•ด ๊ฐ„๋‹จํ•œ ๋ฝ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด ์•„ํ† ๋ฏน(atomic)ํ•˜์ง€ ์•Š์œผ๋ฉด ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๐Ÿงพ ๊ฐ€์ƒ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ (์ฝ”๋“œ 05-07)

start:
  load r0, mem       ; mem์—์„œ ๊ฐ’์„ r0์— ๋กœ๋“œ
  test r0            ; r0์ด 0์ธ์ง€ ํ™•์ธ
  jmpz enter         ; 0์ด๋ฉด (lock ์•ˆ ๊ฑธ๋ฆผ) โ†’ enter
  jmp start          ; ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด โ†’ ๋‹ค์‹œ ์‹œ์ž‘

enter:
  store mem, 1       ; lock ๊ฑธ๊ธฐ
  <ํฌ๋ฆฌํ‹ฐ์ปฌ ์„น์…˜ ์‹คํ–‰>
  store mem, 0       ; lock ํ•ด์ œ

์ด ๋ฐฉ์‹์€ mem์ด 0์ธ์ง€ ์ฝ๊ณ (lock ์ƒํƒœ ํ™•์ธ), 1๋กœ ๋ฐ”๊พธ๊ณ (lock ์„ค์ •), ํฌ๋ฆฌํ‹ฐ์ปฌ ์„น์…˜ ์‹คํ–‰ ํ›„ 0์œผ๋กœ ๋Œ๋ฆฌ๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.

3) โš  ๋ฌธ์ œ์ : ์ด ๋ฐฉ์‹์€ ์•ˆ์ „ํ•˜์ง€ ์•Š๋‹ค!

์œ„ ์ฝ”๋“œ๋Š” ๊ฒ‰๋ณด๊ธฐ์— ์ž˜ ๋™์ž‘ํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ๋ฌธ์ œ๊ฐ€ ๋งŽ์Šต๋‹ˆ๋‹ค. ์™œ์ผ๊นŒ์š”?

  • load โ†’ test โ†’ store ๊ณผ์ •์ด ๋ถ„๋ฆฌ๋˜์–ด ์žˆ์–ด์„œ ์ค‘๊ฐ„์— ๋ผ์–ด๋“ค ์ˆ˜ ์žˆ์Œ
  • ์˜ˆ๋ฅผ ๋“ค์–ด ๋‘ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๊ฐ€ ๊ฑฐ์˜ ๋™์‹œ์— load๋ฅผ ์‹คํ–‰ํ•˜๋ฉด, ๋‘˜ ๋‹ค mem = 0์œผ๋กœ ํŒ๋‹จํ•˜๊ณ  ๋ฝ์„ ํš๋“ํ•˜๋ ค๊ณ  ํ•  ์ˆ˜ ์žˆ์Œ
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ ๋‘ ์Šค๋ ˆ๋“œ๊ฐ€ ๋™์‹œ์— ํฌ๋ฆฌํ‹ฐ์ปฌ ์„น์…˜์— ์ง„์ž…ํ•˜๋Š” ๋ฌธ์ œ ๋ฐœ์ƒ โ†’ ๋ฝ ์‹คํŒจ!

4) ํ•ด๊ฒฐ์ฑ…: ์•„ํ† ๋ฏน ๋ช…๋ น์–ด ์‚ฌ์šฉ

๋Œ€๋ถ€๋ถ„์˜ ํ˜„๋Œ€ CPU๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด "์•„ํ† ๋ฏน ์—ฐ์‚ฐ(Atomic Instruction)"์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋Œ€ํ‘œ์ ์ธ ์˜ˆ:

๋ช…๋ น์–ด ์ด๋ฆ„์„ค๋ช…
Test and Set๊ฐ’์„ ํ™•์ธํ•œ ํ›„ ๋ณ€๊ฒฝ
Compare and Swap์กฐ๊ฑด์— ๋งž์œผ๋ฉด ๊ฐ’์„ ๋ณ€๊ฒฝ
Exchange (XCHG)๋‘ ๊ฐ’์„ ๊ตํ™˜ (๋ฝ ๊ตฌํ˜„์— ์ž์ฃผ ์‚ฌ์šฉ)

์ด๋Ÿฌํ•œ ๋ช…๋ น์–ด๋“ค์€ ์ค‘๊ฐ„์— ๋ผ์–ด๋“ค ์ˆ˜ ์—†๋„๋ก CPU ์ˆ˜์ค€์—์„œ ์™„์ „ํ•œ ์›์ž์„ฑ ๋ณด์žฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

5) ์ฐธ๊ณ  ์•Œ๊ณ ๋ฆฌ์ฆ˜: ํ”ผํ„ฐ์Šจ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜ (Petersonโ€™s Algorithm)

  • ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜์—์„œ ๋‘ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ๋ฝ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ณ ์ „์  ์•Œ๊ณ ๋ฆฌ์ฆ˜
  • ํ˜„๋Œ€ CPU ์•„ํ† ๋ฏน ๋ช…๋ น์ด ๋“ฑ์žฅํ•˜๊ธฐ ์ „๊นŒ์ง€ ์ด๋ก ์ ์œผ๋กœ ์ค‘์š”ํ•œ ๊ธฐ์ดˆ์˜€์–ด์š”
  • ์ง€๊ธˆ๋„ ๋™๊ธฐํ™”์˜ ๊ฐœ๋…์  ์ดํ•ด์— ๋งค์šฐ ์œ ์šฉํ•œ ์ž๋ฃŒ์ž…๋‹ˆ๋‹ค

Peterson's algorithm์€ busy waiting์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ๊ต์œก์  ๋ชฉ์ ์—์„œ ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

์ง„์งœ ๋ฝ์€ CPU ๋‚ด๋ถ€์—์„œ ์•„ํ† ๋ฏน ๋ช…๋ น์–ด๋กœ ๊ตฌํ˜„๋˜๋ฉฐ, ๊ณ ๊ธ‰ ์–ธ์–ด์˜ ๋ฝ ํ•จ์ˆ˜๋“ค์€ ์ด ์•„ํ† ๋ฏน ์—ฐ์‚ฐ ์œ„์— ๋งŒ๋“ค์–ด์ง„ ์ถ”์ƒํ™” ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.

๐Ÿง  ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค์™€ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ, ๊ทธ๋ฆฌ๊ณ  ์ปค๋„ ์Šค๋ ˆ๋“œ vs ์‚ฌ์šฉ์ž ์Šค๋ ˆ๋“œ

1๏ธโƒฃ ๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์˜ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹

ํ˜„๋Œ€ CPU๋Š” ๋ฉ€ํ‹ฐ์ฝ”์–ด๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด, ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์ด ๋งˆ๋ จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋žจ์„ ๋ณ‘๋ ฌ๋กœ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค:

๋ฐฉ์‹์„ค๋ช…
๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค (Multi-process)์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…๋ฆฝ์ ์ธ ํ”„๋กœ๊ทธ๋žจ์„ ๋™์‹œ์— ์‹คํ–‰
๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ (Multi-thread)ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์„ ์—ฌ๋Ÿฌ ํ๋ฆ„(์Šค๋ ˆ๋“œ)์œผ๋กœ ๋‚˜๋ˆ„์–ด ์‹คํ–‰

2๏ธโƒฃ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค: ํ”„๋กœ์„ธ์Šค๋ฅผ ๋‚˜๋ˆ ์„œ ์‹คํ–‰

  • fork() ๋˜๋Š” execve()๋ฅผ ํ†ตํ•ด ๋…๋ฆฝ๋œ ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ
  • ๊ฐ ํ”„๋กœ์„ธ์Šค๋Š” ์ž์‹ ๋งŒ์˜ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ฐ–๊ณ  ์žˆ์œผ๋ฉฐ, ์ž์› ๊ณต์œ ๊ฐ€ ์–ด๋ ค์›€
  • ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ (IPC)์ด ํ•„์š”ํ•จ (์˜ˆ: Pipe, Message Queue ๋“ฑ)

์˜ˆ: ์›น ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ๋งˆ๋‹ค ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑ

3๏ธโƒฃ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ: ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ํ๋ฆ„์„ ๋‚˜๋ˆ”

  • pthread_create() ๋“ฑ์œผ๋กœ ํ”„๋กœ์„ธ์Šค ๋‚ด์— ์—ฌ๋Ÿฌ ํ๋ฆ„ ์ƒ์„ฑ
  • ๋ชจ๋“  ์Šค๋ ˆ๋“œ๋Š” ๊ณต์œ ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„(๊ฐ€์ƒ ์ฃผ์†Œ)์—์„œ ์‹คํ–‰๋จ
  • ์Šค๋ ˆ๋“œ ๊ฐ„ ํ†ต์‹ ์ด ๊ฐ„ํŽธํ•˜์ง€๋งŒ, ๋™๊ธฐํ™” ๋ฌธ์ œ๊ฐ€ ์กด์žฌ (mutex ๋“ฑ ํ•„์š”)

์˜ˆ: ํ•˜๋‚˜์˜ ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—ฌ๋Ÿฌ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์Šค๋ ˆ๋“œ ์‚ฌ์šฉ

4๏ธโƒฃ ์‚ฌ์šฉ์ž ์Šค๋ ˆ๋“œ vs ์ปค๋„ ์Šค๋ ˆ๋“œ

๊ตฌ๋ถ„์‚ฌ์šฉ์ž ์Šค๋ ˆ๋“œ (User-level)์ปค๋„ ์Šค๋ ˆ๋“œ (Kernel-level)
๊ด€๋ฆฌ ์ฃผ์ฒด์‚ฌ์šฉ์ž ๊ณต๊ฐ„์˜ ์Šค๋ ˆ๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ปค๋„
์ƒ์„ฑ/์ „ํ™˜ ๋น„์šฉ๋‚ฎ์Œ๋†’์Œ
์ปค๋„์—์„œ์˜ ์ธ์‹๋ชจ๋“  ์‚ฌ์šฉ์ž ์Šค๋ ˆ๋“œ = ํ•˜๋‚˜์˜ ์ปค๋„ ์Šค๋ ˆ๋“œ๊ฐ๊ฐ ์ปค๋„ ์Šค๋ ˆ๋“œ๋กœ ์ธ์‹
๋ณ‘๋ ฌ์„ฑ์ œํ•œ์  (ํ•œ ๋ฒˆ์— ํ•˜๋‚˜๋งŒ ์‹คํ–‰)์‹ค์ œ ๋ณ‘๋ ฌ ์‹คํ–‰ ๊ฐ€๋Šฅ
์˜ˆ์‹œgoroutine (Go), green thread๋ฆฌ๋ˆ…์Šค ์Šค๋ ˆ๋“œ, Java thread (OS ์—ฐ๋™๋จ)

5๏ธโƒฃ ์Šค์ผ€์ค„๋ง์—์„œ์˜ ์ฐจ์ด์ 

์ปค๋„ ์Šค๋ ˆ๋“œ

  • ์ปค๋„์€ ๊ฐ ์Šค๋ ˆ๋“œ๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์ธ์‹
  • A์˜ ์Šค๋ ˆ๋“œ 0, 1๋„ ๊ฐ๊ฐ ๋…๋ฆฝ์ ์œผ๋กœ CPU๋ฅผ ํ• ๋‹น๋ฐ›์„ ์ˆ˜ ์žˆ์Œ

์‚ฌ์šฉ์ž ์Šค๋ ˆ๋“œ

  • ์ปค๋„ ์ž…์žฅ์—์„œ๋Š” ํ”„๋กœ์„ธ์Šค A์˜ ์Šค๋ ˆ๋“œ 0, 1์„ ๊ตฌ๋ถ„ํ•˜์ง€ ๋ชปํ•จ
  • CPU๋Š” ํ”„๋กœ์„ธ์Šค A ์ „์ฒด์— ํ• ๋‹น๋˜๊ณ , ์Šค๋ ˆ๋“œ ๊ฐ„ ์Šค์ผ€์ค„๋ง์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด๋ถ€์—์„œ ์ฒ˜๋ฆฌ

6๏ธโƒฃ ๊ธฐํƒ€ ์ฐธ๊ณ  ์ •๋ณด

  • ์ปค๋„์ด ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ์ปค๋„ ์Šค๋ ˆ๋“œ๋„ ์กด์žฌํ•จ
    • ps aux์—์„œ [kthreadd], [rcu_gp] ๋“ฑ []๋กœ ๊ฐ์‹ธ์ง„ ์ด๋ฆ„์€ ์ปค๋„ ์Šค๋ ˆ๋“œ
    • PID=2์ธ kthreadd๊ฐ€ ๋ฃจํŠธ์ด๋ฉฐ, ๋‹ค์–‘ํ•œ ์ปค๋„ ์Šค๋ ˆ๋“œ๋ฅผ ์ž์‹์œผ๋กœ ์ƒ์„ฑํ•จ

๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค๋Š” ๋…๋ฆฝ์ ์ธ ์‹คํ–‰ ๋‹จ์œ„, ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋“œ๋Š” ํ•˜๋‚˜์˜ ๊ณต๊ฐ„ ์•ˆ์—์„œ์˜ ๋ณ‘๋ ฌ ํ๋ฆ„์ด๋ฉฐ, ์‚ฌ์šฉ์ž ์Šค๋ ˆ๋“œ๋Š” ๊ฐ€๋ณ์ง€๋งŒ ๋ณ‘๋ ฌ์„ฑ์ด ๋‚ฎ๊ณ , ์ปค๋„ ์Šค๋ ˆ๋“œ๋Š” ๋ฌด๊ฒ์ง€๋งŒ ์ง„์งœ ๋ณ‘๋ ฌ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

profile
๋‚ด ์ง€์‹์„ ๊ธฐ๋กํ•˜์—ฌ, ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ๊ณต์œ ํ•˜์—ฌ ํ•จ๊ป˜ ๋ฐœ์ „ํ•˜๋Š” ์‚ฌ๋žŒ์ด ๋˜๊ณ  ์‹ถ๋‹ค. gitbook์—๋„ ์ •๋ฆฌ์ค‘ ~

0๊ฐœ์˜ ๋Œ“๊ธ€