TL;DR
- GIL์ CPython ์ธํฐํ๋ฆฌํฐ๊ฐ ์ ์ ๊ณต๊ฐ์์ ๊ด๋ฆฌํ๋ ์ ๊ธ โ ํ ์๊ฐ ํ๋์ thread๋ง ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํ, ์ปค๋์ ์กด์ฌ๋ฅผ ๋ชจ๋ฆ
- ์กด์ฌ ์ด์ ๋ ์ฐธ์กฐ ์นด์ดํ โ refcount race๋ฅผ GIL ํ๋๋ก ์ง๋ ฌํํด ๋ง๊ณ , GIL์ด ์งํค๋ ๊ฑด ๊ฐ๋ฐ์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ธํฐํ๋ฆฌํฐ ๋ด๋ถ ์ํ
- thread์ CPU ๋ณ๋ ฌ์ ๋งํ์ง๋ง I/O ์ค์ ํ๋ ค I/O ๋์์ฑ์ ๊ฐ๋ฅ, 3.13๋ถํฐ free-threading ์คํ ์ค
AI-assisted
1. GIL์ด๋ ๋ฌด์์ธ๊ฐ
GIL(Global Interpreter Lock)์ **CPython ์ธํฐํ๋ฆฌํฐ ์์ ์๋ ํ๋์ ๋ฎคํ ์ค**๋ค. ๊ท์น์ ๋จ์ํ๋ค: Python ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํํ๋ ค๋ฉด ์ด ์ ๊ธ์ ์ฅ์ด์ผ ํ๊ณ , ์ ๊ธ์ ํ๋๋ฟ์ด๋ผ ํ ์๊ฐ์ ํ๋์ thread๋ง ์์ Python ์ฝ๋๋ฅผ ์คํํ๋ค.
- ์์น: CPython ์ธํฐํ๋ฆฌํฐ ๋ด๋ถ, ์ ์ ๊ณต๊ฐ์ด๋ค. OS๋ ํ๋ก์ธ์ค์ ํ์ค ์์ฑ์ด ์๋๋ผ, CPython์ด๋ผ๋ ํ๋ก๊ทธ๋จ์ด ์๊ธฐ ๋ฉ๋ชจ๋ฆฌ์ ๋ ๋ฝ ๊ฐ์ฒด๋ค.
- ๋ฒ์: CPython ํ๋ก์ธ์ค๋ง๋ค ํ๋. ๊ทธ๋์
multiprocessing์ผ๋ก ํ๋ก์ธ์ค๋ฅผ ๋๋๋ฉด ๊ฐ์ ๋ ๋ฆฝ GIL์ด ์๊ฒจ ์ฐํ๋๋ค. - ๊ฐ์ ์ฃผ์ฒด: CPython ์ธํฐํ๋ฆฌํฐ ์ฝ๋ ์์ . ๋ฐ์ดํธ์ฝ๋ ์คํ ๋ฃจํ์์ GIL์ acquireํ๊ณ , ์ผ์ ๊ฐ๊ฒฉ์ด๋ I/O ์ง์ ์ releaseํ๋ค.
2. ์ ์๋ โ ์ฐธ์กฐ ์นด์ดํ ์ ์งํค๋ ค๊ณ
ํต์ฌ ์ด์ ๋ CPython์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐฉ์์ธ ์ฐธ์กฐ ์นด์ดํ (reference counting)์ด๋ค. ๋ชจ๋ ๊ฐ์ฒด๊ฐ โ์ง๊ธ ๋ช ๊ณณ์์ ์ฐธ์กฐ๋๋์งโ๋ฅผ ์ธ๋ ์นด์ดํฐ(refcount)๋ฅผ ๊ฐ๊ณ ์ด ๊ฐ์ด 0์ด ๋๋ฉด ์ฆ์ ํด์ ๋๋ค. Python์์ ๋ชจ๋ ๊ฒ ๊ฐ์ฒด๋ผ, ๋ณ์ ๋์ ยทํจ์ ์ ๋ฌ๋ง๋ค ์ด refcount๊ฐ ์ด ์ ์์ด ์ค๋ฅด๋ด๋ฆฐ๋ค.
๋ฌธ์ ๋ refcount ๊ฐฑ์ ์ด ์์์ ์ด์ง ์๋ค๋ ์ ์ด๋ค(์ฝ๊ณ โ ์ฆ๊ฐ โ ์ฐ๊ธฐ). ์ฌ๋ฌ thread๊ฐ ๊ฐ์ ๊ฐ์ฒด์ refcount๋ฅผ ๋์์ ๊ฑด๋๋ฆฌ๋ฉด race condition์ด ์๊ธด๋ค.
- ์นด์ดํธ๊ฐ ํ์ด์ ธ ๋๋ฌด ์ผ์ฐ ํด์ โ use-after-free ํฌ๋์
- ๋๋ ํด์ ๊ฐ ์ ๋จ โ ๋ฉ๋ชจ๋ฆฌ ๋์
GIL์ ์ด๊ฑธ ํ ๋ฒ์ ๋ง๋๋ค. ํ ์๊ฐ ํ๋์ thread๋ง ์คํํ๋ refcount ์กฐ์์ด ์ง๋ ฌํ๋๊ณ ๋ฝ ํ๋๋ก ๋ชจ๋ ๊ฐ์ฒด์ refcount๋ฅผ ํ๊บผ๋ฒ์ ๋ณดํธํ๋ค.
"์ง๋ ฌํ"์ ๋ป โ serialize
์ฌ๊ธฐ์ ์ง๋ ฌํ๋ ์ฐ์ฐ์ ํ ์ค๋ก ์ธ์ ์์ฐจ ์คํ์ ๊ฐ์ ํ๋ค๋ ๋ป(serialize)์ด๋ค. ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํธ ์คํธ๋ฆผ์ผ๋ก ๋ฐ๊พธ๋ ๋ฐ์ดํฐ ์ง๋ ฌํ(pickleยทJSON)๋ DB์ serializable ๊ฒฉ๋ฆฌ ์์ค๊ณผ๋ ์ด๋ฆ๋ง ๊ฐ๊ณ ๋ฌด๊ดํ๋ค.
GIL ์์ด ๊ฐ์ฒด๋ง๋ค ๋ฝ์ ๊ฑธ๋ฉด?
๊ฐ๋ฅ์ ํ์ง๋ง ๋จ์ผ thread ์ฑ๋ฅ์ด ํญ๋ฝํ๋ค. Python์ ๊ฐ์ฒด๋ฅผ ์๋ ์์ฃผ ๋ง๋ค๊ณ ์ฐธ์กฐํด์ refcount ๊ฐฑ์ ๋ง๋ค ๋ฝ์ด๋ atomic ์ฐ์ฐ์ ๊ฑธ๋ฉด ๊ทธ ์ค๋ฒํค๋๊ฐ ๋ง๋ํ๋ค. GIL ํ๋๋ก ํ์น๋ ํธ์ด ๋จ์ผ thread์์ ํจ์ฌ ๋น ๋ฅด๋ค.
๋น์ ํ๋ฉด, ๊ฐ์ฒด๋ง๋ค โ๋ช ๋ช ์ด ์ฐ๋์งโ ์ ๋ ๋ฐฉ๋ช ๋ก(refcount)์ด ์๋ค. ์ฌ๋ฌ ์ผ๊พผ์ด ๋์์ ์ซ์๋ฅผ ๊ณ ์น๋ฉด ํ์ด์ง๋ค. GIL์ โ๋ฐฉ๋ช ๋ก์ ๊ณ ์น๋ ค๋ฉด ํ๋๋ฟ์ธ ํ์ ์ฅ์ด์ผ ํ๋คโ๋ ๊ท์น์ด๋ผ ์์ฐํ ์ง๋ ฌํ๋๋ค. GIL ์์ด ํ๋ ค๋ฉด ์๋ฐฑ๋ง ๊ฐ ๋ฐฉ๋ช ๋ก๋ง๋ค ์๋ฌผ์ ๋ฅผ ๋ฌ๊ณ ๋งค๋ฒ ์ ๊ทธ๊ณ ํ์ด์ผ ํ๋๋ฐ, ๊ทธ๊ฒ ๋ ๋๋ฆฌ๋ค.
3. ์ปค๋์ GIL์ ๋ชจ๋ฅธ๋ค
GIL์ ์ ์ ๊ณต๊ฐ(์ธํฐํ๋ฆฌํฐ)์์๋ง ๊ด๋ฆฌ๋๋ค. ์ปค๋์ด ๋ณด๋ ๊ฒ์ ๊ทธ๋ฅ ์ฌ๋ฌ OS thread(๋ฆฌ๋
์ค์ task_struct)์ผ ๋ฟ์ด๋ค.
- GIL์ ๊ธฐ๋ค๋ฆฌ๋ thread๋, ์ปค๋ ๋์๋ โ์ด๋ค ์ ์ ๊ณต๊ฐ ๋๊ธฐํ ๊ฐ์ฒด๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ฉฐ sleep ์ค์ธ threadโ๋ก๋ง ๋ณด์ธ๋ค. ๊ทธ๊ฒ โGILโ์ด๋ผ๋ ์๋ฏธ๋ ์ปค๋์ด ๋ชจ๋ฅธ๋ค.
- ์ฆ โ์ด thread๊ฐ GIL์ ๋งํ๋คโ๋ฅผ ์๋ ๊ฒ์ ์ปค๋์ด ์๋๋ผ CPython ์ธํฐํ๋ฆฌํฐ๋ค.
๊ฑด๋ฌผ ๊ด๋ฆฌ์ธ(์ปค๋)์ด ์ผ๊พผ(thread)๋ค์ ๋ฐฉ(์ฝ์ด)์ ๋ฐฐ์นํ์ง๋ง ํ์ฌ ๋ด๋ถ ๊ท์น์ธ โ๊ธฐ๋ก ํ(GIL)โ์ ํ์ฌ(์ธํฐํ๋ฆฌํฐ)๊ฐ ์์ฒด์ ์ผ๋ก ๋ง๋ ๊ฒ์ด๋ผ ๊ด๋ฆฌ์ธ์ ๊ทธ ์กด์ฌ๋ฅผ ๋ชจ๋ฅด๋ ๊ฒ๊ณผ ๊ฐ๋ค.
4. GIL์ด ์งํค๋ ๊ฒ vs ๊ฐ๋ฐ์๊ฐ ์งํค๋ ๊ฒ
โ๊ณต์ ๋ฌธ์ ๋ ๊ฐ๋ฐ์๊ฐ lock์ผ๋ก ์ฒ๋ฆฌํ๋ฉด ๋์ง ์๋โ๋ผ๋ ์๋ฌธ์ด ์์ฐ์ค๋ฝ๋ค. ์ฌ๊ธฐ์ ๋ ์ธต์๊ฐ ์๋ค.
- ๊ฐ๋ฐ์์ ๋ฐ์ดํฐ(๋ด ๋ณ์ยท์๋ฃ๊ตฌ์กฐ): ์ด๊ฑด ๊ฐ๋ฐ์๊ฐ lock์ผ๋ก ์งํค๋ ๊ฒ ๋ง๋ค. ๊ทธ๋ฆฌ๊ณ GIL์ด ์์ด๋ ์ด๊ฑด ์ฌ์ ํ ๊ฐ๋ฐ์ ๋ชซ์ด๋ค. GIL์ด ์๋ค๊ณ ์ ํ๋ฆฌ์ผ์ด์ ๋ ๋ฒจ race condition์ด ๋ค ์ฌ๋ผ์ง์ง ์๋๋ค.
- ์ธํฐํ๋ฆฌํฐ ๋ด๋ถ ์ํ(refcount, ๋ด๋ถ ์๋ฃ๊ตฌ์กฐ): ๊ฐ๋ฐ์๊ฐ ๋ณผ ์๋ ์๋ ์๋ ์๋ CPython ๋ด๋ถ๋ค. ๊ฐ๋ฐ์๊ฐ ์ฒ๋ฆฌํ ๋ฐฉ๋ฒ์ด ์๋ค.
GIL์ด ์งํค๋ ๊ฒ์ ํ์๋ค. ๊ฐ๋ฐ์๊ฐ ๋์ ๋ชป ์งํค๋ ์ธํฐํ๋ฆฌํฐ ๋ด๋ถ๋ผ, ์ธํฐํ๋ฆฌํฐ๊ฐ ์ค์ค๋ก ์ง์ผ์ผ ํ๊ณ ๊ทธ ์๋จ์ด GIL์ด๋ค. ๊ทธ๋ฌ๋ โ๊ฐ๋ฐ์๊ฐ ์ฒ๋ฆฌํ๋ฉด ๋์์โ๋ ์์ชฝ(๊ฐ๋ฐ์ ๋ฐ์ดํฐ)์ ๋ง์ง๋ง ๋ค์ชฝ(์ธํฐํ๋ฆฌํฐ ๋ด๋ถ)์ ํด๋นํ์ง ์๋๋ค.
5. ๊ฒฐ๊ณผ โ ๋ฌด์์ด ๋๊ณ ๋ฌด์์ด ์ ๋๋
GIL์ ์คํ์ ์ง๋ ฌํํ๋ฏ๋ก ๊ฒฐ๊ณผ๊ฐ ๊ฐ๋ฆฐ๋ค.
- CPU-bound + thread โ ๋ณ๋ ฌ ์ ๋จ. ๊ณ์ฐ ์ค์๋ GIL์ ๊ณ์ ์ฅ๊ณ ์์ด thread๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ง๋ค์ด๋ ์์ Python ์ฐ์ฐ์ ํ ๋ฒ์ ํ๋์ฉ ๋๋ค. ์ ํ ๋น์ฉ ํ์ ์คํ๋ ค ๋๋ ค์ง ์๋ ์๋ค. CPU ๋ณ๋ ฌ์ด ํ์ํ๋ฉด
multiprocessing์ผ๋ก ํ๋ก์ธ์ค๋ฅผ ๋๋ GIL์ ์ฐํํ๋ค. - I/O-bound + thread โ ์ธ๋ชจ ์์. thread๊ฐ I/O ๋๊ธฐ(blocking)์ ๋ค์ด๊ฐ๋ฉด GIL์ ๋๋๋ค. ๊ทธ๋์ ๋ค๋ฅธ thread๊ฐ GIL์ ์ฅ๊ณ ์งํํ๋ฏ๋ก, ์ฌ๋ฌ thread๋ก ๋๊ธฐ๋ฅผ ๊ฒน์น ์ ์๋ค.
์ฆ GIL์ด ๋ง๋ ๊ฒ์ ์ ํํ โ์์ Python CPU ์ฐ์ฐ์ thread๋ก ๋ณ๋ ฌํํ๋ ๊ฒโ๋ฟ์ด๋ค. โPython์ ๋์์ฑ์ด ์ ๋๋คโ๋ ํ๋ฆฐ ๋ง์ด๋ค.
6. ๋ค๋ฅธ ์ธ์ด์ ์ ์๋, ๊ทธ๋ฆฌ๊ณ ์์ผ๋ก
GoยทJava์ GIL์ด ์๋ ๊ฑด ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐฉ์์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ์ธ์ด๋ค์ ์ถ์ GC(tracing garbage collection)๋ฅผ ์ด๋ค โ ๋ณ๋ GC๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก ์ ์ฐ์ด๋ ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ฒญ์ํ๋ฏ๋ก, ๊ฐ์ฒด๋ง๋ค refcount๋ฅผ ์ค์๊ฐ ๊ฐฑ์ ํ์ง ์๋๋ค. ๊ทธ๋์ refcount race ์์ฒด๊ฐ ์๊ณ , GIL ๊ฐ์ ์ ์ญ ๋ฝ์ด ํ์ ์๋ค.
| ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ | GIL | |
|---|---|---|
| CPython | ์ฐธ์กฐ ์นด์ดํ (refcount ์ค์๊ฐ ๊ฐฑ์ ) | ํ์ |
| GoยทJava | ์ถ์ GC(refcount ์์) | ๋ถํ์ |
GIL์ ๊ฒฐํจ์ด๋ผ๊ธฐ๋ณด๋ค ์๋์ ํธ๋ ์ด๋์คํ๋ค. Python์ด ํ์ด๋ 1991๋ ์ ๋ฉํฐ์ฝ์ด๊ฐ ๋๋ฌธ ๋จ์ผ CPU ์๋๋ผ, โ๋ฉํฐ์ฝ์ด ๋ณ๋ ฌ ๋ถ๊ฐโ๋ผ๋ ๋จ์ ์ด ํฌ์ง ์์๋ค. ์ฐธ์กฐ ์นด์ดํ + GIL์ ๋จ์ผ thread ์ฑ๋ฅยท๊ตฌํ ๋จ์์ฑยทC ํ์ฅ ํธํ์ ์ป๋ ํฉ๋ฆฌ์ ์ ํ์ด์๋ค. ๋ฉํฐ์ฝ์ด๊ฐ ๋ณดํธํ๋ ์ง๊ธ ๋ณ๋ชฉ์ด ๋์ง๋ง refcount์ C ํ์ฅ ์ํ๊ณ๊ฐ GIL์ ์์กดํด ์ ๊ฑฐ๊ฐ ์ด๋ ค์ ๋ค.
๊ทธ๋์ Python 3.13๋ถํฐ GIL์ ๋๋ free-threading ๋น๋๋ฅผ ์คํ์ ์ผ๋ก ๋์ ํ๊ธฐ ์์ํ๋ค. refcount๋ฅผ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ๋ฐ๊พธ๊ณ C ํ์ฅ ํธํ์ ๋ง์ถ๋ ํฐ ์์ ์ด๋ผ ์๊ฐ์ด ๊ฑธ๋ฆฌ์ง๋ง GIL์ด ์ธ์ด์ ๋ณธ์ง์ด ์๋๋ผ ๋ฐ๊ฟ ์ ์๋ ๊ตฌํ ๊ฒฐ์ ์์ ๋ณด์ฌ์ค๋ค. Jython(JVM)ยทIronPython(.NET) ๊ฐ์ ๋ค๋ฅธ Python ๊ตฌํ์ ์ ์ด์ GIL์ด ์๋ ๊ฒ๋ ๊ฐ์ ๋งฅ๋ฝ์ด๋ค.