Post

[OS] Operating System(3-1): Process Scheduling/Creation/Termination, IPC

[OS] Operating System(3-1): Process Scheduling/Creation/Termination, IPC

๐Ÿ€ ์šด์˜์ฒด์ œ ์ „๊ณต ์ˆ˜์—… ์ •๋ฆฌ

Process


๐Ÿง Process = A program in execution, must progress in sequential fashion

  • ๋‹จ์ˆœํžˆ ์ฝ”๋“œ๋งŒ ์žˆ๋Š” ์ •์ ์ธ ํ”„๋กœ๊ทธ๋žจ์ด ์•„๋‹ˆ๋ผ, CPU์—์„œ ์‹ค์ œ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ๋™์ ์ธ ์กด์žฌ
  • ์ฆ‰, ํ”„๋กœ์„ธ์Šค๋Š” ์‹œ๊ฐ„์— ๋”ฐ๋ผ ์ƒํƒœ๊ฐ€ ๋ณ€ํ•˜๋ฉฐ, ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ๋”ฐ๋ผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ง„ํ–‰

โœ… ํ”„๋กœ์„ธ์Šค์˜ ๊ตฌ์„ฑ ์š”์†Œ

  • Text section
    • ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋œ ์˜์—ญ
  • Program Counter and Register
    • Program Counter: ๋‹ค์Œ์— ์‹คํ–‰ํ•  ๋ช…๋ น์–ด์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ €์žฅ
    • Register: ํ˜„์žฌ ์ˆ˜ํ–‰ ์ค‘์ธ ์ž‘์—…์˜ ์ƒํƒœ ์ •๋ณด ์ €์žฅ
  • Stack
    • ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ƒ์„ฑ๋˜๋Š” ์ž„์‹œ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ
    • ์ €์žฅ ๋‚ด์šฉ:
      • Funtion parameters: ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ผ๋ฐ˜์ ์ธ user program๋“ค์€ ํŽธ์˜์„ฑ ๋•Œ๋ฌธ์— stack์„ ํ†ตํ•ด์„œ parameterํ˜•์‹์œผ๋กœ ๋„˜๊น€
      • return addresses: ํ•จ์ˆ˜์—์„œ returnํ•œ ๊ฐ’์„ stack์œผ๋กœ ์ €์žฅ
      • local variables: ํ•จ์ˆ˜๊ฐ€ ๊ตฌ๋™๋˜๋Š” ๋™์•ˆ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ณ€์ˆ˜,์‚ฌ์šฉ์ด ๋๋‚˜๋ฉด ํŒŒ๊ดด๋จ(โ†” ์ „์—ญ๋ณ€์ˆ˜)
  • Data section: ํ”„๋กœ๊ทธ๋žจ ๋‚ด ์ „์—ญ ๋ณ€์ˆ˜(Global variables) ์ €์žฅ ๊ณต๊ฐ„ โ†’ ํ”„๋กœ๊ทธ๋žจ ์ „์ฒด์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅ
  • Heap: ๋™์  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ๊ณต๊ฐ„, ์‹คํ–‰ ์ค‘ malloc, new ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์š”์ฒญํ•œ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ด๊ณณ์— ์ €์žฅ๋จ
  • ํ”„๋กœ์„ธ์Šค๋Š” active์ด์ง€๋งŒ ํ”„๋กœ๊ทธ๋žจ์€ passive entity์ด๋‹ค.
  • ํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ process๋ฅผ ์ƒ์„ฑ ๊ฐ€๋Šฅํ•จ(์˜ˆ์‹œ: ์›น๋ธŒ๋ผ์šฐ์ € ์—ฌ๋Ÿฌ๊ฐœ ๋„์šฐ๊ธฐ ๊ฐ€๋Šฅ)

alt text

text๋Š” ๊ธฐ๊ณ„์–ด๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ์Œ
stack, heap, data(์ „์—ญ ๋ณ€์ˆ˜ ๋“ฑ)๋“ค์ด ์žˆ๋‹ค
stack, heap์€ ๋™์ ์œผ๋กœ ๊ณต๊ฐ„์„ ํ• ๋‹น, free()ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–‘์ชฝ์œผ๋กœ ๋Š˜์–ด๋‚ฌ๋‹ค ์ค„์—ˆ๋‹ค ํ•จ โ†’ ๊ทธ๋ž˜์„œ ๋งˆ์ฃผ๋ณด๊ฒŒ ๋””์ž์ธ

alt text

์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๊ฒŒ ๋˜๋ฉด binary code๊ฐ€ ๋˜๊ณ  text์— ์ €์žฅ๋จ
x, y๋Š” data์— ์˜์—ญ์— ์ €์žฅ
malloc์€ heap, mainํ•จ์ˆ˜ ์•ˆ์˜ *value๋“ฑ์€ local variable๋กœ stack์— ์ €์žฅ

Process state


process์˜ ์‹คํ–‰์— ๋”ฐ๋ผ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€๋‹ค

  • New: process๊ฐ€ ๋ฐฉ๊ธˆ ์ƒ์„ฑ๋œ ์ƒํƒœ
  • Running: process๊ฐ€ ์‹คํ–‰ ์ค‘์ธ ์ƒํƒœ(CPU๋ฅผ ์žก์Œ)
  • Waiting: ์ด๋–ค event๋ฐœ์ƒ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœ(CPU๋ฅผ ์žก๊ณ ์žˆ์ง€ ์•Š์Œ)
  • Ready: ๋ฉˆ์ถฐ์žˆ๋‹ค๊ฐ€ CPU๋งŒ ํ• ๋‹นํ•˜๋ฉด ๋ฐ”๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ค€๋น„๋œ ์ƒํƒœ
  • Terminated: process๊ฐ€ ์ข…๋ฃŒ๋œ ์ƒํƒœ

alt text

  • running ์ƒํƒœ์— ๊ฐ€๊ธฐ ์ง์ „์— ๋ฐ˜๋“œ์‹œ ready์ƒํƒœ์— ๋†“์—ฌ์žˆ์–ด์•ผํ•จ
  • ๊ทธ ์ด์œ ๋Š” ๋ฌด์ˆ˜ํžˆ ๋งŽ์€ process๊ฐ€ ready์ƒํƒœ์— ๋†“์—ฌ์žˆ๊ธฐ ๋•Œ๋ฌธ์—
  • ๋งŽ์€ process์ค‘์— ์‹คํ–‰ํ•  process๋ฅผ ๊ณ ๋ฅด๋Š” ์ž‘์—…์ด process scheduling ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

Process Control Block (PCB)


Process Control Block (PCB): process๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ •๋ณด๋ฅผ ๋‹ด๊ณ ์žˆ๋Š” ์ž๋ฃŒ๊ตฌ์กฐ PCB๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ๊ธฐ๋ฉด ๊ฐ™์ด ์ƒ์„ฑ๋˜๊ณ , ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ญ์ œ๋˜๋ฉด ์‚ญ์ œ๋œ๋‹ค.

alt text

  • Process state: running, waiting๋“ฑ์˜ ์ƒํƒœ ์ •๋ณด
  • Program counter: ๋‹ค์Œ์— ์‹คํ–‰ํ•  CPU instruction์˜ ์ฃผ์†Œ โ†’ ๋‚˜์ค‘์— ํ”„๋กœ์„ธ์Šค๊ฐ€ ์žฌ์‹œ์ž‘์„ ํ•˜๊ธฐ ์œ„ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊น€
  • CPU registers: CPU๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’๋“ค
  • CPU scheduling info: ์šฐ์„ ์ˆœ์œ„, ํ ์œ„์น˜ ๋“ฑ ์Šค์ผ€์ค„๋ง ๊ด€๋ จ ์ •๋ณด
  • Memory management info: process์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ์ •๋ณด
  • Accounting info: ์‚ฌ์šฉ๋œ CPU ์‹œ๊ฐ„, ์‹คํ–‰ ์‹œ๊ฐ„, ์ œํ•œ์‹œ๊ฐ„ ๋“ฑ
  • I/O status info: ์—ฐ๊ฒฐ๋œ I/O ์žฅ์น˜๋‚˜ ์—ด๋ฆฐ ํŒŒ์ผ ๋ฆฌ์ŠคํŠธ

Threads


๐Ÿ“š ์Šค๋ ˆ๋“œ๋Š” ํ”„๋กœ์„ธ์Šค ๋‚ด์— ์žˆ๋Š” ์‹คํ–‰์˜ ํ•œ ํ๋ฆ„์„ ์˜๋ฏธํ•œ๋‹ค

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

alt text

Linux์—์„œ๋Š” ๋Œ€๋ถ€๋ถ„ process๋ณด๋‹ค thread ๋‹จ์œ„๋กœ ๋‚˜ํƒ€๋‚ธ๋‹ค

Process Scheduling


Process scheduling์€ CPU๊ฐ€ ๋†€์ง€ ์•Š๊ฒŒ ํ•ญ์ƒ ์ž‘์—…์„ ์‹œํ‚ค๊ณ , ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋น ๋ฅด๊ฒŒ CPU์— ํ• ๋‹นํ•ด์„œ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•˜๋‹ค Process scheduling: ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ์„ธ์Šค๋“ค ์ค‘์—์„œ ๋‹ค์Œ์— CPU์— ์˜ฌ๋ฆด ๊ฑธ ์„ ํƒํ•˜๋Š” ๋‹ด๋‹น์ž

โœ… Process Queue ์ข…๋ฅ˜

  • Ready Queue: ๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๊ณ  ์ฆ‰์‹œ CPU ํ• ๋‹น๋ฐ›์„ ์ค€๋น„๊ฐ€ ๋œ ํ”„๋กœ์„ธ์Šค๋“ค์˜ ์ง‘ํ•ฉ
  • Wait Queue: I/O ๋“ฑ ์–ด๋–ค ์ด๋ฒคํŠธ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๋“ค์˜ ์ค„(์˜ˆ: ํ‚ค๋ณด๋“œ ์ž…๋ ฅ, ๋””์Šคํฌ ์ฝ๊ธฐ ๋“ฑ)
  • ํ”„๋กœ์„ธ์Šค๋Š” ์ด ํ๋“ค ์‚ฌ์ด๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์ด๋™ํ•จ
    • ์˜ˆ: CPU ์“ฐ๋‹ค๊ฐ€ โ†’ ์ž…์ถœ๋ ฅ ๊ธฐ๋‹ค๋ฆฌ๋ฉด wait queue๋กœ โ†’ ๋๋‚˜๋ฉด ๋‹ค์‹œ ready queue๋กœ

alt text

queue์ด๊ธฐ ๋•Œ๋ฌธ์— tailํฌ์ธํ„ฐ๋„ ํ•„์š”, ์–‘๋ฐฉํ–ฅ๋„ ๊ฐ€๋Šฅ

alt text

time slice expired๋Š” ๊ฐ ํ™œ๋™์— ์‹œ๊ฐ„์„ ํ• ๋‹นํ•จ
Multicore system์ด๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ Queue๋ฅผ ๊ฐ€์ง€๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Œ

Context Switch


alt text

process P0 ์‹คํ–‰ ์ค‘ โ†’ interrupt or systemcall ๋ฐœ์ƒ โ†’ P0 ์ •์ง€ ํ›„ ํ˜„์žฌ ์ƒํƒœ๋ฅผ PCB0์— ์ €์žฅ
๋ฉˆ์ถฐ์žˆ๋˜ process P1์„ PCB1์œผ๋กœ๋ถ€ํ„ฐ reload โ†’ interrupt or systemcall์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ฉˆ์ถ”๋ฉด ํ˜„์žฌ ์ƒํƒœ๋ฅผ PCB1์— ์ €์žฅ
๋˜ ๋‹ค์‹œ P0๋ฅผ ๋ถˆ๋Ÿฌ์˜ด (Process๊ฐ€ ๋‘๊ฐœ๊ฐ€ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ๊ฐœ์—ฌ๋„ ๊ฐ™์€ ๋งค์ปค๋‹ˆ์ฆ˜)

๐Ÿ“š Context Switch: ์‹คํ–‰ ์ค‘์ธ old process์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ , ์ €์žฅ๋œ new process๋ฅผ ๋ถˆ๋Ÿฌ์˜จ๋‹ค

  • Context Switch๋Š” ์ƒ๋‹นํžˆ ๋งŽ์ด ์ผ์–ด๋‚จ
  • Context๋Š” PCB์— ์ €์žฅํ•จ

  • Context Switch time์€ overhead๊ฐ€ ์žˆ์Œ โ†’ overhead์‹œ ์‹œ์Šคํ…œ ์ž‘์—…์ด ๋ถˆ์•ˆ์ •ํ•จ
    • OS and PCB๊ฐ€ ๋ณต์žกํ•  ์ˆ˜๋ก context switch time์€ ๋Š˜์–ด๋‚  ์ˆ˜ ๋ฐ–์— ์—†์Œ
  • ๊ทธ ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด hardware support๊ฐ€ ํ•„์š”
    • ์–ด๋–ค CPU๋Š” single instruction or store all registers๋ฅผ ํ•œ๋‹ค.
    • ์–ด๋–ค CPU๋Š” multiple sets of register๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ ๋ณต์‚ฌํ•˜์ง€ ์•Š๊ณ  ํฌ์ธํ„ฐ๋งŒ ์˜ฎ๊ฒจ์„œ ์ €์žฅํ•œ๋‹ค.

alt text

  1. P0์— timer interrupt๊ฐ€ ๊ฑธ๋ฆฌ๋ฉด, ํ˜„์žฌ register์™€ IP๊ฐ’์„ ์ €์žฅ(userโ†’kernel mode์ด๊ธฐ ๋•Œ๋ฌธ์— IP๋„ ์ €์žฅ)
  2. ์Šค์ผ€์ฅด๋ง์œผ๋กœ ์‹คํ–‰์‹œ๊ฐ„ ๊ณ„์‚ฐ(๋งŒ์•ฝ ์‹œ๊ฐ„์ด ๋‚จ์•˜์œผ๋ฉด ๋ฐ”๋กœ returnํ•ด์„œ P0์‹คํ–‰) โ†’ ๋‹ค ์ผ์œผ๋ฉด P0์˜ PCB๋ฅผ Ready Queue์— ๋„ฃ์Œ, ๋‹ค์Œ์— ์‹คํ–‰ํ•  P1์„ Ready Queue์—์„œ ์„ ํƒ
  3. switching์„ ํ•ด์„œ ํ˜„์žฌ register, IP๊ฐ’์„ P0 PCB์— ์ €์žฅ, P1 PCB์—์„œ ์ €์žฅ๋œ register, IP๊ฐ’์„ ๋ณต์›ํ•˜์ž๋งˆ์ž ์‹คํ–‰(Jump: ์ง์ ‘ ๊ฐ€์ง€ ๋ชปํ•˜๊ธฐ๋•Œ๋ฌธ์— jump๋ผํ•จ)

Multitasking in Mobile Systems


์ดˆ๊ธฐ์˜ iOS ๋ชจ๋ฐ”์ผ system์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ณ  ๋‚˜๋จธ์ง€ ํ”„๋กœ์„ธ์Šค๋Š” ์ผ์‹œ์ •์ง€ ์ƒํƒœ

  • User Interface(UI) ๊ณต๊ฐ„์ด ์ œํ•œ๋˜๊ธฐ ๋•Œ๋ฌธ์— iOS๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ Multitasking ๋ฐฉ์‹์„ ์ œ๊ณต
    • Foreground Process: ํ™”๋ฉด์— ํ‘œ์‹œ๋˜๋ฉฐ ์‚ฌ์šฉ์ž์™€ ์ง์ ‘ ์ƒํ˜ธ์ž‘์šฉํ•จ, ์˜ค์ง ํ•˜๋‚˜๋งŒ ์กด์žฌ ๊ฐ€๋Šฅ
    • Background Processes: ์‹คํ–‰ ์ค‘์ด์ง€๋งŒ ํ™”๋ฉด์—๋Š” ๋ณด์ด์ง€ ์•Š์Œ, ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์ฃผํ•˜์ง€๋งŒ ๊ธฐ๋Šฅ ์ œํ•œ ์กด์žฌ
  • Android ์‹œ์Šคํ…œ์€ ๋” ์œ ์—ฐํ•จ
    • Foreground & Background ํ”„๋กœ์„ธ์Šค๋ฅผ ๋™์‹œ์— ์‹คํ–‰ ๊ฐ€๋Šฅ
    • Background Processes๋Š” Service(๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋Œ์•„๊ฐ€๋Š” ๋ณ„๋„์˜ ๊ตฌ์„ฑ ์š”์†Œ)๋ฅผ ์‚ฌ์šฉ
    • Service๋Š” UI ์—†์Œ, ์ž‘์€ ๋ฉ”๋ชจ๋ฆฌ๋งŒ ์‚ฌ์šฉ
    • Background Processes๊ฐ€ ์ค‘๋‹จ๋ผ๋„ ๊ณ„์† ์‹คํ–‰ ๊ฐ€๋Šฅ

Process Creation


Parent process๋Š” ์ž์‹ ์„ ๋ณต์ œํ•ด์„œ children process๋“ค์„ ๋งŒ๋“ค์–ด ๋‚ธ๋‹ค

  • ๊ทธ๋ž˜์„œ ๋ถ€๋ชจ-์ž์‹ ๊ด€๊ณ„๋กœ ์—ฐ๊ฒฐ๋œ process๋“ค์€ `tree`ํ˜•์‹์„ ๋ค๋‹ค.
  • ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค๋Š” ๊ณ ์œ ํ•œ ๋ฒˆํ˜ธ๋กœ ์‹๋ณ„๋œ๋‹ค โ†’ ๊ทธ ๋ฒˆํ˜ธ๊ฐ€ PID(process identifier)

  • Resource Sharing Options
    • share all resources(์˜ˆ: ๋ฉ”๋ชจ๋ฆฌ, ํŒŒ์ผ ๋“ฑ ๋ชจ๋‘ ๊ณต์œ )
    • subset of resources(์˜ˆ: ํŠน์ • ๋ณ€์ˆ˜๋งŒ ๊ณต์œ , ๋‚˜๋จธ์ง€๋Š” ๋ถ„๋ฆฌ)
    • share no resources(์™„์ „ํžˆ ๋…๋ฆฝ์ ์ธ ํ”„๋กœ์„ธ์Šค) alt text

โœ…Execution Options

  • Concurrently: ๋ถ€๋ชจ์™€ ์ž์‹์ด ๋™์‹œ์— ์‹คํ–‰(์˜ˆ: ์›น๋ธŒ๋ผ์šฐ์ €์™€ ๋‹ค์šด๋กœ๋“œ ์ฐฝ์ด ๋”ฐ๋กœ ์›€์ง์ž„)
  • parents wait: ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋ถ€๋ชจ๊ฐ€ ๋ฉˆ์ถค

โœ… Address space

  • Address space์˜ ๊ฒฝ์šฐ ์ž์‹ํ”„๋กœ์„ธ์Šค๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๋ฅผ ์™„์ „ํžˆ ๋ณต์ œ
  • ๊ทธ๋ฆฌ๊ณ  ์ด ๊ณต๊ฐ„์—์„œ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ์„ ๋กœ๋“œํ•จ
  • UNIX ์˜ˆ์‹œ:
    • fork(): ๋ถ€๋ชจ๊ฐ€ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•จ, ์ž์‹์€ ๋ถ€๋ชจ์˜ ๋ณต์‚ฌ๋ณธ์œผ๋กœ ์‹œ์ž‘
    • exec(): ์ž์‹์ด ์ž์‹ ๋งŒ์˜ ์ƒˆ๋กœ์šด ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ๋ฐ”๊ฟˆ, ์ž๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์™„์ „ํžˆ ๋ฎ์–ด์”€(๋ถ€๋ชจ ๋‚ด์šฉ์€ ์‚ฌ๋ผ์ง)
    • wait(): ๋ถ€๋ชจ๋Š” wait()์„ ํ˜ธ์ถœํ•˜์—ฌ ์ž์‹์˜ ์ข…๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆผ, ์ž์‹์ด ์ข…๋ฃŒ(exit())ํ•˜๋ฉด ๋ถ€๋ชจ๋Š” ๋‹ค์‹œ ์‹คํ–‰๋จ

alt text

parent process์—์„œ fork()๋ฅผ ํ•˜๋ฉด pid=0์ผ ๊ฒฝ์šฐ child, pid>0์ด๋ฉด parent๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.

alt text

fork()ํ•˜์ž๋งˆ์ž parent์™€ child๊ฐ€ ์ƒ์„ฑ๋จ
fork()์ข…๋ฃŒ ํ›„ parent์—๋Š” child์˜ pid๊ฐ€ ๋ฆฌํ„ด, child์—๊ฒŒ๋Š” 0์ด ๋ฆฌํ„ด
pid>0์ด๋ฉด ๋…ธ๋ž€์ƒ‰๋ถ€๋ถ„ ์‹คํ–‰, pid==0์ด๋ฉด ์ดˆ๋ก๋ถ€๋ถ„ ์‹คํ–‰

1
2
3
4
5
6
7
8
9
10
11
12
13
parent process
  |
  |-- fork() --> child process ์ƒ์„ฑ
        |
        โ””โ”€> execl("/bin/ls", "ls") ์‹คํ–‰ โ†’ ํ˜„์žฌ child process๊ฐ€ 'ls' ๋ช…๋ น์–ด๋กœ ์™„์ „ํžˆ ๊ต์ฒด๋จ
        |
        โ””โ”€> 'ls' ๋ช…๋ น ์‹คํ–‰ ๊ฒฐ๊ณผ ์ถœ๋ ฅ๋จ (์ž์‹)
  
๋ถ€๋ชจ๋Š” wait() ํ˜ธ์ถœ
  |
  |-- ์ž์‹ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
  |
  |-- "Child Complete" ์ถœ๋ ฅ (๋ถ€๋ชจ)

Process Termination


  1. ์ผ๋ฐ˜์ ์ธ ์ž์‹ ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ(exit())
    • ํ”„๋กœ์„ธ์Šค๋Š” ๋งˆ์ง€๋ง‰ ๋ช…๋ น๋ฌธ์„ ์‹คํ–‰ํ•œ ๋’ค, ์šด์˜์ฒด์ œ์—๊ฒŒ exit() ์‹œ์Šคํ…œ ํ˜ธ์ถœ๋กœ ์ž์‹ ์„ ์ข…๋ฃŒํ•˜๋„๋ก ์š”์ฒญ
    • ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” status data๋ฅผ wait() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ๋ถ€๋ชจ์—๊ฒŒ ์ „๋‹ฌ
    • ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด, ์šด์˜์ฒด์ œ๊ฐ€ ์ž์‹์ด ์‚ฌ์šฉํ•˜๋˜ ์ž์›์„ ํšŒ์ˆ˜
  2. ๋ถ€๋ชจ๊ฐ€ ์ž์‹์„ ๊ฐ•์ œ ์ข…๋ฃŒํ•˜๋Š” ๊ฒฝ์šฐ(abort())
    • ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ abort() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ด์šฉํ•ด ์ž์‹ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒํ•  ์ˆ˜๋„ ์žˆ๋‹ค
    • ์ด์œ  3๊ฐ€์ง€:
      1. ์ž์‹์ด ํ• ๋‹น๋œ ์ž์›์„ ์ดˆ๊ณผํ–ˆ์„ ๋•Œ โ†’ Ex: ๋ฉ”๋ชจ๋ฆฌ, CPU ์‹œ๊ฐ„ ๋“ฑ ์ œํ•œ๋œ ์ž์›์„ ๋„˜๊ธด ๊ฒฝ์šฐ
      2. ์ž์‹์—๊ฒŒ ๋งก๊ธด ์ž‘์—…์ด ๋” ์ด์ƒ ํ•„์š” ์—†์„ ๋•Œ โ†’ Ex: ์œ ์ €๊ฐ€ ์ž‘์—…์„ ์ทจ์†Œํ•˜๊ฑฐ๋‚˜, ์กฐ๊ฑด์ด ๋ฐ”๋€ ๊ฒฝ์šฐ
      3. ๋ถ€๋ชจ๊ฐ€ ๋จผ์ € ์ข…๋ฃŒ๋  ๋•Œ โ†’ OS๋Š” ๋ถ€๋ชจ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ž์‹๋„ ์‹คํ–‰์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Œ

์ผ๋ถ€ ์šด์˜์ฒด์ œ๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ž์‹ ํ”„๋กœ์„ธ์Šค๋„ ์ž๋™์œผ๋กœ ์ข…๋ฃŒ์‹œํ‚จ๋‹ค

  • ์ด๋•Œ ์ผ์–ด๋‚˜๋Š” ํ˜„์ƒ: Cascading Termination (๊ณ„๋‹จ์‹ ์ข…๋ฃŒ)
    • ๋ถ€๋ชจ๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด โ†’ ์ž์‹, ์†์ž, ์ฆ์†์ž ํ”„๋กœ์„ธ์Šค๋“ค๊นŒ์ง€ ์ „๋ถ€ ์šด์˜์ฒด์ œ๊ฐ€ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒ์‹œํ‚ด
    • This is initiated by the OS, not the parent

โœ… ๋ถ€๋ชจ๊ฐ€ ์ž์‹ ์ข…๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒฝ์šฐ(wait())

1
pid = wait(&status); // ์ž์‹ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆผ
  • wait() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ†ตํ•ด ๋ถ€๋ชจ๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค์˜ ์ข…๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์Œ
  • ์ž์‹์ด ์ข…๋ฃŒ๋˜๋ฉด, ํ•ด๋‹น ์ž์‹์˜ pid์™€ status๋ฅผ ๋ฐ˜ํ™˜๋ฐ›์Œ
  • ํŠน์ • ์ž์‹์˜ ์ข…๋ฃŒ๋งŒ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์‹ถ์„ ๋•Œ โ†’ waitpid(pid, &status, 0);

  • ํŠน์ˆ˜ํ•œ ์ƒํƒœ์˜ ํ”„๋กœ์„ธ์Šค | ์ƒํƒœ | ์„ค๋ช… | | โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€” | โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”- | | Zombie ์ข€๋น„ ํ”„๋กœ์„ธ์Šค | ์ž์‹์€ ์ข…๋ฃŒ๋์ง€๋งŒ, ๋ถ€๋ชจ๊ฐ€ wait() ํ•˜์ง€ ์•Š์•„ ์‹œ์ฒด์ฒ˜๋Ÿผ ํ…Œ์ด๋ธ”์— ๋‚จ์•„ ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค | | Orphan ๊ณ ์•„ ํ”„๋กœ์„ธ์Šค | ๋ถ€๋ชจ๊ฐ€ ๋จผ์ € ์ข…๋ฃŒ๋ผ์„œ, ์ž์‹์€ ๊ณ ์•„ ์ƒํƒœ๊ฐ€ ๋จ. ๋ณดํ†ต init ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋งก์Œ |

Andriod Process Importance Hierarchy


์•ˆ๋“œ๋กœ์ด๋“œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ™•๋ณด๋ฅผ ์œ„ํ•ด ํ•„์š”์— ๋”ฐ๋ผ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒํ•ด์•ผ ํ•  ๋•Œ๊ฐ€ ์žˆ๋‹ค ์ด๋•Œ ์–ด๋–ค ํ”„๋กœ์„ธ์Šค๋ฅผ ๋จผ์ € ์ฃฝ์ผ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ธฐ์ค€์ด ๋ฐ”๋กœ ์ด Process Importance Hierarchy

  • Android will begin terminating processes that are least important

โœ…์ค‘์š”๋„ ์ˆœ์œ„ (์œ„ โ†’ ์•„๋ž˜๋กœ ์ค‘์š”ํ•จ)

1
2
3
4
5
6
7
8
9
     โ†‘ ์ค‘์š”ํ•จ (์‚ด๋ ค์•ผ ํ•จ)
     โ”‚
     โ”‚   **Foreground** (์ง์ ‘ ์‚ฌ์šฉ ์ค‘ ์•ฑ)
     โ”‚   **Visible**     (ํ™”๋ฉด ์ผ๋ถ€ ํ‘œ์‹œ)
     โ”‚   **Service**     (์Œ์•…์žฌ์ƒ ๋“ฑ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ž‘์—…)
     โ”‚   **Background**  (์ด์ „ ์•ฑ, ๋ฐฑ๊ทธ๋ผ์šด๋“œ ๋Œ€๊ธฐ)
     โ”‚   **Empty**       (์บ์‹œ๋งŒ ๋‚จ์€ ์•ฑ)
     โ”‚
     โ†“ ๋œ ์ค‘์š”ํ•จ (๋จผ์ € ์ข…๋ฃŒ๋จ)

Multiprocess Architecture - Chrome Browser


๐ŸŸฅ โ€œํ•˜๋‚˜์˜ ํ”„๋กœ๊ทธ๋žจ์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑโ€

์˜ˆ์ „์˜ ์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ๋Œ€๋ถ€๋ถ„ single process๋กœ ์‹คํ–‰๋˜์—ˆ๋‹ค.
ํ•˜์ง€๋งŒ Chrome์€ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋กœ ๋‚˜๋ˆ„์–ด ์ฒ˜๋ฆฌ(multiprocess)

๐Ÿงฉ Chrome์˜ 3๊ฐ€์ง€ ์ฃผ์š” ํ”„๋กœ์„ธ์Šค ์œ ํ˜•

  • Browser process: User interface, ๋””์Šคํฌ ์ ‘๊ทผ, ๋„คํŠธ์›Œํฌ ์ž…์ถœ๋ ฅ ๊ด€๋ฆฌ
  • Renderer process: web page rendering(ํ™”๋ฉด์— ๋„์šฐ๋Š” ์ฒ˜๋ฆฌ)(HTML, CSS, JavaScript์ฒ˜๋ฆฌ)
    ์›น์‚ฌ์ดํŠธ๋งˆ๋‹ค ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑ๋จ โ†’ Sandbox ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜์–ด ๋ณด์•ˆ ์œ„ํ—˜์„ ์ค„์ž„
  • Plug-in process: plug-in(์˜ˆ: Flash ๋“ฑ)๋ณ„๋กœ ๋ถ„๋ฆฌ๋œ ํ”„๋กœ์„ธ์Šค ์‚ฌ์šฉ

Interprocess Communication(IPC)


โœ…process์˜ ์ข…๋ฅ˜

  • Independent process
    • ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์™€ ์ „ํ˜€ ์ƒํ˜ธ์ž‘์šฉํ•˜์ง€ ์•Š์Œ
  • Cooperating process
    • ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉฐ ์ƒํ˜ธ์ž‘์šฉํ•จ
    • ์ฆ‰, ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์˜ํ–ฅ์„ ์ฃผ๊ฑฐ๋‚˜ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ

๐Ÿ“šReasons for cooperating

  1. Information sharing: ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์ผํ•œ ํŒŒ์ผ์ด๋‚˜ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ํ•จ๊ป˜ ์ฝ๊ณ  ์“ธ ๋•Œ
  2. Computation speedup: ํฐ ์ž‘์—…์„ ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋กœ ๋‚˜๋ˆ ์„œ ๋™์‹œ์— ์ฒ˜๋ฆฌ (๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ)
  3. Modularity: ๊ธฐ๋Šฅ์„ ๋‚˜๋ˆ„์–ด ๊ฐ๊ธฐ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„
  4. Convenience: ์‚ฌ์šฉ์ž์—๊ฒŒ ํŽธ๋ฆฌํ•œ ๊ธฐ๋Šฅ ์ œ๊ณต (์˜ˆ: ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์Œ์•… ์žฌ์ƒ)

๐Ÿ“ก IPC (Interprocess Communication)

Cooperating process ๊ฐ„์—๋Š” ํ†ต์‹ ์ด ํ•„์š”ํ•จ โ†’ ์ด๋ฅผ ์œ„ํ•ด IPC๊ฐ€ ์‚ฌ์šฉ๋จ

๐ŸŸฃ Shared memory: ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณต์œ ๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์‚ฌ์šฉ
๐Ÿ”ต Message passing: ๋ฉ”์‹œ์ง€๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฐ์ดํ„ฐ ๊ตํ™˜

alt text

Shared memory๋Š” ์ƒ๊ฐ๋ณด๋‹ค ๋ณต์žก, 2๊ฐœ์˜ process๊ฐ€ ์–ด๋–ค ๊ณต๋™ํ‡ธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉ Message passing์€ message queue๊ฐ€ ์žˆ์–ด์„œ ๊ฑฐ๊ธฐ์„œ message๋ฅผ ์ฃผ๊ณ ๋ฐ›์Œ

Producer-Consumer Problem


๋‘ ๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ๋™๊ธฐํ™” ๋ฌธ์ œ

  • Producer: data๋ฅผ ์ƒ์‚ฐ์—์„œ buffer์— ๋„ฃ๋Š” ์—ญํ• 
  • Consumer: buffer์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด ์‚ฌ์šฉํ•˜๋Š” ์—ญํ• 

โœ…Buffer์˜ ์ข…๋ฅ˜

  • unbounded buffer: ๋ฒ„ํผ ํฌ๊ธฐ์— ์ œํ•œ์ด ์—†์Œ โ†’ ์ด๋ก ์ ์œผ๋กœ ๋ฌดํ•œ ์ €์žฅ ๊ฐ€๋Šฅ
  • bounded buffer: ๋ฒ„ํผ ํฌ๊ธฐ๊ฐ€ ์ •ํ•ด์ ธ ์žˆ์Œ โ†’ ๊ณต๊ฐ„์ด ๊ฝ‰ ์ฐจ๋ฉด ๋Œ€๊ธฐ ํ•„์š”(์‹ค์ œ ์‹œ์Šคํ…œ์—๋Š” ๋Œ€๋ถ€๋ถ„ bounded buffer)

IPC - Shared Memory


๐Ÿ“š Shared Memory: ์„œ๋กœ ํ†ต์‹ ํ•˜๊ณ  ์‹ถ์€ ํ”„๋กœ์„ธ์Šค๋“ค๋ผ๋ฆฌ ๊ณต์œ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ

  • OS๊ฐ€ ์ง์ ‘ ๊ด€์—ฌํ•˜์ง€ ์•Š๊ณ , process๋“ค์ด ์ž์ฒด์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ๊ณผ ํ†ต์‹ ์„ ์กฐ์ ˆํ•ด์•ผ ํ•จ

โŒ ์ฃผ์š” ๋ฌธ์ œ

๐Ÿ’ฅ Synchronization

  • ๋‘ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋™์‹œ์— ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•˜๋ฉด ์ถฉ๋Œ ๋ฐœ์ƒ ๊ฐ€๋Šฅ
  • ์˜ˆ: Producer๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ณ  ์žˆ๋Š” ์ค‘์—, Consumer๊ฐ€ ์ฝ์œผ๋ ค๊ณ  ํ•˜๋ฉด ๋ฐ์ดํ„ฐ๊ฐ€ ์†์ƒ๋  ์ˆ˜ ์žˆ์Œ
  • Bounded-Buffer โ€“ Shared-Memory Solution
1
2
3
4
5
6
7
8
9
// Shared data (์‹ค์ œ ํ•จ์ˆ˜ X)
#define BUFFER_SIZE 10
typedef struct {
  . . .
} item;

item buffer[BUFFER_SIZE];
int in = 0; // in: ์ƒˆ๋กœ์šด ์•„์ดํ…œ์„ ๋„ฃ์„ ์œ„์น˜, out: ์ง€๊ธˆ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์•„์ดํ…œ ์œ„์น˜
int out = 0; // in == out์€ buffer๊ฐ€ ๋นˆ ์ƒํƒœ๋ฅผ ์˜๋ฏธ

alt text

if ((in + 1) % BUFFER_SIZE) == out์ด๋ฉด ๊ฐ€๋“ ์ฐฌ ์ƒํƒœ๋กœ ๊ฐ„์ฃผ โ†’ ๋”ฐ๋ผ์„œ ํ•œ ์นธ์€ ๋น„์›Œ๋‘๊ณ  ์‚ฌ์šฉํ•ด์„œ ์‹ค์ œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ณต๊ฐ„์€ BUFFER_SIZE-1

  • producer code
1
2
3
4
5
6
7
8
item next_produced;

while (true) {
  while (((in + 1) % BUFFER_SIZE) == out) ; // ๋ฒ„ํผ๊ฐ€ ๊ฐ€๋“ ์ฐผ๋Š”์ง€ ํ™•์ธ (busy wait) 
    /* do nothing */
  buffer[in] = next_produced; // ์ƒ์‚ฐ๋œ ์•„์ดํ…œ ์ €์žฅ
  in = (in + 1) % BUFFER_SIZE; // ๋‹ค์Œ ์ €์žฅ ์œ„์น˜๋กœ ์ด๋™
}

alt text

((in + 1) % BUFFER_SIZE) == out์„ ํ™•์ธ ์•ˆํ•˜๊ณ  ๋„ฃ๊ฒŒ ๋˜๋ฉด in==out์ด ๋˜๋ฉด์„œ buffer๊ฐ€ ๋น„์–ด์žˆ๋Š”์ง€ ๊ฐ€๋“ ์ฐจ์žˆ๋Š”์ง€ ํ™•์ธ ๋ถˆ๊ฐ€

  • consumer code
1
2
3
4
5
6
7
8
item next_consumed;

while (true) {
  while (in == out) ; // ๋ฒ„ํผ๊ฐ€ ๋น„์–ด ์žˆ์œผ๋ฉด ๋Œ€๊ธฐ
    /* do nothing */
  next_consumed = buffer[out]; // ์•„์ดํ…œ ๊บผ๋‚ด๊ธฐ
  out = (out + 1) % BUFFER_SIZE; // ๋‹ค์Œ ์œ„์น˜๋กœ ์ด๋™
}

alt text

This post is licensed under CC BY 4.0 by the author.