๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ป Computer Science/์šด์˜์ฒด์ œ

Process & Thread ๋ž€? (multi process & multi thread & Deadlock ์ •๋ฆฌ)

by Jay Din 2023. 5. 23.
728x90
๋ฐ˜์‘ํ˜•

Process ๋ž€?

์‹คํ–‰ํŒŒ์ผ(program)์ด memory์— ์ ์žฌ๋˜์–ด CPU๋ฅผ ํ• ๋‹น๋ฐ›์•„ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ process๋ผ๊ณ  ํ•œ๋‹ค.

 

์šด์˜์ฒด์ œ๋ฅผ ๊ด€ํ†ตํ•˜๋Š” ํ•ต์‹ฌ์ ์ธ ๋‹จ์–ด ํ•˜๋‚˜๋ฅผ ๋ฝ‘๋Š”๋‹ค๋ฉด Process์ด๋‹ค.

์šด์˜์ฒด์ œ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋‹ค์–‘ํ•œ ์›๋ฆฌ๋“ค์ด ๋ฐ”๋กœ Process๋ฅผ ์œ„ํ•ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋”ฐ๋ผ์„œ process์˜ ์ •์˜๋ฅผ ์ž˜ ์ดํ•ดํ•œ๋‹ค๋ฉด ์šด์˜์ฒด์ œ์˜ ๋‹ค๋ฅธ ๋‚ด์šฉ๋“ค์„ ์ดํ•ดํ•˜๊ธฐ ํŽธํ•˜๋‹ค.

process๋ฅผ memory์™€ CPU๊ด€์ ์œผ๋กœ ์ƒ๊ฐํ•˜๊ธฐ! 

Process

ํ”„๋กœ์„ธ์Šค(process)๋ž€ ์‹คํ–‰์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ(program in execution)์„ ๋œปํ•œ๋‹ค.

์ฆ‰, ์‹คํ–‰ํŒŒ์ผ ํ˜•ํƒœ๋กœ ์กด์žฌํ•˜๋˜ program์ด memory์— ์ ์žฌ๋˜์–ด CPU์— ์˜ํ•ด ์‹คํ–‰(์—ฐ์‚ฐ)๋˜๋Š”๊ฒƒ์„ process๋ผ๊ณ  ํ•œ๋‹ค. 

( + program์€ ๋‹จ์ˆœํžˆ ๋ช…๋ น์–ด ๋ฆฌ์ŠคํŠธ๋ฅผ ํฌํ•จํ•˜๋Š” ํŒŒ์ผ์ด๋‹ค.)

Memory์— ์ ์žฌ

memory๋Š” CPU๊ฐ€ ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํ“จํ„ฐ ๋‚ด๋ถ€์˜ ๊ธฐ์–ต์žฅ์น˜์ด๋‹ค.

program์ด CPU์—์„œ ์‹คํ–‰๋˜๋ ค๋ฉด ํ•ด๋‹น ๋‚ด์šฉ์ด memory์— ์ ์žฌ๋œ ์ƒํƒœ์—ฌ์•ผ๋งŒ ํ•œ๋‹ค.

ํ”„๋กœ์„ธ์Šค์— ํ• ๋‹น๋˜๋Š” memory ๊ณต๊ฐ„์€ Code, Data, Stack, Heap 4๊ฐœ์˜ ์˜์—ญ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์œผ๋ฉฐ, ๊ฐ process๋งˆ๋‹ค ๋…๋ฆฝ์ ์œผ๋กœ ํ• ๋‹น์„ ๋ฐ›๋Š”๋‹ค.

 

CPU์˜ ์—ฐ์‚ฐ๊ณผ PC register

ํ”„๋กœ๊ทธ๋žจ์˜ ์ฝ”๋“œ๋ฅผ ํ† ๋Œ€๋กœ CPU๊ฐ€ ์‹ค์ œ๋กœ ์—ฐ์‚ฐ์„ ํ•ด์•ผ๋งŒ ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋œ๋‹ค๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์–ด๋–ค ์ฝ”๋“œ๋ฅผ ์ฝ์–ด์•ผ ํ•˜๋Š”๊ฐ€๋ฅผ ์ •ํ•˜๋Š” ๊ฒƒ์€ CPU ๋‚ด๋ถ€์— ์žˆ๋Š” PC(Program counter) register์— ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.

PC register์—๋Š” ๋‹ค์Œ์— ์‹คํ–‰๋  ์ฝ”๋“œ(๋ช…๋ น์–ด, instruction)์˜ ์ฃผ์†Œ๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.

์ฆ‰, memory์— ์ ์žฌ๋˜์–ด์žˆ๋Š” process code์˜์—ญ์˜ ๋ช…๋ น์–ด์ค‘ ๋‹ค์Œ๋ฒˆ ์—ฐ์‚ฐ์—์„œ ์ฝ์–ด์•ผํ•  ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๊ฐ’์„ PC register๊ฐ€ ์ˆœ์ฐจ์ ์œผ๋กœ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋˜๊ณ , ํ•ด๋‹น ๋ช…๋ น์–ด๋ฅผ ์ฝ์–ด์™€์„œ CPU๊ฐ€ ์—ฐ์‚ฐ์„ ํ•˜๊ฒŒ ๋˜๋ฉด process๊ฐ€ ์‹คํ–‰์ด ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

process์˜ momory ์˜์—ญ์— ๋Œ€ํ•ด ์„ค๋ช…

ํ”„๋กœ์„ธ์Šค๊ฐ€ ์šด์˜์ฒด์ œ์—์„œ ํ• ๋‹น๋ฐ›๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์€ code, data, stack, heap ์˜์—ญ์œผ๋กœ ๊ตฌ๋ถ„๋œ๋‹ค.

  • code ์˜์—ญ์€ ์‹คํ–‰ํ•œ ํ”„๋กœ๊ทธ๋žจ์˜ ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๋‹ค. 
  • data ์˜์—ญ์€ ํ”„๋กœ๊ทธ๋žจ์˜ ์ „์—ญ ๋ณ€์ˆ˜์™€ static ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๋‹ค.
  • heap ์˜์—ญ์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์ง์ ‘ ๊ณต๊ฐ„์„ ํ• ๋‹น(malloc)/ํ•ด์ œ(free) ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๋‹ค.
  • stack ์˜์—ญ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ƒ์„ฑ๋˜๋Š” ์ง€์—ญ ๋ณ€์ˆ˜์™€ ๋งค๊ฐœ ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋˜๋Š” ์ž„์‹œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด๋‹ค.
๋ฐ˜์‘ํ˜•

Multi process

Multi process๋ž€ 2๊ฐœ ์ด์ƒ์˜ process๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

๋™์‹œ์—๋ผ๋Š” ๋ง์€ ๋™์‹œ์„ฑ(concurrency)๊ณผ ๋ณ‘๋ ฌ์„ฑ(parallelism) ๋‘๊ฐ€์ง€๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๋™์‹œ์„ฑ์€ CPU core๊ฐ€ 1๊ฐœ์ผ ๋•Œ, ์—ฌ๋Ÿฌ process๋ฅผ ์งง์€ ์‹œ๊ฐ„๋™์•ˆ ๋ฒˆ๊ฑธ์•„ ๊ฐ€๋ฉด์„œ ์—ฐ์‚ฐ์„ ํ•˜๊ฒŒ ๋˜๋Š” ์‹œ๋ถ„ํ•  ์‹œ์Šคํ…œ(time sharing system)์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ณ‘๋ ฌ์„ฑ์€ CPU core๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์ผ ๋•Œ, ๊ฐ๊ฐ€์˜ core๊ฐ€ ๊ฐ๊ฐ์˜ process๋ฅผ ์—ฐ์‚ฐํ•จ์œผ๋กœ์จ process๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋™์‹œ์„ฑ๊ณผ ๋ณ‘๋ ฌ์„ฑ์˜ ์ž์„ธํ•œ ๋‚ด์šฉ

https://jay-din.tistory.com/9

 

๋™์‹œ์„ฑ (Concurrency)๊ณผ ๋ณ‘๋ ฌ์„ฑ (Parallelism)

๋™์‹œ์„ฑ (Concurrency) ํ•˜๋‚˜์˜ ์ฝ”์–ด์—์„œ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ๊ฐ€ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ์‹คํ–‰ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž„ ์‹ฑ๊ธ€ ์ฝ”์–ด, ๋ฉ€ํ‹ฐ ์ฝ”์–ด์—์„œ ๋ชจ๋‘ ๊ตฌํ˜„ ๊ฐ€๋Šฅ ๋…ผ๋ฆฌ์ ์ธ ๊ฐœ๋… ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘

jay-din.tistory.com

 

์šฐ๋ฆฌ๊ฐ€ ์“ฐ๋Š” ๋…ธํŠธ๋ถ์€ CPU core๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์žˆ๋‹ค. core๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ์—ฌ์„œ ์‹ค์ œ๋กœ ์—ฌ๋Ÿฌ process๊ฐ€ ๋™์‹œ์— ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์„ ๋ณ‘๋ ฌ์„ฑ์ด๋ผ๊ณ  ํ•œ๋‹ค.

์•ž์œผ๋กœ ์„ค๋ช…ํ•  ๋ชจ๋“  ๋‚ด์šฉ์€ Single core์˜ ๋™์‹œ์„ฑ์— ์ดˆ์ ์„ ๋งž์ท„๋‹ค.

Multi process

Multi process๋ž€ 2๊ฐœ ์ด์ƒ์˜ process๊ฐ€ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

์ด ๋•Œ process๋“ค์€ CPU์™€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ๋œ๋‹ค.

memory์˜ ๊ฒฝ์šฐ์—๋Š” ์—ฌ๋Ÿฌ process๋“ค์ด ๊ฐ์ž์˜ memory์˜์—ญ์„ ์ฐจ์ง€ํ•˜์—ฌ ๋™์‹œ์— ์ ์žฌ๋œ๋‹ค.

๋ฐ˜๋ฉด ํ•˜๋‚˜์˜ CPU๋Š” ๋งค ์ˆœ๊ฐ„ ํ•˜๋‚˜์˜ process๋งŒ ์—ฐ์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ CPU์˜ ์ฒ˜๋ฆฌ์†๋„๊ฐ€ ๋นจ๋ผ์„œ ์ˆ˜ ms ์ด๋‚ด์˜ ์งง์€ ์‹œ๊ฐ„๋™์•ˆ ์—ฌ๋Ÿฌ process๋“ค์ด CPU์—์„œ ๋ฒˆ๊ฐˆ์•„ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ๋Š” ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋žจ์ด ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.

์ด์ฒ˜๋Ÿผ CPU์˜ ์ž‘์—…์‹œ๊ฐ„์„ ์—ฌ๋Ÿฌ process๋“ค์ด ์กฐ๊ธˆ์”ฉ ๋‚˜๋ˆ„์–ด ์“ฐ๋Š” ์‹œ์Šคํ…œ์„ ์‹œ๋ถ„ํ•  ์‹œ์Šคํ…œ(time sharing system)์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ

์—ฌ๋Ÿฌ process๊ฐ€ ๋™์‹œ์— memory์— ์ ์žฌ๋œ ๊ฒฝ์šฐ,

์„œ๋กœ ๋‹ค๋ฅธ process์˜ ์˜์—ญ์„ ์นจ๋ฒ”ํ•˜์ง€ ์•Š๋„๋ก ๊ฐ process๊ฐ€ ์ž์‹ ์˜ memory์˜์—ญ์—๋งŒ ์ ‘๊ทผํ•˜๋„๋ก ์šด์˜์ฒด์ œ๊ฐ€ ๊ด€๋ฆฌํ•ด์ค€๋‹ค.

CPU์˜ ์—ฐ์‚ฐ๊ณผ PC register 

CPU๋Š” PC(Program counter) register๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š” ๋ช…๋ น์–ด๋ฅผ ์ฝ์–ด๋“ค์—ฌ ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•œ๋‹ค.

PC register์—๋Š” ๋‹ค์Œ์— ์‹คํ–‰๋  ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.

multi process ์‹œ์Šคํ…œ์—์„œ๋Š” process1์ด ์ง„ํ–‰๋˜๊ณ  ์žˆ์„ ๋•Œ๋Š” process1์˜ code ์˜์—ญ์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋œ๋‹ค.

CPU๋Š” PC register๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๊ณณ์— ๋”ฐ๋ผ process๋ฅผ ๋ณ€๊ฒฝํ•ด ๊ฐ€๋ฉด์„œ ๋ช…๋ น์–ด๋ฅผ ์ฝ์–ด๋“ค์ด๊ณ  ์—ฐ์‚ฐ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

Context 

์‹œ๋ถ„ํ•  ์‹œ์Šคํ…œ์—์„œ๋Š” ํ•œ process๊ฐ€ ๋งค์šฐ ์งง์€ ์‹œ๊ฐ„๋™์•ˆ CPU๋ฅผ ์ ์œ ํ•˜์—ฌ ์ผ์ • ๋ถ€๋ถ„์˜ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋‹ค๋ฅธ process์—๊ฒŒ๋„˜๊ธด๋‹ค. ๊ทธ ํ›„ ์ฐจ๋ก€๊ฐ€ ๋˜๋ฉด ๋‹ค์‹œ CPU๋ฅผ ์ ์œ ํ•˜์—ฌ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์ด์ „์— ์–ด๋””๊นŒ์ง€ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ–ˆ๊ณ , register์—๋Š” ์–ด๋–ค ๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ์—ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๊ฒŒ ๋œ๋‹ค. process๊ฐ€ ํ˜„์žฌ ์–ด๋–ค ์ƒํƒœ๋กœ ์ˆ˜ํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ์ด์ œ์ ์ธ ์ •๋ณด๊ฐ€ ๋ฐ”๋กœ context์ด๋‹ค. context ์ •๋ณด๋“ค์€ PCB(Process Control Block)์— ์ €์žฅ์„ ํ•œ๋‹ค.     

PCB (Process Control Block)

PCB๋Š” ์šด์˜ ์ฒด์ œ๊ฐ€ ํ”„๋กœ์„ธ์Šค๋ฅผ ํ‘œํ˜„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

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

์ผ๋ถ€ ์šด์˜ ์ฒด์ œ์—์„œ PCB๋Š” ์ปค๋„ ์Šคํƒ์— ์œ„์น˜ํ•œ๋‹ค. ์ด ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์€ ๋ณดํ˜ธ๋ฅผ ๋ฐ›์œผ๋ฉด์„œ๋„ ๋น„๊ต์  ์ ‘๊ทผํ•˜๊ธฐ๊ฐ€ ํŽธ๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

PCB  
Process State new, running, waiting, halted ๋“ฑ์˜ state๊ฐ€ ์žˆ๋‹ค.
Process Number ํ•ด๋‹น process์˜ number
Program counter(PC) ํ•ด๋‹น process๊ฐ€ ๋‹ค์Œ์— ์‹คํ–‰ํ•  ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค. 
Registers ์ปดํ“จํ„ฐ ๊ตฌ์กฐ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ์ˆ˜์™€ ์œ ํ˜•์„ ๊ฐ€์ง„ register ๊ฐ’๋“ค
Memory limits base register, limit register, page table ๋˜๋Š” segment  table ๋“ฑ
...  

Context switch

Context switch๋ž€ ํ•œ ํ”„๋กœ์„ธ์Šค์—์„œ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋กœ CPU ์ œ์–ด๊ถŒ์„ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

์ด ๋•Œ ์ด์ „์˜ ํ”„๋กœ์„ธ์Šค์˜ ์ƒํƒœ๋ฅผ PCB์— ์ €์žฅํ•˜์—ฌ ๋ณด๊ด€ํ•˜๊ณ  ์ƒˆ๋กœ์šด ํ”„๋กœ์„ธ์Šค์˜ PCB๋ฅผ ์ฝ์–ด์„œ ๋ณด๊ด€๋œ ์ƒํƒœ๋ฅผ ๋ณต๊ตฌํ•˜๋Š” ์ž‘์—…์ด ์ด๋ฃจ์–ด์ง„๋‹ค. 

Thread 

Thread๋Š” ํ•œ process ๋‚ด์—์„œ ์‹คํ–‰๋˜๋Š” ๋™์ž‘(๊ธฐ๋Šฅ function)์˜ ๋‹จ์œ„์ด๋‹ค.

๊ฐ Thread๋Š” ์†ํ•ด ์žˆ๋Š” process์˜ Stack ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ memory ์˜์—ญ์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Thread๋Š” process๋‚ด์—์„œ ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ฆ‰, ๋…๋ฆฝ์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•จ์„ ์˜๋ฏธํ•˜๊ณ  ์ด๋ฅผ ์œ„ํ•ด stack memory์™€ PC Register๊ฐ€ ๊ฐ์ž ํ•„์š”ํ•œ ๊ฒƒ์ด๋‹ค.  

Multi thread 

Multi thread๋ž€ ํ•˜๋‚˜์˜ process๊ฐ€ ๋™์‹œ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ผ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์ฆ‰, ํ•˜๋‚˜์˜ process์—์„œ (์‹คํ–‰์ด ๋œํ•˜๋‚˜์˜ program์—์„œ) ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด multi thread๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

Multi thread์—์„œ๋Š” ํ•œ process ๋‚ด์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ thread๊ฐ€ ์žˆ๊ณ , thread๋“ค์€ Stack ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์˜์—ญ(Code, Data, Heap) ์„ ๊ณต์œ ํ•˜๊ฒŒ ๋œ๋‹ค.     

 

Thread์™€ Multi thread

Thread๋Š” process ๋‚ด์—์„œ ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. 

๊ฐ thread๊ฐ€ ๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๋…๋ฆฝ์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•จ์„ ์˜๋ฏธํ•œ๋‹ค.

Stack memory & PC register

Thread๊ฐ€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ธ์ž ์ „๋‹ฌ, Return Address ์ €์žฅ, ํ•จ์ˆ˜ ๋‚ด ์ง€์—ญ๋ณ€์ˆ˜ ์ €์žฅ ๋“ฑ์„ ์œ„ํ•œ ๋…๋ฆฝ์ ์ธ stack memory ๊ณต๊ฐ„์„ ํ•„์š”๋กœ ํ•œ๋‹ค. 

๊ฒฐ๊ณผ์ ์œผ๋กœ thread๋Š” process๋กœ๋ถ€ํ„ฐ Stack memory ์˜์—ญ์€ ๋…๋ฆฝ์ ์œผ๋กœ ํ• ๋‹น ๋ฐ›๊ณ , Code, Data, Heap ์˜์—ญ์€ ๊ณต์œ ํ•˜๋Š” ํ˜•ํƒœ๋ฅผ ๊ฐ–๊ฒŒ ๋œ๋‹ค.

๋˜ํ•œ  Multi thread์—์„œ๋Š” ๊ฐ๊ฐ์˜ thread๋งˆ๋‹ค PC register๋ฅผ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค. ๊ทธ ์ด์œ ๋Š” ํ•œ process ๋‚ด์—์„œ๋„ thread๋ผ๋ฆฌ context switch๊ฐ€ ์ผ์–ด๋‚˜๊ฒŒ ๋˜๋Š”๋ฐ, PC register์— code address๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ์–ด์•ผ ์ด์–ด์„œ ์‹คํ–‰์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.    

 

thread๋Š” ์™œ ๋…๋ฆฝ์ ์ธ stack memory ์˜์—ญ์ด ํ•„์š”ํ•œ๊ฐ€?

Stack ์˜์—ญ์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ์ „๋‹ฌ๋˜๋Š” ์ธ์ž, ํ•จ์ˆ˜์˜ Return Address, ํ•จ์ˆ˜ ๋‚ด ์ง€์—ญ๋ณ€์ˆ˜ ๋“ฑ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ memory์˜์—ญ์ด๋‹ค. thread๊ฐ€ process๋‚ด์—์„œ "๋…๋ฆฝ์ ์ธ ๊ธฐ๋Šฅ์„ ์‹คํ–‰"ํ•œ๋‹ค๋Š” ๊ฒƒ์€ "๋…๋ฆฝ์ ์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ"ํ•จ์„ ์˜๋ฏธํ•œ๋‹ค.

๋”ฐ๋ผ์„œ thread๊ฐ€ ๋…๋ฆฝ์ ์ธ ๋™์ž‘์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐ thread์˜ stack memory์˜์—ญ์ด ๋…๋ฆฝ์ ์ด์—ฌ์•ผ ํ•œ๋‹ค.

process์™€ thread ๋น„๊ต ์„ค๋ช…

process ์šด์˜์ฒด์ œ๋กœ๋ถ€ํ„ฐ ์ž์›์„ ํ• ๋‹น๋ฐ›๋Š” ์ž‘์—…์˜ ๋‹จ์œ„์ด๊ณ  thread๋Š” process๊ฐ€ ํ• ๋‹น๋ฐ›์€ ์ž์›์„ ์ด์šฉํ•˜๋Š” ์‹คํ–‰์˜ ๋‹จ์œ„์ด๋‹ค.
์ฆ‰, process๋Š” ์‹คํ–‰ํŒŒ์ผ(program)์ด memory์— ์ ์žฌ๋˜์–ด CPU๋ฅผ ํ• ๋‹น๋ฐ›์•„ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค.
thread ํ•œ process ๋‚ด์—์„œ ์‹คํ–‰๋˜๋Š” ๋™์ž‘์˜ ๋‹จ์œ„์ด๋‹ค.
process๋Š” memory ๊ณต๊ฐ„์— code, data, heap, stack ์˜์—ญ์ด ์žˆ๋Š”๋ฐ, thread๋Š” process๋‚ด์—์„œ stack ์˜์—ญ์„ ์ œ์™ธํ•œ code, data, heap ์˜์—ญ์„ ๊ณต์œ ํ•œ๋‹ค.
๋ฐ˜์‘ํ˜•

 

Multi process์™€ Multi thread ๋น„๊ต ์„ค๋ช…

Multi process - Mulit thread๋ณด๋‹ค ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„๊ณผ CPU ์‹œ๊ฐ„์„ ์ฐจ์ง€ํ•œ๋‹ค.
- ํ•˜๋‚˜์˜ process๊ฐ€ ์ฃฝ๋”๋ผ๋„ ๋‹ค๋ฅธ process์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์•„ ์•ˆ์ •์„ฑ์ด ๋†’๋‹ค.
Multi thread - Mulit process๋ณด๋‹ค ์ ์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•˜๊ณ  Context Switching์ด ๋น ๋ฅด๋‹ค.
- ๋™๊ธฐํ™” ๋ฌธ์ œ์™€ ํ•˜๋‚˜์˜ thread ์žฅ์• ๋กœ ์ „์ฒด thread๊ฐ€ ์ข…๋ฃŒ๋  ์œ„ํ—˜์ด ์žˆ๋‹ค.

๋‘ ๋ฐฉ๋ฒ•์€ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š” ์ธก๋ฉด์—์„œ ์œ ์‚ฌํ•œ ๋ฉด์ด ์žˆ๋‹ค.

์ ์šฉํ•  ์‹œ์Šคํ…œ์— ๋”ฐ๋ผ ๋‘ ๋ฐฉ๋ฒ•์˜ ์žฅ๋‹จ์ ์„ ๊ณ ๋ คํ•˜์—ฌ ์ ํ•ฉํ•œ ๋ฐฉ์‹์„ ์„ ํƒํ•ด์•ผ ํ•œ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๊ตฌ๋ถ„์ด ํ•„์š”ํ•  ๋•Œ๋Š” multi process๊ฐ€ ์œ ๋ฆฌํ•˜๋‹ค.

๋ฐ˜๋ฉด, Context switching์ด ์ž์ฃผ ์ผ์–ด๋‚˜๊ณ  ๋ฐ์ดํ„ฐ ๊ณต์œ ๊ฐ€ ๋นˆ๋ฒˆํ•œ ๊ฒฝ์šฐ, ๊ทธ๋ฆฌ๊ณ  ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ๋˜๋Š” ๊ฒฝ์šฐ์—๋Š” mulit thread๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์œ ๋ฆฌํ•˜๋‹ค.

Multi process & Multi thread

Multi process ๋Œ€์‹  multi thread๋กœ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ, ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„๊ณผ ์‹œ์Šคํ…œ ์ž์› ์†Œ๋ชจ๊ฐ€ ์ค„์–ด๋“ค๊ฒŒ ๋œ๋‹ค.

ํ•˜์ง€๋งŒ mutli thread๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” thread๊ฐ„ ์ž์›์„ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋™๊ธฐํ™” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ๊ณ ๋ คํ•œ ํ”„๋กœ๊ทธ๋žจ ์„ค๊ณ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

๋˜ํ•œ process๊ฐ„์˜ ํ†ต์‹ (IPC)๋ณด๋‹ค thread๊ฐ„์˜ ํ†ต์‹  ๋น„์šฉ์ด ์ ๊ธฐ ๋•Œ๋ฌธ์— ํ†ต์‹ ์œผ๋กœ ์ธํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ ๋‹ค.

  ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ / CPU ์‹œ๊ฐ„ Context switching ์•ˆ์ •์„ฑ
Multi process ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ /  CPU ์‹œ๊ฐ„ ์ฐจ์ง€ ๋Š๋ฆผ ๋†’์Œ
Mutli thread ์ ์€ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ / CPU ์‹œ๊ฐ„ ์ฐจ์ง€ ๋น ๋ฆ„ ๋‚ฎ์Œ

Multi thread๊ฐ€ multi process๋ณด๋‹ค ์ข‹์€ ์ ์€?

Multi process๋ฅผ ์ด์šฉํ•˜๋˜ ์ž‘์—…์„ multi thread๋กœ ๊ตฌํ˜„ํ•  ๊ฒฝ์šฐ, ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„๊ณผ ์‹œ์Šคํ…œ ์ž์› ์†Œ๋ชจ๊ฐ€ ์ค„์–ด๋“ค๊ฒŒ ๋œ๋‹ค.

๋˜ํ•œ, process๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ž์›์„ ํ• ๋‹นํ•˜๋Š” ๋“ฑ์˜ system call์„ ์ƒ๋žตํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Context swtiching ์‹œ ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ดˆ๊ธฐํ™”ํ•  ํ•„์š”๊ฐ€ ์—†์–ด์„œ ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ๋•Œ๋ฅผ ๋น„๊ตํ•ด๋ณด๋ฉด, process ๊ฐ„์˜ ํ†ต์‹  (IPC)๋ณด๋‹ค mutli thread ๊ฐ„์˜ ํ†ต์‹  ๋น„์šฉ์ด ์ ๊ธฐ ๋•Œ๋ฌธ์— ํ†ต์‹ ์œผ๋กœ ์ธํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ ๋‹ค.

Multi thread๊ฐ€ multi process๋ณด๋‹ค ์•ˆ์ข‹์€ ์ ์€?

thread ๊ฐ„์˜ ์ž์› ๊ณต์œ  ์‹œ ๋™๊ธฐํ™” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์„œ ํ”„๋กœ๊ทธ๋žจ ์„ค๊ณ„ ์‹œ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•˜๊ณ , ํ•˜๋‚˜์˜ thread์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๋ฉด process๋‚ด์˜ ๋‹ค๋ฅธ thread์—๋„ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋‹ค.

 

Mutli process ํ™˜๊ฒฝ์—์„œ process ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฃผ๊ณ  ๋ฐ›๋‚˜?

์›์น™์ ์œผ๋กœ process๋Š” ๋…๋ฆฝ์ ์ธ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์—, ๋‹ค๋ฅธ process์˜ ์ฃผ์†Œ ๊ณต๊ฐ„์„ ์ฐธ์กฐํ•  ์ˆ˜ ์—†๋‹ค.

ํ•˜์ง€๋งŒ ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์šด์˜์ฒด์ œ๋Š” process ๊ฐ„์˜ ์ž์› ์ ‘๊ทผ์„ ์œ„ํ•œ ๋งค์ปค๋‹ˆ์ฆ˜์ธ ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ (IPC, Inter Process, Communication)๋ฅผ ์ œ๊ณตํ•œ๋‹ค.

ํ”„๋กœ์„ธ์Šค ๊ฐ„ ํ†ต์‹ (IPC) ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ํŒŒ์ดํ”„, ํŒŒ์ผ, ์†Œ์ผ“, ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๋“ฑ์„ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

 

Multi thread์™€ ๋‹ค๋ฅด๊ฒŒ process๋ผ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ ๊ณต์œ ๋ฅผ ํ•˜๊ณ  ์žˆ์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ IPC ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค. IPC๋Š” ํฌ๊ฒŒ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๋ฐฉ์‹๊ณผ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ๋ฐฉ์‹์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

IPC (Inter-Process Communication)

process๋Š” ๊ฐ์ž ์ž์‹ ๋งŒ์˜ ๋…๋ฆฝ์ ์ธ ์ฃผ์†Œ๊ณต๊ฐ„์„ ๊ฐ€์ง€๋Š”๋ฐ, ๋‹ค๋ฅธ process๊ฐ€ ์ด ์ฃผ์†Œ๊ณต๊ฐ„์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ์€ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ process์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž ์šด์˜์ฒด์ œ๋Š” IPC ๊ธฐ๋ฒ•์„ ํ†ตํ•ด processs๋“ค ๊ฐ„์— ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ค€๋‹ค.

process๊ฐ„ ํ†ต์‹ (IPC)์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ(shared memory)์™€ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ(message passing)์˜ ๋‘ ๊ฐ€์ง€ ๋ชจ๋ธ์ด ์žˆ๋‹ค.

๊ณต์œ ๋ฉ”๋ชจ๋ฆฌ (shared memeory)

๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๋ฐฉ์‹์—์„œ๋Š” process๋“ค์ด ์ฃผ์†Œ ๊ณต๊ฐ„์˜ ์ผ๋ถ€๋ฅผ ๊ณต์œ ํ•œ๋‹ค. ๊ณต์œ ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ฝ๊ธฐ/์“ฐ๊ธฐ๋ฅผ ํ†ตํ•ด์„œ ํ†ต์‹ ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. process๊ฐ€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ kernel์— ์š”์ฒญํ•˜๋ฉด kernel์€ ํ•ด๋‹น process์— ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ• ๋‹นํ•ด์ค€๋‹ค. ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ด ๊ตฌ์ถ•๋œ ์ดํ›„์—๋Š” ๋ชจ๋“  ์ ‘๊ทผ์ด ์ผ๋ฐ˜์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์œผ๋กœ ์ทจ๊ธ‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋”์ด์ƒ kernel์˜ ๋„์›€ ์—†์ด๋„ ๊ฐ process๋“ค์ด ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ปค๋„์˜ ๊ด€์—ฌ ์—†์ด ๋ฐ์ดํ„ฐ๋ฅผ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— IPC ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค๋Š”  ์žฅ์ ์ด ์žˆ๋‹ค.

๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๋ฐฉ์‹์€ process๊ฐ„์˜ ํ†ต์‹ ์œผ๋กœ ์ˆ˜์›”ํ•˜๊ฒŒ ๋งŒ๋“ค์ง€๋งŒ ๋™์‹œ์— ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ์ ‘๊ทผํ•˜๊ฒŒ ๋˜๋ฉด ์ผ๊ด€์„ฑ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ๋Š” ์ปค๋„์ด ๊ด€์—ฌํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— process๋“ค ๋ผ๋ฆฌ ์ง์ ‘ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ์— ๋Œ€ํ•œ ๋™๊ธฐํ™” ๋ฌธ์ œ๋ฅผ ์ฑ…์ž„์ ธ์•ผ ํ•œ๋‹ค.

๋ฉ”์‹œ์ง€ ์ „๋‹ฌ (message passing)

๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ๋ฐฉ๋ฒ•์€ ํ†ต์ƒ system call์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋œ๋‹ค.

kernel์„ ํ†ตํ•ด send(message)์™€ receive(message)๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์—ฐ์‚ฐ์„ ์ œ๊ณต๋ฐ›๋Š”๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด, process1์ด kernel๋กœ message๋ฅผ ๋ณด๋‚ด๋ฉด kernel์ด process2์—๊ฒŒ message๋ฅผ ๋ณด๋‚ด์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ๊ณต์œ ๋ณด๋‹ค ์†๋„๊ฐ€ ๋Š๋ฆฌ์ง€๋งŒ, ์ถฉ๋Œ์„ ํšŒํ”ผํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ ์€ ์–‘์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•˜๋Š”๋ฐ ์œ ์šฉํ•˜๊ณ  ๊ตฌํ˜„ํ•˜๊ธฐ ์‰ฝ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ๋‹ค. ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๋กœ, pipe, socket, message queue ๋“ฑ์ด ์žˆ๋‹ค.

IPC์˜ ์˜ˆ์‹œ๋Š”?

IPC๋Š” ํฌ๊ฒŒ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ๊ณผ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ๋ชจ๋ธ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ์€ ์ฃผ์†Œ ๊ณต๊ฐ„์˜ ์ผ๋ถ€๋ฅผ ๊ณต์œ ํ•˜๋ฉฐ ๊ณต์œ ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— read/write๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•˜๊ฒŒ ๋œ๋‹ค. ์˜ˆ์‹œ๋กœ๋Š” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์™€ POSIX๊ฐ€ ์žˆ๋‹ค.

๋ฉ”์‹œ์ง€ ์ „์†ก ๋ชจ๋ธ์˜ ๊ฒฝ์šฐ์—๋Š” kernel์„ ํ†ตํ•ด send/receive ์—ฐ์‚ฐ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค. ์˜ˆ์‹œ๋กœ๋Š” Pipe, socket, message queue ๋“ฑ์ด ์žˆ๋‹ค.

๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ์™€ ๋ฉ”์‹œ์ง€ ์ „๋‹ฌ ๋ชจ๋ธ์˜ ์žฅ๋‹จ์  ์„ค๋ช…

๋ชจ๋ธ ์žฅ์  ๋‹จ์ 
๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ธฐ์— ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์ œ์™ธํ•˜๋ฉด kernel์˜ ๊ด€์—ฌ ์—†์ด ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์†๋„๊ฐ€ ๋น ๋ฅด๋‹ค. ์—ฌ๋Ÿฌ process๊ฐ€ ๋™์‹œ์— ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋ณ„๋„์˜ ๋™๊ธฐํ™” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.
๋ฉ”์„ธ์ง€ ์ „๋‹ฌ kernel์—์„œ ์ œ์–ด๋ฅผ ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์•ˆ์ „ํ•˜๋ฉฐ kernel์ด ๋™๊ธฐํ™”๋ฅผ ์ œ๊ณตํ•ด์ค€๋‹ค. kernel์„ ํ†ตํ•ด์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ํ†ต์‹  ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค.

 

Multi process/thread ํ™˜๊ฒฝ์—์„œ ๋™๊ธฐํ™” ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋‚˜?

๋™๊ธฐํ™” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด mutex, semaphore ๊ธฐ๋ฒ• ๋“ฑ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Mutext 1๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋งŒ์ด ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ• ์ˆ˜ ์žˆ๋„๋ก ํ•˜์—ฌ, ๊ฒฝ์Ÿ ์ƒํ™ฉ(race condition)์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ธฐ๋ฒ•์ด๋‹ค.
๊ณต์œ  ์ž์›์„ ์ ์œ ํ•˜๋Š” thread๊ฐ€ lock์„ ๊ฑธ๋ฉด, ๋‹ค๋ฅธ thread๋Š” unlock ์ƒํƒœ๊ฐ€ ๋  ๋•Œ๊นŒ์ง€ ํ•ด๋‹น ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.
Semaphore S๊ฐœ์˜ thread๋งŒ์ด ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ œ์–ดํ•˜๋Š” ๋™๊ธฐํ™” ๊ธฐ๋ฒ•์ด๋‹ค.
Semaphore ๊ธฐ๋ฒ•์—์„œ๋Š” ์ •์ˆ˜ํ˜• ๋ณ€์ˆ˜ S(์„ธ๋ชจํฌ) ๊ฐ’์„ ๊ฐ€์šฉํ•œ ์ž์›์˜ ์ˆ˜๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ์ž์›์— ์ ‘๊ทผํ•  ๋•Œ S-- ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์„ธ๋งˆํฌ ๊ฐ’์„ ๊ฐ์†Œ์‹œํ‚ค๊ณ  ์ž์›์„ ๋ฐฉ์ถœํ•  ๋•Œ๋Š” S++ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ์„ธ๋งˆํฌ ๊ฐ’์„ ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
์ด ๋•Œ ์„ธ๋งˆํฌ ๊ฐ’์ด 0์ด ๋˜๋ฉด ๋ชจ๋“  ์ž์›์ด ์‚ฌ์šฉ ์ค‘์ž„์„ ์˜๋ฏธํ•˜๊ณ , ์ดํ›„ ์ž์›์„ ์‚ฌ์šฉํ•˜๋ ค๋Š” ํ”„๋กœ์„ธ์Šค๋Š” ์„ธ๋งˆํฌ ๊ฐ’์ด 0๋ณด๋‹ค ์ปค์งˆ ๋•Œ๊นŒ์ง€ block ๋œ๋‹ค.  

๋™๊ธฐํ™” ๋ฌธ์ œ

๋™๊ธฐํ™” ๋ฌธ์ œ๋ž€ ์„œ๋กœ ๋‹ค๋ฅธ thread๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ๊ณต์œ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๋Ÿฌ thread๊ฐ€ ๋™์ผํ•œ ์ž์›์— ๋™์‹œ์— ์ ‘๊ทผํ•˜์—ฌ ์—‰๋šฑํ•œ ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋Š” ๋ฌธ์ œ์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, 

count++ ๋ฅผ CPU ์ž…์žฅ์—์„œ ๋ถ„ํ•ดํ•ด๋ณด๋ฉด 3๊ฐœ์˜ atomic operations์œผ๋กœ ๋‚˜๋‰œ๋‹ค.

  1. count ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.
  2. count ๋ณ€์ˆ˜์˜ ๊ฐ’์„ 1 ์ฆ๊ฐ€์‹œํ‚จ๋‹ค.
  3. ๋ณ€๊ฒฝ๋œ count ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

CPU๋Š” atomic operation์„ ์—ฐ์‚ฐํ•˜๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ count++์„ ํ•˜๊ธฐ ์œ„ํ•ด 3๋ฒˆ์˜ ์—ฐ์‚ฐ์„ ํ•˜๊ฒŒ ๋œ๋‹ค.

์‹œ๋ถ„ํ•  ์‹œ์Šคํ…œ์œผ๋กœ ์ž‘๋™ํ•˜๋Š” multi process/multi thread ์‹œ์Šคํ…œ์—์„œ, ๋‘ ๊ฐœ์˜ thread๊ฐ€ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ์ธ count์— ๋™์‹œ์— ์ ‘๊ทผ์„ ํ•˜์—ฌ ์กฐ์ž‘์„ ํ•˜๋Š” ์ƒํ™ฉ์„ ๊ฐ€์ •ํ•ด๋ณด์ž.

thread1์—์„œ๋„ count++๋ฅผ ํ•˜๊ณ , thread2์—์„œ๋„ count++๋ฅผ ํ•œ๋‹ค๋ฉด ๊ทธ ์‹คํ–‰ ๊ฒฐ๊ณผ๊ฐ€ ์ ‘๊ทผ์ด ๋ฐœ์ƒํ•œ ์ˆœ์„œ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ๊ฒฝ์Ÿ์ƒํ™ฉ(rece condition)์ด๋ผ๊ณ  ํ•œ๋‹ค.    

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

์ž„๊ณ„์˜์—ญ (critical section)

๋‘˜ ์ด์ƒ์˜ process/thread๊ฐ€ ๋™์‹œ์— ๋™์ผํ•œ ์ž์›์— ์ ‘๊ทผํ•˜๋„๋ก ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ ๋ถ€๋ถ„์„ ์˜๋ฏธํ•œ๋‹ค.

์ค‘์š”ํ•œ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š”, ํ•œ process/thread๊ฐ€ ์ž์‹ ์˜ ์ž„๊ณ„์˜์—ญ์—์„œ ์ˆ˜ํ–‰ํ•˜๋Š” ๋™์•ˆ์—๋Š” ๋‹ค๋ฅธ process/thread๋“ค์€ ๊ทธ๋“ค์˜ ์ž„๊ณ„๊ตฌ์—ญ์— ๋“ค์–ด๊ฐˆ ์ˆ˜ ์—†์–ด์•ผ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์ด๋‹ค. ์ฆ‰, ์ž„๊ณ„์˜์—ญ ๋‚ด์˜ ์ฝ”๋“œ๋Š” ์›์ž์ ์œผ๋กœ(atomically) ์‹คํ–‰์ด ๋˜์–ด์•ผ ํ•œ๋‹ค.

์›์ž์ ์œผ๋กœ ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•ด์„œ ๊ฐ๊ฐ์˜ process/thread๋Š” ์ž์‹ ์˜ ์ž„๊ณ„๊ตฌ์—ญ์œผ๋กœ ์ง„์ž…ํ•˜๋ ค๋ฉด ์ง„์ž…ํ—ˆ๊ฐ€๋ฅผ ์š”์ฒญํ•ด์•ผ ํ•œ๋‹ค.

์ด ๋ถ€๋ถ„์„ entry section ์ด๋ผ๊ณ  ํ•˜๊ณ , ์ง„์ž…์ด ํ—ˆ๊ฐ€๋˜๋ฉด ์ž„๊ณ„์˜์—ญ์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ž„๊ณ„์˜์—ญ์ด ๋๋‚˜๊ณ  ๋‚˜๋ฉด exit section์œผ๋กœ ํ‡ด์ถœ์„ ํ•˜๊ฒŒ ๋œ๋‹ค. ์ž„๊ณ„์˜์—ญ์˜ ์›์ž์„ฑ์„ ๋ณด์žฅํ•˜์—ฌ process/thread๋“ค์ด ๋™๊ธฐํ™”๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.  

๋™๊ธฐํ™” ๋ฐฉ๋ฒ•์œผ๋กœ ๋Œ€ํ‘œ์ ์œผ๋กœ Mutex์™€ Semaphore๊ฐ€์žˆ๋‹ค. 

Mutex

๋™๊ธฐํ™” ๋ฐฉ๋ฒ•์ค‘ ํ•˜๋‚˜๋กœ mutual exclusion์˜ ์ถ•์•ฝ์–ด์ด๋‹ค. ๊ณต์œ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” process/thread์˜ ์ˆ˜๋ฅผ 1๊ฐœ๋กœ ์ œํ•œํ•œ๋‹ค.

์ž„๊ณ„์˜์—ญ์„ ๋ณดํ˜ธํ•˜๊ณ , ๊ฒฝ์Ÿ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด mutex lock์„ ์‚ฌ์šฉํ•œ๋‹ค. ์ฆ‰, process/thread๋Š” ์ž„๊ณ„์˜์—ญ์— ๋“ค์–ด๊ฐ€๊ธฐ ์ „์— ๋ฐ˜๋“œ์‹œ lock์„ ํš๋“ํ•ด์•ผ ํ•˜๊ณ , ์ž„๊ณ„๊ตฌ์—ญ์„ ๋น ์ ธ๋‚˜์˜ฌ ๋•Œ lock์„ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

acquire()ํ•จ์ˆ˜๊ฐ€ lock์„ ํš๋“ํ•˜๊ณ  release() ํ•จ์ˆ˜๊ฐ€ lock์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

acquire() // entry section
// critical section
release() // exit section

busy waiting์€ ๋‹ค๋ฅธ process/thread๊ฐ€ ์ƒ์‚ฐ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” CPU๋ฅผ ๋‚ญ๋น„ํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

Semaphore

๋™๊ธฐํ™” ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ, mutax์™€ ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์€ ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” process/thread์˜ ๊ฐœ์ˆ˜๊ฐ€ 2๊ฐœ ์ด์ƒ์ด ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. 

semaphore ๋ณ€์ˆ˜ S(์„ธ๋งˆํฌ)์— ๋™์‹œ์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ process/thread์˜ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•œ๋‹ค.

S๊ฐ€ 0๋ณด๋‹ค ํฌ๋ฉด ์ž„๊ณ„์˜์—ญ์œผ๋กœ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๊ณ , ์ž„๊ณ„์˜์—ญ์— ๋“ค์–ด๊ฐ€๋ฉด S๊ฐ’์„ 1๊ฐ์†Œ ์‹œํ‚จ๋‹ค.

S๊ฐ’์ด 0์ด ๋˜๋ฉด ๋‹ค๋ฅธ process/thread๋Š” ์ž„๊ณ„์˜์—ญ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.

์ž„๊ณ„์˜์—ญ์—์„œ์˜ ์ž‘์—…์ด ๋๋‚˜๊ณ  ์ž„๊ณ„์˜์—ญ์—์„œ exitํ•˜๋ฉด์„œ S๊ฐ’์„ 1์ฆ๊ฐ€ ์‹œํ‚จ๋‹ค.

wait(S) // entry section
// critical section
signal(S) // exit section

semaphore ๊ฐ’์ด 0,1๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ binary semaphore๋ผ๊ณ  ํ•˜๋Š”๋ฐ, ์ด๋Š” mutex๋ž‘ ๊ฑฐ์˜ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘๋™ํ•œ๋‹ค.

 

mutex์™€ semaphore ๊ธฐ๋ฒ• ๋น„๊ต ์„ค๋ช…

๊ณต์œ ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ์ˆ˜์— ์˜ํ•ด ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. 

mutex ์˜ค์ง 1๊ฐœ์˜ process/thread๋งŒ์ด ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.
mutex๋Š” binary semaphore๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.
semaphore semaphore๋Š” ์„ธ๋งˆํฌ ๋ณ€์ˆ˜์˜ ๊ฐ’๋งŒํผ์˜ process/thread๋“ค์ด ๋™์‹œ์— ๊ณต์œ  ์ž์›์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ต์ฐฉ์ƒํƒœ (Deadlock)

๋‘˜ ์ด์ƒ์˜ thread๊ฐ€ ๊ฐ๊ธฐ ๋‹ค๋ฅธ thread๊ฐ€ ์ ์œ ํ•˜๊ณ  ์žˆ๋Š” ์ž์›์„ ์„œ๋กœ ๊ธฐ๋‹ค๋ฆด ๋•Œ, ๋ฌดํ•œ ๋Œ€๊ธฐ์— ๋น ์ง€๋Š” ์ƒํ™ฉ์„ ๋งํ•œ๋‹ค.

deadlock์ด ๋ฐœ์ƒํ•˜๋Š” ์กฐ๊ฑด์€ ์ƒํ˜ธ ๋ฐฐ์ œ(mutual exclusion), ์ ์œ  ๋Œ€๊ธฐ(hold-and-wait), ๋น„์„ ์ (no preemption), ์ˆœํ™˜ ๋Œ€๊ธฐ(circular wait)์ด๋‹ค. ์ด 4๊ฐ€์ง€ ์กฐ๊ฑด์ด ๋™์‹œ์— ์„ฑ๋ฆฝํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

deadlock ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ๋ฌด์‹œ, ์˜ˆ๋ฐฉ, ํšŒํ”ผ, ํƒ์ง€-ํšŒ๋ณต 4๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.

 

deadlock์ด ๋ฐœ์ƒํ•˜๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด๊ณผ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๊ผญ ์•Œ์•„์•ผํ•œ๋‹ค.

  ๋ฐœ์ƒ ์กฐ๊ฑด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•
Deadlock ์ƒํ˜ธ๋ฐฐ์ œ, ์ ์œ ๋Œ€๊ธฐ, ๋น„์„ ์ , ์ˆœํ™˜๋Œ€๊ธฐ ๋ฌด์‹œ, ์˜ˆ๋ฐฉ, ํšŒํ”ผ, ํƒ์ง€-ํšŒ๋ณต

Deadlock ๋ฐœ์ƒ ์กฐ๊ฑด

deadlock์€ ๋‹ค์Œ 4๊ฐ€์ง€ ์กฐ๊ฑด์ด ๋™์‹œ์— ์„ฑ๋ฆฝํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

  1.  ์ƒํ˜ธ ๋ฐฐ์ œ (mutual exclusion)
    • ๋™์‹œ์— ํ•œ thread๋งŒ ์ž์›์„ ์ ์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด๋‹ค.
    • ๋‹ค๋ฅธ thread๊ฐ€ ์ž์›์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ž์›์ด ๋ฐฉ์ถœ๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค. 
  2. ์ ์œ  ๋Œ€๊ธฐ (hold-and-wait)
    • thread๊ฐ€ ์ž์›์€ใ„น ๋ณด์œ ํ•œ ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ thread๊ฐ€ ๋ณด์œ ํ•œ ์ž์›์„ ์ถ”๊ฐ€๋กœ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํ™ฉ์ด๋‹ค.
  3. ๋น„์„ ์  (no preemption)
    • ๋‹ค๋ฅธ thread๊ฐ€ ์‚ฌ์šฉ ์ค‘์ธ ์ž์›์„ ๊ฐ•์ œ๋กœ ์„ ์ ํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด๋‹ค.
    • ์ž์›์„ ์ ์œ ํ•˜๊ณ  ์žˆ๋Š” thread์— ์˜ํ•ด์„œ๋งŒ ์ž์›์ด ๋ฐฉ์ถœ๋œ๋‹ค
  4. ์ˆœํ™˜ ๋Œ€๊ธฐ (circular wait)
    • ๋Œ€๊ธฐ ์ค‘์ธ thread๋“ค์ด ์ˆœํ™˜ ํ˜•ํƒœ๋กœ ์ž์›์„ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋Š” ์ƒํ™ฉ์ด๋‹ค.

Deadlock ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  ์„ค๋ช… ๋น„๊ณ 
๋ฌด์‹œ deadlock ๋ฐœ์ƒ ํ™•๋ฅ ์ด ๋‚ฎ์€ ์‹œ์Šคํ…œ์—์„œ ์•„๋ฌด๋Ÿฐ ์กฐ์น˜๋„ ์ทจํ•˜์ง€ ์•Š๊ณ  deadlock์„ ๋ฌด์‹œํ•˜๋Š” ๋ฐฉ๋ฒ• - ๋ฌด์‹œ ๊ธฐ๋ฒ•์€ ์‹œ์Šคํ…œ ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ์—†๋‹ค๋Š” ํฐ ์žฅ์ ์ด ์žˆ๋‹ค.
- ํ˜„๋Œ€ ์‹œ์Šคํ…œ์—์„œ๋Š” deadlock์ด ์ž˜ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ณ , ํ•ด๊ฒฐ ๋น„์šฉ์ด ํฌ๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์‹œ ๋ฐฉ๋ฒ•์ด ๋งŽ์ด ์‚ฌ์šฉ๋œ๋‹ค.
์˜ˆ๋ฐฉ ๊ต์ฐฉ ์ƒํƒœ์˜ 4๊ฐ€์ง€ ๋ฐœ์ƒ ์กฐ๊ฑด ์ค‘ ํ•˜๋‚˜๊ฐ€ ์„ฑ๋ฆฝํ•˜์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ๋ฐฉ๋ฒ• - ์ˆœํ™˜ ๋Œ€๊ธฐ ์กฐ๊ฑด์ด ์„ฑ๋ฆฝํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ํ˜„์‹ค์ ์œผ๋กœ ๊ฐ€๋Šฅํ•œ ์˜ˆ๋ฐฉ ๊ธฐ๋ฒ•์ด๋‹ค.
- ์ž์› ์‚ฌ์šฉ์˜ ํšจ์œจ์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ๋น„์šฉ์ด ํฌ๋‹ค.
ํšŒํ”ผ thread๊ฐ€ ์•ž์œผ๋กœ ์ž์›์„ ์–ด๋–ป๊ฒŒ ์š”์ฒญํ• ์ง€์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํ†ตํ•ด ์ˆœํ™˜ ๋Œ€๊ธฐ ์ƒํƒœ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ์ž์›์„ ํ• ๋‹นํ•˜๋Š” ๋ฐฉ๋ฒ• - ์ž์› ํ• ๋‹น ๊ทธ๋ž˜ํ”„ ์•Œ๊ณ ๋ฆฌ์ฆ˜, ์€ํ–‰์› ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋“ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž์›์„ ํ• ๋‹นํ•˜์—ฌ deadlockd์„ ํšŒํ”ผํ•œ๋‹ค.
ํƒ์ง€-ํšŒ๋ณต ์‹œ์Šคํ…œ ๊ฒ€์‚ฌ๋ฅผ ํ†ตํ•ด deadlock ๋ฐœ์ƒ์„ ํƒ์ง€ํ•˜๊ณ , ์ด๋ฅผ ํšŒ๋ณต์‹œํ‚ค๋Š” ๋ฐฉ๋ฒ• - ์ž์› ์‚ฌ์šฉ์˜ ํšจ์œจ์„ฑ์ด ๋–จ์–ด์ง€๊ณ  ๋น„์šฉ์ด ํฌ๋‹ค.

deadlock์€ ์–ธ์ œ ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋‚˜?

deadlock์€ ์ƒํ˜ธ๋ฐฐ์ œ, ์ ์œ ๋Œ€๊ธฐ, ๋น„์„ ์ , ์ˆœํ™˜๋Œ€๊ธฐ 4๊ฐ€์ง€ ์กฐ๊ฑด์ด ๋™์‹œ์— ์„ฑ๋ฆฝํ•  ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์ƒํ˜ธ ๋ฐฐ์ œ๋Š” ๋™์‹œ์— ํ•œ thread๋งŒ ์ž์›์„ ์ ์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒํ™ฉ์ด๊ณ ,

์ ์œ  ๋Œ€๊ธฐ๋Š” thread๊ฐ€ ์ž์›์„ ๋ณด์œ ํ•œ ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ thread๊ฐ€ ๋ณด์œ ํ•œ ์ž์›์„ ์ถ”๊ฐ€์ ์œผ๋กœ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํ™ฉ์ด๋‹ค.

๋น„์„ ์ ์€ ๋‹ค๋ฅธ thread๊ฐ€ ์‚ฌ์šฉ ์ค‘์ธ ์ž์›์„ ๊ฐ•์ œ๋กœ ์„ ์ ํ• ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด๊ณ ,

์ˆœํ™˜ ๋Œ€๊ธฐ๋Š” ๋Œ€๊ธฐ ์ค‘์ธ thread๋“ค์ด ์ˆœํ™˜ ํ˜•ํƒœ๋กœ ์ž์›์„ ๋Œ€๊ธฐํ•˜๋Š” ์ƒํ™ฉ์„ ๋งํ•œ๋‹ค. 

 

 


์ฐธ๊ณ 

https://velog.velcdn.com/images/dot2__/post/89878cc7-5156-4d74-abba-ec55d6740c04/image.jpg

https://3.bp.blogspot.com/-QCSJjTzvRNU/XJ9EV9oz3MI/AAAAAAAAANM/quZ8dbUOeH8TgMoYdSHffdzTkYFYPHnjwCLcBGAs/s1600/PCB%2BTable.png

https://t1.daumcdn.net/cfile/tistory/994590345BB1B4DB2F

https://t1.daumcdn.net/cfile/tistory/998BB43D5A6E7E6912

https://static.javatpoint.com/operating-system/images/ipc-through-shared-memory.png

https://beingintelligent.com/wp-content/uploads/2022/04/Shared-Memory-and-Message-Passing-System.jpg

https://media.geeksforgeeks.org/wp-content/uploads/20210923191813/ttm.png

https://www.google.com/url?sa=i&url=https%3A%2F%2Fwww.gatevidyalay.com%2Fcritical-section-critical-section-problem%2F&psig=AOvVaw3cBI-TfrdbKojd3aITvsrO&ust=1684905996497000&source=images&cd=vfe&ved=0CBEQjRxqFwoTCJjI-I7aiv8CFQAAAAAdAAAAABAD 

 

๋ฆฌ๋””๋ ‰์…˜ ์•Œ๋ฆผ

 

www.google.com

 

728x90
๋ฐ˜์‘ํ˜•