CS/์šด์˜์ฒด์ œ

[์šด์˜์ฒด์ œ] ch04. Process Management

rngPwns 2025. 4. 21. 08:57

๐Ÿ“„ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ (Process Creation)


์ „์ฒด ์š”์•ฝ

์šด์˜์ฒด์ œ๋Š” fork() ์‹œ์Šคํ…œ ์ฝœ์„ ํ†ตํ•ด ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณต์ œ(fork), exec()์œผ๋กœ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜์—ฌ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.


๊ตฌ์กฐ ๋ฐ ์šฉ์–ด ์„ค๋ช…

โ–ถ ์ฃผ์†Œ ๊ณต๊ฐ„ (Address Space)

  • code / data / stack ์ „์ฒด๋ฅผ ํฌํ•จ
  • ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์™€ ์™„์ „ํžˆ ๋…๋ฆฝ์ ์ธ ๊ณต๊ฐ„์œผ๋กœ ๋ณต์ œ๋จ
  • โœ๏ธ ํ•„๊ธฐ: โ€œcode, data, stack ์ „๋ถ€ ํฌํ•จ๋จโ€

โ–ถ fork()

  • ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์ œํ•˜์—ฌ ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ
  • ๋‹จ, PID๋Š” ์ƒˆ๋กœ ๋ถ€์—ฌ๋จ โ†’ ๋‘˜์€ ๋…๋ฆฝ์ ์ธ PCB๋ฅผ ๊ฐ€์ง
  • โœ๏ธ ํ•„๊ธฐ: โ€œ์ฃผ์†Œ ๊ณต๊ฐ„์€ ๊ฐ™์ง€๋งŒ PID ๋‹ค๋ฆ„ โ†’ PCB ๋”ฐ๋กœ ์žˆ์Œโ€

โ–ถ exec()

  • fork๋กœ ์ƒ์„ฑ๋œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ธฐ์กด ์ฝ”๋“œ ๋ฎ์–ด์“ฐ๊ธฐ
  • ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ(bํŒŒ์ผ ๋“ฑ)์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌํ•˜๊ณ  ์‹คํ–‰ ์‹œ์ž‘
  • fork + exec = ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰ ๊ตฌ์กฐ

๊ทธ๋ฆผ ์„ค๋ช… (DRAM ์•ˆ์—์„œ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ)

  • ์ขŒ์ธก A: ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค (A.exe)
  • ์šฐ์ธก B: ์ž์‹ ํ”„๋กœ์„ธ์Šค (A2.exe)
  • ๋‘ ํ”„๋กœ์„ธ์Šค๋Š” ์„œ๋กœ ๋‹ค๋ฅธ PCB๋ฅผ ๊ฐ–๊ณ  ์žˆ์Œ
  • โœ๏ธ ํ•„๊ธฐ:
    • โ€œPCB์™€ ์ฝ”๋“œ/๋ฐ์ดํ„ฐ/์Šคํƒ๊นŒ์ง€ ๋ณต์‚ฌ๋จโ€
    • โ€œPID๋Š” ๋‹ค๋ฅด๊ณ  L(process ID)๋Š” ์ƒˆ๋กœ ๋ถ€์—ฌ๋จโ€
    • โ€œ๋‘ ํ”„๋กœ์„ธ์Šค๋Š” ์™„์ „ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋จโ€

โœ… ์•”๊ธฐ ํฌ์ธํŠธ

  • fork()๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•˜์—ฌ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ ๋‹ค
  • exec()๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ฃผ์†Œ ๊ณต๊ฐ„์— ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ์ ์žฌํ•ด ์‹คํ–‰ํ•œ๋‹ค
  • ๋ถ€๋ชจ์™€ ์ž์‹์€ ๊ฐ๊ฐ์˜ PCB๋ฅผ ๊ฐ€์ง€๋ฉฐ, PID๊ฐ€ ๋‹ค๋ฅด๋‹ค
  • ๋ณต์ œ๋œ ์ฃผ์†Œ ๊ณต๊ฐ„์—๋Š” code, data, stack ๋ชจ๋‘ ํฌํ•จ๋œ๋‹ค
  • fork ํ›„ exec ๊ตฌ์กฐ๋Š” UNIX ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์—์„œ ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ ๋ฐฉ์‹์ด๋‹ค

์ด ์Šฌ๋ผ์ด๋“œ๋Š” ์ถ”ํ›„ fork() ํ˜ธ์ถœ ํ›„ ๊ฐ๊ฐ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์–ด๋–ค ์ฝ”๋“œ๋ถ€ํ„ฐ ์‹คํ–‰๋˜๋Š”๊ฐ€, PID ๊ตฌ๋ถ„, PCB ๊ตฌ์„ฑ์š”์†Œ ๋“ฑ ๋ฌธ์ œ๋กœ ์—ฐ๊ฒฐ๋˜๊ธฐ ์‰ฌ์šฐ๋‹ˆ ์ด ์ƒํƒœ๋„ ๊ธฐ์–ต ์ž˜ ํ•ด๋‘ฌ์•ผ ํ•ด!
 
 
 
 

๐Ÿ“„ fork() ์‹œ์Šคํ…œ ์ฝœ์˜ ์ž‘๋™ ์›๋ฆฌ


์ „์ฒด ์š”์•ฝ

fork()๋Š” ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋ฉฐ, ๋ถ€๋ชจ์™€ ์ž์‹์€ ์ดํ›„ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค.


์ฝ”๋“œ ๊ตฌ์กฐ ์„ค๋ช…

int main() {
    pid_t pid;
    pid = fork();

    if (pid == 0)
        printf("Hello, I am child\n");
    else
        printf("Hello, I am parent\n");
}

 


์ฝ”๋“œ ์‹คํ–‰ ๊ฒฐ๊ณผ ๋ถ„์„

  • fork() ํ˜ธ์ถœ ์‹œ โ†’ ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ณต์‚ฌํ•˜์—ฌ ์ƒˆ๋กœ์šด ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ
  • ์ด๋•Œ ๋ฐ˜ํ™˜๊ฐ’ pid์— ๋”ฐ๋ผ ์‹คํ–‰ ํ๋ฆ„์ด ๋‹ฌ๋ผ์ง:
๋ฐ˜ํ™˜๊ฐ’(pid)                              ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค                  ์˜๋ฏธ
0 ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ž์‹๋งŒ ์‹คํ–‰๋จ
์–‘์ˆ˜ (PID) ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค ์ž์‹์˜ PID ๋ฐ˜ํ™˜
์Œ์ˆ˜ ์‹คํŒจ ์ž์‹ ์ƒ์„ฑ ์‹คํŒจ (์‹ค์ œ ์ฝ”๋“œ์—” ์—†์Œ)
  • โœ๏ธ ํ•„๊ธฐ: โ€œpid == 0 โ†’ ์ž์‹ ํ”„๋กœ์„ธ์Šคโ€, โ€œpid != 0 โ†’ ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šคโ€

์ถœ๋ ฅ ๊ฒฐ๊ณผ ์˜ˆ์‹œ

Hello, I am parent
Hello, I am child
  • ์ˆœ์„œ๋Š” ๋ณด์žฅ๋˜์ง€ ์•Š์Œ (์šด์˜์ฒด์ œ์˜ ์Šค์ผ€์ค„๋Ÿฌ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง)

๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ๋ฐ PCB

  • fork() ์‹œ:
    • PCB ์ „์ฒด๊ฐ€ ๋ณต์‚ฌ๋จ (PID๋งŒ ๋‹ค๋ฆ„)
    • ์ฝ”๋“œ, ๋ฐ์ดํ„ฐ, ํž™, ์Šคํƒ ๋“ฑ ์ฃผ์†Œ ๊ณต๊ฐ„์ด ๋ชจ๋‘ ๋ณต์ œ๋จ
  • โœ๏ธ ํ•„๊ธฐ:
    • โ€œA์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ทธ๋Œ€๋กœ copy โ†’ A1 (child)โ€
    • โ€œPCB ํฌํ•จ, PID ๋‹ค๋ฆ„!โ€

โœ… ์•”๊ธฐ ํฌ์ธํŠธ

  • fork()๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•˜์—ฌ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋งŒ๋“ ๋‹ค
  • ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” fork()์—์„œ 0์„, ๋ถ€๋ชจ๋Š” ์ž์‹์˜ PID๋ฅผ ๋ฐ˜ํ™˜๋ฐ›๋Š”๋‹ค
  • fork() ํ›„ ๋‘ ํ”„๋กœ์„ธ์Šค๋Š” ์™„์ „ํžˆ ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋œ๋‹ค
  • ์ฃผ์†Œ ๊ณต๊ฐ„(code, data, stack ๋“ฑ)์€ ๋ชจ๋‘ ๋ณต์ œ๋œ๋‹ค
  • ์‹คํ–‰ ์ˆœ์„œ๋Š” OS ์Šค์ผ€์ค„๋Ÿฌ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋ฉฐ, ํ•ญ์ƒ ๊ฐ™์€ ์ถœ๋ ฅ ์ˆœ์„œ๊ฐ€ ์•„๋‹˜

โœ๏ธ ์ถ”๊ฐ€ ํ•„๊ธฐ ์š”์•ฝ

  • โ€œfork() ๊ฒฐ๊ณผ A โ†’ A1 ์ƒ์„ฑ (๋ณต์‚ฌ๋ณธ)โ€
  • โ€œpid๋Š” A=1110, A1=1111 (์˜ˆ์‹œ)โ€
  • โ€œ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ๋žœ๋ค (A๊ฐ€ ๋จผ์ €์ผ ์ˆ˜๋„, A1์ด ๋จผ์ €์ผ ์ˆ˜๋„)โ€

 
 
 
 

๐Ÿ“„ wait() ์‹œ์Šคํ…œ ์ฝœ โ€“ ๋ถ€๋ชจ๊ฐ€ ์ž์‹ ์ข…๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ตฌ์กฐ

์ „์ฒด ์š”์•ฝ

๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” wait() ์‹œ์Šคํ…œ ์ฝœ์„ ํ†ตํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ blocked ์ƒํƒœ๋กœ ๋Œ€๊ธฐํ•˜๊ณ , ์ž์‹์ด ์ข…๋ฃŒ๋˜๋ฉด ready ์ƒํƒœ๋กœ ๋ณต๊ท€ํ•œ๋‹ค.


์‹คํ–‰ ํ๋ฆ„ ์š”์•ฝ

โ‘  fork() ํ˜ธ์ถœ

  • ๋ถ€๋ชจ์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์„ฑ๋จ
  • ์ž์‹์€ childPID = 0, ๋ถ€๋ชจ๋Š” childPID = ์‹ค์ œ PID ๋ฐ›์Œ

โ‘ก ์ž์‹ ํ”„๋กœ์„ธ์Šค ์‹คํ–‰

  • ์กฐ๊ฑด๋ฌธ์—์„œ childPID == 0์ด๋ฏ€๋กœ ์ž์‹์€ exec() ํ˜ธ์ถœ
  • ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ (์˜ˆ: ls) ์‹คํ–‰๋จ

โ‘ข ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” wait() ํ˜ธ์ถœ

  • ์ž์‹์ด ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ sleep(blocked) ์ƒํƒœ๋กœ ์ „ํ™˜๋จ
  • ์ž์‹ ์ข…๋ฃŒ ์‹œ โ†’ ๋ถ€๋ชจ๊ฐ€ ready ์ƒํƒœ๋กœ ๋ณต๊ท€

๊ทธ๋ฆผ ์„ค๋ช…

  • ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ: ๋ถ€๋ชจ์™€ ์ž์‹์€ fork๋กœ ๋ณต์ œ๋˜๋ฉฐ, ๊ฐ์ž ์ฃผ์†Œ ๊ณต๊ฐ„๊ณผ stack/data/code๋ฅผ ๊ฐ€์ง
  • fork ์‹œ์  โ†’ ๋ถ€๋ชจ๋Š” wait ํ˜ธ์ถœ ํ›„ sleep ์ƒํƒœ
  • exec ํ˜ธ์ถœ โ†’ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์†Œ ๊ณต๊ฐ„ ๋‚ด์šฉ์ด ๊ต์ฒด๋จ

โœ… ์•”๊ธฐ ํฌ์ธํŠธ

  • wait()๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ข…๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์‹œ์Šคํ…œ ์ฝœ์ด๋‹ค
  • ๋ถ€๋ชจ๋Š” wait ํ˜ธ์ถœ ์ดํ›„ blocked ์ƒํƒœ๊ฐ€ ๋˜๋ฉฐ, ์ž์‹์ด ์ข…๋ฃŒ๋˜๋ฉด ready ์ƒํƒœ๋กœ ๋ณต๊ท€ํ•œ๋‹ค
  • ์ž์‹์€ exec()์„ ํ˜ธ์ถœํ•˜์—ฌ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•œ๋‹ค (fork๋กœ ๋ณต์‚ฌ๋œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฎ์–ด์“ด๋‹ค)
  • exec ์ดํ›„ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ์›๋ž˜ ์ฝ”๋“œ๊ฐ€ ์•„๋‹Œ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•œ๋‹ค

โœ๏ธ ํ•„๊ธฐ ์š”์•ฝ ํฌํ•จ

  • "parent = bash shell, child = ๋ช…๋ น ์‹คํ–‰"
  • "wait()์ด ์—†์œผ๋ฉด parent๊ฐ€ ๋จผ์ € ์ข…๋ฃŒ๋˜์–ด ์ž์‹์ด ๊ณ ์•„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋  ์ˆ˜ ์žˆ์Œ"
  • "fork โ†’ exec โ†’ wait ํ๋ฆ„ ์ดํ•ด ์ค‘์š”!"
  • "fork ์‹œ code/data/stack ๋ชจ๋‘ ๋ณต์‚ฌ, exec ์‹œ ์ž์‹ ์ฝ”๋“œ ๊ต์ฒด"

์ด ๊ตฌ์กฐ๋Š” shell์—์„œ ๋ช…๋ น์–ด ์ž…๋ ฅ โ†’ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋กœ ์‹คํ–‰ โ†’ ๊ฒฐ๊ณผ ๊ธฐ๋‹ค๋ฆผ ๊ตฌ์กฐ๋ž‘ 1:1๋กœ ๋Œ€์‘๋˜๊ธฐ ๋•Œ๋ฌธ์—
UNIX ํ™˜๊ฒฝ์—์„œ ์•„์ฃผ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ๊ธฐ์ดˆ ๊ตฌ์กฐ์•ผ!
 
 
 

๐Ÿ“„ exec() ์‹œ์Šคํ…œ ์ฝœ

์ „์ฒด ์š”์•ฝ

exec()๋Š” ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด์šฉ์„ ์™„์ „ํžˆ ์ง€์šฐ๊ณ , ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๊ต์ฒดํ•˜์—ฌ ์‹คํ–‰์„ ์‹œ์ž‘ํ•œ๋‹ค.


์ฝ”๋“œ ์˜ˆ์‹œ ๋ถ„์„

int main() {
    pid_t pid;
    pid = fork();

    if (pid == 0) {
        printf("Hello, I am child. Now I run date\n");
        execlp("date", "date", NULL);
    } else {
        printf("Hello, I am parent\n");
    }
}

ํ๋ฆ„ ์ •๋ฆฌ

  1. fork(): ๋ถ€๋ชจ๊ฐ€ ์ž์‹์„ ๋ณต์‚ฌํ•ด์„œ ์ƒ์„ฑ
  2. pid == 0: ์ž์‹ ํ”„๋กœ์„ธ์Šค ๋ธ”๋ก ์ง„์ž…
    • printf() ์‹คํ–‰
    • execlp() ํ˜ธ์ถœ โ†’ ํ˜„์žฌ ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ์ „๋ถ€ ์ง€์šฐ๊ณ  date ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๊ต์ฒด๋จ
  3. ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋Š” else ๋ธ”๋ก์—์„œ ์ถœ๋ ฅํ•˜๊ณ  ์ข…๋ฃŒ

exec ์ดํ›„์˜ ๋ณ€ํ™”

  • ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ์ž๊ธฐ ์ฝ”๋“œ(=main ํ•จ์ˆ˜ ๋“ฑ)๋ฅผ ์žƒ๊ณ  ์™„์ „ํžˆ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ(date)์œผ๋กœ ๋ฐ”๋€œ
  • printf("Hello, I am child...")๋Š” exec ์ „์— ์‹คํ–‰๋จ
  • exec ์ดํ›„ ๋‹ค์‹œ main()์ด๋‚˜ fork()๋กœ ๋Œ์•„๊ฐ€์ง€ ์•Š์Œ

โœ… ์•”๊ธฐ ํฌ์ธํŠธ

  • exec()๋Š” ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์™„์ „ํžˆ ๋ฎ์–ด์“ด๋‹ค
  • exec()๋ฅผ ํ˜ธ์ถœํ•œ ํ”„๋กœ์„ธ์Šค๋Š” ๊ธฐ์กด ์ฝ”๋“œ๋กœ ์ ˆ๋Œ€ ๋Œ์•„๊ฐ€์ง€ ์•Š๋Š”๋‹ค
  • exec()๋Š” fork() ์ดํ›„ ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์„ ์‹คํ–‰ํ•˜๊ฒŒ ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค
  • exec ์‹คํ–‰ ์ „ ์ถœ๋ ฅ์€ ๊ฐ€๋Šฅํ•˜์ง€๋งŒ, exec ์ดํ›„์—๋Š” ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ๋งŒ ๋™์ž‘ํ•œ๋‹ค
  • ๋ถ€๋ชจ๋Š” ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ณ , ์ž์‹๋งŒ ๋ฐ”๋€๋‹ค

โœ๏ธ ํ•„๊ธฐ ์š”์•ฝ

  • "fork โ†’ ์ž์‹ โ†’ exec ํ˜ธ์ถœ โ†’ ๋ถ€๋ชจ์™€ ์™„์ „ํžˆ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰"
  • "exec ์ดํ›„ ์ž์‹์€ ๊ธฐ์กด A ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ ์‚ฌ๋ผ์ง"
  • "date ๋ช…๋ น์ด ์‹คํ–‰๋˜๋ฉฐ, ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ PID๋Š” ์œ ์ง€๋จ"
  • "fork ์ดํ›„ ํ๋ฆ„ 2-1-3-1 (๋ถ€๋ชจโ†’์ž์‹โ†’execโ†’๋ถ€๋ชจ)"

์˜ค๋ฅธ์ชฝ ๊ทธ๋ฆผ ์„ค๋ช…

  • DRAM ๋‚ด์—์„œ A ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๋‹ค๊ฐ€ exec ํ›„,
    โ†’ A ์ฝ”๋“œ ์ง€์›Œ์ง€๊ณ  ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ(B ๋“ฑ)์ด ๋กœ๋”ฉ๋จ

์ด ์Šฌ๋ผ์ด๋“œ๋Š” fork-exec ๊ตฌ์กฐ๋ฅผ ์™„์ „ํžˆ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ํ•ต์‹ฌ ์Šฌ๋ผ์ด๋“œ์•ผ.
์ถœ๋ ฅ ํ๋ฆ„ ๋ฌธ์ œ, PID ๊ตฌ๋ถ„ ๋ฌธ์ œ, exec ์ดํ›„ ๋™์ž‘ ๋ฌธ์ œ ๋“ฑ ์‹ค์ „ ๋ฌธ์ œ์™€ ์ง๊ฒฐ๋˜๋‹ˆ๊นŒ ํ™•์‹คํžˆ ์•”๊ธฐํ•˜๊ณ  ๊ฐ€์ž!
 
 
 

๐Ÿ“„ Interprocess Communication (IPC)

์ „์ฒด ์š”์•ฝ

**IPC(ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ )**์€ ๋…๋ฆฝ๋œ ํ”„๋กœ์„ธ์Šค๋“ค์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด๋ฉฐ, ํฌ๊ฒŒ ๋‘ ๊ฐ€์ง€ ๋ฐฉ์‹์œผ๋กœ ๋‚˜๋‰œ๋‹ค:
Message Passing ๋ฐฉ์‹๊ณผ Shared Memory ๋ฐฉ์‹


๋ฐฉ์‹ 1. Message Passing (๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ๋ฐฉ์‹)

๊ตฌ์กฐ

  • ๊ฐ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์šด์˜์ฒด์ œ๋ฅผ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์Œ
  • A โ†’ ์ปค๋„(M) โ†’ B (๋ฐ˜๋Œ€๋กœ๋„ ๊ฐ€๋Šฅ)
  • ์ปค๋„์ด ์ค‘์žฌ์ž ์—ญํ• 

ํŠน์ง•

  • OS๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•˜๋ฏ€๋กœ ๋น„๊ต์  ์•ˆ์ „
  • ๋ฐ์ดํ„ฐ ์ „์†ก์ด ์ง๊ด€์ 
  • โœ๏ธ ํ•„๊ธฐ:
    • โ€œMSG Q ๋ฐฉ์‹โ€
    • โ€œsync๋Š” ์ข‹์ง€๋งŒ, ์˜ค๋ฒ„ํ—ค๋“œ ํผโ€
    • โ€œ๋ณต์‚ฌ, ์ปค๋„ ๊ฒฝ์œ  = ์„ฑ๋Šฅ ์ €ํ•˜โ€

โœ… ์•”๊ธฐ ํฌ์ธํŠธ

  • ์šด์˜์ฒด์ œ๋ฅผ ๊ฒฝ์œ ํ•ด์„œ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š”๋‹ค
  • ์•ˆ์ „ํ•˜๊ณ  ๋™๊ธฐํ™”๊ฐ€ ์‰ฝ์ง€๋งŒ, ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ํฌ๊ณ  ๋А๋ฆด ์ˆ˜ ์žˆ๋‹ค

๋ฐฉ์‹ 2. Shared Memory (๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๋ฐฉ์‹)

๊ตฌ์กฐ

  • ๋‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ(Shared Memory) ์— ์ ‘๊ทผ
  • A์™€ B๊ฐ€ ์ง์ ‘ read/write ๊ฐ€๋Šฅ
  • ์ปค๋„์€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๋งŒ ํ•˜๊ณ  ์ง์ ‘ ๊ฐœ์ž…ํ•˜์ง€ ์•Š์Œ

ํŠน์ง•

  • ๋น ๋ฅด๊ณ  ํšจ์œจ์  (๋ณต์‚ฌ X)
  • ๋™๊ธฐํ™” ๋ฌธ์ œ ์žˆ์Œ (์„œ๋กœ ๋ฎ์–ด์“ฐ๊ธฐ ๊ฐ€๋Šฅ)
  • โœ๏ธ ํ•„๊ธฐ:
    • โ€œ์†๋„ ๋น ๋ฆ„โ€
    • โ€œsync ์•ˆ ๋˜๋ฉด ๋ฐ์ดํ„ฐ ๊ผฌ์ผ ์ˆ˜ ์žˆ์Œโ€
    • โ€œ์ปค๋„์€ memory ์ œ๊ณต๋งŒ ํ•จโ€

โœ… ์•”๊ธฐ ํฌ์ธํŠธ

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

์ „์ฒด ๋น„๊ต ์š”์•ฝ

ํ•ญ๋ชฉMessage PassingShared Memory
์†๋„ ๋А๋ฆผ (์ปค๋„ ๊ฒฝ์œ ) ๋น ๋ฆ„
์•ˆ์ •์„ฑ ๋†’์Œ ๋‚ฎ์Œ (๋™๊ธฐํ™” ํ•„์š”)
OS ๊ฐœ์ž… ํผ ์ž‘์Œ
๋ณต์žก์„ฑ ๋‚ฎ์Œ ๋™๊ธฐํ™” ์„ค๊ณ„ ํ•„์š”
์„ฑ๋Šฅ ์˜ค๋ฒ„ํ—ค๋“œ ์žˆ์Œ ์„ฑ๋Šฅ ์ข‹์Œ

โœ๏ธ ํ•„๊ธฐ ํฌ์ธํŠธ ์ •๋ฆฌ

  • โ€œ(1) MSG Q: sync ์ข‹๊ณ , ์˜ค๋ฒ„ํ—ค๋“œ Badโ€
  • โ€œ(2) SHM: copy ์—†๊ณ  fast, but sync Badโ€
  • โ€œ์ปค๋„์€ shared memory๋งŒ ํ• ๋‹นํ•˜๊ณ  ์ง์ ‘ ๋ฐ์ดํ„ฐ๋Š” ์•ˆ ๋‹ค๋ฃธโ€

 

๐Ÿ“„ Message Passing: Direct vs Indirect Communication

 

์ „์ฒด ์š”์•ฝ

Message Passing ๋ฐฉ์‹์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ, ์ง์ ‘ ์ด๋ฆ„์„ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ ๋ฉ”์ผ๋ฐ•์Šค/ํฌํŠธ๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.


(1) Direct Communication (์ง์ ‘ ํ†ต์‹ )

๊ตฌ์กฐ

  • **๋ณด๋‚ด๋Š” ํ”„๋กœ์„ธ์Šค(P)**๊ฐ€ ๋ฐ›๋Š” ํ”„๋กœ์„ธ์Šค(Q)์˜ ์ด๋ฆ„์„ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •
  • send(Q, message) / receive(P, message)
  • OS๊ฐ€ ๋‘˜ ์‚ฌ์ด ํ†ต์‹ ์„ ์ค‘์žฌํ•˜์ง€๋งŒ, ๊ตฌ์กฐ์ƒ ์ง์ ‘ ์—ฐ๊ฒฐ

ํŠน์ง•

  • ๋‹จ์ˆœํ•จ
  • ์†ก์‹ ์ž์™€ ์ˆ˜์‹ ์ž ์Œ๋ฐฉ ์ด๋ฆ„์„ ๋ฐ˜๋“œ์‹œ ์•Œ์•„์•ผ ํ•จ
  • โœ๏ธ ํ•„๊ธฐ: "msg ๋ฐฉ์‹, ๋‹จ์ˆœํ•˜์ง€๋งŒ ์œ ์—ฐ์„ฑ ๋‚ฎ์Œ"

โœ… ์•”๊ธฐ ํฌ์ธํŠธ

  • Direct ๋ฐฉ์‹์€ ํ†ต์‹  ์ƒ๋Œ€์˜ ์ด๋ฆ„์„ ๋ช…์‹œ์ ์œผ๋กœ ์•Œ์•„์•ผ ํ•œ๋‹ค
  • ๋ฉ”์‹œ์ง€๋Š” ์ง์ ‘ ์ƒ๋Œ€์—๊ฒŒ ์ „๋‹ฌ๋˜๋ฉฐ, ํฌํŠธ ๊ฐ™์€ ์ค‘๊ฐ„์ž ์—†์Œ
  • ๊ตฌ์กฐ๋Š” ๋‹จ์ˆœํ•˜์ง€๋งŒ ์œ ์—ฐ์„ฑ์€ ๋‚ฎ์Œ

(2) Indirect Communication (๊ฐ„์ ‘ ํ†ต์‹ )

๊ตฌ์กฐ

  • **๋ฉ”์ผ๋ฐ•์Šค(Mailbox) ๋˜๋Š” ํฌํŠธ(Port)**๋ฅผ ํ†ตํ•ด ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›์Œ
  • ์†ก์‹ ์ž/์ˆ˜์‹ ์ž๋Š” ํฌํŠธ์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๊ณ  ๋ฐ›์Œ
  • send(M, message) / receive(M, message)

ํŠน์ง•

  • ์†ก์ˆ˜์‹ ์ž๋Š” ์„œ๋กœ๋ฅผ ๋ชฐ๋ผ๋„ ํฌํŠธ๋งŒ ๊ณต์œ ํ•˜๋ฉด ํ†ต์‹  ๊ฐ€๋Šฅ
  • N:1, 1:N ํ†ต์‹  ๊ตฌ์กฐ ๊ฐ€๋Šฅ
  • โœ๏ธ ํ•„๊ธฐ:
    • "syscall ํ†ตํ•ด mailbox ์ ‘๊ทผ"
    • "port ID ๊ธฐ์ค€์œผ๋กœ ๋ฉ”์‹œ์ง€ ํ ์ƒ์„ฑ๋จ"
    • โ€œport์— message stack์ฒ˜๋Ÿผ ์Œ“์ž„โ€

โœ… ์•”๊ธฐ ํฌ์ธํŠธ

  • Indirect ๋ฐฉ์‹์€ mailbox/port๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ํ†ต์‹ ํ•œ๋‹ค
  • ์ƒ๋Œ€๋ฐฉ ์ด๋ฆ„์„ ๋ชฐ๋ผ๋„ ๋ฉ”์‹œ์ง€ ์†ก์ˆ˜์‹  ๊ฐ€๋Šฅ
  • ๋™์  ์—ฐ๊ฒฐ ๋ฐ ์œ ์—ฐ์„ฑ ๋†’์Œ
  • port๋Š” ๋ฉ”์‹œ์ง€๋ฅผ ํ(๋ฒ„ํผ)์ฒ˜๋Ÿผ ๊ด€๋ฆฌ

์ „์ฒด ๋น„๊ต ์š”์•ฝ

ํ•ญ๋ชฉDirect CommunicationIndirect Communication
์ƒ๋Œ€ ์ง€์ • ๋ช…์‹œ์  (์ƒ๋Œ€ ์ด๋ฆ„ ์ง์ ‘ ์ง€์ •) ๊ฐ„์ ‘์  (ํฌํŠธ ์ด๋ฆ„ ์ง€์ •)
์œ ์—ฐ์„ฑ ๋‚ฎ์Œ ๋†’์Œ
๊ตฌ์กฐ ๋‹จ์ˆœ ์œ ์—ฐ (port ์—ฌ๋Ÿฌ ๊ฐœ ๊ฐ€๋Šฅ)
ํ™œ์šฉ ๊ณ ์ •๋œ ์Œ๋ฐฉ ํ†ต์‹ ์— ์ ํ•ฉ ๋™์  ๊ตฌ์„ฑ ๊ฐ€๋Šฅ, ์‹ค์šฉ์ 

โœ๏ธ ํ•„๊ธฐ ์š”์•ฝ

  • "Direct ๋ฐฉ์‹์€ ๋‹จ์ˆœํ•˜์ง€๋งŒ ํฌํŠธ ๊ณต์œ  ๋ถˆ๊ฐ€"
  • "Indirect๋Š” ํฌํŠธ ID ๊ธฐ์ค€, ๋ฉ”์‹œ์ง€ queue์ฒ˜๋Ÿผ ์‚ฌ์šฉ"
  • "syscall ํ†ตํ•ด ํฌํŠธ์— ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ / ์ˆ˜์‹ "
  • "process M๊ณผ port M ๊ตฌ๋ถ„ ์ž˜ํ•  ๊ฒƒ"