GoSuda

Conceptos bรกsicos de gorutinas

By hamori
views ...

Goroutine

Gopher๋“ค์—๊ฒŒ golang์˜ ์žฅ์ ์„ ์ด์•ผ๊ธฐ ํ•ด๋‹ฌ๋ผํ•˜๋ฉด ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ๋™์‹œ์„ฑ(Concurrency) ๊ด€๋ จ ๊ธ€์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋‚ด์šฉ์˜ ๊ธฐ๋ฐ˜์€ ๊ฐ€๋ณ๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” **๊ณ ๋ฃจํ‹ด(goroutine)**์ž…๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•˜์—ฌ ๊ฐ„๋žตํ•˜๊ฒŒ ์ž‘์„ฑํ•ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

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

๊ณ ๋ฃจํ‹ด์„ ์ดํ•ดํ•˜๊ธฐ ์ „์—, ์ž์ฃผ ํ˜ผ๋™๋˜๋Š” ๋‘ ๊ฐ€์ง€ ๊ฐœ๋…์„ ๋จผ์ € ์งš๊ณ  ๋„˜์–ด๊ฐ€๋ ค ํ•ฉ๋‹ˆ๋‹ค.

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

๊ณ ๋ฃจํ‹ด์€ Go ๋Ÿฐํƒ€์ž„ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ํ†ตํ•ด ๋™์‹œ์„ฑ์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•˜๊ฒŒ ํ•ด์ฃผ๋ฉฐ, GOMAXPROCS ์„ค์ •์„ ํ†ตํ•ด ๋ณ‘๋ ฌ์„ฑ๊นŒ์ง€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ”ํžˆ ์ด์šฉ๋ฅ ์ด ๋†’์€ ์ž๋ฐ”์˜ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ(Multi thread)๋Š” ๋ณ‘๋ ฌ์„ฑ์˜ ๋Œ€ํ‘œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค.

๊ณ ๋ฃจํ‹ด์€ ์™œ ์ข‹์„๊นŒ?

๊ฐ€๋ณ๋‹ค(lightweight)

์ƒ์„ฑ๋น„์šฉ์ด ๋‹ค๋ฅธ ์–ธ์–ด์— ๋น„ํ•ด์„œ ๋งค์šฐ ๋‚ฎ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์™œ golang์€ ์ ๊ฒŒ ์‚ฌ์šฉํ• ๊นŒ์š”? ๋ผ๋Š” ์˜๋ฌธ์ด ๋“œ๋Š”๋ฐ ์ƒ์„ฑ ์œ„์น˜๊ฐ€ Go๋Ÿฐํƒ€์ž„ ๋‚ด๋ถ€์—์„œ ๊ด€๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์œ„์˜ ๊ฒฝ๋Ÿ‰ ๋…ผ๋ฆฌ ์Šค๋ ˆ๋“œ ์ด๊ธฐ ๋•Œ๋ฌธ์ด OS์“ฐ๋ ˆ๋“œ ๋‹จ์œ„๋ณด๋‹ค ์ž‘๊ณ , ์ดˆ๊ธฐ์Šคํƒ์€ 2KB์ •๋„์˜ ํฌ๊ธฐ๋ฅผ ํ•„์š”๋กœ ํ•˜๋ฉฐ ์‚ฌ์šฉ์ž์˜ ๊ตฌํ˜„์— ๋”ฐ๋ผ ์Šคํƒ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋™์ ์œผ๋กœ ๊ฐ€๋ณ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์Šคํƒ ๋‹จ์œ„๋กœ ๊ด€๋ฆฌํ•˜์—ฌ ์ƒ์„ฑ,์ œ๊ฑฐ๊ฐ€ ๋งค์šฐ ๋น ๋ฅด๊ณ  ์ €๋ ดํ•˜๊ฒŒ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜์—ฌ ์ˆ˜๋ฐฑ๋งŒ๊ฐœ์˜ ๊ณ ๋ฃจํ‹ด์„ ๋Œ๋ ค๋„ ๋ถ€๋‹ด์Šค๋Ÿฝ์ง€ ์•Š์€ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด Goroutine์€ ๋Ÿฐํƒ€์ž„ ์Šค์ผ€์ฅด๋Ÿฌ ๋•๋ถ„์— OS์ปค๋„ ๊ฐœ์ž…์„ ์ตœ์†Œํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ฑ๋Šฅ์ด ์ข‹๋‹ค(performance)

์šฐ์„  Goroutine์€ ์œ„์˜ ์„ค๋ช…์ฒ˜๋Ÿผ OS์ปค๋„ ๊ฐœ์ž…์ด ์ ์–ด ์‚ฌ์šฉ์ž ์ˆ˜์ค€(User-Level)์—์„œ ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์„ ํ• ๋•Œ OS์Šค๋ ˆ๋“œ ๋‹จ์œ„๋ณด๋‹ค ๋น„์šฉ์ด ์ €๋ ดํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ์ž‘์—…์„ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์™ธ์—๋„ M:N๋ชจ๋ธ์„ ์ด์šฉํ•˜์—ฌ OS์Šค๋ ˆ๋“œ์— ํ• ๋‹นํ•˜์—ฌ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. OS ์“ฐ๋ ˆ๋“œ ํ’€์„ ๋งŒ๋“ค์–ด ๋งŽ์€ ์“ฐ๋ ˆ๋“œ๊ฐ€ ํ•„์š”์—†์ด ์ ์€ ์“ฐ๋ ˆ๋“œ๋กœ๋„ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๊ณผ ๊ฐ™์€ ๋Œ€๊ธฐ์ƒํƒœ์— ๋น ์ง€๋ฉด Go๋Ÿฐํƒ€์ž„์€ OS์“ฐ๋ ˆ๋“œ์—์„œ ๋‹ค๋ฅธ ๊ณ ๋ฃจํ‹ด์„ ์‹คํ–‰ํ•˜์—ฌ OS์“ฐ๋ ˆ๋“œ๋Š” ์‰ฌ์ง€ ์•Š๊ณ  ํšจ์œจ์ ์œผ๋กœ CPU๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋น ๋ฅธ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด๋กœ ์ธํ•˜์—ฌ Golang์ด ํŠนํžˆ I/O์ž‘์—…์—์„œ ๋‹ค๋ฅธ ์–ธ์–ด์— ๋น„ํ•ด ๋†’์€ ์„ฑ๋Šฅ์„ ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ„๊ฒฐํ•˜๋‹ค(concise)

๋™์‹œ์„ฑ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ go ํ‚ค์›Œ๋“œ ํ•˜๋‚˜๋กœ ํ•จ์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๊ฒƒ๋„ ํฐ ์žฅ์ ์ž…๋‹ˆ๋‹ค.

Mutex , Semaphore ๋“ฑ ๋ณต์žกํ•œ Lock์„ ์ด์šฉํ•ด์•ผ ํ•˜๋ฉฐ, Lock์„ ์ด์šฉํ•˜๋ฉด ํ•„์ˆ˜์ ์œผ๋กœ ๊ณ ๋ ค์•ผํ•  ๋ฐ๋“œ๋ฝ(DeadLock) ์ƒํƒœ๋ฅผ ๊ณ ๋ คํ•  ์ˆ˜ ๋ฐ–์— ์—†์–ด ๊ฐœ๋ฐœ์ด์ „ ์„ค๊ณ„๋‹จ๊ณ„์—์„œ ๋ถ€ํ„ฐ ๋ณต์žกํ•œ ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•ด์ง‘๋‹ˆ๋‹ค.

Goroutine์€ "๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜์—ฌ ํ†ต์‹ ํ•˜์ง€ ๋ง๊ณ , ํ†ต์‹ ํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๋ผ"๋Š” ์ฒ ํ•™์— ๋”ฐ๋ผ ์ฑ„๋„(Channel)์„ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ์„ ๊ถŒ์žฅํ•˜๋ฉฐ SELECT ๋Š” ์ฑ„๋„(Channel)๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๊ฐ€ ์ค€๋น„๋œ ์ฑ„๋„๋ถ€ํ„ฐ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ๊นŒ์ง€ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, sync.WaitGroup์„ ์ด์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ๊ณ ๋ฃจํ‹ด์ด ๋ชจ๋‘ ๋๋‚  ๋•Œ๊นŒ์ง€ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ์–ด ์ž‘์—… ํ๋ฆ„์„ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋“ค ๋•๋ถ„์— ์“ฐ๋ ˆ๋“œ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๊ฒฝ์Ÿ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ณ  ๋ณด๋‹ค ์•ˆ์ „ํ•˜๊ฒŒ ๋™์‹œ์„ฑ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ, ์ปจํ…์ŠคํŠธ(context)๋ฅผ ์ด์šฉํ•˜์—ฌ ์ด๋ฅผ ์‚ฌ์šฉ์ž ์ˆ˜์ค€(User-Level)์—์„œ ์ƒ๋ช…์ฃผ๊ธฐ, ์ทจ์†Œ, ํƒ€์ž„์•„์›ƒ, ๋ฐ๋“œ๋ผ์ธ, ์š”์ฒญ๋ฒ”์œ„๋ฅผ ์ œ์–ด ํ•  ์ˆ˜ ์žˆ์–ด ์–ด๋А์ •๋„์˜ ์•ˆ์ •์„ฑ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Goroutine์˜ ๋ณ‘๋ ฌ ์ž‘์—…(GOMAXPROCS)

goroutine์˜ ๋™์‹œ์„ฑ์ด ์ข‹์€์ ์„ ๋งํ–ˆ์ง€๋งŒ ๋ณ‘๋ ฌ์€ ์ง€์›ํ•˜์ง€ ์•Š๋‚˜? ๋ผ๋Š” ์˜๋ฌธ์ด ๋“œ์‹ค๊ฒ๋‹ˆ๋‹ค. ์ตœ๊ทผ CPU์˜ ์ฝ”์–ด์˜์ˆ˜๋Š” ๊ณผ๊ฑฐ์™€ ๋‹ค๋ฅด๊ฒŒ ๋‘์ž๋ฆฌ ์ˆ˜๊ฐ€ ๋„˜์–ด๊ฐ€๋ฉฐ, ๊ฐ€์ •์šฉ PC๋˜ํ•œ ์ฝ”์–ด๊ฐ€ ์ ์ง€์•Š์€ ์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ Goroutine์€ ๋ณ‘๋ ฌ์ž‘์—…๊นŒ์ง€ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค ๊ทธ๊ฒƒ์ด GOMAXPROCS์ž…๋‹ˆ๋‹ค.

GOMAXPROCS ๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฒ„์ „๋ณ„๋กœ ๋‹ค๋ฅด๊ฒŒ ์„ค์ •๋ฉ๋‹ˆ๋‹ค.

  1. 1.5 ์ด์ „: ๊ธฐ๋ณธ๊ฐ’ 1, 1 ์ด์ƒ ํ•„์š”์‹œ runtime.GOMAXPOCS(runtime.NumCPU()) ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์„ค์ •์ด ํ•„์ˆ˜

  2. 1.5 ~ 1.24: ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๋…ผ๋ฆฌ ์ฝ”์–ด์ˆ˜๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ๋ถ€ํ„ฐ ๊ฐœ๋ฐœ์ž๊ฐ€ ํฌ๊ฒŒ ์ œ์•ฝ์„ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ์„ค์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค

  3. 1.25: ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ ์œ ๋ช…ํ•œ ์–ธ์–ด๋‹ต๊ฒŒ, linux์ƒ์˜ cGroup์„ ํ™•์ธํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ์— ์„ค์ •๋œ CPU์ œํ•œ ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

    ๊ทธ๋Ÿฌ๋ฉด ๋…ผ๋ฆฌ ์ฝ”์–ด์ˆ˜๊ฐ€ 10๊ฐœ์ด๊ณ , CPU์ œํ•œ๊ฐ’์ด 5์ผ ๊ฒฝ์šฐ GOMAXPROCS ๋Š” ๋” ๋‚ฎ์€ ์ˆ˜์ธ 5๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

1.25 ์˜ ์ˆ˜์ •์€ ๊ต‰์žฅํžˆ ํฐ ์ˆ˜์ •์ ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์—์„œ์˜ ์–ธ์–ด ํ™œ์šฉ๋„๊ฐ€ ์˜ฌ๋ผ๊ฐ”๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด์„œ ๋ถˆํ•„์š”ํ•œ ์Šค๋ ˆ๋“œ ์ƒ์„ฑ๊ณผ, ์ปจํ…์ŠคํŠธ ์Šค์œ„์นญ์„ ์ค„์—ฌ CPU ์Šค๋กœํ‹€๋ง(throttling)์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

 1package main
 2
 3import (
 4	"fmt"
 5	"math/rand"
 6	"runtime"
 7	"time"
 8)
 9
10func exe(name int, wg *sync.WaitGroup) {
11	defer wg.Done()
12
13	fmt.Printf("Goroutine %d: ์‹œ์ž‘\n", name)
14	time.Sleep(10 * time.Millisecond) // ์ž‘์—… ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์œ„ํ•œ ์ง€์—ฐ
15	fmt.Printf("Goroutine %d: ์‹œ์ž‘\n", name)
16}
17
18func main() {
19	runtime.GOMAXPROCS(2) // CPU ์ฝ”์–ด 2๊ฐœ๋งŒ ์‚ฌ์šฉ
20	wg := sync.WaitGroup();
21  goroutineCount := 10
22	wg.Add(goroutineCount)
23
24	for i := 0; i < goroutineCount; i++ {
25		go exe(i, &wg)
26	}
27
28	fmt.Println("๋ชจ๋“  goroutine์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•ฉ๋‹ˆ๋‹ค...")
29	wg.Wait()
30	fmt.Println("๋ชจ๋“  ์ž‘์—…์ด ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
31
32}
33

Goroutine์˜ ์Šค์ผ€์ฅด๋Ÿฌ (M:N๋ชจ๋ธ)

์•ž์˜ ๋‚ด์šฉ์ธ M:N๋ชจ๋ธ์„ ์ด์šฉํ•˜์—ฌ OS์Šค๋ ˆ๋“œ์— ํ• ๋‹นํ•˜์—ฌ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค ๋ถ€๋ถ„์—์„œ ์กฐ๊ธˆ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฉด goroutine GMP๋ชจ๋ธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • G (Goroutine): Go์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฐ€์žฅ ์ž‘์€ ์ž‘์—… ๋‹จ์œ„
  • M (Machine): OS ์“ฐ๋ ˆ๋“œ (์‹ค์ œ ์ž‘์—… ์œ„์น˜)
  • P (Processor): Go๋Ÿฐํƒ€์ž„์ด ๊ด€๋ฆฌํ•˜๋Š” ๋…ผ๋ฆฌ์ ์ธ ํ”„๋กœ์„ธ์Šค

์ž…๋‹ˆ๋‹ค. P๋Š” ์ถ”๊ฐ€์ ์œผ๋กœ ๋กœ์ปฌ ์‹คํ–‰ ํ(Local Run Queue)๋ฅผ ๊ฐ€์ง€๋ฉฐ, ํ• ๋‹น๋œ G๋ฅผ M์— ๋ฐฐ์ •ํ•˜๋Š” ์Šค์ผ€์ฅด๋Ÿฌ ์—ญํ™œ์„ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•˜๊ฒŒ goroutine์€

GMP์˜ ๋™์ž‘๊ณผ์ •์€ ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค

  1. G(Gorutine)๊ฐ€ ์ƒ์„ฑ๋˜๋ฉด P(Processor)์˜ ๋กœ์ปฌ ์‹คํ–‰ ํ์— ํ• ๋‹น์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค
  2. P(Processor)๋Š” ๋กœ์ปฌ ์‹คํ–‰ ํ์— ์žˆ๋Š” G(Goroutine)์„ M(Machine)์— ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.
  3. M(Machine)์€ G(Goroutine)์˜ ์ƒํƒœ์ธ block, complete, preempted์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  4. Work-Stealing (์ž‘์—… ํ›”์น˜๊ธฐ): ๋งŒ์•ฝ P์˜ ๋กœ์ปฌ ์‹คํ–‰ ํ๊ฐ€ ๋น„๊ฒŒ ๋  ๊ฒฝ์šฐ, ๋‹ค๋ฅธ P๋Š” ๊ธ€๋กœ๋ฒŒ ํ๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ณณ์—๋„ G(Goroutine)์ด ์—†๋‹ค๋ฉด ๋‹ค๋ฅธ ๋กœ์ปฌ P(Processsor)์˜ ์ž‘์—…์„ ํ›”์ณ์™€ ๋ชจ๋“  M์ด ์‰ฌ์ง€ ์•Š๊ณ  ๋™์ž‘ํ•˜๋„๋ก ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  5. ์‹œ์Šคํ…œ ์ฝœ ์ฒ˜๋ฆฌ (Blocking): G(Goroutine)๊ฐ€ ์‹คํ–‰์ค‘ Block์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ M(Machine)์€ ๋Œ€๊ธฐ์ƒํƒœ๊ฐ€ ๋˜๋Š”๋ฐ, ์ด๋•Œ P(Processor)๋Š” Block์ด ๋œ M(Machine) y ๋ถ„๋ฆฌํ•˜์—ฌ ๋‹ค๋ฅธ M(Machine)๊ณผ ๊ฒฐํ•ฉํ•˜์—ฌ ๋‹ค์Œ G(Goroutine)์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ I/O ์ž‘์—…๋„์ค‘ ๋Œ€๊ธฐ์‹œ๊ฐ„์—์„œ๋„ CPU๋‚ญ๋น„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.
  6. ํ•˜๋‚˜์˜ G(Goroutine)์ด ์˜ค๋ž˜ ์„ ์ (preempted)ํ•  ๊ฒฝ์šฐ ๋‹ค๋ฅธ G(Goroutine)์—๊ฒŒ ์‹คํ–‰ ๊ธฐํšŒ๋ฅผ ์ค๋‹ˆ๋‹ค.

Golang์€ GC(Garbage Collector)๋˜ํ•œ Goroutine์œ„์—์„œ ์‹คํ–‰๋˜์–ด, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์‹คํ–‰์„ ์ตœ์†Œํ•œ์œผ๋กœ ์ค‘๋‹จ์‹œํ‚ค๋ฉด์„œ(STW) ๋ณ‘๋ ฌ์ ์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ •๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ์‹œ์Šคํ…œ ์ž์›์„ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ Golang์€ ์–ธ์–ด์˜ ๊ฐ•ํ•œ ์žฅ์ ์ค‘ ํ•˜๋‚˜์ด๋ฉฐ, ์ด์™ธ์—๋„ ๋งŽ์œผ๋‹ˆ ๋งŽ์€ ๊ฐœ๋ฐœ์ž ๋ถ„๋“ค์ด ๊ณ ๋žญ์„ ์ฆ๊ธฐ์…จ์œผ๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.