https://peps.python.org/pep-0703/
[PEP 703 โ Making the Global Interpreter Lock Optional in CPython | peps.python.org
In CPython, the global interpreter lock protects against corruption of internal interpreter states when multiple threads concurrently access or modify Python objects. For example, if multiple threads concurrently modify the same list, the GIL ensures that
peps.python.org](https://peps.python.org/pep-0703/)
PEP 703 โ CPython์์ ์ ์ญ ์ธํฐํ๋ฆฌํฐ ๋ฝ(GIL)
- Sam Gross
- ลukasz Langa
- Discourse thread
์ด์
- 2023๋ 1์ 9์ผ
- Python ๋ฒ์ 3.13
- 2023๋ 1์ 9์ผ๋ถํฐ 2023๋ 5์ 4์ผ๊น์ง
Abstract
CPython์ ์ ์ญ ์ธํฐํ๋ฆฌํฐ ๋ฝ(GIL)์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ Python ์ฝ๋๋ฅผ ์คํํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. GIL์ Python์์ ๋ฉํฐ์ฝ์ด CPU๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋ฐฉํดํฉ๋๋ค. ์ด PEP์ CPython์ ๋น๋ ๊ตฌ์ฑ(--disable-gil)์ ์ถ๊ฐํ์ฌ ์ ์ญ ์ธํฐํ๋ฆฌํฐ ๋ฝ ์์ด Python ์ฝ๋๋ฅผ ์คํํ๊ณ ์ธํฐํ๋ฆฌํฐ์ ์ค๋ ๋ ์์ ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํ ํ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ํฉ๋๋ค.
๋๊ธฐ
GIL์ ๋์์ฑ์ ๋ํ ์ฃผ์ ์ฅ์ ๋ฌผ์ ๋๋ค. ๊ณผํ ๊ณ์ฐ ์์ ์์๋ ์ด๋ฌํ ๋์์ฑ์ ๋ถ์ฌ๊ฐ Python ์ฝ๋ ์คํ ์๋๋ณด๋ค ๋ ํฐ ๋ฌธ์ ๊ฐ ๋ ๋๊ฐ ๋ง์ต๋๋ค. ์๋ํ๋ฉด ๋๋ถ๋ถ์ ํ๋ก์ธ์ ์ฌ์ดํด์ ์ต์ ํ๋ CPU ๋๋ GPU ์ปค๋์์ ์๋น๋๊ธฐ ๋๋ฌธ์ ๋๋ค. GIL์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ Python ์ฝ๋๋ฅผ ํธ์ถํ ๊ฒฝ์ฐ ์งํ์ ๋ฐฉํดํ ์ ์๋ ์ ์ญ ๋ณ๋ชฉ ํ์์ ๋์ ํฉ๋๋ค. ํ์ฌ CPython์์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด ์์ง๋ง, ์ด๋ฌํ ๊ธฐ์ ์ ์ค์ํ ์ ํ ์ฌํญ์ ๊ฐ์ง๊ณ ์์ต๋๋ค(๋์ ์ฐธ์กฐ).
์ด ์น์ ์์๋ ๊ณผํ ๊ณ์ฐ์ ์ํ GIL์ ์ํฅ์ ์ด์ ์ ๋ง์ถ๊ณ ์์ผ๋ฉฐ, ํนํ ์ธ๊ณต ์ง๋ฅ/๋จธ์ ๋ฌ๋ ์์ ์ ๋ํ ์ํฅ์ ๋ค๋ฃจ๊ณ ์์ต๋๋ค. ์ด ์์ฑ์๋ ์ด ๋ถ์ผ์์ ๊ฐ์ฅ ๋ง์ ๊ฒฝํ์ ๊ฐ์ง๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฌ๋ GIL์ Python์ ๋ค๋ฅธ ์ฌ์ฉ์๋ค์๊ฒ๋ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
GIL๋ก ์ธํด ๋ค์ํ ์ ํ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๊ฐ ์ด๋ ค์์ง๋๋ค.
์ ๊ฒฝ๋ง ๊ธฐ๋ฐ์ AI ๋ชจ๋ธ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ์ ๋ค์ํ ๊ธฐํ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฐ๋ณ ์์ ์ ๋ด๋ถ์ ์ผ๋ก ๋ณ๋ ฌํ๋ ์ ์์ผ๋ฉฐ("intra-operator"), ์ฌ๋ฌ ์์ ์ ๋์์ ์คํํ ์ ์์ผ๋ฉฐ("inter-operator"), ์์ฒญ(์ฌ๋ฌ ์์ ์ ํฌํจ)์ ๋ณ๋ ฌํ๋ ์๋ ์์ต๋๋ค. ํจ์จ์ ์ธ ์คํ์ ์ํด์๋ ๋ค์ํ ์ ํ์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํ์ฉํด์ผ ํฉ๋๋ค [1].
GIL์ Python์์ inter-operator ๋ณ๋ ฌ ์ฒ๋ฆฌ ๋ฐ ์ผ๋ถ ํํ์ ์์ฒญ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ํํํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์๋ ์์คํ ์ด ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ฒฝ๋ง์ ๊ฐ ๋ถ๋ถ์ ๋ณ๋์ CPU ์ฝ์ด์์ ์คํํ ์ ์์ง๋ง, GIL๋ก ์ธํด Python์์๋ ์ด๊ฒ์ด ๋นํจ์จ์ ์ ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, ์ง์ฐ ์๊ฐ์ ๋ฏผ๊ฐํ ์ถ๋ก ์์ ์ ์ข ์ข ์ฌ๋ฌ ์์ฒญ์ ๊ฑธ์ณ ๋ณ๋ ฌํ๋ฅผ ์ํด ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ง๋ง, Python์์๋ ๋์ผํ ํ์ฅ์ฑ ๋ณ๋ชฉ ํ์์ ๋ง์ฃผํ๊ฒ ๋ฉ๋๋ค.
GIL์ด Python์์ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํ์ฉํ๋ ๋ฐ ์ด๋ ค์์ ์ผ์ผํค๋ ๋ฌธ์ ๋ ๊ฐํ ํ์ต์์ ์์ฃผ ๋ฐ์ํฉ๋๋ค. NetHack Learning Environment์ ์ ์์ด์ Inflection AI์ Technical Staff ๋ฉค๋ฒ์ธ Heinrich Kuttler๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํฉ๋๋ค:
"DotA 2, StarCraft, NetHack ๋ฑ์ ์ต๊ทผ ๊ฐํ ํ์ต์ ํ๊ธฐ์ ์ธ ๋ฐ์ ์ ๋น๋๊ธฐ์ ์ธ ์กํฐ-ํฌ๋ฆฌํฑ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ๋ณ๋ ฌ๋ก ์ฌ๋ฌ ํ๊ฒฝ(์๋ฎฌ๋ ์ด์ ๊ฒ์)์ ์คํํ๋ ๋ฐ ์์กดํฉ๋๋ค. Python์ ๋จ์ํ ๋ฉํฐ์ค๋ ๋ ๊ตฌํ์ GIL ๊ฒฝํฉ ๋๋ฌธ์ ๋ช ๊ฐ ์ด์์ ๋ณ๋ ฌ ํ๊ฒฝ์์ ํ์ฅ๋์ง ์์ต๋๋ค. ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ UNIX ์์ผ์ ํตํด ํต์ ํ๋ ๋ค์ค ํ๋ก์ธ์ฑ์ ๋ง์ ๋ณต์ก์ฑ์ ๋๋ฐํ๋ฉฐ, CUDA๋ฅผ ๋ค๋ฅธ ์์ปค์์ ์ฌ์ฉํ๋ ๊ฒ์ ์ฌ์ค์ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ค์ด ์ค๊ณ ๊ณต๊ฐ์ ์ฌ๊ฐํ๊ฒ ์ ํํฉ๋๋ค."
GIL(Globel Interpreter Lock)๋ก ์ธํ ํ์ด์ฌ ์ฝ๋์ ์ ๊ทผ์ฑ ์ ํ
๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์์ DeepMind์์ Python GIL๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ์ ์ง๋ฉดํ๊ณ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ณดํต ํ๋์ ํ๋ก์ธ์ค์์ 50-100๊ฐ์ ์ค๋ ๋๋ฅผ ์คํํ๊ณ ์ถ์ดํ์ง๋ง, ๋๋ก๋ 10๊ฐ ์ดํ์ ์ค๋ ๋๋ผ๋ GIL์ด ๋ณ๋ชฉ ํ์์ ์ผ์ผํต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋๋ก๋ ์๋ธํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ์ง๋ง, ๋ง์ ๊ฒฝ์ฐ์๋ ํ๋ก์ธ์ค๊ฐ ํต์ ์ด ๋๋ฌด ํฐ ์ค๋ฒํค๋๊ฐ ๋ฉ๋๋ค. GIL๊ณผ ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ฐ๋ฆฌ๋ ๋ณดํต Python ์ฝ๋ ๋ฒ ์ด์ค์ ํฐ ๋ถ๋ถ์ C++๋ก ๋ณํํฉ๋๋ค. ์ด๋ ์ฐ๊ตฌ์๋ค์๊ฒ ์ฝ๋ ์ ๊ทผ์ฑ์ ๋จ์ด๋จ๋ฆฌ๋ ๋ถ์์ฉ์ ์ผ์ผํต๋๋ค.
์ฌ๋ฌ ํ๋์จ์ด ์ฅ์น์์ ์ธํฐํ์ด์ค๋ฅผ ํฌํจํ๋ ํ๋ก์ ํธ๋ค์ ์ ์ฌํ ๋์ ์ ์ง๋ฉดํ๊ณ ์์ต๋๋ค. Dose-3D ํ๋ก์ ํธ๋ ์ ํํ ์ฉ๋ ๊ณํ์ผ๋ก ์ ๋ฐฉ์ฌ์ ์น๋ฃ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํ ๋ชฉํ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด ํ๋ก์ ํธ๋ ์ฌ๋์ ์กฐ์ง์ ๋์ ํ ์ ์๋ ์๋ฃ ์ ์ฌ์ฒด(medical phantom)์ ํจ๊ป Python์ผ๋ก ์์ฑ๋ ์๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ์ปค์คํ ํ๋์จ์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค. Dose-3D ํ๋ก์ ํธ์ ๋ฐ์ดํฐ ์์ง ์์คํ ์ ์ฃผ์ ์ํํธ์จ์ด ์ํคํ ํธ์ธ Paweล Jurgielewicz์ GIL์ ์ํด ์ ๊ธฐ๋๋ ํ์ฅ ๋ฌธ์ ์ GIL์ด ์๋ Python์ ํฌํฌ๋ฅผ ์ฌ์ฉํจ์ผ๋ก์จ ํ๋ก์ ํธ๋ฅผ ๋จ์ํํ ๊ฒฝํ์ ๋ํด ์ค๋ช ํฉ๋๋ค.
Dose-3D ํ๋ก์ ํธ์์ ์ฃผ์ํ ๋์ ์ ํ๋์จ์ด ์ฅ์น์ ์์ ์ ์ด๊ณ ๋ณต์กํ ๋์ ํต์ ๋งํฌ๋ฅผ ์ ์งํ๋ ๊ฒ์ด์์ต๋๋ค. ํนํ, 1 Gbit/s UDP/IP ์ฐ๊ฒฐ์ ์ต๋ํ ํ์ฉํด์ผ ํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ์์ฐ์ค๋ฝ๊ฒ multiprocessing ํจํค์ง๋ฅผ ์ฌ์ฉํด ์์ํ์ง๋ง, ์ด๋ ์๊ฐ์๋ ๋ฐ์ดํฐ ์ ์ก์ด ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋จ๊ณ๋ณด๋ค CPU ์๊ฐ์ ๋๋ถ๋ถ์ ์๋ชจํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. GIL์ ๊ธฐ๋ฐ์ผ๋ก ํ CPython์ ๋ฉํฐ์ค๋ ๋ฉ ๊ตฌํ์ ๋ง๋ค๋ฅธ ๊ธธ์ด์์ต๋๋ค. ์ฐ๋ฆฌ๊ฐ "nogil"์ด๋ผ๋ Python ํฌํฌ์ ๋ํด ์๊ฒ ๋ ํ์๋ ๋จ ํ ๋ช ์ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ด ํฌํฌ๋ฅผ ์ฌ์ฉํ๋๋ก ์กฐ์ ํ๋ ๋ฐ์ ์ ๋ฐ ์ ๋์ ์ ๋ฌด ์๊ฐ์ด ๊ฑธ๋ ธ๊ณ , ๊ฒฐ๊ณผ๋ ๋๋ผ์ ์ต๋๋ค. ์ด์ ์ฐ๋ฆฌ๋ ๋ฐ์ดํฐ ๊ตํ ์๊ณ ๋ฆฌ์ฆ์ ์ธ๋ฐํ๊ฒ ์กฐ์ ํ๋ ๋์ ๋ฐ์ดํฐ ์์ง ์์คํ ๊ฐ๋ฐ์ ์ง์คํ ์ ์์ต๋๋ค.
CellProfiler์ ์ ์์ด์ Prescient Design ๋ฐ Genentech์ ์คํํ ์์ง๋์ด์ธ Allen Goodman์ GIL๋ก ์ธํด ์๋ฌผํ์ ๋ฐฉ๋ฒ ์ฐ๊ตฌ๊ฐ ํ์ด์ฌ์์ ๋ ์ด๋ ค์์ง๋ค๊ณ ์ค๋ช ํฉ๋๋ค.
Python์ ๊ธ๋ก๋ฒ ์ธํฐํ๋ฆฌํฐ ์ ๊ธ(GIL)์ ์๋ฌผํ์ ๋ฐฉ๋ฒ ์ฐ๊ตฌ ์ ๋ฐ์ ๊ฑธ์ณ ๋น๋ฒํ ์ข์ ์ ์์ธ์ด ๋ฉ๋๋ค.
์ ๋ ํ์ฌ์ ๋ฉํฐ์ค๋ ๋ฉ ์ํฉ์ ๋ ์ ์ดํดํ๊ธฐ ์ํด HMMER, ์ฌ๋ฌ ์์ด ์ ๋ ฌ์ ์ฌ์ฉ๋๋ ํ์ค ๋ฐฉ๋ฒ์ ์ผ๋ถ๋ฅผ ์ฌ๊ตฌํํด ๋ณด์์ต๋๋ค. ์ด ๋ฐฉ๋ฒ์ ๋จ์ผ ์ค๋ ๋ ์ฑ๋ฅ(์ ์ ๋งค๊ธฐ๊ธฐ)๊ณผ ๋ฉํฐ์ค๋ ๋ฉ ์ฑ๋ฅ(์์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฒ์)์ ๋ชจ๋ ๊ฐ์กฐํฉ๋๋ค. GIL์ 8๊ฐ์ ์ค๋ ๋๋ง ์ฌ์ฉํ ๋์๋ ๋ณ๋ชฉ ํ์์ด ๋ฐ์ํ์ต๋๋ค. ํ์ฌ ์ธ๊ธฐ ์๋ ๊ตฌํ์ ํ๋ก์ธ์ค ๋น 64๊ฐ ์ด์ ๋๋ 128๊ฐ์ ์ค๋ ๋์ ์์กดํฉ๋๋ค. ์ ๋ ์๋ธํ๋ก์ธ์ค๋ก ์ด๋ํด ๋ณด์์ง๋ง, IPC cost ๋๋ฌธ์ ๋งํ์ต๋๋ค. HMMER๋ ์๋์ ์ผ๋ก ๊ธฐ์ด์ ์ธ ์๋ฌผ์ ๋ณดํ ๋ฐฉ๋ฒ์ด๋ฉฐ, ์ต์ ๋ฐฉ๋ฒ๋ค์ ํจ์ฌ ๋ ํฐ ๋ฉํฐ์ค๋ ๋ฉ ์๊ตฌ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
๋ฐฉ๋ฒ ์ฐ๊ตฌ์๋ค์ ์ฌ์ฉํ๊ธฐ ์ฌ์ฐ๋ฉฐ, Python ์ํ๊ณ์ "์ฌ๋๋ค์ด ์๋ ์ธ์ด"๋ผ๋ ์ด์ ๋ก Python์ ์ฌ์ฉํ๊ณ ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ Python์ ๋ฉํฐ์ค๋ ๋ฉ ์ํฉ์ด ๊ฐ์ ๋์ง ์๋ ํ, C์ C++์ ์๋ฌผํ์ ๋ฐฉ๋ฒ ์ฐ๊ตฌ ์ปค๋ฎค๋ํฐ์ ๊ณต์ฉ์ด๋ก ๋จ๊ฒ ๋ ๊ฒ์ ๋๋ค.
GIL์ด ํ์ด์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ฉ์ฑ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
GIL์ ๋ฉํฐ์ค๋ ๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ ํํ๋ CPython์ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ด๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ฑ ๋ฌธ์ ๋ก ๊ฐ์ฃผํ๊ธฐ์๋ ๋ฏ์ค๊ฒ ๋๊ปด์ง ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์์ฑ์๋ค์ ์ข ์ข ์ฑ๋ฅ์ ํฐ ๊ด์ฌ์ ๊ฐ์ง๋ฉฐ, GIL์ ํผํ๊ธฐ ์ํ API๋ฅผ ์ค๊ณํฉ๋๋ค. ์ด๋ฌํ ํํผ ๋ฐฉ๋ฒ์ ๋ณด๋ค ์ด๋ ค์ด ์ฌ์ฉ์ฑ์ ๊ฐ์ง API๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก, ์ด๋ฌํ API์ ์ฌ์ฉ์๋ค์ ์ฑ๋ฅ ๋ฌธ์ ๋ฟ๋ง ์๋๋ผ ์ฌ์ฉ์ฑ ๋ฌธ์ ๋ก์ GIL์ ๊ฒฝํํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, PyTorch๋ ๋ฐ์ดํฐ ์ ๋ ฅ ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ๊ธฐ ์ํ multiprocessing ๊ธฐ๋ฐ API์ธ DataLoader๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด API๋ Linux์์ fork()๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ด๋ ์ผ๋ฐ์ ์ผ๋ก spawn()๋ณด๋ค ๋น ๋ฅด๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ์ฌ์ฉ์์๊ฒ ์ถ๊ฐ์ ์ธ ๋์ ์ ์ ๊ณตํฉ๋๋ค. GPU์ ์ก์ธ์คํ ํ DataLoader๋ฅผ ์์ฑํ๋ฉด ํผ๋์ค๋ฌ์ด CUDA ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. DataLoader ์์ ์ ๋ด์์ GPU์ ์ก์ธ์คํ๋ฉด CUDA ์ปจํ ์คํธ๋ฅผ ํ๋ก์ธ์ค๊ฐ ๊ณต์ ํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ค๋ฅ๊ฐ ๋น ๋ฅด๊ฒ ๋ฐ์ํฉ๋๋ค.
scikit-learn ๊ฐ๋ฐ์์ด์ Inria์ ์ํํธ์จ์ด ์์ง๋์ด์ธ Olivier Grisel์ scikit-learn ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ GIL์ ์ฐํํด์ผ ํ๋ ๊ฒ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ๋ ๋ณต์กํ๊ณ ํผ๋์ค๋ฝ๊ฒ ๋ง๋ ๋ค๊ณ ์ค๋ช ํฉ๋๋ค.
์ฌ๋ฌ ํด๊ฐ ์ง๋จ์ ๋ฐ๋ผ, scikit-learn ๊ฐ๋ฐ์๋ค์ joblib, loky, Ralf Gommers, Quansight Labs์ ๊ณต๋ ๋๋ ํฐ์ด์ NumPy ๋ฐ SciPy ์ ์ง ๊ด๋ฆฌ์๋ GIL์ด NumPy ๋ฐ ์ซ์ ๊ณ์ฐ์ฉ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง์ ๋ํด ์ค๋ช ํฉ๋๋ค.
joblib
GIL์ด NumPy์ Numeric Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ฏธ์น๋ ์ํฅ
NumPy์ NumPy๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ํจํค์ง ์คํ์์์ ์ฃผ์ ๋ฌธ์ ๋ NumPy๊ฐ ์ฌ์ ํ (๋๋ถ๋ถ) ๋จ์ผ ์ค๋ ๋๋ก ๊ตฌ์ฑ๋์ด ์๋ค๋ ๊ฒ์ ๋๋ค. ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ๊ณผ ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ํ๋ก์ ํธ์ ์ค์ํ ๋ถ๋ถ์ ํ์ฑํด ์์ต๋๋ค. NumPy๋ ๋ด๋ถ ๋ฃจํ์์ GIL์ ํด์ ํ์ง๋ง ์ด๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. NumPy๋ ๋จ์ผ ์ปดํจํฐ์ ๋ชจ๋ CPU ์ฝ์ด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๊ธฐ ์ํ ํด๊ฒฐ์ฑ ์ ์ ๊ณตํ์ง ์์ผ๋ฉฐ, ๋์ Dask์ ๊ฐ์ ๋ค๋ฅธ ๋ณ๋ ฌ ์ฒ๋ฆฌ ์๋ฃจ์ ์ ์ด๋ฅผ ๋งก๊น๋๋ค. ํ์ง๋ง ์ด๋ฌํ ์๋ฃจ์ ๋ค์ ํจ์จ์ ์ด์ง ์์ผ๋ฉฐ ์ฌ์ฉํ๊ธฐ๋ ๋ ์ด๋ ต์ต๋๋ค. ์ด๋ฐ ์ด๋ ค์์ ์ฃผ๋ก ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ ๋ ์ถ๊ฐ์ ์ธ ์ถ์ํ์ ๊ณ์ธต์ ๊ณ ๋ คํด์ผ ํ๋ ๋ถ๋ถ์์ ๋ฐ์ํฉ๋๋ค.
๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- dask.array
- numpy.ndarray
- threadpoolctl
๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ ์ดํ๊ธฐ ์ํ API ๋ฐ ๋์์ธ ๊ฒฐ์ ์ ์กฐ์ ํ๋ ์์ ์ ์ฌ์ ํ PyData ์ํ๊ณ ์ ๋ฐ์์ ๊ฐ์ฅ ์ด๋ ค์ด ๋ฌธ์ ์ค ํ๋์ ๋๋ค. GIL์ด ์์๋ค๋ฉด ์ด ์์ ์ ํจ์ฌ ๋ค๋ฅด๊ณ (๋ ์ข๊ณ , ์ฌ์ ์ ๊ฒ์ ๋๋ค).
GPU ์ค์ฌ์ ์์ ์ ๋ฉํฐ์ฝ์ด ์ฒ๋ฆฌ๋ฅผ ํ์๋ก ํฉ๋๋ค
๊ณ ์ฑ๋ฅ ์ปดํจํ (HPC) ๋ฐ AI ์์ ์ GPU๋ฅผ ์ค์ฌ์ผ๋ก ๋ง์ด ์ฌ์ฉ๋ฉ๋๋ค. ์ด๋ฌํ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ผ๋ฐ์ ์ผ๋ก ๋๋ถ๋ถ์ ๊ณ์ฐ์ GPU์์ ์คํํ์ง๋ง ํจ์จ์ ์ธ ๋ฉํฐ์ฝ์ด CPU ์คํ์ด ํ์ํฉ๋๋ค.
PyTorch ํต์ฌ ๊ฐ๋ฐ์์ด์ FAIR (Meta AI)์ ์ฐ๊ตฌ์์ธ Zachary DeVito๋ GIL๋ก ์ธํด Python ์ธ๋ถ์์ ๋๋ถ๋ถ์ ๊ณ์ฐ์ด ์ํ๋๋ ๊ฒฝ์ฐ์๋ ๋ฉํฐ์ค๋ ๋ ํ์ฅ์ด ๋นํจ์จ์ ์ด๋ผ๊ณ ์ค๋ช ํฉ๋๋ค.
PyTorch์์๋ Python์ ์ฌ์ฉํ์ฌ ๋๊ฐ ~8๊ฐ์ GPU์ ~64๊ฐ์ CPU ์ค๋ ๋๋ฅผ ์กฐ์ ํ๋ฉฐ, ๋๊ท๋ชจ ๋ชจ๋ธ์ ๊ฒฝ์ฐ 4k๊ฐ์ GPU์ 32k๊ฐ์ CPU ์ค๋ ๋๊น์ง ํ์ฅ๋ฉ๋๋ค. ์ค์ ์์ ์ Python ์ธ๋ถ์์ ์ํ๋์ง๋ง GPU์ ์๋ ๋๋ฌธ์ Python์์์ ์กฐ์ ๋ง์ผ๋ก๋ ํ์ฅ์ด ์ด๋ ต์ต๋๋ค. GIL ๋๋ฌธ์ ํ๋ ๋์ 72๊ฐ์ ํ๋ก์ธ์ค๊ฐ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์ข ์ข ์์ต๋๋ค. ์ด๋ก ์ธํด ๋ก๊น , ๋๋ฒ๊น ๋ฐ ์ฑ๋ฅ ํ๋์ด ์ด๋ ค์์ง๋ฉฐ ๊ฐ๋ฐ์์ ์์ฐ์ฑ์ด ํฌ๊ฒ ์ ํ๋ฉ๋๋ค.
์ค๋ ๋ ๋์ ๋ง์ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ธ ์์ ์ ๋ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. Zachary DeVito๋ ๋ค์๊ณผ ๊ฐ์ด ๋งํฉ๋๋ค.
"์ง๋ ๋ช ๋ฌ ๋์ ์ค๋ณต ๊ณ์ฐ์ ์ค์ด๋ ๋ฐ์ดํฐ ๋ก๋, ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ๋ฅผ ๋น๋๊ธฐ๋ก ์์ฑํ๋ ๊ฒ, ์ปดํ์ผ๋ฌ ์ต์ ํ๋ฅผ ๋ณ๋ ฌํํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ GIL ์ ์ฝ์ ์ด๋ป๊ฒ ํผํ ์ง์ ๋ํด ์์๋ณด๋ ๋ฐ ์๊ฐ์ ์์ํ ๊ฒ์ ์ค์ ๋ก ๊ทธ ๋ฌธ์ ์์ฒด๋ฅผ ํด๊ฒฐํ๋ ๋ฐ๋ณด๋ค๋ ํ ์ฐจ์ ๋ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ ธ์ต๋๋ค."
์ฌ์ง์ด GPU ์ค์ฌ์ ์์ ๋ค๋ CPU ์ง์ฝ์ ์ธ ๋ถ๋ถ์ด ์์ฃผ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ปดํจํฐ ๋น์ ์์ ์ ์ด๋ฏธ์ง ๋์ฝ๋ฉ, ํฌ๋กญ ๋ฐ ๋ฆฌ์ฌ์ด์ง๊ณผ ๊ฐ์ "์ ์ฒ๋ฆฌ" ๋จ๊ณ๋ฅผ ์ฌ๋ฌ ๊ฐ ํ์๋ก ํฉ๋๋ค. ์ด๋ฌํ ์์ ์ ์ผ๋ฐ์ ์ผ๋ก CPU์์ ์ํ๋๋ฉฐ Pillow๋ Pillow-SIMD์ ๊ฐ์ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. GPU๋ฅผ ๋ฐ์ดํฐ๋ก "๊ณต๊ธ"ํ๊ธฐ ์ํด ๋ฐ์ดํฐ ์ ๋ ฅ ํ์ดํ๋ผ์ธ์ ์ฌ๋ฌ CPU ์ฝ์ด์์ ์คํํด์ผ ํฉ๋๋ค.
๊ฐ๋ณ CPU ์ฝ์ด ๋๋น GPU ์ฑ๋ฅ์ ์ฆ๊ฐ๋ก ์ธํด ๋ฉํฐ์ฝ์ด ์ฑ๋ฅ์ด ๋ ์ค์ํด์ก์ต๋๋ค. GPU๋ฅผ ์์ ํ ํ์ฉํ๊ธฐ ์ํด์๋ ํจ์จ์ ์ธ ์ฌ๋ฌ CPU ์ฝ์ด์ ์ฌ์ฉ์ด ํ์ํฉ๋๋ค. ํนํ ๋ค์ค GPU ์์คํ ์์๋ ๋์ฑ ์ด๋ ค์์ก์ต๋๋ค. ์๋ฅผ ๋ค์ด, NVIDIA์ DGX-A100์ 8๊ฐ์ GPU์ 2๊ฐ์ 64์ฝ์ด CPU๋ฅผ ์ฌ์ฉํ์ฌ GPU๋ฅผ ๋ฐ์ดํฐ๋ก "๊ณต๊ธ"ํฉ๋๋ค.
GIL๋ก ์ธํด Python AI ๋ชจ๋ธ ๋ฐฐํฌ๊ฐ ์ด๋ ค์์ง๋๋ค
Python์ ์ ๊ฒฝ๋ง ๊ธฐ๋ฐ AI ๋ชจ๋ธ์ ๊ฐ๋ฐํ๋ ๋ฐ ๋๋ฆฌ ์ฌ์ฉ๋ฉ๋๋ค. PyTorch์์ ๋ชจ๋ธ์ ์์ฃผ ๋ฉํฐ์ค๋ ๋๋ก ๋ ์ฃผ๋ก C++ ํ๊ฒฝ์ ์ผ๋ถ๋ก ๋ฐฐํฌ๋ฉ๋๋ค. GIL๋ก ์ธํด ํจ์จ์ ์ธ ํ์ฅ์ด ๋ฐฉํด๋์ด Python์ ์ข ์ข ํ์์ ์ผ๋ก ์ฌ๊ฒจ์ง๋๋ค. ์ค์ ๋ก ๋๋ถ๋ถ์ ๊ณ์ฐ์ด GIL์ด ํด์ ๋ Python ์ธ๋ถ์์ ์ํ๋๊ธฐ ๋๋ฌธ์ ๋๋ค. torchdeploy ๋ ผ๋ฌธ์์๋ ์ด๋ฌํ ํ์ฅ ๋ณ๋ชฉ ํ์์ ์ฌ๋ฌ ๋ชจ๋ธ ์ํคํ ์ฒ์์ ์คํ์ ์ผ๋ก ์ ์ฆํ์ต๋๋ค.
PyTorch๋ GIL์ ํผํ๊ฑฐ๋ ํด๊ฒฐํ๊ธฐ ์ํ ์ฌ๋ฌ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ง๋ง ๋ชจ๋ ์ค์ํ ์ ํ ์ฌํญ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, TorchScript๋ Python ์ข ์์ฑ ์์ด C++์์ ์คํํ ์ ์๋ ๋ชจ๋ธ์ ํํ์ ์บก์ฒํ์ง๋ง ์ ํ๋ Python ํ์ ์งํฉ๋ง ์ง์ํ๋ฉฐ ๋ชจ๋ธ์ ์ผ๋ถ ์ฝ๋๋ฅผ ๋ค์ ์์ฑํด์ผ ํ ์๋ ์์ต๋๋ค. torch::deploy API๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ผํ ํ๋ก์ธ์ค์์ ๊ฐ๊ฐ ๊ณ ์ ํ GIL์ ๊ฐ์ง ์ฌ๋ฌ Python ์ธํฐํ๋ฆฌํฐ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค(PEP 684๊ณผ ์ ์ฌ). ๊ทธ๋ฌ๋ torch::deploy๋ C-API ํ์ฅ์ ์ฌ์ฉํ๋ Python ๋ชจ๋์ ๋ํ ์ง์์ด ์ ํ์ ์ ๋๋ค.
๋๊ธฐ
๋ง์ ๊ณผํ ๋ฐ ์์น ๊ณ์ฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ Python์ ๊ธ๋ก๋ฒ ์ธํฐํ๋ฆฌํฐ ๋ฝ์ ํ๋์ ์ธ ๋ฉํฐ์ฝ์ด CPU์ ํจ์จ์ ์ธ ์ฌ์ฉ์ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. Heinrich Kuttler, Manuel Kroiss ๋ฐ Paweล Jurgielewicz๋ Python์์ ๋ฉํฐ์ค๋ ๋ ๊ตฌํ์ด ์์ ์ ํจ๊ณผ์ ์ผ๋ก ํ์ฅ๋์ง ์๊ณ ์ฌ๋ฌ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ํฉํ์ง ์๋ค๊ณ ๋ฐ๊ฒฌํ์ต๋๋ค.
์ด ์ค์ผ์ผ๋ง ๋ณ๋ชฉํ์์ ํต์ฌ์ ์ธ ์ซ์ ๊ณ์ฐ ์์ ์๋ง ์๋ ๊ฒ์ด ์๋๋๋ค. Zachary DeVito์ Paweล Jurgielewicz๋ Python์์์ ์กฐ์ ๊ณผ ํต์ ์ ๋ํ ์ด๋ ค์์ ๋ํด ์ค๋ช ํ์ต๋๋ค.## GIL(GLOBAL INTERPRETER LOCK) ์ ๊ฑฐ
๊ฐ์
GIL(GLOBAL INTERPRETER LOCK)์ CPython์์ ์ฌ์ฉ๋๋ ์ค๋ ๋ ๊ฐ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ์ผ๋ก, ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง Python ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํํ ์ ์๋๋ก ์ ์ดํฉ๋๋ค. ๊ทธ๋ฌ๋ GIL์ ํ์ฌ์ ๊ณผํ ๋ฐ ์ซ์ ๊ณ์ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ๋ฐ๊ณผ ์ ์ง๋ณด์์ ์ด๋ ค์์ ์ค ๋ฟ๋ง ์๋๋ผ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค๊ณ๋ฅผ ๋ ์ด๋ ต๊ฒ ๋ง๋ค๊ธฐ๋ ํฉ๋๋ค.
์ด PEP(ํ์ด์ฌ ๊ฐ์ ์ ์)์ CPython์์ GIL์ ์ ๊ฑฐํ๊ธฐ ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ํ๊ณ ์์ต๋๋ค.
๋น๋ ๊ตฌ์ฑ ๋ณ๊ฒฝ
GIL์ CPython ๋น๋ ๋ฐ python.org ๋ค์ด๋ก๋์ ๊ธฐ๋ณธ ์ค์ ์ผ๋ก ์ ์ง๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ์๋ก์ด ๋น๋ ๊ตฌ์ฑ ํ๋๊ทธ์ธ --disable-gil
์ด configure ์คํฌ๋ฆฝํธ์ ์ถ๊ฐ๋ ๊ฒ์ด๋ฉฐ, ์ด๋ฅผ ์ฌ์ฉํ์ฌ GIL ์์ด CPython์ ์คํํ ์ ์๋๋ก ๋น๋ํ ์ ์์ต๋๋ค.
--disable-gil
๋ก ๋น๋๋ CPython์ Python/patchlevel.h์ ์๋ Py_NOGIL
๋งคํฌ๋ก๋ฅผ ์ ์ํ ๊ฒ์
๋๋ค. ABI ํ๊ทธ์๋ "n" (nogil์ ์๋ฏธ)์ด ํฌํจ๋ ๊ฒ์
๋๋ค.
CPython์ --disable-gil
๋น๋๋ ์ฌ์ ํ ๋ฐํ์์์ GIL์ ์ฌ์ฉํ์ฌ ์คํํ ์ ์์ต๋๋ค(PYTHONGIL ํ๊ฒฝ ๋ณ์ ๋ฐ Py_mod_gil ์ฌ๋กฏ ์ฐธ์กฐ).
CPython ๋ณ๊ฒฝ ์ฌํญ ๊ฐ์
GIL ์ ๊ฑฐ์๋ CPython ๋ด๋ถ์ ์๋นํ ๋ณ๊ฒฝ ์ฌํญ์ด ํ์ํ์ง๋ง, ๊ณต๊ฐ Python ๋ฐ C API์๋ ์๋์ ์ผ๋ก ์ ์ ๋ณ๊ฒฝ ์ฌํญ์ด ํ์ํฉ๋๋ค. ์ด ์น์ ์์๋ CPython ๊ตฌํ์ ํ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ์ค๋ช ํ ๋ค์, ์ ์๋ API ๋ณ๊ฒฝ ์ฌํญ์ ์ค๋ช ํฉ๋๋ค.
๊ตฌํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ค์ ๋ค ๊ฐ์ง ๋ฒ์ฃผ๋ก ๊ทธ๋ฃนํ๋ ์ ์์ต๋๋ค:
- ์ฐธ์กฐ ์นด์ดํ
- ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
- ์ปจํ ์ด๋ ์ค๋ ๋ ์์ ์ฑ
- ์ ๊ธ ๋ฐ ์์์ฑ API
์ฐธ์กฐ ์นด์ดํ
GIL ์ ๊ฑฐ๋ CPython์ ์ฐธ์กฐ ์นด์ดํ ๊ตฌํ์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ํ์๋ก ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฐธ์กฐ ์นด์ดํ ์ด ์ค๋ ๋ ์์ ํ๊ณ , ์คํ ์ค๋ฒํค๋๊ฐ ๋ฎ์ผ๋ฉฐ, ์ฌ๋ฌ ์ค๋ ๋์์ ํจ์จ์ ์ผ๋ก ํ์ฅ๋ ์ ์๋๋ก ๋ง๋ค์ด์ผ ํฉ๋๋ค. ์ด PEP์ ์ด๋ฌํ ์ ์ฝ ์ฌํญ์ ๋์ํ๊ธฐ ์ํด ์ธ ๊ฐ์ง ๊ธฐ์ ์ ์กฐํฉ์ ์ ์ํฉ๋๋ค. ์ฒซ ๋ฒ์งธ๋ ์ผ๋ฐ ๋น์์์ ์ฐธ์กฐ ์นด์ดํ ์์ ์ค๋ ๋ ์์ ํ ์ฐธ์กฐ ์นด์ดํ ์ผ๋ก์ ์ ํ์ ๋๋ค. ์ด๋ ์์์ ์ฐธ์กฐ ์นด์ดํ ๋ณด๋ค ์คํ ์ค๋ฒํค๋๊ฐ ๋ฎ์ ์ค๋ ๋ ์์ ํ ์ฐธ์กฐ ์นด์ดํ ๊ธฐ์ ์ ๋๋ค. ๋๋จธ์ง ๋ ๊ฐ์ง ๊ธฐ์ ์ ๋ถ๋ฉธํ(immortalization)์ ์ ํ๋ ํํ์ ์ง์ฐ ์ฐธ์กฐ ์นด์ดํ ์ ํฌํจํ๋ฉฐ, ์ฐธ์กฐ ์นด์ดํ ์ ๋ฉํฐ์ค๋ ๋ ํ์ฅ์ฑ ๋ฌธ์ ์ค ์ผ๋ถ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
๋น์์์ ์ฐธ์กฐ ์นด์ดํ ์์ ์ค๋ ๋ ์์ ํ ์ฐธ์กฐ ์นด์ดํ ์ผ๋ก์ ์ ํ์ Jiho Choi, Thomas Shull, Josep Torrellas์ ์ํด 2018๋ ์ ์ฒ์์ผ๋ก ์๊ฐ๋ ๊ธฐ์ ์ ๋๋ค. ์ด ๊ธฐ์ ์ ๋๋ถ๋ถ์ ๊ฐ์ฒด๊ฐ ๋ค์ค ์ค๋ ๋ ํ๋ก๊ทธ๋จ์์๋ ํ๋์ ์ค๋ ๋์ ์ํด์๋ง ์ก์ธ์ค๋๋ ๊ฒ์ ๊ด์ฐฐํ ๊ฒ์ ๊ธฐ๋ฐํฉ๋๋ค. ๊ฐ ๊ฐ์ฒด๋ ์์ ์ค๋ ๋(์์ฑํ ์ค๋ ๋)์ ์ฐ๊ฒฐ๋ฉ๋๋ค. ์์ ์ค๋ ๋์์์ ์ฐธ์กฐ ์นด์ดํ ์์ ์ "๋ก์ปฌ" ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์์ ํ๊ธฐ ์ํด ์์์ ์ด์ง ์์ ๋ช ๋ น์ ์ฌ์ฉํฉ๋๋ค. ๋ค๋ฅธ ์ค๋ ๋๋ "๊ณต์ " ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์์ ํ๊ธฐ ์ํด ์์์ ๋ช ๋ น์ ์ฌ์ฉํฉ๋๋ค. ์ด ์ค๊ณ๋ ํ์ฌ ํ๋ก์ธ์์์ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์์ ์ฝ๊ธฐ-์์ -์ฐ๊ธฐ ์ฐ์ฐ์ ํผํ ์ ์๋๋ก ํฉ๋๋ค.
์ด PEP์์ ์ ์ํ๋ BRC(์ฐธ์กฐ ์นด์ดํ )์ ๊ตฌํ์ ๊ธฐ๋ณธ์ ์ผ๋ก biased reference counting์ ์๋ ์ค๋ช ๊ณผ ๋งค์ฐ ์ ์ฌํ์ง๋ง, ์ฐธ์กฐ ์นด์ดํธ ํ๋์ ํฌ๊ธฐ์ ํด๋น ํ๋์ ํน์ ๋นํธ ๋ฑ ์ธ๋ถ ์ฌํญ์์ ์ฐจ์ด๊ฐ ์์ต๋๋ค. BRC๋ ๊ฐ ๊ฐ์ฒด์ ํค๋์ ์ธ ๊ฐ์ง ์ ๋ณด๋ฅผ ์ ์ฅํด์ผ ํฉ๋๋ค: "๋ก์ปฌ" ์ฐธ์กฐ ์นด์ดํธ, "๊ณต์ " ์ฐธ์กฐ ์นด์ดํธ, ์์ ์ค๋ ๋์ ์๋ณ์. BRC ๋ ผ๋ฌธ์ ์ด๋ฌํ ์ธ ๊ฐ์ง ์์๋ฅผ ํ๋์ 64๋นํธ ํ๋๋ก ์์ถํฉ๋๋ค. ์ด PEP์ ์ฐธ์กฐ ์นด์ดํธ ์ค๋ฒํ๋ก์ฐ๋ก ์ธํ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ํผํ๊ธฐ ์ํด ๊ฐ ๊ฐ์ฒด์ ํค๋์ ์ธ ๊ฐ์ ๋ณ๋ ํ๋๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ ์ํฉ๋๋ค. ๋ํ PEP์ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ์์์ ์ฐ์ฐ์ ํผํ๋ ๋ ๋น ๋ฅธ ํ ๋น ํด์ ๊ฒฝ๋ก๋ฅผ ์ง์ํฉ๋๋ค.
์ ์๋ PyObject ๊ตฌ์กฐ์ฒด(๋๋ struct _object)๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
struct _object {
_PyObject_HEAD_EXTRA
uintptr_t ob_tid; // ์์ ์ค๋ ๋ id (4-8๋ฐ์ดํธ)
uint16_t __padding; // ๋ฏธ๋์ ์ฌ์ฉํ๊ธฐ ์ํ ์์ฝ ๊ณต๊ฐ (2๋ฐ์ดํธ)
PyMutex ob_mutex; // ๊ฐ๋ณ ๊ฐ์ฒด์ ๋ฎคํ
์ค (1๋ฐ์ดํธ)
uint8_t ob_gc_bits; // ๊ฐ๋น์ง ์ปฌ๋ ์
ํ๋ (1๋ฐ์ดํธ)
uint32_t ob_ref_local; // ๋ก์ปฌ ์ฐธ์กฐ ์นด์ดํธ (4๋ฐ์ดํธ)
Py_ssize_t ob_ref_shared; // ๊ณต์ ์ฐธ์กฐ ์นด์ดํธ ๋ฐ ์ํ ๋นํธ (4-8๋ฐ์ดํธ)
PyTypeObject ob_type;
};
๋ถ๋ฉธํ
์ผ๋ถ ๊ฐ์ฒด๋ค์ ํ๋ก๊ทธ๋จ์ ์๋ช ๋์ ๊ณ์ ์ ์ง๋๋ interned ๋ฌธ์์ด, ์์ ์ ์, ์ ์ ์ผ๋ก ํ ๋น๋ PyTypeObject ๋ฐ True, False, None ๊ฐ์ฒด์ ๊ฐ์ ๊ฐ์ฒด์ ๋๋ค. ์ด๋ฌํ ๊ฐ์ฒด๋ค์ ๋ก์ปฌ ์ฐธ์กฐ ์นด์ดํธ ํ๋(ob_ref_local)๋ฅผ UINT32_MAX๋ก ์ค์ ํ์ฌ ๋ถ๋ฉธ๋ก ํ์๋ฉ๋๋ค.
๋ถ๋ฉธ ๊ฐ์ฒด์ ๋ํด Py_INCREF ๋ฐ Py_DECREF ๋งคํฌ๋ก๋ ์์ ์ ์ํํ์ง ์์ต๋๋ค. ์ด๋ก์จ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ด๋ฌํ ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ ํ๋์ ์ ๊ทผํ ๋ ๋ฐ์ํ๋ ๊ฒฝํฉ์ ํผํ ์ ์์ต๋๋ค.# Py_INCREF and Py_DECREF ๋งคํฌ๋ก
Py_INCREF์ Py_DECREF ๋งคํฌ๋ก๋ ๋ถ๋ณ ๊ฐ์ฒด์ ๋ํด ์๋ํ์ง ์์ต๋๋ค. ์ด๋ ๊ฒ ํจ์ผ๋ก์จ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์ด๋ฌํ ๊ฐ์ฒด์ ์ก์ธ์คํ ๋ ์ฐธ์กฐ ์นด์ดํธ ํ๋์ ๋ํ ๊ฒฝํฉ์ ํผํ ์ ์์ต๋๋ค.
์ด ์ ์๋ ๋ถ๋ณํ ์ฒด๊ณ๋ Python 3.12์์ ์ฑํ๋ PEP 683์ ๋งค์ฐ ์ ์ฌํ์ง๋ง, ์ฐธ์กฐ ์นด์ดํธ ํ๋์ ๋ถ๋ณ ๊ฐ์ฒด์ ๋ํ ์ฝ๊ฐ ๋ค๋ฅธ ๋นํธ ํํ์ ์ฌ์ฉํ์ฌ ํธํฅ ์ฐธ์กฐ ์นด์ดํ ๊ณผ ์ง์ฐ ์ฐธ์กฐ ์นด์ดํ ๊ณผ ํจ๊ป ์๋ํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. PEP 683 ๋ถ๋ณํ๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ์ฐธ์กฐํ์ญ์์ค.
ํธํฅ ์ฐธ์กฐ ์นด์ดํ
ํธํฅ ์ฐธ์กฐ ์นด์ดํ ์ ํ์ฌ ์ค๋ ๋๊ฐ "์์ "ํ๋ ๊ฐ์ฒด์ ๋ํ ๋น ๋ฅธ ๊ฒฝ๋ก์ ๋ค๋ฅธ ๊ฐ์ฒด์ ๋ํ ๋๋ฆฐ ๊ฒฝ๋ก๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์์ ๊ถ์ ob_tid ํ๋์ ์ํด ํ์๋ฉ๋๋ค. ์ค๋ ๋ ID๋ฅผ ๊ฒฐ์ ํ๊ธฐ ์ํด์๋ ํ๋ซํผ๋ณ ์ฝ๋๊ฐ ํ์ํฉ๋๋ค. ob_tid์ 0 ๊ฐ์ด ์๋ ๊ฒฝ์ฐ, ํด๋น ๊ฐ์ฒด๋ ์ด๋ค ์ค๋ ๋๋ ์์ ํ์ง ์์์ ๋ํ๋ ๋๋ค.
ob_ref_local ํ๋๋ ๋ก์ปฌ ์ฐธ์กฐ ์นด์ดํธ์ ๋ ๊ฐ์ ํ๋๊ทธ๋ฅผ ์ ์ฅํฉ๋๋ค. ๊ฐ์ฅ ์์ 2๋นํธ๋ ๊ฐ์ฒด๊ฐ ๋ถ๋ณ ๊ฐ์ฒด์ธ์ง ๋๋ ์ง์ฐ ์ฐธ์กฐ ์นด์ดํ ์ ์ฌ์ฉํ๋์ง๋ฅผ ๋ํ๋ ๋๋ค (์ง์ฐ ์ฐธ์กฐ ์นด์ดํ ์ ๋ํด์๋ Deferred reference counting์ ์ฐธ์กฐํ์ญ์์ค).
ob_ref_shared ํ๋๋ ๊ณต์ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ ์ฅํฉ๋๋ค. ๊ฐ์ฅ ํ์ 2๋นํธ๋ ์ฐธ์กฐ ์นด์ดํ ์ํ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๊ณต์ ์ฐธ์กฐ ์นด์ดํธ๋ ์ผ์ชฝ์ผ๋ก 2๋นํธ ์ํํธ๋ฉ๋๋ค. ob_ref_shared ํ๋๋ ๊ณต์ ์ฐธ์กฐ ์นด์ดํธ๊ฐ ์ผ์์ ์ผ๋ก ์์๊ฐ ๋ ์ ์์ผ๋ฏ๋ก ๊ฐ์ฅ ํ์ ๋นํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ก ์ธํด incref์ decref๊ฐ ์ค๋ ๋ ๊ฐ์ ๊ท ํ์ ์ด๋ฃจ์ง ๋ชปํ ์ ์์ต๋๋ค.
๊ฐ๋ฅํ ์ฐธ์กฐ ์นด์ดํ ์ํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
0b00 - ๊ธฐ๋ณธ ์ํ
0b01 - ์ฝํ ์ฐธ์กฐ
0b10 - ๋๊ธฐ ์ค์ธ ์ํ
0b11 - ๋ณํฉ๋ ์ํ
๊ฐ ์ํ๋ ์ซ์์ ์ผ๋ก ๋์ ์ํ๋ก ์ ํ๋ ์ ์์ต๋๋ค. ๊ฐ์ฒด๋ "๊ธฐ๋ณธ" ๋ฐ "๋ณํฉ" ์ํ์์๋ง ํ ๋น ํด์ ๋ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ํ๋ ํ ๋น ํด์ ๋๊ธฐ ์ ์ "๋ณํฉ" ์ํ๋ก ์ ํํด์ผํฉ๋๋ค. ์ํ ์ ํ์ ob_ref_shared ํ๋์ ๋ํ ์์์ ๋น๊ต ๋ฐ ๊ต์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฉ๋๋ค.
๊ธฐ๋ณธ (0b00)
๊ฐ์ฒด๋ ๊ธฐ๋ณธ ์ํ์์ ์ด๊ธฐ์ ์์ฑ๋ฉ๋๋ค. ์ด๊ฒ์ ๋น ๋ฅธ ํ ๋น ํด์ ์ฝ๋ ๊ฒฝ๋ก๋ง ํ์ฉํ๋ ์ ์ผํ ์ํ์ ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด, ์ค๋ ๋๋ ๋ก์ปฌ ๋ฐ ๊ณต์ ์ฐธ์กฐ ์นด์ดํธ ํ๋๋ฅผ ๋ณํฉํด์ผํ๋ฉฐ, ์ด๋ ์์์ ๋น๊ต ๋ฐ ๊ต์ฒด๋ฅผ ํ์๋กํฉ๋๋ค.
์ด ๋น ๋ฅธ ํ ๋น ํด์ ์ฝ๋ ๊ฒฝ๋ก๋ ์ฝํ ์ฐธ์กฐ์ ๋์์ ์ธ ์ฐธ์กฐ ํด์ ์ ์ค๋ ๋ ๊ฐ์ ์ ๊ธ ์๋ ๋ฆฌ์คํธ ๋ฐ ์ฌ์ ์ก์ธ์ค์ ํจ๊ป ์ฌ์ฉ๋ ์ ์์ผ๋ฏ๋ก, ์ฝํ ์ฐธ์กฐ๊ฐ ์ฒ์์ผ๋ก ์์ฑ๋ ๋ ๊ฐ์ฒด๊ฐ "๊ธฐ๋ณธ" ์ํ์ธ ๊ฒฝ์ฐ "์ฝํ ์ฐธ์กฐ" ์ํ๋ก ์ ํ๋ฉ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก, ๋น ๋ฅธ ํ ๋น ํด์ ์ฝ๋ ๊ฒฝ๋ก๋ ์ ๊ธ ์๋ ๋ฆฌ์คํธ ๋ฐ ์ฌ์ ์ก์ธ์ค (Optimistically Avoiding Locking ์ฐธ์กฐ)๋ก ์ธํด ์์ ํ์ง ์๋ ์ค๋ ๋๊ฐ ์ฒ์์ผ๋ก "๊ธฐ๋ณธ" ์ํ์ ๊ฐ์ฒด๋ฅผ ๊ฒ์ํ๋ ค๊ณ ํ ๋ ๋๋ฆฐ ์ ๊ธ ์ฝ๋ ๊ฒฝ๋ก๋ก ์ ํ๋๋ฉฐ, ๊ฐ์ฒด๊ฐ "์ฝํ ์ฐธ์กฐ" ์ํ๋ก ์ ํ๋ฉ๋๋ค.
์ฝํ ์ฐธ์กฐ (0b01)
์ฝํ ์ฐธ์กฐ ๋ฐ ๊ทธ ์ด์์ ์ํ์ ์๋ ๊ฐ์ฒด๋ ์ฝํ ์ฐธ์กฐ ํด์ ๋ฐ ์์ ํ์ง ์๋ ์ค๋ ๋์ ์ํ ์ ๊ธ ์๋ ๋ฆฌ์คํธ ๋ฐ ์ฌ์ ์ก์ธ์ค๋ฅผ ์ง์ํฉ๋๋ค. ํ ๋น ํด์ ๋ฅผ ์ํด์๋ ๋ณํฉ ์ํ๋ก ์ ํํด์ผํ๋ฉฐ, ์ด๋ "๊ธฐ๋ณธ" ์ํ์์ ์ง์๋๋ ๋น ๋ฅธ ํ ๋น ํด์ ์ฝ๋ ๊ฒฝ๋ก๋ณด๋ค ๋น์ฉ์ด ๋ ๋ง์ด ๋ญ๋๋ค.
๋๊ธฐ ์ค (0b10)
๋๊ธฐ ์ค์ธ ์ํ๋ ์์ ํ์ง ์๋ ์ค๋ ๋๊ฐ ์ฐธ์กฐ ์นด์ดํธ ํ๋๋ฅผ ๋ณํฉํ๋๋ก ์์ฒญํ ๊ฒ์ ๋ํ๋ ๋๋ค. ๊ณต์ ์ฐธ์กฐ ์นด์ดํธ๊ฐ ์์๊ฐ ๋๋ฉด (์ค๋ ๋ ๊ฐ์ incref ๋ฐ decref ๊ฐ์ ๊ท ํ์ด ๊นจ์ง ๊ฒฝ์ฐ), ๊ฐ์ฒด๋ ์์ ํ๋ ์ค๋ ๋์ ๋ณํฉ ๋๊ธฐ์ด์ ์ฝ์ ๋ฉ๋๋ค. ์์ ํ๋ ์ค๋ ๋๋ eval_breaker ๋ฉ์ปค๋์ฆ์ ํตํด ์๋ฆผ์ ๋ฐ์ต๋๋ค. ์ค์ ๋ก์ด ์์ ์ ๋๋ฌผ๊ฒ ๋ฐ์ํฉ๋๋ค. ๋๋ถ๋ถ์ ๊ฐ์ฒด๋ ๋จ์ผ ์ค๋ ๋์ ์ํด๋ง ์ก์ธ์ค๋๋ฉฐ, ์ฌ๋ฌ ์ค๋ ๋์ ์ํด ์ก์ธ์ค๋๋ ๊ฒฝ์ฐ์๋ ์์์ธ ๊ณต์ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ๊ฐ์ง๋ ๊ฐ์ฒด๋ ๋๋ฌผ๊ฒ ์์ต๋๋ค.
์์ ํ๋ ์ค๋ ๋๊ฐ ์ข ๋ฃ๋ ๊ฒฝ์ฐ, ์๋ํ๋ ์ค๋ ๋๋ ์ฆ์ ๋ก์ปฌ ๋ฐ ๊ณต์ ์ฐธ์กฐ ์นด์ดํธ ํ๋๋ฅผ ๋ณํฉํ๊ณ ๋ณํฉ๋ ์ํ๋ก ์ ํํฉ๋๋ค.
๋ณํฉ (0b11)
๋ณํฉ๋ ์ํ๋ ๊ฐ์ฒด๊ฐ ์ด๋ค ์ค๋ ๋๋ ์์ ํ์ง ์์์ ๋ํ๋ ๋๋ค. ๋ณํฉ๋ ์ํ์์ ob_tid ํ๋๋ 0์ด๊ณ ob_ref_local์ ์ฌ์ฉ๋์ง ์์ต๋๋ค. ๊ณต์ ์ฐธ์กฐ ์นด์ดํธ๊ฐ 0์ด ๋๋ฉด ๊ฐ์ฒด๋ ๋ณํฉ๋ ์ํ์์ ํ ๋น ํด์ ๋ ์ ์์ต๋๋ค.
์ฐธ์กฐ ์นด์ดํ ์์ฌ ์ฝ๋
๋ค์์ ์ ์๋ Py_INCREF ๋ฐ Py_DECREF ์์ ์ ๋์์ ์ค๋ช ํ๋ ์์ฌ ์ฝ๋(C ์คํ์ผ)์ ๋๋ค:
// "ob_ref_shared"์ ํ์ 2๋นํธ๋ ํ๋๊ทธ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
define _Py_SHARED_SHIFT 2
void Py_INCREF(PyObject *op) {
uint32_t new_local = op->ob_ref_local + 1;
if (new_local == _Py_IMMORTAL_REFCNT)
return; // object is immortal
if (op->ob_tid == _Py_ThreadId())
op->ob_ref_local = new_local;
else
atomic_add(&op->ob_ref_shared, 1 << _Py_SHARED_SHIFT);
}
void Py_DECREF(PyObject *op) {
if (op->ob_ref_local == _Py_IMMORTAL_REFCNT)
return; // object is immortal
if (op->ob_tid == _Py_ThreadId())
op->ob_ref_local--;
else if (op->ob_ref_local == _Py_MergeZeroRefcount())
// merge refcount
else
_Py_DecRefShared(); // slow path
}
void _Py_MergeZeroRefcount(PyObject *op) {
if (op->ob_ref_shared == 0)
// quick deallocation code path (common case)
op->ob_tid = 0;
}# merge refcount
else
_Py_DecRefShared();
slow path
void _Py_MergeZeroRefcount(PyObject *op)
{
if (op->ob_ref_shared == 0)
{
// quick deallocation code path (common case)
_Py_Dealloc(op);
}
else
{
// slower merging path not shown
}
}
์ฐธ์กฐ ๊ตฌํ์ฒด์๋ _Py_MergeZeroRefcount์ _Py_DecRefShared์ ๊ตฌํ์ด ํฌํจ๋์ด ์์ต๋๋ค.
์์ ์ฝ๋๋ ์์ฌ ์ฝ๋์ด๋ฉฐ, ์ค์ ๋ก๋ C ๋ฐ C++์์ ์ ์๋์ง ์์ ๋์์ ํผํ๊ธฐ ์ํด "relaxed atomics"๋ฅผ ์ฌ์ฉํ์ฌ ob_tid์ ob_ref_local์ ์ก์ธ์คํด์ผ ํฉ๋๋ค.
์ง์ฐ๋ ์ฐธ์กฐ ์นด์ดํ
์ผ๋ถ ์ ํ์ ๊ฐ์ฒด(์: ์ต์์ ํจ์, ์ฝ๋ ๊ฐ์ฒด, ๋ชจ๋ ๋ฐ ๋ฉ์๋)๋ ์ฌ๋ฌ ์ค๋ ๋์์ ๋์์ ์์ฃผ ์ก์ธ์ค๋ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ฐ์ฒด๋ ํ๋ก๊ทธ๋จ์ ์๋ช ๋์ ์กด์ฌํ์ง ์์ ์ ์์ผ๋ฏ๋ก ๋ถ๋ฉธํ๋ ์ ํฉํ์ง ์์ต๋๋ค. ์ด PEP๋ ๋ฉํฐ ์ค๋ ๋ ํ๋ก๊ทธ๋จ์์ ์ด๋ฌํ ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ ํ๋์ ๋ํ ๊ฒฝํฉ์ ํผํ๊ธฐ ์ํด ์ ํ๋ ํํ์ ์ง์ฐ๋ ์ฐธ์กฐ ์นด์ดํ ์ ์ ์ํฉ๋๋ค.
์ผ๋ฐ์ ์ผ๋ก ์ธํฐํ๋ฆฌํฐ๋ ๊ฐ์ฒด๋ฅผ ์ธํฐํ๋ฆฌํฐ ์คํ์ ํธ์ํ๊ณ ํํ ๋ ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์์ ํฉ๋๋ค. ์ธํฐํ๋ฆฌํฐ๋ ์ง์ฐ๋ ์ฐธ์กฐ ์นด์ดํ ์ ์ฌ์ฉํ๋ ๊ฐ์ฒด์ ๋ํด ์ด๋ฌํ ์ฐธ์กฐ ์นด์ดํ ์์ ์ ๊ฑด๋๋๋๋ค. ์ง์ฐ๋ ์ฐธ์กฐ ์นด์ดํ ์ ์ง์ํ๋ ๊ฐ์ฒด๋ ๋ก์ปฌ ์ฐธ์กฐ ์นด์ดํธ ํ๋์ ๊ฐ์ฅ ์์ 2๋นํธ๋ฅผ 1๋ก ์ค์ ํ์ฌ ํ์๋ฉ๋๋ค.
์ฐธ์กฐ ์นด์ดํ ์์ ์ด ๊ฑด๋๋ฐ์ด์ง๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐ ์นด์ดํธ ํ๋๋ ์ด์ ์ด๋ฌํ ๊ฐ์ฒด์ ๋ํ ์ค์ ์ฐธ์กฐ ์๋ฅผ ๋ฐ์ํ์ง ์์ต๋๋ค. ์ค์ ์ฐธ์กฐ ์นด์ดํธ๋ ์ฐธ์กฐ ์นด์ดํธ ํ๋์ ํฉ๊ณผ ๊ฐ ์ค๋ ๋์ ์ธํฐํ๋ฆฌํฐ ์คํ์์ ๊ฑด๋๋ด ์ฐธ์กฐ์ ํฉ์ ๋๋ค. ์ค์ ์ฐธ์กฐ ์นด์ดํธ๋ ์ํ ๊ฐ๋น์ง ์์ง ์ค ๋ชจ๋ ์ค๋ ๋๊ฐ ์ผ์ ์ค์ง๋ ๋๋ง ์์ ํ๊ฒ ๊ณ์ฐํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ง์ฐ๋ ์ฐธ์กฐ ์นด์ดํ ์ ์ฌ์ฉํ๋ ๊ฐ์ฒด๋ ์ํ ๊ฐ๋น์ง ์์ง ์ฃผ๊ธฐ ๋์์๋ง ํด์ ๋ ์ ์์ต๋๋ค.
์ง์ฐ๋ ์ฐธ์กฐ ์นด์ดํ ์ ์ฌ์ฉํ๋ ๊ฐ์ฒด๋ ์ด๋ฏธ CPython์์ ์์ฐ์ค๋ฝ๊ฒ ์ฐธ์กฐ ์ฌ์ดํด์ ํ์ฑํ๋ฏ๋ก ์ง์ฐ๋ ์ฐธ์กฐ ์นด์ดํ ์์ด๋ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ๋น์ง ์์ง๊ธฐ์ ์ํด ํด์ ๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ์ต์์ ํจ์์ ๋ชจ๋์ ์ฐธ์กฐ ์ฌ์ดํด์ ํ์ฑํ๋ฉฐ, ๋ฉ์๋์ ํ์ ๊ฐ์ฒด๋ ์ฐธ์กฐ ์ฌ์ดํด์ ํ์ฑํฉ๋๋ค.
์ง์ฐ๋ ์ฐธ์กฐ ์นด์ดํ ์ ์ํ ๊ฐ๋น์ง ์์ง๊ธฐ ์์
์ถ์ ๊ฐ๋น์ง ์์ง๊ธฐ๋ ์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด๋ฅผ ์ฐพ์ ํด์ ํฉ๋๋ค. ํ์ฌ ์ถ์ ๊ฐ๋น์ง ์์ง๊ธฐ๋ ์ฐธ์กฐ ์ฌ์ดํด์ ์ผ๋ถ์ธ ์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด๋ง ์ฐพ์ต๋๋ค. ์ง์ฐ๋ ์ฐธ์กฐ ์นด์ดํ ์ ์ฌ์ฉํ๋ฉด ์ถ์ ๊ฐ๋น์ง ์์ง๊ธฐ๋ ์ฐธ์กฐ ์ฌ์ดํด์ ์ํ์ง ์์ ์๋ ์๋ ์ผ๋ถ ์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์์งํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ์ง์ฐ๋ ์ฐธ์กฐ ์นด์ดํ ์ผ๋ก ์ธํด ์์ง์ด ์ง์ฐ๋ ๊ฐ์ฒด์ ๋๋ค. ์ด๋ฅผ ์ํด ์ง์ฐ๋ ์ฐธ์กฐ ์นด์ดํ ์ ์ง์ํ๋ ๋ชจ๋ ๊ฐ์ฒด๋ ์ถ์ ๊ฐ๋น์ง ์์ง์ ์ง์ํ๋ ํด๋น ์ ํ ๊ฐ์ฒด(through the Py_TPFLAGS_HAVE_GC ํ๋๊ทธ๋ฅผ ํตํด)๋ ๊ฐ์ ธ์ผ ํฉ๋๋ค. ๋ํ ๊ฐ๋น์ง ์์ง๊ธฐ๋ ๊ฐ ์ค๋ ๋์ ์คํ์ ํธ๋๋ฒ์คํ์ฌ ๊ฐ ์ปฌ๋ ์ ์ ์์ ์ GC ์ฐธ์กฐ ์นด์ดํธ์ ์ฐธ์กฐ๋ฅผ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
์ฐธ์กฐ ์นด์ดํ ์ ํ ๊ฐ์ฒด
์ ํ ๊ฐ์ฒด(PyTypeObject)๋ ์ฐธ์กฐ ์นด์ดํ ๊ธฐ์ ์ ํผํฉํ์ฌ ์ฌ์ฉํฉ๋๋ค. ์ ์ ์ผ๋ก ํ ๋น๋ ์ ํ ๊ฐ์ฒด๋ ์ด๋ฏธ ํ๋ก๊ทธ๋จ์ ์๋ช ๋์ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๋ถ๋ฉธํ๋ฉ๋๋ค. ํ ์ ํ ๊ฐ์ฒด๋ ์ง์ฐ๋ ์ฐธ์กฐ ์นด์ดํ ๊ณผ ์ค๋ ๋๋ณ ์ฐธ์กฐ ์นด์ดํ ์ ์กฐํฉํ์ฌ ์ฌ์ฉํฉ๋๋ค. ํ ์ ํ์ ๋ฉํฐ ์ค๋ ๋ ํ์ฅ ๋ณ๋ชฉํ์์ ํด๊ฒฐํ๊ธฐ ์ํด ์ง์ฐ๋ ์ฐธ์กฐ ์นด์ดํ ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์๋ํ๋ฉด ํ ์ ํ์ ๋ํ ๋๋ถ๋ถ์ ์ฐธ์กฐ๋ ์ธ์คํด์ค์ ์ฐธ์กฐ๊ฐ ์๋ ์ธํฐํ๋ฆฌํฐ ์คํ์ ์๋ ์ฐธ์กฐ์ ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ํ ์ ํ์ ์ฐธ์กฐ ์นด์ดํธ๋ ์ค๋ ๋๋ณ ๋ฐฐ์ด์ ๋ถ์ฐํ์ฌ ์ ์ฅ๋ฉ๋๋ค. ๊ฐ ์ค๋ ๋๋ ๊ฐ ํ ์ ํ ๊ฐ์ฒด์ ๋ํ ๋ก์ปฌ ์ฐธ์กฐ ์นด์ดํธ ๋ฐฐ์ด์ ์ ์ฅํฉ๋๋ค. ํ ์ ํ ๊ฐ์ฒด์๋ ๊ณ ์ ํ ๋ฒํธ๊ฐ ํ ๋น๋์ด ๋ก์ปฌ ์ฐธ์กฐ ์นด์ดํธ ๋ฐฐ์ด์์์ ์์น๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ํ ์ ํ์ ์ค์ ์ฐธ์กฐ ์นด์ดํธ๋ ์ค๋ ๋๋ณ ๋ฐฐ์ด์ ํญ๋ชฉ๋ค์ ํฉ, PyTypeObject์ ์ฐธ์กฐ ์นด์ดํธ ๋ฐ ์ธํฐํ๋ฆฌํฐ ์คํ์์์ ์ง์ฐ๋ ์ฐธ์กฐ๋ฅผ ๋ํ ๊ฐ์ ๋๋ค.
์ค๋ ๋๋ ์ ํ ๊ฐ์ฒด์ ๋ก์ปฌ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ฆ๊ฐ ๋๋ ๊ฐ์ํ ๋ ํ์์ ๋ฐ๋ผ ์์ฒด ์ ํ ์ฐธ์กฐ ์นด์ดํธ ๋ฐฐ์ด์ ํ์ฅํ ์ ์์ต๋๋ค.
์ค๋ ๋๋ณ ์ฐธ์กฐ ์นด์ดํธ ๋ฐฐ์ด์ ์ฌ์ฉ์ ๋ช ๊ตฐ๋ฐ๋ก ์ ํ๋ฉ๋๋ค:
- PyType_GenericAlloc(PyTypeObject *type, Py_ssize_t nitems): ํ ์ ํ์ธ ๊ฒฝ์ฐ ํ์ฌ ์ค๋ ๋์ ์ ํ์ ๋ํ ๋ก์ปฌ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ฆ๊ฐ์ํต๋๋ค.
- subtype_dealloc(PyObject *self): ํ ์ ํ์ธ ๊ฒฝ์ฐ ํ์ฌ ์ค๋ ๋์ self->ob_type์ ๋ํ ๋ก์ปฌ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ๊ฐ์์ํต๋๋ค.
- gcmodule.c: ๊ฐ ์ค๋ ๋์ ๋ก์ปฌ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ํด๋น ํ ์ ํ ๊ฐ์ฒด์ gc_refs ์นด์ดํธ์ ์ถ๊ฐํฉ๋๋ค.
๋ํ ์ค๋ ๋๊ฐ ์ข ๋ฃ๋ ๋๋ ๋ชจ๋ ์ ํ ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ ํ๋์ ๋ํด 0์ด ์๋ ๋ก์ปฌ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ# ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
CPython์ ํ์ฌ ์์ ๊ฐ์ฒด ํ ๋น์ ์ต์ ํ๋ ๋ด๋ถ ํ ๋น์์ธ pymalloc์ ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋ฌ๋ pymalloc์ GIL ์์ด๋ ์ค๋ ๋ ์์ ํ์ง ์์ต๋๋ค. ์ด PEP๋ pymalloc์ mimalloc์ผ๋ก ๋์ฒดํ๋ ๊ฒ์ ์ ์ํฉ๋๋ค. mimalloc์ ์์ ํ ๋น์๋ ์ข์ ์ฑ๋ฅ์ ๊ฐ์ง๋ฉฐ ์ค๋ ๋ ์์ ํ ๋ฒ์ฉ ํ ๋น์์ ๋๋ค.
mimalloc์ ์ฌ์ฉํ๋ฉด GIL์ ์ ๊ฑฐํ๋ ๋ฐ ๊ด๋ จ๋ ๋ ๊ฐ์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ฒซ์งธ, ๋ด๋ถ mimalloc ๊ตฌ์กฐ๋ฅผ ํ์ํจ์ผ๋ก์จ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๊ฐ ์ฐ๊ฒฐ๋ ๋ชฉ๋ก์ ์ ์งํ์ง ์๊ณ ๋ ๋ชจ๋ Python ๊ฐ์ฒด๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค. ์ด์ ๋ํ ์์ธํ ๋ด์ฉ์ ๊ฐ๋น์ง ์ปฌ๋ ์ ์น์ ์์ ์ค๋ช ํฉ๋๋ค. ๋์งธ, mimalloc ํ๊ณผ ์ฌ์ด์ฆ ํด๋์ค์ ๊ธฐ๋ฐํ ํ ๋น์ dict์ ๊ฐ์ ์ปฌ๋ ์ ์์ ์ฝ๊ธฐ ์ ์ฉ ์์ ์ค์ ์ผ๋ฐ์ ์ผ๋ก ์ ๊ธ์ ํ๋ํ์ง ์๋๋ก ํ ์ ์์ต๋๋ค. ์ด์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ปฌ๋ ์ ์ค๋ ๋ ์์ ์ฑ ์น์ ์์ ์ค๋ช ํฉ๋๋ค.
CPython์ ์ด๋ฏธ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ง์ํ๋ ๊ฐ์ฒด๊ฐ GC ํ ๋น์ API๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค๋ ์๊ตฌ ์ฌํญ์ ๊ฐ์ง๊ณ ์์ต๋๋ค (์ผ๋ฐ์ ์ผ๋ก PyType_GenericAlloc๋ฅผ ํธ์ถํจ์ผ๋ก์จ ๊ฐ์ ์ ์ผ๋ก ํธ์ถ๋ฉ๋๋ค). ์ด PEP๋ Python ํ ๋น์ API์ ์ฌ์ฉ์ ๋ํ ์ถ๊ฐ์ ์ธ ์๊ตฌ ์ฌํญ์ ์ถ๊ฐํฉ๋๋ค. ๋จผ์ , Python ๊ฐ์ฒด๋ PyType_GenericAlloc, PyObject_Malloc ๋๋ ํด๋น ํธ์ถ์ ๋ํํ๋ ๋ค๋ฅธ Python API์ ๊ฐ์ ๊ฐ์ฒด ํ ๋น API๋ฅผ ํตํด ํ ๋น๋์ด์ผ ํฉ๋๋ค. Python ๊ฐ์ฒด๋ C์ malloc ๋๋ C++์ new ์ฐ์ฐ์์ ๊ฐ์ ๋ค๋ฅธ API๋ฅผ ํตํด ํ ๋นํด์๋ ์ ๋ฉ๋๋ค. ๋ํ, PyObject_Malloc์ Python ๊ฐ์ฒด๋ง ํ ๋นํ๋ ๋ฐ ์ฌ์ฉ๋์ด์ผ ํ๋ฉฐ ๋ฒํผ, ์ ์ฅ์ ๋๋ PyObjects๊ฐ ์๋ ๋ค๋ฅธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํ ๋นํ๋ ๋ฐ ์ฌ์ฉํด์๋ ์ ๋ฉ๋๋ค.
์ด PEP์ ํ๋ฌ๊ทธ ๊ฐ๋ฅํ ํ ๋น์ API(PyMem_SetAllocator)์๋ ์ ํ์ ๊ฐํฉ๋๋ค. GIL ์์ด ์ปดํ์ผํ๋ ๊ฒฝ์ฐ ์ด API๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ๋ ํ ๋น์๋ Python ๊ฐ์ฒด ํ ๋น์ ์ํด PyObject_Malloc๊ณผ ๊ฐ์ ํด๋นํ๋ ํ์ ํ ๋น์๋ก ํ ๋น์ ์์ํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ํตํด Python์ tracemalloc๊ณผ ๋๋ฒ๊ทธ ํ ๋น์์ ๊ฐ์ด ํ์ ํ ๋น์๋ฅผ "๋ํ"ํ๋ ํ ๋น์๋ฅผ ์ฌ์ฉํ ์ ์์ง๋ง, ํ ๋น์๋ฅผ ์์ ํ ๋์ฒดํ ์๋ ์์ต๋๋ค.
CPython ์์ ๋ฆฌ์คํธ
CPython์ ํํ์ด๋ ์ซ์์ ๊ฐ์ด ์์ฃผ ํ ๋น๋๋ ์์ ๊ฐ์ฒด์ ํ ๋น ์๋๋ฅผ ๋์ด๊ธฐ ์ํด ์์ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฌํ ์์ ๋ฆฌ์คํธ๋ ๊ฐ๋ณ ์ธํฐํ๋ฆฌํฐ ์ํ์์ PyThreadState๋ก ์ด๋ํฉ๋๋ค.
๊ฐ๋น์ง ์ปฌ๋ ์ (Cycle Collection)
CPython ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ด ์ ์๊ณผ ํจ๊ป ์๋ํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ ๋ณ๊ฒฝ ์ฌํญ์ด ํ์ํฉ๋๋ค.
GIL์ด ์ด์ ์ ์ ๊ณตํ๋ ์ค๋ ๋ ์์ ์ฑ ๋ณด์ฅ์ ์ํด "stop-the-world" ์ฌ์ฉ
๋น ์ธ๋์ ์ธ ์ปฌ๋ ํฐ๋ฅผ ์ธ๋์ ์ธ ์ปฌ๋ ํฐ ๋์ ์ฌ์ฉ
์ง์ฐ๋ ์ฐธ์กฐ ์นด์ดํ ๋ฐ ํธํฅ๋ ์ฐธ์กฐ ์นด์ดํ ๊ณผ์ ํตํฉ
๋ํ ์์ ๋ณ๊ฒฝ ์ฌํญ์ GC ๊ฐ์ฒด์์ _gc_prev ๋ฐ _gc_next ํ๋๋ฅผ ์ ๊ฑฐํ ์ ์๋๋ก ํฉ๋๋ค. ์ถ์ ๋ ์ํ, ์๋ฃ๋ ์ํ ๋ฐ ๋๋ฌํ ์ ์๋ ์ํ๋ฅผ ์ ์ฅํ๋ GC ๋นํธ๋ PyObject ํค๋์ ob_gc_bits ํ๋๋ก ์ด๋ํฉ๋๋ค.
Stop-the-World
ํ์ฌ CPython ์ํ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ฌ์ดํด์ ์ฐพ๋ ๋์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ Python ๊ฐ์ฒด์ ์ก์ธ์คํ์ง ๋ชปํ๋๋ก ์ ์ญ ์ธํฐํ๋ฆฌํฐ ๋ฝ(GIL)์ ์ฌ์ฉํฉ๋๋ค. GIL์ ์ฌ์ดํด ๊ฒ์ ๋ฃจํด ์ค์ ์ ๋๋ก ํด์ ๋์ง ์์ผ๋ฏ๋ก ์ปฌ๋ ํฐ๋ ์์ ์ ์ธ(์ฆ, ๋ณ๊ฒฝ๋์ง ์๋) ์ฐธ์กฐ ์นด์ดํธ์ ์ฐธ์กฐ๋ฅผ ์ฌ์ดํด ๊ฒ์ ๋ฃจํด์ ์ง์ ์๊ฐ ๋์ ์์กดํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ์ดํด ๊ฐ์ง ์ดํ์๋ GIL์ด ์ผ์์ ์ผ๋ก ํด์ ๋ ์ ์์ผ๋ฉฐ ๊ฐ์ฒด์ ์ต์ข ํ์์ clear(tp_clear) ํจ์๋ฅผ ํธ์ถํ๋ ๋์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๊ต์ฐจ๋ก ์คํ๋ ์ ์์ต๋๋ค.
GIL ์์ด ์คํ๋ ๋ ๊ตฌํ์ ์ฌ์ดํด ๊ฒ์ถ ์ค์ ์ฐธ์กฐ ์นด์ดํธ๊ฐ ์์ ์ ์ธ ์ํ๋ฅผ ์ ์งํ ์ ์๋ ๋ฐฉ๋ฒ์ด ํ์ํฉ๋๋ค. Python ์ฝ๋๋ฅผ ์คํํ๋ ์ค๋ ๋๋ ์ฐธ์กฐ์ ์ฐธ์กฐ ์นด์ดํธ๊ฐ ์์ ์ ์ธ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํด ์ผ์์ ์ผ๋ก ์ผ์ ์ ์ง๋์ด์ผ ํฉ๋๋ค. ์ฌ์ดํด์ด ์๋ณ๋๋ฉด ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๋ค์ ์์๋ฉ๋๋ค.
ํ์ฌ CPython ์ํ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ฃผ๊ธฐ์์ ๋ ๊ฐ์ ์ฌ์ดํด ๊ฒ์ถ ํจ์ค๋ฅผ ์ํํฉ๋๋ค. ๋ฐ๋ผ์ GIL ์์ด ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ฅผ ์คํํ ๋๋ ๋ ๊ฐ์ stop-the-world ์ผ์ ์ ์ง๊ฐ ํ์ํฉ๋๋ค. ์ฒซ ๋ฒ์งธ ์ฌ์ดํด ๊ฒ์ถ ํจ์ค๋ ์ํ ์ฐ๋ ๊ธฐ๋ฅผ ์๋ณํฉ๋๋ค. ๋ ๋ฒ์งธ ํจ์ค๋ ์ต์ข ํ์ ์ดํ์ ์คํ๋์ด ์ฌ์ ํ ๋๋ฌํ ์ ์๋ ๊ฐ์ฒด๋ฅผ ์๋ณํฉ๋๋ค. ๋ค๋ฅธ ์ค๋ ๋๊ฐ ์ต์ข ํ์์ tp_clear ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ ์ ๋ค์ ์์๋๋ฏ๋ก ํ์ฌ CPython ๋์๊ณผ ๋ฌ๋ฆฌ ์ ์ฌ์ ์ธ ๋ฐ๋๋ฝ์ ๋ฐ์์ํค์ง ์๋๋ก ํฉ๋๋ค.
์ค๋ ๋ ์ํ
๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ํด ์ค๋ ๋๋ฅผ ์ผ์ ์ ์งํ๊ธฐ ์ํด PyThreadState์ ์๋ก์ด "status" ํ๋๊ฐ ์ถ๊ฐ๋ฉ๋๋ค. PyThreadState์ ๋ค๋ฅธ ํ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก status ํ๋๋ ๊ณต๊ฐ CPython API์ ์ผ๋ถ๊ฐ ์๋๋๋ค. status ํ๋๋ ๋ค์ ์ธ ๊ฐ์ง ์ํ ์ค ํ๋๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
- ATTACHED
- DETACHED
- GC
ATTACHED์ DETACHED ์ํ๋ ์ด์ ๊ณผ ๋์ผํ๊ฒ ์ ์ง๋ฉ๋๋ค. GC ์ํ๋ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ค์ธ ์ค๋ ๋์ ๋ํด ์ค์ ๋ฉ๋๋ค. ์ด๋ฌํ ์ํ๋ ๋์์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์์ํ ์ ์๋๋ก ํ์ฉํฉ๋๋ค. ์ด๋ฅผ ์ํด PyEval_RestoreThread ํจ์๊ฐ ์์ ๋ฉ๋๋ค.### ATTACHED์ DETACHED
- GC(Garbage Collection)๋ฅผ ์ํํ๋ ์ค๋ ๋๋ ๋ค๋ฅธ ์ค๋ ๋๊ฐ Python ๊ฐ์ฒด์ ์ ๊ทผํ๊ฑฐ๋ ์์ ํ์ง ์๋๋ก ๋ณด์ฅํด์ผ ํฉ๋๋ค.
- ๋ค๋ฅธ ์ค๋ ๋๋ "GC" ์ํ์ฌ์ผ ํฉ๋๋ค.
- GC ์ค๋ ๋๋ ์ํ ํ๋์ ๋ํด ์์์ ์ธ compare-and-swap ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ DETACHED ์ํ์์ ๋ค๋ฅธ ์ค๋ ๋๋ฅผ GC ์ํ๋ก ์ ํํ ์ ์์ต๋๋ค.
- ATTACHED ์ํ์ ์๋ ์ค๋ ๋๋ ๊ธฐ์กด์ "eval breaker" ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ์ฌ ์ค์ค๋ก ์ผ์ ์ ์งํ๊ณ ์ํ๋ฅผ "GC"๋ก ์ค์ ํด์ผ ํฉ๋๋ค.
- stop-the-world ์ผ์ ์ ์ง๊ฐ ๋๋๋ฉด, "GC" ์ํ์ธ ๋ชจ๋ ์ค๋ ๋๋ DETACHED๋ก ์ค์ ๋๊ณ ์ผ์ ์ ์ง๋ ๊ฒฝ์ฐ ๊นจ์ด๋ฉ๋๋ค.
- ์ด์ ์ ATTACHED ์ํ์๋ (์ฆ, Python ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํ ์ค์ด๋) ์ค๋ ๋๋ ๋ค์ ATTACHED๋ก ์ฒจ๋ถํ๊ณ Python ์ฝ๋๋ฅผ ๊ณ์ ์คํํ ์ ์์ต๋๋ค.
- ์ด์ ์ DETACHED ์ํ์๋ ์ค๋ ๋๋ ์๋ฆผ์ ๋ฌด์ํฉ๋๋ค.
Generations
- ๊ธฐ์กด์ Python ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ธ ๊ฐ์ง ์ธ๋(generation)๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- GIL ์์ด ์ปดํ์ผํ๋ ๊ฒฝ์ฐ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ๋จ์ผ ์ธ๋๋ฅผ ์ฌ์ฉํฉ๋๋ค(์ฆ, ์ธ๋์ ์ด์ง ์์ต๋๋ค).
- ์ด ๋ณ๊ฒฝ์ ์ฃผ์ ์ด์ ๋ ๋ฉํฐ์ค๋ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ stop-the-world ์ผ์ ์ ์ง์ ์ํฅ์ ์ค์ด๊ธฐ ์ํ ๊ฒ์ ๋๋ค.
- ์ด๋ฆฐ ์ธ๋๋ฅผ ์์งํ๊ธฐ ์ํ ๋น๋ฒํ stop-the-world ์ผ์ ์ ์ง๋ ์ ์ ๋น๋์ ์์ง๋ณด๋ค ๋ฉํฐ์ค๋ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ํฐ ์ํฅ์ ๋ฏธ์น ๊ฒ์ ๋๋ค.
Deferred์ Biased ์ฐธ์กฐ ์นด์ดํ ๊ณผ์ ํตํฉ
- ์ํ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ฐธ์กฐ๋์ง ์์ ๊ฐ์ฒด๋ฅผ ์ฐพ๊ธฐ ์ํด ์ฐธ์กฐ ์์ ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ์ ์ฐจ์ด๋ฅผ ๊ณ์ฐํฉ๋๋ค.
- ์ด ์ฐจ์ด๋ gc_refs๋ผ๊ณ ํ๋ฉฐ _gc_prev ํ๋์ ์ ์ฅ๋ฉ๋๋ค.
- gc_refs๊ฐ ์์์ด๋ฉด ๊ฐ์ฒด๊ฐ ์ด์์์(์ฆ, ์ํ ์ฐ๋ ๊ธฐ๊ฐ ์๋)์ด ๋ณด์ฅ๋ฉ๋๋ค.
- gc_refs๊ฐ 0์ด๋ฉด ๊ฐ์ฒด๋ ๋ค๋ฅธ ์ด์์๋ ๊ฐ์ฒด์ ์ํด ์ด์ ์ ์ฐธ์กฐ๋์๋์ง์ ๋ฐ๋ผ ์ด์์์ ์๋ ์์ต๋๋ค.
- ์ด ์ฐจ์ด๋ฅผ ๊ณ์ฐํ ๋, ์ปฌ๋ ํฐ๋ ๊ฐ ์ค๋ ๋์ ์คํ์ ํ์ํ๊ณ ๊ฐ ์ง์ฐ ์ฐธ์กฐ์ ๋ํด ์ฐธ์กฐ๋ ๊ฐ์ฒด์ gc_refs๋ฅผ ์ฆ๊ฐ์์ผ์ผ ํฉ๋๋ค.
- ์ ๋๋ ์ดํฐ ๊ฐ์ฒด๋ ์ง์ฐ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง ์คํ์ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ๋์ผํ ์ ์ฐจ๊ฐ ๊ฐ ์ ๋๋ ์ดํฐ์ ์คํ์๋ ์ ์ฉ๋ฉ๋๋ค.
์ปจํ ์ด๋ ์ค๋ ๋ ์์ ์ฑ
- CPython์์ ๊ธ๋ก๋ฒ ์ธํฐํ๋ฆฌํฐ ๋ฝ(GIL)์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ Python ๊ฐ์ฒด์ ์ ๊ทผํ๊ฑฐ๋ ์์ ํ ๋ ๋ด๋ถ ์ธํฐํ๋ฆฌํฐ ์ํ์ ์์์ ๋ฐฉ์งํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ๋์ผํ ๋ฆฌ์คํธ๋ฅผ ์์ ํ๋ ๊ฒฝ์ฐ GIL์ ๋ฆฌ์คํธ์ ๊ธธ์ด(ob_size)๊ฐ ์ ํํ๊ฒ ์์์ ์์ ์ผ์นํ๊ณ ๊ฐ ์์์ ์ฐธ์กฐ ์นด์ดํธ๊ฐ ํด๋น ์์์ ๋ํ ์ฐธ์กฐ ์๋ฅผ ์ ํํ๊ฒ ๋ฐ์ํ๋ ๊ฒ์ ๋ณด์ฅํฉ๋๋ค.
- GIL์ด ์์ผ๋ฉด์ ๋ค๋ฅธ ๋ณ๊ฒฝ ์์ด ๋์ ์์ ์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ, ์ด๋ฌํ ํ๋๊ฐ ์์๋๊ณ ํ๋ก๊ทธ๋จ ์ถฉ๋์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
- GIL์ ์ฐ์ฐ์ด ์์์ ์ด๊ฑฐ๋ ์ฌ๋ฌ ์ฐ์ฐ์ด ๋์์ ๋ฐ์ํ ๋ ์ ํ์ฑ์ ์ ์งํ์ง ์๋๋ค.
- ์๋ฅผ ๋ค์ด, list.extend(iterable)๋ iterable์ด Python์ผ๋ก ๊ตฌํ๋ ๋ฐ๋ณต์๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒฝ์ฐ (๋๋ ๋ด๋ถ์ ์ผ๋ก GIL์ ํด์ ํ๋ ๊ฒฝ์ฐ) ์์์ ์ผ๋ก ๋ณด์ด์ง ์์ ์ ์์ต๋๋ค.
- ๋ง์ฐฌ๊ฐ์ง๋ก, list.remove(x)๋ ๋ฆฌ์คํธ๋ฅผ ์์ ํ๋ ๋ค๋ฅธ ์์ ๊ณผ ๊ฒน์น๋ ๊ฒฝ์ฐ ์๋ชป๋ ๊ฐ์ฒด๋ฅผ ์ ๊ฑฐํ ์ ์์ผ๋ฉฐ, ์ด๋ ๋๋ฑ์ฑ ์ฐ์ฐ์์ ๊ตฌํ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
- ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ GIL์ ์ผ๋ถ ์ฐ์ฐ์ด ์ฌ์ค์ ์์์ ์ธ ๊ฒ์ฒ๋ผ ๋ณด์ฅํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, ์์ฑ์ list(set)์ set์ ํญ๋ชฉ์ ์์์ ์ผ๋ก ์๋ก์ด ๋ฆฌ์คํธ๋ก ๋ณต์ฌํ๋ฉฐ, ์ผ๋ถ ์ฝ๋๋ ํด๋น ๋ณต์ฌ๊ฐ ์์์ ์(์ฆ, set์ ํญ๋ชฉ์ ์ค๋ ์ท์ ๊ฐ์ง๊ณ ์์)์ ์์กดํฉ๋๋ค.
- ์ด PEP๋ ์ด๋ฌํ ์์ฑ์ ์ ์งํฉ๋๋ค.
- ์ด PEP๋ GIL์ด ์ ๊ณตํ๋ ๋ง์ ๋ณดํธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ธฐ ์ํด ๊ฐ๋ณ ๊ฐ์ฒด ๋ฝ์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ์ํฉ๋๋ค.
- ์๋ฅผ ๋ค์ด, ๋ชจ๋ ๋ฆฌ์คํธ, ์ฌ์ ๋ฐ ์งํฉ์ ๊ด๋ จ๋ ๊ฐ๋ฒผ์ด ๋ฝ์ ๊ฐ์ง๊ฒ ๋ฉ๋๋ค.
- ๊ฐ์ฒด๋ฅผ ์์ ํ๋ ๋ชจ๋ ์์ ์ ํด๋น ๊ฐ์ฒด์ ๋ฝ์ ๋ณด์ ํด์ผ ํฉ๋๋ค.
- ๋๋ถ๋ถ์ ๊ฐ์ฒด์์ ์ฝ๊ธฐ ์์ ๋ ํด๋น ๊ฐ์ฒด์ ๋ฝ์ ํ๋ํด์ผ ํ๋ฉฐ, ๋ฝ์ ๋ณด์ ํ์ง ์๊ณ ์งํํ ์ ์๋ ๋ช ๊ฐ์ง ์ฝ๊ธฐ ์์ ์ ์๋์์ ์ค๋ช ํฉ๋๋ค.### Per-object Locking vs. GIL
๊ฐ ๊ฐ์ฒด์ ๋ํ ์ ๊ธ๊ณผ ํฌ๋ฆฌํฐ์ปฌ ์น์ ์ GIL(Global Interpreter Lock)๋ณด๋ค ์ฝํ ๋ณดํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. GIL์ ๋์ ์์ ์ด ์์์ ์ด๊ฑฐ๋ ์ฌ๋ฐ๋ฅด๋ค๊ณ ๋ณด์ฅํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ณ ๊ฐ์ฒด์ ๋ํ ์ ๊ธ ์ฒด๊ณ๋ ๋์ ์์ ์ด ์์์ ์ด๊ฑฐ๋ ์ฌ๋ฐ๋ฅด๋ค๊ณ ๋ณด์ฅํ ์ ์์ต๋๋ค. ๋์ , ๊ฐ๋ณ ๊ฐ์ฒด์ ๋ํ ์ ๊ธ์ GIL๊ณผ ์ ์ฌํ ๋ณดํธ๋ฅผ ๋ชฉํ๋กํ์ง๋ง ์ํธ ๋ฐฐ์ ๋ ๊ฐ๋ณ ๊ฐ์ฒด๋ก ์ ํ๋ฉ๋๋ค.
์ปจํ ์ด๋ ์ ํ์ ์ธ์คํด์ค์ ๋ํ ๋๋ถ๋ถ์ ์์ ์ ํด๋น ๊ฐ์ฒด๋ฅผ ์ ๊ทธ๋ ๊ฒ์ ์๊ตฌํฉ๋๋ค. ์๋ฅผ ๋ค์ด:
- list.append, list.insert, list.repeat, PyList_SetItem
- dict.setitem, PyDict_SetItem
- list.clear, dict.clear
- list.repr, dict.repr ๋ฑ
list.extend(iterable)
setiter_iternext
์ผ๋ถ ์์ ์ ๋ ๊ฐ์ ์ปจํ ์ด๋ ๊ฐ์ฒด์ ์ง์ ์์ฉํ๋ฉฐ, ๋ ์ปจํ ์ด๋์ ๋ด๋ถ ๊ตฌ์กฐ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, set๊ณผ ๊ฐ์ ํน์ ๋ฐ๋ณต ๊ฐ๋ฅํ ์ ํ์ ๋ํ ํน์ํ ๋ ๋ด๋ถ์ ์ธ list.extend(iterable)์ด ์์ต๋๋ค. ์ด๋ฌํ ์์ ์ ๋ ๊ฐ์ฒด์ ๋ด๋ถ์ ๋์์ ์ ๊ทผํ๋ฏ๋ก ๋ ๊ฐ์ฒด ๋ชจ๋ ์ ๊ทธ๋ ๊ฒ์ด ํ์ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ list.extend์ ๊ตฌํ์ ํ ๊ฐ์ฒด (list) ๋ง ์ ๊ทธ๋ฉด ๋ฉ๋๋ค. ๋ค๋ฅธ ๊ฐ์ฒด๋ ์ค๋ ๋ ์์ ํ ์ดํฐ๋ ์ดํฐ API๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ์ก์ธ์ค๋๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ ๊ฐ์ ์ปจํ ์ด๋๋ฅผ ์ ๊ทธ๋ ์์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- list.extend(list), list.extend(set), list.extend(dictitems) ๋ฐ ์ธ์ ์ ํ์ ๋ํด ๊ตฌํ์ด ํน์ํ ๋ ๋ค๋ฅธ ํน์ํ๋ค
list.concat(list)
list.eq(list), dict.eq(dict)
์ผ๋ถ ๊ฐ๋จํ ์์ ์ ํ๋์ ํ๋์๋ง ์์์ ์ผ๋ก ์ก์ธ์คํ์ฌ ์ ๊ธ์ด ํ์ํ์ง ์์ต๋๋ค. ์ด๋ฌํ ์์ ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค.
- len(list) ์ฆ, list_length(PyListObject *a)
- len(dict)
- len(set)
์ผ๋ถ ์์ ์ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ์ ๊ธํ์ง ์๊ณ ๋๊ด์ ์ผ๋ก ์ฒ๋ฆฌ๋ ์ ์์ต๋๋ค. ์ด๋ฌํ ์์ ์ ํน์ํ ๊ตฌํ๊ณผ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ธฐ์ ํ๋ ฅ์ด ํ์ํฉ๋๋ค.
- list[idx] (list_subscript)
- dict[key] (dict_subscript)
- listiter_next, dictiter_iternextkey/value/item
- list.contains
๋์ฌ๋ ์ฐธ์กฐ
๊ฐ๋ณ ๊ฐ์ฒด ์ ๊ธ์ GIL์ด ์ ๊ณตํ๋ ์ค์ํ ๋ณดํธ ๊ธฐ๋ฅ์ ๋ง์ด ์ ๊ณตํ์ง๋ง, ์ผ๋ถ ๊ฒฝ์ฐ์๋ ์ถฉ๋ถํ์ง ์์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋์ฌ๋ ์ฐธ์กฐ๋ฅผ "์์ " ์ฐธ์กฐ๋ก ์ ๊ทธ๋ ์ด๋ํ๋ ์ฝ๋๋ ํน์ ํ ์ํฉ์์ ์์ ํ์ง ์์ ์ ์์ต๋๋ค.
- PyObject
- item
- PyList_GetItem
- list
- idx
- Py_INCREF
- item
GIL์ ์ก์ธ์ค์ Py_INCREF ํธ์ถ ์ฌ์ด์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๋ชฉ๋ก์ ์์ ํ์ง ๋ชปํ๋๋ก ๋ณด์ฅํฉ๋๋ค. GIL์ด ์์ผ๋ฉด ๊ฐ๋ณ ๊ฐ์ฒด ์ ๊ธ์ด ์๋๋ผ๋ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๋ชฉ๋ก์ ์์ ํ์ฌ ์ก์ธ์ค์ Py_INCREF ํธ์ถ ์ฌ์ด์ item์ด ํด์ ๋ ์ ์์ต๋๋ค.
๋ฌธ์ ๊ฐ์๋ ๋์ฌ ์ฐธ์กฐ API๋ "์๋ก์ด ์ฐธ์กฐ"๋ฅผ ๋ฐํํ์ง๋ง ๊ทธ ์ธ์๋ ๋๋ฑํฉ๋๋ค.
- PyList_FetchItem(list, idx) : PyList_GetItem์ ๋์ฒด
- PyDict_FetchItem(dict, key) : PyDict_GetItem์ ๋์ฒด
- PyWeakref_FetchObject : PyWeakref_GetObject์ ๋์ฒด
์ผ๋ถ ๋์ฌ ์ฐธ์กฐ๋ฅผ ๋ฐํํ๋ API (์ : PyTuple_GetItem)๋ ํํ์ด ๋ถ๋ณ์ด๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ๋์ง ์์ต๋๋ค. ๋ํ ์์ API์ ๋ชจ๋ ์ฌ์ฉ์ด ๋ฌธ์ ๊ฐ๋๋ ๊ฒ์ ์๋๋๋ค. ์๋ฅผ ๋ค์ด, PyDict_GetItem์ ํจ์ ํธ์ถ์์ ํค์๋ ์ธ์ ์ฌ์ ์ ๊ตฌ๋ฌธ ๋ถ์ํ๋ ๋ฐ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค. ํด๋น ํค์๋ ์ธ์ ์ฌ์ ์ ์ฌ์ค์ ๊ฐ์ธ์ ์ด๋ฉฐ (๋ค๋ฅธ ์ค๋ ๋๋ก๋ถํฐ ์ ๊ทผํ ์ ์์) ๋ค๋ฅธ ์ค๋ ๋์์ ์ ๊ทผํ ์ ์์ต๋๋ค.
Python ํฌ๋ฆฌํฐ์ปฌ ์น์
์ง๊ด์ ์ธ ๊ฐ๋ณ ๊ฐ์ฒด ์ ๊ธ์ GIL๋ก ์คํํ ๋ ์กด์ฌํ์ง ์์๋ ๊ต์ฐฉ ์ํ๋ฅผ ๋์ ํ ์ ์์ต๋๋ค. Python ์์ ์ ์ค์ฒฉ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ค๋ ๋๋ ํ ๋ฒ์ ํ๋์ ์์ ์ ๋ํ ์ ๊ธ (๋๋ ์ ๊ธ) ๋ง ๋ณด์ ํ ์ ์๋๋ก ํ์ฉํด์ผํฉ๋๋ค. ์ค์ฒฉ ์์ ์ ์์ํ๊ธฐ ์ ์ ์ธ๋ถ ์์ ์ ๋ํ ์ ๊ธ์ด ์ผ์ ์ค์ง๋์ด์ผํฉ๋๋ค. ์ค์ฒฉ ์์ ์ด ์๋ฃ๋๋ฉด ์ธ๋ถ ์์ ์ ๋ํ ์ ๊ธ์ ๋ค์ ํ๋ํด์ผํฉ๋๋ค.
๋ํ I/O์ ๊ฐ์ ์ ์ฌ์ ์ผ๋ก ๋ธ๋กํน ์์ (์ฆ, GIL์ ํด์ ํ ์์ ) ์ฃผ์์์๋ ํ์ฑ ์์ ์ ๋ํ ์ ๊ธ์ด ์ผ์ ์ค๋จ๋์ด์ผํฉ๋๋ค. ์ด๋ ์ ๊ธ๊ณผ ๋ธ๋กํน ์์ ๊ฐ์ ์ํธ ์์ฉ์ด ์ฌ๋ฌ ์ ๊ธ๊ฐ์ ์ํธ ์์ฉ๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ๊ต์ฐฉ ์ํ๋ฅผ ์ ๋ฐํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.# ๊ฐ์
์ด PEP๋ ๋ฐ๋๋ฝ์ ํผํ๊ธฐ ์ํด ์์ ๋ฐฉ๋ฒ๊ณผ ๋ค๋ฅธ ๋ณํ์ ์ ์ํ์ฌ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. ์ค์ฒฉ๋ ์์ ์ด ์์๋ ๋๋ง๋ค ์ฆ์ ์ ๊ธ์ ์ค์งํ๋ ๋์ , ์ค๋ ๋๊ฐ ๋ธ๋ก๋ ๊ฒฝ์ฐ์๋ง ์ ๊ธ์ด ์ค์ง๋ฉ๋๋ค (์ฆ, GIL์ ํด์ ํ ๊ฒ์ ๋๋ค). ์ด๋ ๊ฒํ๋ฉด ์ค์ฒฉ๋ ์์ ์ ๋ํ ์ ๊ธ ํ๋ ๋ฐ ํด์ ํ์๊ฐ ์ค์ด๋ค๋ฉด์ ๋ฐ๋๋ฝ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
Python ์๊ณ ์์ญ์ ๋ํ ์ ์๋ API๋ ๋ค์ ๋ค ๊ฐ์ง ๋งคํฌ๋ก์ ๋๋ค. ์ด๋ค์ ๊ณต๊ฐ์ ์ผ๋ก ์ฌ์ฉ ๊ฐ๋ฅํ C-API ํ์ฅ์์ ์ฌ์ฉํ ์ ์๋๋ก ๊ณ ๋ ค๋์์ง๋ง ์ ํ๋ API์ ์ผ๋ถ๋ ์๋๋๋ค.
Py_BEGIN_CRITICAL_SECTION(PyObject *op);
์ฐธ์กฐ ๋ ๊ฐ์ฒด์ ๋ฎคํ ์ค๋ฅผ ์ป์ด ์๊ณ ์์ญ์ ์์ํฉ๋๋ค. ๊ฐ์ฒด๊ฐ ์ด๋ฏธ ์ ๊ฒจ ์์ผ๋ฉด์ด ์ค๋ ๋๋ ์ฐธ์กฐ ๋ ๊ฐ์ฒด์ ์ ๊ธ์ด ํด์ ๋ ๋๊น์ง ๋๊ธฐํ๊ธฐ ์ ์ ๋ชจ๋ ๋ฏธ์ฒ๋ฆฌ ๋ ์๊ณ ์์ญ์ ์ ๊ธ์ด ํด์ ๋ฉ๋๋ค.
Py_END_CRITICAL_SECTION;
๊ฐ์ฅ ์ต๊ทผ์ ์์ ์ ์ข ๋ฃํ๊ณ ๋ฎคํ ์ค๋ฅผ ์ ๊ธ ํด์ ํฉ๋๋ค. ๋ค์์ผ๋ก ๊ฐ์ฅ ์ต๊ทผ์ ์ค๋จ ๋ ์ด์ ์๊ณ ์์ญ (์๋ ๊ฒฝ์ฐ)์ด ํ์ฌ ์ค๋จ๋ ๊ฒฝ์ฐ ๋ค์ ์์๋ฉ๋๋ค.
Py_BEGIN_CRITICAL_SECTION2(PyObject *a, PyObject *b);
๋ ๊ฐ์ฒด์ ๋ฎคํ ์ค๋ฅผ ์ป์ด ์๊ณ ์์ญ์ ์์ํฉ๋๋ค. ์ผ๊ด๋ ์ ๊ธ ์์๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ํ๋ ์์๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค (์ฆ, ๋ฎ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๋ฎคํ ์ค๊ฐ ๋จผ์ ํ๋๋จ). ๋ ๋ฎคํ ์ค ์ค ํ๋๊ฐ ์ด๋ฏธ ์ ๊ฒจ ์์ผ๋ฉด ์ฐธ์กฐ ๋ ๊ฐ์ฒด๊ฐ ์ ๊ธ ํด์ ๋ ๋๊น์ง ๋๊ธฐํ๊ธฐ ์ ์ ๋ชจ๋ ๋ฏธ์ฒ๋ฆฌ ๋ ์๊ณ ์์ญ์ ์ ๊ธ์ด ํด์ ๋ฉ๋๋ค.
Py_END_CRITICAL_SECTION2;
Py_END_CRITICAL_SECTION๊ณผ ๋์ผํ๊ฒ ์๋ํ์ง๋ง ๋ ๊ฐ์ฒด๋ฅผ ์ ๊ธ ํด์ ํฉ๋๋ค.
๋ํ, ์ค๋ ๋๊ฐ ATTACHED ์ํ์์ DETACHED ์ํ๋ก ์ ํ ๋ ๋ ํ์ฑ ์๊ณ ์์ญ์ ์ผ์ ์ค์งํด์ผํฉ๋๋ค. DETACHED์์ ATTACHED๋ก ์ ํ ๋ ๋ ๊ฐ์ฅ ์ต๊ทผ์ ์ค๋จ ๋ ์๊ณ ์์ญ (์๋ ๊ฒฝ์ฐ)์ ๋ค์ ์์ํด์ผํฉ๋๋ค.
๋ ์ปจํ ์ด๋๋ฅผ ๋์์ ์ ๊ทธ๋ ์์ ์ ๊ฒฝ์ฐ Py_BEGIN_CRITICAL_SECTION2 ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค. Py_BEGIN_CRITICAL_SECTION์ ๋ ๋ฒ ์ค์ฒฉํ๋ ๊ฒ๋ง์ผ๋ก๋ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ๋ด๋ถ ์๊ณ ์์ญ์ ์ธ๋ถ ์๊ณ ์์ญ์ ์ ๊ธ์ ํด์ ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ ๊ธ ํํผ๋ฅผ ํตํ ์ต์ ํ
dict์ list์ ์ผ๋ถ ์์ ์ ์ ๊ธ์ ํํผํฉ๋๋ค. ์ ๊ธ์ ์ป์ง ์๋ ๋น ๋ฅธ ๊ฒฝ๋ก ์์ ์ด ์์ผ๋ฉฐ, ๋ค๋ฅธ ์ค๋ ๋๊ฐ ํด๋น ์ปจํ ์ด๋๋ฅผ ๋์์ ์์ ํ๋ ๊ฒฝ์ฐ์๋ง ํด๋น ์ฌ์ ์ด๋ ๋ชฉ๋ก์ ์ ๊ธ์ ์ป๋ ๋๋ฆฐ ์์ ์ผ๋ก ์ ํ ๋ ์ ์์ต๋๋ค.
๋๊ด์ ์ธ ๋น ๋ฅธ ๊ฒฝ๋ก๊ฐ์๋ ์์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- PyDict_FetchItem/GetItem ๋ฐ dict.getitem
- PyList_FetchItem/GetItem ๋ฐ list.getitem
๋ํ, ์ฌ์ ๊ณผ ๋ชฉ๋ก์ ๋ฐ๋ณต์๋ ์์ ํจ์๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๋ค์ ํญ๋ชฉ์ ๋ฐํ ํ ๋ ์ ๊ธ์ ๋๊ด์ ์ผ๋ก ํํผํฉ๋๋ค.
์ด๋ฌํ ๊ธฐ๋ฅ์ ์ ๊ธ ํ๋์ ํผํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ด์ ๋ ๋ ๊ฐ์ง์ ๋๋ค. ์ฃผ์ ์ด์ ๋ ๊ฐ๋จํ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ํด์๋ ํ์ฅ ๊ฐ๋ฅํ ๋ฉํฐ ์ค๋ ๋ ์ฑ๋ฅ์ ํ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฌ์ ์ ๋ชจ๋์ ์ต์์ ํจ์ ๋ฐ ํด๋์ค์ ๋ฉ์๋๋ฅผ ๋ณด์ ํฉ๋๋ค. ์ด๋ฌํ ์ฌ์ ์ ๋ฉํฐ ์ค๋ ๋ ํ๋ก๊ทธ๋จ์์ ๋ง์ ์ค๋ ๋์์ ๊ณต์ ๋๋ ํน์ฑ์ด ์์ต๋๋ค. ๋ฉํฐ ์ค๋ ๋ ํ๋ก๊ทธ๋จ์์ ๋ฐฉ๋ฒ๊ณผ ํจ์๋ฅผ๋ก๋ํ๋ ๋ฐ ๋ํ ์ด๋ฌํ ์ ๊ธ์ ๊ฒฝ์์ ๋ง์ ๊ธฐ๋ณธ ํ๋ก๊ทธ๋จ์์ ํจ์จ์ ์ธ ํ์ฅ์ ์ต์ ํ ๊ฒ์ ๋๋ค.
์ ๊ธ์ ํผํ๋ ๋ ๋ฒ์งธ ๋๊ธฐ๋ ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ณ ๋จ์ผ ์ค๋ ๋ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๊ฒ์ ๋๋ค. ์ ๊ธ ํ๋์ ๋๋ถ๋ถ์ ์์ ์ ๋นํด ์ค๋ฒํค๋๊ฐ ๋ฎ์ง๋ง ๋ชฉ๋ก๊ณผ ์ฌ์ ์ ๊ฐ๋ณ ์์์ ์ก์ธ์คํ๋ ๊ฒ์ ๋น ๋ฅธ ์์ ์ ๋๋ค (๋ฐ๋ผ์ ์ ๊ธ ์ค๋ฒํค๋๋ ์๋์ ์ผ๋ก ํฝ๋๋ค) ๋ฐ ๋น๋ฒํฉ๋๋ค (๋ฐ๋ผ์ ์ค๋ฒํค๋๋ ๋ ํฐ ์ํฅ์ ๋ฏธ์นฉ๋๋ค).
์ด ์น์ ์์๋ ์ ๊ธ ์์ด ์ฌ์ ๋ฐ ๋ชฉ๋ก ์ก์ธ์ค๋ฅผ ๊ตฌํํ๋ ๋ฐ ์ด๋ ค์์ด์๋ ๋์์์ด PEP์์ ์ด๋ฌํ ๋์ ์ ๋์ํ๊ธฐ ์ํด Python ์ธํฐํ๋ฆฌํฐ์ ํ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ์ค๋ช ํฉ๋๋ค.
์ฃผ์ ๋์ ์ ๋ชฉ๋ก์ด๋ ์ฌ์ ์์ ํญ๋ชฉ์ ๊ฒ์ํ๊ณ ํด๋น ํญ๋ชฉ์ ์ฐธ์กฐ ์๋ฅผ ์ฆ๊ฐ์ํค๋ ๊ฒ์ด ์์์ ์ธ ์์ ์ด ์๋๋ผ๋ ๊ฒ์ ๋๋ค. ํญ๋ชฉ์ด ๊ฒ์๋๊ณ ์ฐธ์กฐ ์๊ฐ ์ฆ๊ฐํ๋ ๋์ ๋ค๋ฅธ ์ค๋ ๋๊ฐ ๋ชฉ๋ก์ด๋ ์ฌ์ ์ ์์ ํ ์ ์์ผ๋ฉฐ, ์ด์ ์ ๊ฒ์ ๋ ํญ๋ชฉ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ ์ ์์ต๋๋ค.
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ถ๋ถ์ ์ธ ์๋๋ ์ฐธ์กฐ ์ ์ฆ๊ฐ๋ฅผ ์กฐ๊ฑด๋ถ ์ฆ๊ฐ๋ก ๋ณํํ์ฌ ์ฐธ์กฐ ์๊ฐ 0์ด ์๋ ๊ฒฝ์ฐ์๋ง ์ฐธ์กฐ ์๋ฅผ ์ฆ๊ฐ์ํค๋ ๊ฒ์ ๋๋ค. ์ด ๋ณ๊ฒฝ์ ์ถฉ๋ถํ์ง ์์ต๋๋ค. Python ๊ฐ์ฒด์ ์ฐธ์กฐ ์๊ฐ 0์ด ๋ ๋ ๊ฐ์ฒด์ ์๋ฉธ์๊ฐ ํธ์ถ๋๊ณ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ค๋ฅธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก ์ฌ์ฌ์ฉ๋๊ฑฐ๋ ์ด์ ์ฒด์ ๋ก ๋ฐํ ๋ ์ ์์ต๋๋ค. ๋์ ,์ด PEP๋ ์กฐ๊ฑด๋ถ ์ฐธ์กฐ ์ ์ฆ๊ฐ๊ฐ ์์ ํ๋๋ก ์ฐธ์กฐ ์ ํ๋๊ฐ ์ก์ธ์คํ๋ ๋์ ์ ํจํ๊ฒ ์ ์ง๋๋๋กํ๋ ๊ธฐ์ ์ ์ ์ํฉ๋๋ค. ์ด ๊ธฐ์ ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ธฐ (mimalloc)์ ํ๋ ฅ ๋ฐ ๋ชฉ๋ก ๋ฐ ์ฌ์ ๊ฐ์ฒด์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ํ์๋กํฉ๋๋ค. ์ ์ ๋ ๊ธฐ์ ์ ๋ฆฌ๋ ์ค ์ปค๋์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ ์ธ read-copy update (RCU) [6]์ ์ ์ฌํฉ๋๋ค.# list_item ํจ์ ๊ตฌํ
ํ์ฌ list.getitem์ ๊ตฌํํ C ํจ์์ธ list_item์ ํ์ฌ ๊ตฌํ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
Py_INCREF(&ob_item[i]);
return ob_item[i];
์ ์๋ ๊ตฌํ ๋ฐฉ์์ ์กฐ๊ฑด๋ถ ์ฆ๊ฐ(_Py_TRY_INCREF)๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๊ฐ์ ์ธ ํ์ธ์ ์ํํฉ๋๋ค:
PyObject *item = atomic_load(&ob_item[i]);
if (item || _Py_TRY_INCREF(item))
goto retry;
if (item != atomic_load(&ob_item[i]))
Py_DECREF(item);
goto retry;
if (ob_item != atomic_load(&ob_item))
Py_DECREF(item);
goto retry;
return item;
์์ ๋น ๋ฅด๊ณ ๋ฝ์ ์ฌ์ฉํ์ง ์๋ ๊ฒฝ๋ก๊ฐ ์คํจํ ๋ ๋์ ์์ ์ผ๋ก ์ธํด ๋ฐ์ํ๋ ์ ๊ธด ๋์ฒด ๊ฒฝ๋ก๋ฅผ ๊ตฌํํ๋ "retry" ์๋ธ๋ฃจํด์ ๋๋ค:
retry:
PyObject *item;
Py_BEGIN_CRITICAL_SECTION(&ob_mutex);
item = ob_item[i];
Py_INCREF(item);
Py_END_CRITICAL_SECTION(&ob_mutex);
return item;
dict ๊ตฌํ์ ๋ํ ์์ ์ ์ ์ฌํฉ๋๋ค. ์๋ํ๋ฉด list์ dictionary ๊ฒ์์ ๊ด๋ จ ๋ถ๋ถ์ ์๋ ค์ง ์ธ๋ฑ์ค์์ ๋ฐฐ์ด์ ํญ๋ชฉ/๊ฐ์ ๋ก๋ํ๋ ๊ฒ์ ํฌํจํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์กฐ๊ฑด๋ถ ์ฆ๊ฐ๋ฅผ ๋ฐ๋ฅด๋ ์ถ๊ฐ์ ์ธ ํ์ธ์ ์ด์ ์ PyObject ๊ตฌ์กฐ์ฒด๋ list๋ dict ๋ฐฐ์ด์ ์ ์ฅํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฆ์ ์ฌ์ฌ์ฉํ ์ ์๋๋ก ํ์ฉํ๊ธฐ ๋๋ฌธ์ ํ์ํฉ๋๋ค. ์ด๋ฌํ ์ถ๊ฐ์ ์ธ ํ์ธ ์์ด ํจ์๋ ๋ฆฌ์คํธ์ ์ด์ ์ ์์ง ์์๋ Python ๊ฐ์ฒด๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. ์๋ํ๋ฉด Python ๊ฐ์ฒด๊ฐ ์ฐจ์งํ๋ ๋ฉ๋ชจ๋ฆฌ๋ ์ด์ ์ ๋ฆฌ์คํธ์ ํญ๋ชฉ์ ์ ์ฅํ๋ ๋ค๋ฅธ PyObject์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ฅํ๊ณ ์์ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋๊ด์ ๋ฆฌ์คํธ์ ๋์ ๋๋ฆฌ ์ก์ธ์ค๋ฅผ ์ํ Mimalloc ๋ณ๊ฒฝ ์ฌํญ
์ด ๊ตฌํ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์์ ๋ํ ์ถ๊ฐ ์ ์ฝ ์กฐ๊ฑด์ ์๊ตฌํ๋ฉฐ, mimalloc ์ฝ๋์ ์ผ๋ถ ๋ณ๊ฒฝ ์ฌํญ์ด ํฌํจ๋ฉ๋๋ค. mimalloc์ ๊ตฌํ์ ๋ํ ๋ฐฐ๊ฒฝ ์ง์์ ํ์ํ ๋ณ๊ฒฝ ์ฌํญ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. mimalloc์์ ๊ฐ๋ณ ํ ๋น์ "๋ธ๋ก"์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ, mimalloc "ํ์ด์ง"๋ ๋ชจ๋ ๊ฐ์ ํฌ๊ธฐ์ ์ฐ์๋ ๋ธ๋ก์ ํฌํจํฉ๋๋ค. mimalloc "ํ์ด์ง"๋ ๋ค๋ฅธ ํ ๋น๊ธฐ์ "์ํผ๋ธ๋ก"๊ณผ ์ ์ฌํ๋ฉฐ, ์ด์ ์ฒด์ ํ์ด์ง๊ฐ ์๋๋๋ค. mimalloc "ํ"์ ์ฌ๋ฌ ํฌ๊ธฐ ํด๋์ค์ ํ์ด์ง๋ฅผ ํฌํจํ๋ฉฐ, ๊ฐ ํ์ด์ง๋ ๋จ์ผ ํ์ ์ํฉ๋๋ค. ํ์ด์ง์ ๋ธ๋ก ์ค ํ๋๋ ํ ๋น๋์ง ์์ ๊ฒฝ์ฐ mimalloc์ ํ์ด์ง๋ฅผ ๋ค๋ฅธ ํฌ๊ธฐ ํด๋์ค๋ ๋ค๋ฅธ ํ์ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค(์ฆ, ํ์ด์ง๋ฅผ ๋ค์ ์ด๊ธฐํํ ์ ์์ต๋๋ค).
๋ฆฌ์คํธ์ ๋์ ๋๋ฆฌ ์ก์ธ์ค ๋ฐฉ๋ฒ์ mimalloc ํ์ด์ง์ ์ฌ์ฌ์ฉ์ ๋ถ๋ถ์ ์ผ๋ก ์ ํํ์ฌ ์ก์ธ์ค ๊ธฐ๊ฐ ๋์ ์ฐธ์กฐ ์นด์ดํธ ํ๋๋ฅผ ์ ํจํ ์ํ๋ก ์ ์งํ๋๋ก ํฉ๋๋ค. mimalloc ํ์ด์ง์ ์ ํ๋ ์ฌ์ฌ์ฉ์ Python ๊ฐ์ฒด์ ๋ํ ๋ณ๋์ ํ์ ๊ฐ์ง๊ณ ์์์ผ๋ก์จ ๊ฐ์ ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด ์ก์ธ์ค ์ค์ ํญ๋ชฉ์ด ํด์ ๋๊ณ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ๊ฐ์ฒด์ ์ฌ์ฌ์ฉ๋๋๋ผ๋ ์ ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ ํ๋๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ๋์ผํ ์์น์ ๋ฐฐ์น๋ฉ๋๋ค. ์ฐธ์กฐ ์นด์ดํธ ํ๋๋ ํ ๋น์ ํตํด ์ ํจํ ์ํ(๋๋ 0)๋ฅผ ์ ์งํฉ๋๋ค.
Py_TPFLAGS_MANAGED_DICT๋ฅผ ์ง์ํ๋ Python ๊ฐ์ฒด๋ PyObject ํค๋ ์ด์ ์ ์ฌ์ ๋ฐ ์ฝํ ์ฐธ์กฐ ํ๋๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์ ์ฐธ์กฐ ์นด์ดํธ ํ๋์ ์คํ์ ์ด ๋ค๋ฆ ๋๋ค. ์ด๋ฌํ ๊ฐ์ฒด๋ ๋ณ๋์ mimalloc ํ์ ์ ์ฅ๋ฉ๋๋ค. ๋ํ, GC ๊ฐ์ฒด๊ฐ ์๋ ๊ฐ์ฒด๋ ์์ฒด ํ์ ์ ์ฅ๋๋ฏ๋ก GC๋ GC ๊ฐ์ฒด๋ง ๊ฒ์ฌํ๋ฉด ๋ฉ๋๋ค. ๋ฐ๋ผ์ Python ๊ฐ์ฒด์๋ GC ๊ฐ์ฒด๊ฐ ์๋ ๊ฐ์ฒด์ฉ ํ, ๊ด๋ฆฌ๋๋ ์ฌ์ ์ด ์๋ GC ๊ฐ์ฒด์ฉ ํ, ๊ด๋ฆฌ๋๋ ์ฌ์ ์ด ์๋ GC ๊ฐ์ฒด์ฉ ํ์ ์ธ ๊ฐ์ง mimalloc ํ์ด ์์ต๋๋ค.
Mimalloc ํ์ด์ง ์ฌ์ฌ์ฉ
์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ฆ๊ฐ์ํค์ง ์๊ธฐ ์ํด mimalloc ํ์ด์ง ์ฌ์ฌ์ฉ์ ์ ํ์ ์งง์ ์๊ฐ์ผ๋ก ์ ์งํ๋ ๊ฒ์ด ์ ๋ฆฌํฉ๋๋ค. ์ ํ์ ๋ฆฌ์คํธ ๋ฐ ๋์ ๋๋ฆฌ ์ก์ธ์ค๋ก๋ง ํ์ ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ต์ํํ ์ ์์ง๋ง, ๋น์ผ ๋๊ธฐํ๋ฅผ ํ์๋ก ํฉ๋๋ค. ๋ค๋ฅธ ๊ทน๋จ์์๋ ์ ํ์ ๋ค์ GC ์ฃผ๊ธฐ๊น์ง ์ ์งํ๋ฉด ์ถ๊ฐ ๋๊ธฐํ๋ฅผ ๋์ ํ์ง ์์ง๋ง ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ด ์ฆ๊ฐํ ์ ์์ต๋๋ค.
์ด PEP๋ FreeBSD์ "GUS"๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ ๋ ๊ฐ์ง ๊ทน๋จ ์ฌ์ด์ ์๋ ์์คํ ์ ์ ์ํฉ๋๋ค. ์ด ์์คํ ์ ์ ์ญ ๋ฐ ์ค๋ ๋๋ณ ์นด์ดํฐ(๋๋ "์ํ์ค ๋ฒํธ")์ ์กฐํฉ์ ์ฌ์ฉํ์ฌ ๋น mimalloc ํ์ด์ง๋ฅผ ๋ค๋ฅธ ํ์ด๋ ๋ค๋ฅธ ํฌ๊ธฐ ํด๋์ค์ ์์ ํ๊ฒ ์ฌ์ฌ์ฉํ๊ฑฐ๋ ์ด์ ์ฒด์ ์ ๋ฐํํ ์ ์๋ ์๊ธฐ๋ฅผ ๊ฒฐ์ ํ๋ ์กฐ์ ์ ์ํํฉ๋๋ค:
- ๋จ์กฐ๋ก ์ฆ๊ฐํ๋ ์ ์ญ ์ฐ๊ธฐ ์ํ์ค ๋ฒํธ๊ฐ ์์ต๋๋ค.
- mimalloc ํ์ด์ง๊ฐ ๋น์ด ์์ผ๋ฉด ํ์ฌ ์ฐ๊ธฐ ์ํ์ค ๋ฒํธ๋ก ํ๊ทธ๊ฐ ์ง์ ๋ฉ๋๋ค. ์ค๋ ๋๋ ์ ์ญ ์ฐ๊ธฐ ์ํ์ค ๋ฒํธ๋ฅผ ์์์ ์ผ๋ก ์ฆ๊ฐ์ํฌ ์๋ ์์ต๋๋ค.
- ๊ฐ ์ค๋ ๋๋ ์ค๋ ๋๋ณ ์ต์ ์ฐ๊ธฐ ์ํ์ค ๋ฒํธ๋ฅผ ๊ธฐ๋กํ๋ ๋ก์ปฌ ์ฝ๊ธฐ ์ํ์ค ๋ฒํธ๋ฅผ ๊ฐ์ต๋๋ค.
- ์ค๋ ๋๋ ๋ฆฌ์คํธ ๋๋ ๋์ ๋๋ฆฌ ์ก์ธ์ค ์ํ๊ฐ ์๋ ๋๋ง๋ค ์ฐ๊ธฐ ์ํ์ค ๋ฒํธ๋ฅผ ๊ด์ฐฐํ ์ ์์ต๋๋ค. ์ฐธ์กฐ ๊ตฌํ์ mimalloc์ ๋๋ฆฐ ๊ฒฝ๋ก ํ ๋น ํจ์์์ ์ด ์์ ์ ์ํํฉ๋๋ค. ์ด๋ ์ ์ฉํ ์ ๋๋ก ์ ๊ธฐ์ ์ผ๋ก ํธ์ถ๋์ง๋ง ์๋นํ ์ค๋ฒํค๋๋ฅผ ๋์ ํ์ง ์์๋งํผ ์ถฉ๋ถํ ์์ฃผ ํธ์ถ๋ฉ๋๋ค.### Global Read Sequence Number
์ ์ญ ์ฝ๊ธฐ ์ํ์ค ๋ฒํธ๋ ๋ชจ๋ ํ์ฑ ์ค๋ ๋์ ์ฝ๊ธฐ ์ํ์ค ๋ฒํธ ์ค ์ต์๊ฐ์ ์ ์ฅํฉ๋๋ค. ์ค๋ ๋๋ ๋ก์ปฌ ์ฝ๊ธฐ ์ํ์ค ๋ฒํธ๋ฅผ ์ค์บํ์ฌ ์ ์ญ ์ฝ๊ธฐ ์ํ์ค ๋ฒํธ๋ฅผ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค. ์๋ก์ด mimalloc ํ์ด์ง๋ฅผ ํ ๋นํ๊ธฐ ์ ์ ์ฌ์ฌ์ฉํ ์ ์๋ ์ ํ๋ ํ์ด์ง๊ฐ ์๋ ๊ฒฝ์ฐ, ์ฐธ์กฐ ๊ตฌํ์ ์ด ์์ ์ ์ํํฉ๋๋ค.
์ ์ญ ์ฝ๊ธฐ ์ํ์ค ๋ฒํธ๊ฐ ํ์ด์ง์ ํ๊ทธ ๋ฒํธ๋ณด๋ค ํฐ ๊ฒฝ์ฐ, ๋น์ด์๋ mimalloc ํ์ด์ง๋ ๋ค๋ฅธ ํ์ด๋ ํฌ๊ธฐ ํด๋์ค์ ์ฌ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
์ ์ญ ์ฝ๊ธฐ ์ํ์ค ๋ฒํธ๊ฐ ํ์ด์ง์ ํ๊ทธ๋ณด๋ค ํฐ ์กฐ๊ฑด์, ๋์์ ์ธ ๋๊ด์ ์ธ ๋ฆฌ์คํธ๋ ์ฌ์ ์ ๊ทผ์ด ์๋ ์ค๋ ๋๊ฐ ํด๋น ์ ๊ทผ์ ์๋ฃํ์์ ๋ณด์ฅํ๊ธฐ ๋๋ฌธ์ ์ถฉ๋ถํฉ๋๋ค. ์ฆ, ํด์ ๋ ํ์ด์ง์ ๋น์ด์๋ ๋ธ๋ก์ ์ ๊ทผํ๋ ์ค๋ ๋๊ฐ ์์ผ๋ฏ๋ก ํด๋น ํ์ด์ง๋ ๋ค๋ฅธ ์ฉ๋๋ก ์ฌ์ฉํ๊ฑฐ๋ ์ด์ ์ฒด์ ์ ๋ฐํ๋ ์ ์์ต๋๋ค.
๋๊ด์ ์ธ Dict์ List ์ ๊ทผ ์์ฝ
์ด PEP๋ ์ผ๋ฐ์ ์ผ๋ก ์ ๊ธ์ ํ๋ํ์ง ์๊ณ ๋ ์์ ํ ๋ฆฌ์คํธ์ ์ฌ์ ์ ๊ทผ์ ์ํ ๊ธฐ์ ์ ์ ์ํฉ๋๋ค. ์ด๋ฅผ ํตํด ํจ์์ ๋ฉ์๋ ํธ์ถ๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์์ ์์ ์คํ ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ณ ๋ฉํฐ ์ค๋ ๋ ํ๊ฒฝ์์์ ํ์ฅ์ฑ ๋ณ๋ชฉ ํ์์ ํผํ ์ ์์ต๋๋ค. ์ด ์ฒด๊ณ๋ ๊ฐ์ฒด๊ฐ ํด์ ๋ ํ์๋ ์กฐ๊ฑด๋ถ ์ฐธ์กฐ ์นด์ดํธ ์ฆ๊ฐ ์์ ์ด ์์ ํ๋๋ก ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ ํ๋๊ฐ ์ ํจํ๊ฒ ์ ์ง๋๋๋ก ์์ ์ ์ฝ ์กฐ๊ฑด์ mimalloc ํ์ด์ง ์ฌ์ฌ์ฉ์ ์ ์ฉํ์ฌ ์๋ํฉ๋๋ค. ์ด๋ฌํ ์ ์ฝ ์กฐ๊ฑด์ ๊ฐ๋ณ ๊ฐ์ฒด ๋์ mimalloc ํ์ด์ง์ ์ ์ฉ๋์ด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฌ์ฉ ๊ธฐํ๋ฅผ ๊ฐ์ ํฉ๋๋ค. ๋น mimalloc ํ์ด์ง์ ๋ํ ๋์ ๋ ์ก์ธ์ค๊ฐ ์์์ ์์คํ ์ด ํ๋จํ ์ ์๋ ๊ฒฝ์ฐ์๋ ์ ์ฝ ์กฐ๊ฑด์ด ํด์ ๋ฉ๋๋ค. ์ด๋ฅผ ํ์ธํ๊ธฐ ์ํด ์์คํ ์ ๊ฐ๋ฒผ์ด ์ค๋ ๋๋ณ ์ํ์ค ์นด์ดํฐ์ ๋น ํ์ด์ง๊ฐ ๋์์ ๋ ํ์ด์ง์ ํ๊ทธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ฐ ์ค๋ ๋์ ๋ก์ปฌ ์นด์ดํฐ๊ฐ ํ์ด์ง์ ํ๊ทธ๋ณด๋ค ํฌ๋ฉด ํด๋น ํ์ด์ง๋ ์ฌ์ฌ์ฉ๋ ์ ์์ผ๋ฉฐ ๋ค๋ฅธ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉํ๊ฑฐ๋ ์ด์ ์ฒด์ ์ ๋ฐํ๋ ์ ์์ต๋๋ค. ๋ํ ์ ์ฝ ์กฐ๊ฑด์ ์ํ ๊ฐ๋น์ง ์์ง๊ธฐ๊ฐ ์คํ๋ ๋๋ง๋ค ํด์ ๋ฉ๋๋ค. ์ํ ๊ฐ๋น์ง ์์ง๊ธฐ์ ์คํฑ-๋-์๋ ์ผ์ ์ ์ง๋ฅผ ํตํด ์ค๋ ๋๊ฐ ๋น์ด์๋ mimalloc ํ์ด์ง์ ๋ํ ๋ฏธ๊ฒฐ๋ ์ฐธ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์์ด ๋ณด์ฅ๋ฉ๋๋ค.
ํนํ๋ ์ธํฐํ๋ฆฌํฐ
ํนํ๋ ์ธํฐํ๋ฆฌํฐ๋ GIL ์์ด ์คํ๋ ๋ ์ค๋ ๋ ์์ ํ๋๋ก ๋ช ๊ฐ์ง ๋ณ๊ฒฝ์ด ํ์ํฉ๋๋ค.
- ๋ฎคํ ์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์ผํ ์ธ๋ผ์ธ ์บ์์ ์ฐ๋ ๊ฒ์ ๋ฐฉ์งํ์ฌ ๋์ ํนํ๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
- GIL์ด ์๋ ๋ฉํฐ ์ค๋ ๋ ํ๋ก๊ทธ๋จ์์๋ ๊ฐ ๋ฐ์ดํธ ์ฝ๋๊ฐ ํ ๋ฒ๋ง ํนํ๋ฉ๋๋ค. ์ด๋ ์ค๋ ๋๊ฐ ๋ถ๋ถ์ ์ผ๋ก ์์ฑ๋ ์ธ๋ผ์ธ ์บ์๋ฅผ ์ฝ์ง ๋ชปํ๋๋กํฉ๋๋ค.
- ๋ฝ์ ์ฌ์ฉํ์ฌ tp_version_tag ๋ฐ keys_version์ ์บ์๋ ๊ฐ์ด ์บ์๋ ๋์คํฌ๋ฆฝํฐ ๋ฐ ๊ธฐํ ๊ฐ๊ณผ ์ผ์นํ๋๋กํฉ๋๋ค.
- ์ธ๋ผ์ธ ์นด์ดํฐ์ ๋ํ ์์ ์ "relaxed atomics"๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฆ, ์ผ๋ถ ์นด์ดํฐ ๊ฐ์๊ฐ ๋๋ฝ๋๊ฑฐ๋ ๋ฎ์ด์ฐ์ฌ๋ ์ ํ์ฑ์๋ ์ํฅ์ ๋ฏธ์น์ง ์์ต๋๋ค.
Py_mod_gil ์ฌ๋กฏ
--disable-gil ๋น๋์์ ํ์ฅ์ ๋ก๋ํ ๋, CPython์ ์๋ก์ด PEP 489 ์คํ์ผ์ Py_mod_gil ์ฌ๋กฏ์ ํ์ธํฉ๋๋ค. ์ฌ๋กฏ์ด Py_mod_gil_not_used๋ก ์ค์ ๋ ๊ฒฝ์ฐ, ํ์ฅ ๋ก๋ฉ์ ์ผ๋ฐ์ ์ผ๋ก ์งํ๋ฉ๋๋ค. ์ฌ๋กฏ์ด ์ค์ ๋์ง ์์ ๊ฒฝ์ฐ, ์ธํฐํ๋ฆฌํฐ๋ ๋ชจ๋ ์ค๋ ๋๋ฅผ ์ผ์ ์ ์ง์ํค๊ณ GIL์ ํ์ฑํํ ํ ๊ณ์ ์งํํฉ๋๋ค. ๋ํ, ์ธํฐํ๋ฆฌํฐ๋ GIL์ด ํ์ฑํ๋์์์ ์๋ฆฌ๋ ๊ฐ์์ ์ธ ๊ฒฝ๊ณ ๋ฅผ ๋ฐ์์ํค๊ณ ์ฌ์ฉ์๊ฐ ์ด๋ฅผ ๋ฌด์ํ ์ ์๋ ๋จ๊ณ๋ฅผ ์๋ดํฉ๋๋ค.
PYTHONGIL ํ๊ฒฝ ๋ณ์
--disable-gil ๋น๋์์ ์ฌ์ฉ์๋ ์คํ ์ค์ ๋์์ ์ฌ์ ์ํ๊ธฐ ์ํด PYTHONGIL ํ๊ฒฝ ๋ณ์๋ฅผ ์ค์ ํ ์๋ ์์ต๋๋ค. PYTHONGIL=0์ผ๋ก ์ค์ ํ๋ฉด ๋ชจ๋ ์ฌ๋กฏ ๋ก์ง์ ๋ฌด์ํ๊ณ GIL์ ๋นํ์ฑํํฉ๋๋ค. PYTHONGIL=1๋ก ์ค์ ํ๋ฉด GIL์ ํ์ฑํํฉ๋๋ค.
PYTHONGIL=0 ์ฌ์ ์๋ GIL์ด ์์ด๋ ์ค๋ ๋ ์์ ํ์ง ์์ ํ์ฅ์ด ์ฌ์ ํ ๋ฉํฐ ์ค๋ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํ์ฅ์ ํ๋์ ์ค๋ ๋์์๋ง ์ฌ์ฉํ๊ฑฐ๋ ์ ๊ธ์ ์ฌ์ฉํ์ฌ ์ก์ธ์ค๋ฅผ ๋ณดํธํ ์ ์์ ์ ์์ต๋๋ค. ์ด๋ฏธ GIL์ด ์๋ ์ํ์์๋ ์ค๋ ๋ ์์ ํ์ง ์์ ๋ช ๊ฐ์ง ํ์ฅ์ด ์์ผ๋ฉฐ, ์ฌ์ฉ์๋ ์ด๋ฏธ ์ด๋ฌํ ์ ํ์ ์กฐ์น๋ฅผ ์ทจํด์ผํฉ๋๋ค.
PYTHONGIL=1 ์ฌ์ ์๋ ๋๋๋ก ๋๋ฒ๊น ์ ์ ์ฉํฉ๋๋ค.
๋น์ธ๋ ๊ฐ๋น์ง ์์ง
์ด PEP๋ GIL์ด ์๋ CPython์์ ์ธ๋๋ณ ์ํ ๊ฐ๋น์ง ์์ง๊ธฐ์์ ๋น์ธ๋ ์์ง๊ธฐ๋ก ์ ํํ๋ ๊ฒ์ ์ ์ํฉ๋๋ค. ์ด๋ ํ๋์ ์ธ๋ (์ฆ, "old" ์ธ๋)๋ง ๊ฐ์ง๋ ๊ฒ๊ณผ ๋์ผํฉ๋๋ค. ์ด ์ ์๋ ๋ณ๊ฒฝ์ ์ํด ๋ ๊ฐ์ง ์ด์ ๊ฐ ์์ต๋๋ค.### ์ฌ์ดํด ๊ฐ๋น์ง ์ปฌ๋ ์ ๊ณผ ๋ค์ค ์ค๋ ๋ ํ๋ก๊ทธ๋จ์ ํ์ฅ์ฑ
์ฌ์ดํด ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ์ ์ ์ธ๋์์๋ ๋ค๋ฅธ ์ค๋ ๋๋ฅผ ์ผ์ ์ค์งํด์ผํ๋ค. ์ ์๋ ์ ์ ์ธ๋์ ๋น๋ฒํ ์ปฌ๋ ์ ์ผ๋ก ์ธํด ๋ฉํฐ์ค๋ ๋ ํ๋ก๊ทธ๋จ์ ํจ์จ์ ์ธ ํ์ฅ์ฑ์ด ์ ํ๋ ์ ์๋ค๋ ์ฐ๋ ค๋ฅผ ํ๋ช ํ๊ณ ์๋ค. ์ด๊ฒ์ ์ ์ ์ธ๋์ ํด๋นํ๋ ์ฌ์ดํด ๊ฐ๋น์ง ์ปฌ๋ ์ ๋ฟ๋ง ์๋๋ผ, ์ค๋๋ ์ธ๋์ ์ปฌ๋ ์ ์๋ ํด๋นํ์ง ์๋๋ค. ์๋ํ๋ฉด ์ ์ ์ธ๋๋ ์ผ์ ํ ํ ๋น ํ์ ํ์ ์ปฌ๋ ์ ๋๊ธฐ ๋๋ฌธ์, ์ค๋๋ ์ธ๋์ ์ปฌ๋ ์ ์ ํ์ ์๋ ๋ผ์ด๋ธ ๊ฐ์ฒด์ ๊ฐ์์ ๋น๋กํ์ฌ ์์ฝ๋๋ค. ๋ํ, GIL ์์ด ๊ฐ ์ธ๋์ ๊ฐ์ฒด๋ฅผ ํจ์จ์ ์ผ๋ก ์ถ์ ํ๋ ๊ฒ์ ์ด๋ ต๋ค. ์๋ฅผ ๋ค์ด, ํ์ฌ CPython์ ๊ฐ ์ธ๋์ ๋ํ ๊ฐ์ฒด๋ค์ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ์ฌ์ฉํ๋ค. CPython์ด ์ด๋ฌํ ์ค๊ณ๋ฅผ ์ ์งํ๋ ค๋ฉด, ํด๋น ๋ฆฌ์คํธ๋ค์ ์ค๋ ๋ ์์ ํ๊ฒ ๋ง๋ค์ด์ผํ๋๋ฐ, ์ด๋ฅผ ํจ์จ์ ์ผ๋ก ์ํํ๋ ๋ฐฉ๋ฒ์ ๋ถ๋ช ํ์ง ์๋ค.
๋ค๋ฅธ ๋ง์ ์ธ์ด ๋ฐํ์์์๋ ์ธ๋๋ณ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๊ณ ์๋ค. ์๋ฅผ ๋ค์ด, ๋ง์ Java HotSpot ๊ฐ๋น์ง ์ปฌ๋ ํฐ ๊ตฌํ์ ์ฌ๋ฌ ์ธ๋๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ฐ ๋ฐํ์์์๋ ์ ์ ์ธ๋๊ฐ ์์ฃผ ์ฒ๋ฆฌ๋์ด ์ฑ๋ฅ ํฅ์์ ์ด๋์ด๋ธ๋ค. ์๋ํ๋ฉด ์ ์ ์ธ๋์ ๋ง์ ๋น์จ์ด ์ผ๋ฐ์ ์ผ๋ก "์ฃฝ์" ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์, GC๋ ์ํํ ์์ ์ ๋นํด ๋ง์ ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ ์ ์๋ค. ์๋ฅผ ๋ค์ด, ์ฌ๋ฌ Java ๋ฒค์น๋งํฌ๋ "์ ์" ๊ฐ์ฒด ์ค 90% ์ด์์ด ์ผ๋ฐ์ ์ผ๋ก ์์ง๋๋ค๊ณ ๋ณด์ฌ์ค๋ค. ์ด๊ฒ์ ์ผ๋ฐ์ ์ผ๋ก "์ฝํ ์ธ๋ ๊ฐ์ค"์ด๋ผ๊ณ ๋ถ๋ฆฌ๋ฉฐ, ๋๋ถ๋ถ์ ๊ฐ์ฒด๊ฐ ์ด๋ฆด ๋ ์ฃฝ๋๋ค๋ ๊ด์ฐฐ์ ์๋ฏธํ๋ค. CPython์์๋ ์ฐธ์กฐ ์นด์ดํ ์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ํจํด์ด ๋ฐ๋๋ก ๋ํ๋๋ค. ๋๋ถ๋ถ์ ๊ฐ์ฒด๋ ์ฌ์ ํ ์ด๋ฆด ๋ ์ฃฝ์ง๋ง, ํด๋น ๊ฐ์ฒด์ ์ฐธ์กฐ ์นด์ดํธ๊ฐ 0์ด ๋ ๋ ์์ง๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ์ ์ฃผ๊ธฐ๊น์ง ์ด์๋จ์ ๊ฐ์ฒด๋ ๋๋ถ๋ถ ๊ณ์ ์ด์์์ ๊ฐ๋ฅ์ฑ์ด ๋๋ค. ์ด ์ฐจ์ด๋ก ์ธํด CPython์์๋ ๋ค๋ฅธ ๋ง์ ์ธ์ด ๋ฐํ์๋ณด๋ค ์ธ๋๋ณ ์ปฌ๋ ์ ์ด ํจ์ฌ ํจ๊ณผ์ ์ด์ง ์๋ค.
dict ๋ฐ list ์ ๊ทผ์์์ ๋๊ด์ ์ธ ๋ฝ ํํผ
์ด ์ ์์ ๋ฆฌ์คํธ์ ๋์ ๋๋ฆฌ์ ๊ฐ๋ณ ์์์ ์ ๊ทผํ ๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋ฝ(๋ฎคํ ์ค)์ ํ๋ํ๋ ๊ฒ์ ํผํ๋ ๋ฐฉ์์ ์์กดํ๋ค. ์ด๋ "๋ฝ ํ๋ฆฌ(lock-free)" ์๊ณ ๋ฆฌ์ฆ๊ณผ "์จ์ดํธ ํ๋ฆฌ(wait-free)" ์๊ณ ๋ฆฌ์ฆ์ ์๋ฏธ์์๋ "๋ฝ ํ๋ฆฌ"๊ฐ ์๋๋ค. ๊ทธ์ ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ์ ๋ฝ(๋ฎคํ ์ค)์ ํ๋ํ์ง ์๋๋ก ํ์ฌ ๋ณ๋ ฌ์ฑ์ ํฅ์์ํค๊ณ ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ธฐ ์ํ ๊ฒ์ด๋ค.
ํจ์ฌ ๋ ๊ฐ๋จํ ๋์์ ๋์ ๋๋ฆฌ์ ๋ฆฌ์คํธ ์ ๊ทผ์ ๋ณดํธํ๊ธฐ ์ํด ๋ฆฌ๋-๋ผ์ดํฐ ๋ฝ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ๋ฆฌ๋-๋ผ์ดํฐ ๋ฝ์ ๋์์ ์ฝ์ ์๋ ์์ง๋ง ์ ๋ฐ์ดํธ๋ ํ ์ ์๋ ๊ธฐ๋ฅ์ ๊ฐ์ง๊ณ ์์ด ๋์ ๋๋ฆฌ์ ๋ฆฌ์คํธ์ ์ด์์ ์ผ๋ก ๋ณด์ผ ์ ์๋ค. ๊ทธ๋ฌ๋ ๋ฆฌ๋-๋ผ์ดํฐ ๋ฝ์ ์๋นํ ์ค๋ฒํค๋์ ํ์ฅ์ฑ์ด ๋จ์ด์ง๋ค๋ ๋ฌธ์ ์ ์ด ์๋ค. ํนํ ๋จ์ผ ์์์ ๋ํ ๋์ ๋๋ฆฌ์ ๋ฆฌ์คํธ ์ ๊ทผ๊ณผ ๊ฐ์ด ํฌ๋ฆฌํฐ์ปฌ ์น์ ์ด ์์ ๊ฒฝ์ฐ์ ๊ทธ๋ ๋ค. ๋ฆฌ๋์ ํ์ฅ์ฑ์ด ๋จ์ด์ง๋ ์ด์ ๋ pthread_rwlock์ ๋ฆฌ๋ ์๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋์ผํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ๋๋ฐ์์ ๋น๋กฏ๋๋ค.
์ด PEP์ ์ค๋ช ๋ ๊ธฐ์ ์ RCU(Read-Copy-Update; ์ฝ๊ธฐ-๋ณต์ฌ-๊ฐฑ์ )์, ๋ ์ ์ ์ ๋๋ก ํ์๋ ํฌ์ธํฐ(hazard pointers)์ ๊ด๋ จ์ด ์๋ค. RCU๋ ํ์ฅ ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ๊ณต์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ณดํธํ๊ธฐ ์ํด ๋ฆฌ๋๊ฐ ๋์์ ์ ๋ฐ์ดํธ๋ฅผ ์ํํ๋ ๊ฒฝ์ฐ์ ๋๋ฆฌ ์ฌ์ฉ๋๋ค. ์ด PEP์ ๊ธฐ์ ๊ณผ RCU๋ ๋ชจ๋ ๋์ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์ ๊ทผํ๋ ๋์ ํ์๋ฅผ ์ฐ๊ธฐํ๋ ๋ฐฉ์์ผ๋ก ์๋ํ๋ค. RCU๋ ์ผ๋ฐ์ ์ผ๋ก ํด์ ํ ์ด๋ธ์ด๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ์ ๊ฐ์ ๊ฐ๋ณ ๊ฐ์ฒด๋ฅผ ๋ณดํธํ๋ ๋ฐ ์ฌ์ฉ๋์ง๋ง, ์ด PEP์์๋ mimalloc "ํ์ด์ง"์ ๊ฐ์ ํฐ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๋ณดํธํ๋ ๋ฐฉ๋ฒ์ ์ ์ํ๋ค.
์ด๋ฌํ ๊ธฐ์ ์ ํ์์ฑ์ ์ฃผ๋ก CPython์์ ์ฐธ์กฐ ์นด์ดํ ์ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์ด๋ค. CPython์ด ์ถ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ง ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด ์ด๋ฌํ ๊ธฐ์ ์ด ํ์ํ์ง ์์ ์๋ ์๋ค. ์๋ํ๋ฉด ์ถ์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ๋ ์ด๋ฏธ ํ์ํ ๋ฐฉ์์ผ๋ก ํ์๋ฅผ ์ฐ๊ธฐํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด๋ฌํ ์ ๊ทผ์ ํ์ฅ์ฑ ๋ฌธ์ ๋ฅผ "ํด๊ฒฐ"ํ์ง๋ ์์ง๋ง, ๋ง์ ์ด๋ ค์์ ๊ฐ๋น์ง ์ปฌ๋ ํฐ ๊ตฌํ์ผ๋ก ์ ํํ ๊ฒ์ด๋ค.
์ญํธํ์ฑ
์ด PEP๋ CPython์ --disable-gil ํ๋๊ทธ๋ก ๋น๋ํ ๋ ์ผ๋ถ ์ญํธํ์ฑ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ์ง๋ง, ๊ธฐ๋ณธ ๋น๋ ๊ตฌ์ฑ์ ์ฌ์ฉํ ๋๋ ์ด๋ฌํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋๋ค. ๊ฑฐ์ ๋ชจ๋ ์ญํธํ์ฑ ๋ฌธ์ ๋ C-API์ ๊ด๋ จ์ด ์๋ค.
GIL ์์ด CPython์ ๋น๋ํ๋ฉด ํ์ค CPython ๋น๋๋ ์์ ์ ์ธ ABI์ ABI ํธํ์ฑ์ด ์์ด์ง๋ฏ๋ก biased reference counting์ ์ง์ํ๊ธฐ ์ํด Python ๊ฐ์ฒด ํค๋์ ๋ํ ๋ณ๊ฒฝ์ด ํ์ํ๋ค.
์ด ๋ฒ์ ์ ๋ง๋ C-API ํ์ฅ์ ๋
๋ฆฝ์ ์ผ๋ก ๋ค์ ๋น๋ํด์ผ ํ๋ค.
GIL์ ์ฌ์ฉํ์ฌ C ์ฝ๋์์ ์ ์ญ ์ํ๋ ๊ฐ์ฒด ์ํ๋ฅผ ๋ณดํธํ๋ C-API ํ์ฅ์ GIL ์์ด ์คํ๋ ๋ ์ค๋ ๋ ์์ ์ฑ์ ์ ์งํ๊ธฐ ์ํด ์ถ๊ฐ์ ์ธ ๋ช ์์ ๋ฝ์ด ํ์ํ๋ค.
GIL ์์ด ์์ ํ์ง ์์ ๋ฐฉ์์ผ๋ก borrowed references๋ฅผ ์ฌ์ฉํ๋ C-API ํ์ฅ์ ๋น๋์นญ๋ ์ฐธ์กฐ๋ฅผ ๋ฐํํ๋ ์๋ก์ด ๋๋ฑํ API๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค. borrowed references์ ์ฌ์ฉ ์ค ์ผ๋ถ๋ง ๋ฌธ์ ๊ฐ ๋๋๋ฐ, ๋ค๋ฅธ ์ค๋ ๋์์ ํด์ ๋ ์ ์๋ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๋ง ๋ฌธ์ ๊ฐ ๋๋ค.# Custom Memory Allocators
์์ฝ
- ์ฌ์ฉ์ ์ ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ธฐ(PyMem_SetAllocator)๋ ์ค์ ํ ๋น์ ์ด์ ์ ์ค์ ๋ ํ ๋น๊ธฐ์ ์์ํด์ผํ๋ค.
- Python ๊ฐ์ฒด๋ PyType_GenericNew ๋๋ PyObject_Malloc๊ณผ ๊ฐ์ ํ์ค API๋ฅผ ํตํด ํ ๋น๋์ด์ผ ํ๋ค.
- Python ์ฝ๋์ ์ญํธํ์ฑ ๋ฌธ์ ๋ ์๋์ ์ผ๋ก ์ ๋ค.
- Python ๋ฐฐํฌ์ ์๋ก์ด ๋์ ์ด ์ ๊ธฐ๋๋ค.
- ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น๋ค.
- ๋น๋ ๋ด์ ํฌํจ๋๋ค.
- ์ฌ์ฉ ๋ฐฉ๋ฒ์ ๊ฐ๋ฅด์น๋ ๋ฐฉ๋ฒ์ด ํฌํจ๋๋ค.
- ์ฐธ์กฐ ๊ตฌํ์ด ์๋ค.
- ๋์ฒด ๋ฐฉ์์ด ์๋ค.
์ฌ์ฉ์ ์ ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ธฐ
Python์์๋ ์ฌ์ฉ์ ์ ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น๊ธฐ(PyMem_SetAllocator)๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ ํ ๋น์ ์ด์ ์ ์ค์ ๋ ํ ๋น๊ธฐ์ ์์ํด์ผ ํ๋ค. ์๋ฅผ ๋ค์ด, Python ๋๋ฒ๊ทธ ํ ๋น๊ธฐ์ ์ถ์ ํ ๋น๊ธฐ๋ ํ ๋น์ ๊ธฐ๋ณธ ํ ๋น๊ธฐ์ ์์ํ๊ธฐ ๋๋ฌธ์ ๊ณ์ ์๋ํ๋ค. ๋ฐ๋ฉด์, ํ ๋น๊ธฐ๋ฅผ ์์ ํ ๋์ฒดํ๋ ๊ฒ(jemalloc ๋๋ tcmalloc๊ณผ ๊ฐ์)์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ์ง ์์ ๊ฒ์ด๋ค.
Python ๊ฐ์ฒด๋ PyType_GenericNew ๋๋ PyObject_Malloc์ ๊ฐ์ ํ์ค API๋ฅผ ํตํด ํ ๋น๋์ด์ผ ํ๋ค. ๋น-Python ๊ฐ์ฒด๋ ์ด๋ฌํ API๋ฅผ ํตํด ํ ๋น๋์ด์๋ ์๋๋ค. ์๋ฅผ ๋ค์ด, ํ์ฌ๋ ๋ฒํผ(non-Python ๊ฐ์ฒด)๋ฅผ PyObject_Malloc์ ํตํด ํ ๋นํ๋ ๊ฒ์ด ํ์ฉ๋์ง๋ง, ์ด์ ๋ ํ์ฉ๋์ง ์๊ณ ๋์ PyMem_Malloc, PyMem_RawMalloc ๋๋ malloc์ ํตํด ๋ฒํผ๋ฅผ ํ ๋นํด์ผ ํ๋ค.
Python ์ฝ๋์๋ ๋ ์ ์ ์ญํธํ์ฑ ๋ฌธ์ ๊ฐ ์๋ค:
- ์ฝ๋ ๊ฐ์ฒด์ ์ต์์ ํจ์ ๊ฐ์ฒด์ ๋ํ ์๋ฉธ์์ ์ฝํ ์ฐธ์กฐ ์ฝ๋ฐฑ์ ์ง์ฐ๋ ์ฐธ์กฐ ์นด์ดํ ์ ์ฌ์ฉํ์ฌ ๋ค์ ์ํ ๊ฐ๋น์ง ์์ง๊น์ง ์ง์ฐ๋๋ค.
- ์ฌ๋ฌ ์ค๋ ๋์์ ์ก์ธ์คํ๋ ์ผ๋ถ ๊ฐ์ฒด์ ์๋ฉธ์๋ ์ฐธ์กฐ ์นด์ดํ ์ ํธํฅ์ด ์ ์ฉ๋์ด ์ฝ๊ฐ ์ง์ฐ๋ ์ ์๋ค. ์ด๋ ๋๋ฌผ๋ค: ๋๋ถ๋ถ์ ๊ฐ์ฒด, ์ฌ์ง์ด ์ฌ๋ฌ ์ค๋ ๋์์ ์ก์ธ์คํ๋ ๊ฐ์ฒด๋ ์ฐธ์กฐ ์นด์ดํธ๊ฐ 0์ด ๋๋ ์ฆ์ ํ๊ดด๋๋ค. Python ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํ ์คํธ์ ๋ ๊ณณ์ gc.collect() ํธ์ถ์ด ๊ณ์ ํต๊ณผํ๊ธฐ ์ํด ํ์ํ๋ค.
๋ฐฐํฌ
์ด PEP๋ Python ๋ฐฐํฌ์ ์๋ก์ด ๋์ ์ ์ ๊ธฐํ๋ค. ์ด์จ๋ , ๋ณ๋๋ก ์ปดํ์ผ๋ C-API ํ์ฅ์ด ํ์ํ ๋ ๊ฐ์ง ๋ฒ์ ์ Python์ด ์กด์ฌํ๊ฒ ๋ ๊ฒ์ด๋ค. C-API ํ์ฅ ์์ฑ์๊ฐ --disable-gil๊ณผ ํธํ๋๋ ํจํค์ง๋ฅผ ๋น๋ํ๊ณ PyPI์ ์ ๋ก๋ํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์๋ค. ๋ํ, ์ด๋ค ์์ฑ์๋ค์ --disable-gil ๋ชจ๋๋ฅผ ๋๋ฆฌ ์ฌ์ฉํ๊ธฐ ์ ๊น์ง ์ง์์ ๋ง์ค์ผ ์ ์์ง๋ง, ์ฌ์ฉ ๊ฐ๋ฅํ Python์ ๋ค์ํ ํ์ฅ ๊ธฐ๋ฅ์ ๋ฐ๋ผ ์ฌ์ฉ์ด ๋ฌ๋ผ์ง ๊ฒ์ด๋ค.
์ด๋ฅผ ์ํํ๊ธฐ ์ํด, ์ ์๋ Anaconda์ ํ๋ ฅํ์ฌ --disable-gil ๋ฒ์ ์ Python์ conda ์ฑ๋๋ก๋ถํฐ ํธํ๋๋ ํจํค์ง์ ํจ๊ป ๋ฐฐํฌํ ๊ณํ์ด๋ค. ์ด๋ ๊ฒ ํ๋ฉด ํ์ฅ ๊ธฐ๋ฅ์ ๋น๋ํ๋ ๋ฌธ์ ๋ฅผ ์ค์์ง์คํํ ์ ์์ผ๋ฉฐ, ์ ์๋ ์ด๋ฅผ ํตํด ์ฌ๋๋ค์ด GIL ์์ด ๋ ๋นจ๋ฆฌ Python์ ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๋ผ๊ณ ๋ฏฟ๋๋ค.
์ฑ๋ฅ
GIL ์์ด CPython์ ์ค๋ ๋ ์์ ํ๊ฒ ๋ง๋๋ ๋ณ๊ฒฝ ์ฌํญ์ --disable-gil ๋น๋์ ์คํ ์ค๋ฒํค๋๋ฅผ ์ฆ๊ฐ์ํจ๋ค. ์คํ ์ค๋ฒํค๋์ ์ํฅ์ ๋จ์ผ ์ค๋ ๋๋ง ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ๊ณผ ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ ์ฌ์ด์์ ๋ค๋ฅด๋ฏ๋ก, ์๋ ํ๋ ๊ฐ๊ฐ์ ํ๋ก๊ทธ๋จ ์ ํ์ ๋ํ ์คํ ์ค๋ฒํค๋๋ฅผ ๋ฐ๋ก ๋ณด๊ณ ํ๋ค.
pyperformance 1.0.6์์์ ์คํ ์ค๋ฒํค๋
- ํ๋์ ์ค๋ ๋: 6%
- ์ฌ๋ฌ ์ค๋ ๋: 8%
์ค๋ฒํค๋๋ฅผ ์ธก์ ํ๊ธฐ ์ํด 3.12 ๋ฒ์ ์ Python์์ PR 19474์ 018be4c๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉ๋์๋ค. ์คํ ์ค๋ฒํค๋์ ๊ฐ์ฅ ํฐ ๊ธฐ์ฌ๋ ํธํฅ ์ฐธ์กฐ ์นด์ดํ ์ด๋ฉฐ, ๊ทธ ๋ค์์ผ๋ก๋ ๊ฐ๋ณ ๊ฐ์ฒด ์ ๊ธ์ด ๋ฐ๋ฅธ๋ค. ์ค๋ ๋ ์์ ์ฑ์ ์ํด, ์ฌ๋ฌ ์ค๋ ๋์์ ์คํ๋๋ ์์ฉ ํ๋ก๊ทธ๋จ์ ํน์ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ํ ๋ฒ๋ง ํน์ํํ๋ค. ์ด๊ฒ์ด ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ์ ์ค๋ฒํค๋๊ฐ ํ๋์ ์ค๋ ๋๋ง ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ๋ณด๋ค ํฐ ์ด์ ์ด๋ค. ๊ทธ๋ฌ๋ GIL์ด ๋นํ์ฑํ๋ ์ํ์์ ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ ํ๋ก๊ทธ๋จ์ CPU ์ฝ์ด๋ฅผ ๋ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ด์ผ ํ๋ค.
์ด PEP๋ CPython์ ๊ธฐ๋ณธ(๋น --disable-gil) ๋น๋์ ์ฑ๋ฅ์๋ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
๋น๋ ๋ด
์์ ์ ์ธ ๋น๋ ๋ด์๋ --disable-gil ๋น๋๊ฐ ํฌํจ๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ ๊ฐ๋ฅด์น๊ธฐ
--disable-gil ๋ชจ๋๋ฅผ ๊ตฌํํ๋ ์ผํ์ผ๋ก, ์ ์๋ GIL ์์ด Python์ ์คํํ ๋ ํธํ๋๋ ํจํค์ง๋ฅผ ๋ง๋ค๊ธฐ ์ํ "HOWTO" ๊ฐ์ด๋๋ฅผ ์์ฑํ ๊ฒ์ด๋ค.
์ฐธ์กฐ ๊ตฌํ
GIL ์๋ CPython์ ๋ฒ์ ์ ๊ตฌํํ ๋ ๊ฐ์ GitHub ๋ฆฌํฌ์งํ ๋ฆฌ๊ฐ ์๋ค:
nogil-3.12์ Python 3.12.0a4๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค. ์ด๊ฒ์ ๋จ์ผ ์ค๋ ๋ ์คํ ์ค๋ฒํค๋๋ฅผ ํ๊ฐํ๊ณ ์ด PEP์ ์ฐธ์กฐ ๊ตฌํ์ผ๋ก ์ฌ์ฉํ๊ธฐ์ ์ ์ฉํ๋ค. ๊ทธ๋ฌ๋ ๋ง์ ํ์ฅ์ด ํ์ฌ Python 3.12๊ณผ ํธํ๋์ง ์๊ธฐ ๋๋ฌธ์ C-API ํ์ฅ ํธํ์ฑ์ ํ๊ฐํ๋ ๋ฐ๋ ๊ทธ๋ค์ง ์ ์ฉํ์ง ์๋ค. 3.12 ํฌํธ์ ์ ํ๋ ์๊ฐ์ผ๋ก ์ธํด nogil-3.12 ๊ตฌํ์ ๋ชจ๋ ์ง์ฐ๋ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ๊ฑด๋๋ฐ์ง ์๋๋ค. ์ผ์์ ์ธ ํด๊ฒฐ์ฑ ์ผ๋ก, ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ์์ฑํ๋ ํ๋ก๊ทธ๋จ์์ ์ง์ฐ๋ ์ฐธ์กฐ ์นด์ดํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฐ์ฒด๋ฅผ ๋ถ๋ฉธ ๊ฐ์ฒด๋ก ๋ง๋ ๋ค.
nogil ๋ฆฌํฌ์งํ ๋ฆฌ๋ Python 3.9.10์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค. ์ค์ ์์ฉ ํ๋ก๊ทธ๋จ๊ณผ ํ์ฅ ํธํ์ฑ์์ ๋ค์ค ์ค๋ ๋ฉ ํ์ฅ์ฑ์ ํ๊ฐํ๋ ๋ฐ ์ ์ฉํ๋ค. nogil-3.12 ๋ฆฌํฌ์งํ ๋ฆฌ๋ณด๋ค ์์ ์ ์ด๊ณ ํ ์คํธ๊ฐ ์ ๋์๋ค.
๋์ฒด ๋ฐฉ์
Python์ ํ์ฌ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ง์ํ์ง๋ง, ๊ธฐ์กด ๊ธฐ์ ์๋ ์ค์ํ ์ ํ ์ฌํญ์ด ์๋ค.
- Multiprocessing# ๋์ฒด ๋ฐฉ๋ฒ
ํ์ด์ฌ์ ํ์ฌ ๋ณ๋ ฌ์ฑ์ ์ง์ํ๊ธฐ ์ํด ์ฌ๋ฌ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง๋ง ๊ธฐ์กด ๊ธฐ์ ์๋ ์ค์ํ ์ ์ฝ ์ฌํญ์ด ์์ต๋๋ค.
Multiprocessing
multiprocessing
๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ด์ฌ ํ๋ก๊ทธ๋จ์์ ํ์ด์ฌ ์๋ธํ๋ก์ธ์ค๋ฅผ ์์ํ๊ณ ํต์ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ ์๋ธํ๋ก์ธ์ค๋ ์์ฒด ํ์ด์ฌ ์ธํฐํ๋ฆฌํฐ๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ๋ณ๋ ฌ์ฑ์ด ๊ฐ๋ฅํฉ๋๋ค(์ฆ, ํ๋ก์ธ์ค๋ง๋ค GIL์ด ์์ต๋๋ค). ๊ทธ๋ฌ๋ multiprocessing
์ ๋ช ๊ฐ์ง ์ ์ฝ ์ฌํญ์ด ์์ต๋๋ค. ํ๋ก์ธ์ค ๊ฐ ํต์ ์ด ์ ํ๋ฉ๋๋ค. ๊ฐ์ฒด๋ ์ผ๋ฐ์ ์ผ๋ก ์ง๋ ฌํ๋์ด ๊ณต์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ณต์ฌ๋์ด์ผ ํฉ๋๋ค. ์ด๋ก ์ธํด ์ค๋ฒํค๋(์ง๋ ฌํ๋ก ์ธํ)๊ฐ ๋ฐ์ํ๋ฉฐ multiprocessing
์์ API๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ๋ณต์กํ๊ฒ ๋ง๋ญ๋๋ค. ์๋ธํ๋ก์ธ์ค ์์ ๋น์ฉ๋ ์ค๋ ๋ ์์ ๋น์ฉ๋ณด๋ค ๋์ต๋๋ค. ํนํ "spawn" ๊ตฌํ์์๋ ์ค๋ ๋ ์์์ ์ฝ 100ยตs๊ฐ ๊ฑธ๋ฆฌ์ง๋ง, ์๋ธํ๋ก์ธ์ค ์์์๋ ์ฝ 50ms(50,000ยตs)๊ฐ ๊ฑธ๋ฆฝ๋๋ค. ๋ง์ง๋ง์ผ๋ก, ๋ง์ C ๋ฐ C++ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ฌ๋ฌ ์ค๋ ๋์์์ ์ ๊ทผ์ ์ง์ํ์ง๋ง ์ฌ๋ฌ ํ๋ก์ธ์ค์์์ ์ ๊ทผ์ด๋ ์ฌ์ฉ์ ์ง์ํ์ง ์์ต๋๋ค.
C-API ํ์ฅ์์ GIL ํด์
C-API ํ์ฅ์ ๊ธด ์คํ ์๊ฐ ํจ์ ์ฃผ์์์ GIL์ ํด์ ํ ์ ์์ต๋๋ค. ์ด๋ GIL์ด ํด์ ๋๋ฉด ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋์์ ์คํ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ด๋ ์ ๋์ ๋ณ๋ ฌ์ฑ์ด ๊ฐ๋ฅํ์ง๋ง, GIL ํ๋ ๋ฐ ํด์ ์ ์ค๋ฒํค๋๋ก ์ธํด ์ด๋ ๋ช ๊ฐ์ ์ค๋ ๋๋ฅผ ๋์ด์๋ ํจ์จ์ ์ผ๋ก ํ์ฅ๋์ง ์์ต๋๋ค. ๋ง์ ๊ณผํ ๊ณ์ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ณ์ฐ ์ง์ฝ์ ์ธ ํจ์์์ GIL์ ํด์ ํ๋ฉฐ, CPython ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ธ๋กํน I/O ์ฃผ์์์ GIL์ ํด์ ํฉ๋๋ค.
๋ด๋ถ ๋ณ๋ ฌํ
C๋ก ๊ตฌํ๋ ํจ์๋ ๋ด๋ถ์ ์ผ๋ก ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ธํ ์ NumPy ๋ฐฐํฌํ, PyTorch ๋ฐ TensorFlow๋ ๋ชจ๋ ์ด ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๊ฐ๋ณ ์์ ์ ๋ด๋ถ์ ์ผ๋ก ๋ณ๋ ฌํํฉ๋๋ค. ์ด๋ ๊ธฐ๋ณธ ์์ ์ด ํจ์จ์ ์ผ๋ก ๋ณ๋ ฌํํ๊ธฐ์ ์ถฉ๋ถํ ํฐ ๊ฒฝ์ฐ์๋ ์ ์๋ํ์ง๋ง, ๋ง์ ์์ ์์ ์ด ์๋ ๊ฒฝ์ฐ๋ ์์ ์ด ์ผ๋ถ Python ์ฝ๋์ ์์กดํ๋ ๊ฒฝ์ฐ์๋ ์๋ํ์ง ์์ต๋๋ค. C์์ Python์ ํธ์ถํ๋ ค๋ฉด GIL์ ํ๋ํด์ผ ํ๋ฏ๋ก, Python ์ฝ๋์ ์งง์ ์ฝ๋ ์ค๋ํซ์กฐ์ฐจ ํ์ฅ์ฑ์ ์ ํํ ์ ์์ต๋๋ค.
๊ด๋ จ๋ ์์
์ธํฐํ๋ฆฌํฐ๋ณ GIL
์ต๊ทผ ์น์ธ๋ PEP 684์ ๋ฉํฐ์ฝ์ด ๋ณ๋ ฌ์ฑ์ ํด๊ฒฐํ๊ธฐ ์ํด ์ธํฐํ๋ฆฌํฐ๋ณ GIL์ ์ ์ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋์ผํ ํ๋ก์ธ์ค ๋ด์ ์ธํฐํ๋ฆฌํฐ ๊ฐ์ ๋ณ๋ ฌ์ฑ์ด ๊ฐ๋ฅํ์ง๋ง, ์ธํฐํ๋ฆฌํฐ ๊ฐ์ ํ์ด์ฌ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ๋ฐ๋ ์๋นํ ์ ์ฝ ์ฌํญ์ด ์์ต๋๋ค. ์ด PEP๊ณผ PEP 684์ ๋ชจ๋ ๋ฉํฐ์ฝ์ด ๋ณ๋ ฌ์ฑ์ ๋ค๋ฃจ์ง๋ง, ๋ค๋ฅธ ํธ๋ ์ด๋์คํ์ ๊ธฐ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. CPython์์ ๋์์ ์ด ๋ ๊ฐ์ง PEP์ ๊ตฌํํ๋ ๊ฒ์ด ๊ฐ๋ฅํฉ๋๋ค.
Gilectomy
Gilectomy [20]๋ GIL์ CPython์์ ์ ๊ฑฐํ๊ธฐ ์ํ Larry Hastings์ ํ๋ก์ ํธ์์ต๋๋ค. ์ด PEP์์ ์ ์๋ ๋์์ธ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก Gilectomy๋ ๋์ผํ ์ธํฐํ๋ฆฌํฐ ๋ด์์ ์ฌ๋ฌ ์ค๋ ๋๊ฐ ๋ณ๋ ฌ๋ก ์คํ๋๋ ๊ฒ(์ฆ, "free-threading")์ ์ง์ํ๋ฉฐ, ์ธ๋ฐํ๊ฒ ๋ถํ ๋ ์ ๊ธ์ ์ฌ์ฉํฉ๋๋ค. ์ด PEP์ ์ฐธ์กฐ ๊ตฌํ์ Gilectomy์ ๋น๊ตํ์ฌ ๋จ์ผ ์ค๋ ๋ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ ๊ฐ์ ํ์ต๋๋ค.
PyParallel
PyParallel [21]์ Trent Nelson์ ์ํด Python 3.3์ ๊ฐ๋ ์ฆ๋ช ์ฉ ํฌํฌ๋ก, ๋จ์ผ Python ํ๋ก์ธ์ค์์ ๋์์ ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ์ง์ํ์ต๋๋ค. ์ด ํฌํฌ๋ "๋ณ๋ ฌ ์ค๋ ๋"๋ผ๋ ๊ฐ๋ ์ ๋์ ํ์ต๋๋ค. ์ฃผ ์ค๋ ๋๊ฐ ์ผ์ ์ค์ง๋ ๋์ ๋ณ๋ ฌ ์ค๋ ๋๊ฐ ๋์์ ์คํ๋ ์ ์์์ต๋๋ค. ๋ณ๋ ฌ ์ค๋ ๋๋ ์ฃผ ์ค๋ ๋์์ ์์ฑ๋ ๊ฐ์ฒด์ ๋ํด ์ฝ๊ธฐ ์ ์ฉ ์ก์ธ์ค ๊ถํ์ ๊ฐ๊ณ ์์์ต๋๋ค. ๋ณ๋ ฌ ์ค๋ ๋์์ ์์ฑ๋ ๊ฐ์ฒด๋ ์์ฑํ ์ค๋ ๋์ ์๋ช ๋์ ์ง์๋์์ต๋๋ค. HTTP ์๋ฒ์ ๊ฒฝ์ฐ, ์ด๋ ์์ฒญ์ ์๋ช ๊ณผ ์ผ์นํ ์ ์์ต๋๋ค.
python-safethread
python-safethread [22] ํ๋ก์ ํธ๋ Adam Olsen์ ์ํด Python 3.0์ ๋ํ ํจ์น๋ก GIL์ ์ ๊ฑฐํ๋ ๊ฒ์ด์์ต๋๋ค. ์ด ํ๋ก์ ํธ์ ์ผ๋ถ๋ ์ด PEP์์ ์ ์๋ ๋์์ธ๊ณผ ์ ์ฌํฉ๋๋ค. ๋ ๋ค ์ธ๋ฐํ ์ ๊ธ์ ์ฌ์ฉํ๋ฉฐ, ๊ฐ์ฒด๊ฐ ๋์ผํ ์ค๋ ๋์์ ์์ฑ๋๊ณ ์ก์ธ์ค๋๋ ๊ฒฝ์ฐ๋ฅผ ์ํด ์ฐธ์กฐ ์นด์ดํ ์ ์ต์ ํํฉ๋๋ค.
Greg Stein์ Free-Threading ํจ์น
1996๋ , Greg Stein์ Python 1.4์ ๋ํ GIL์ ์ ๊ฑฐํ๋ ํจ์น๋ฅผ ๊ฒ์ํ์ต๋๋ค [23]. ์ด ํจ์น๋ Windows์์ ์์์ ์ธ ์ฐธ์กฐ ์นด์ดํ ๊ณผ Linux์์ ์ ์ญ ์ฐธ์กฐ ์นด์ดํธ ์ ๊ธ์ ์ฌ์ฉํ์ต๋๋ค. ๋ฆฌ์คํธ์ ๋์ ๋๋ฆฌ ์ก์ธ์ค๋ ๋ฎคํ ์ค๋ก ๋ณดํธ๋์์ต๋๋ค. ์ด ํจ์น์ ์ผ๋ถ๋ CPython์์ ์ฑํ๋์์ต๋๋ค. ํนํ, ์ด ํจ์น๋ PyThreadState ๊ตฌ์กฐ์ฒด์ ์ฌ๋ฐ๋ฅธ ์ค๋ ๋๋ณ ์์ธ ์ฒ๋ฆฌ๋ฅผ ๋์ ํ์ต๋๋ค.
Dave Beazley๋ 2011๋ ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์์ ์ด ํจ์น๋ฅผ ๋ค์ ์ดํด๋ณด์์ต๋๋ค [24].
Jython ๋ฐ IronPython
Jython [25] ๋ฐ IronPython [26]๊ณผ ๊ฐ์ ๋์ฒด ํ์ด์ฌ ๊ตฌํ์ ์ ์ญ ์ธํฐํ๋ฆฌํฐ ์ ๊ธ(GIL)์ ๊ฐ๊ณ ์์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ค์ CPython ํ์ฅ์ ์ง์ํ์ง ์์ต๋๋ค. (์ด ๊ตฌํ์ Java ๋๋ C#์ผ๋ก ์์ฑ๋ ์ฝ๋์ ์ํธ ์์ฉํ ์ ์์ต๋๋ค).
PyPy-STM
pypy-stm [27] ์ธํฐํ๋ฆฌํฐ๋ ์ํํธ์จ์ด ํธ๋์ญ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ PyPy์ ๋ณํ์ ๋๋ค. ์ ์๋ค์ PyPy์์ ๋จ์ผ ์ค๋ ๋ ์ฑ๋ฅ ์ค๋ฒํค๋๊ฐ 20%~50% ๋ฒ์์ ์๋ค๊ณ ๋ณด๊ณ ํ์ต๋๋ค. ์ด๋ CPython ํ์ฅ๊ณผ ํธํ๋์ง ์์ต๋๋ค.
๊ฑฐ์ ๋ ์์ด๋์ด
์ ๋์ ๊ฐ๋น์ง ์์ง๊ธฐ๋ฅผ ์ฌ์ฉํ์ง ์์๊น์?# ๊ฑฐ๋ถ๋ ์์ด๋์ด
๋์์ฑ ๊ฐ๋น์ง ์์ง๊ธฐ ์ฌ์ฉํ์ง ์๋ ์ด์
๋ง์ ์ต๊ทผ ๊ฐ๋น์ง ์์ง๊ธฐ๋ ์ฃผ๋ก ๋์์ฑ์ ์ง์ํฉ๋๋ค. ์ด๋ฌํ ๊ฐ๋น์ง ์์ง๊ธฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋์์ ๊ฐ๋น์ง ์์ง๊ธฐ๋ฅผ ์คํํ์ฌ ๊ธด ์ ์ง ์๊ฐ์ ํผํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์ ๋์์ฑ ์์ง๊ธฐ๋ฅผ ์ฌ์ฉํ์ง ์์๊น์?
๋์ ์์ง์ ์ฐ๊ธฐ ๋ฐ๋ฆฌ์ด(๋๋ ์ฝ๊ธฐ ๋ฐ๋ฆฌ์ด)๊ฐ ํ์ํฉ๋๋ค. CPython์ ์ฐ๊ธฐ ๋ฐ๋ฆฌ์ด๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ C-API๋ฅผ ์๋นํ ๋ง๊ฐํธ๋ฆฌ์ง ์๊ณ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ ์๋ ์์ง ๋ชปํฉ๋๋ค.
PyDict_GetItem์ PyDict_FetchItem์ผ๋ก ๋์ฒดํ์ง ์๋ ์ด์
์ด PEP๋ PyDict_GetItem๊ณผ ๋์ผํ๊ฒ ๋์ํ์ง๋ง ๋์ถ๋ ์ฐธ์กฐ ๋์ ์๋ก์ด ์ฐธ์กฐ๋ฅผ ๋ฐํํ๋ PyDict_FetchItem์ด๋ผ๋ ์๋ก์ด API๋ฅผ ์ ์ํฉ๋๋ค. ๋์ถ๋ ์ฐธ์กฐ์ ๋ํ ๊ธฐ์ ์์ ์ค๋ช ํ ๋๋ก GIL์ด ์๋ ์ํ์์ ์คํํ ๋ ์์ ํ์ง ์์ ์ผ๋ถ ๋์ถ๋ ์ฐธ์กฐ ์ฌ์ฉ์ PyDict_FetchItem๊ณผ ๊ฐ์ ํจ์๋ก ๋์ฒดํด์ผ ํฉ๋๋ค.
์ด PEP์ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ด์ ๋ก PyDict_GetItem ๋ฐ ๋์ถ๋ ์ฐธ์กฐ๋ฅผ ๋ฐํํ๋ ์ ์ฌํ ํจ์๋ฅผ ํ์งํ์ง ์์ต๋๋ค.
- ๋์ถ๋ ์ฐธ์กฐ์ ๋ง์ ์ฌ์ฉ์ GIL์ด ์๋ ์ํ์์ ์คํํ ๋๋ ์์ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, C API ํจ์๋ ํค์๋ ์ธ์ ์ฌ์ ์์ ํญ๋ชฉ์ ๊ฒ์ํ๊ธฐ ์ํด PyDict_GetItem์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฌํ ํธ์ถ์ ํค์๋ ์ธ์ ์ฌ์ ์ด ๋จ์ผ ์ค๋ ๋์๋ง ํ์๋๊ธฐ ๋๋ฌธ์ ์์ ํฉ๋๋ค.
- ์ ์๋ ์ด๊ธฐ์ ์ด ์ ๊ทผ ๋ฐฉ์์ ์๋ํด ๋ณด์๊ณ , PyDict_GetItem์ PyDict_FetchItem์ผ๋ก ๋๋ถ๋ถ ๊ต์ฒดํ๋ฉด ์ฐธ์กฐ ๊ณ์ฐ ๋ฒ๊ทธ๊ฐ ์์ฃผ ๋ฐ์ํ๋ค๋ ๊ฒ์ ์๊ฒ ๋์์ต๋๋ค. ์ ์๊ฒฌ์ผ๋ก๋ ์ฐธ์กฐ ๊ณ์ฐ ๋ฒ๊ทธ๋ฅผ ๋์ ํ ์ํ์ ์ผ๋ฐ์ ์ผ๋ก GIL์ด ์๋ ์ํ์์ ์์ ํ์ง ์์ PyDict_GetItem ํธ์ถ์ ๋์น๋ ์ํ๋ณด๋ค ๋ ํฌ๋ค๊ณ ์๊ฐํฉ๋๋ค.
PEP 683 ๋ถ๋ฉธํ ์ฌ์ฉํ์ง ์๋ ์ด์
PEP 683๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, ์ด PEP๋ Python ๊ฐ์ฒด์ ๋ํ ๋ถ๋ฉธํ ์ฒด๊ณ๋ฅผ ์ ์ํ์ง๋ง, ๋ถ๋ฉธ ๊ฐ์ฒด๋ฅผ ํ์ํ๊ธฐ ์ํด PEP์์ ์ฌ์ฉํ๋ ๋นํธ ํํ์ ๋ค๋ฆ ๋๋ค. ์ด PEP๋ ๋ ๊ฐ์ ์ฐธ์กฐ ๊ณ์ ํ๋ ๋์ ํ๋์ ์ฐธ์กฐ ๊ณ์ ํ๋๋ฅผ ๊ฐ์ง ๊ฒฝํฅ ์๋ ์ฐธ์กฐ ๊ณ์์ ์์กดํ๊ธฐ ๋๋ฌธ์ ๋์ผํ ์ฒด๊ณ์ผ ์ ์์ต๋๋ค.
๊ฐ์ ๋ ํน์ํ
Python 3.11 ๋ฆด๋ฆฌ์ค์์ ๋น ๋ฅธ CPython ํ๋ก์ ํธ์ ์ผ๋ถ๋ก์ ํต๋๊ณผ ํน์ํ๊ฐ ๋์ ๋์ด ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋์์ต๋๋ค. ํน์ํ๋ ๋๋ฆฐ ๋ฐ์ดํธ ์ฝ๋ ๋ช ๋ น์ ๋น ๋ฅธ ๋ณํ์ผ๋ก ๋์ฒดํฉ๋๋ค [19]. ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ๋ ์์ฉ ํ๋ก๊ทธ๋จ(๋ฐ GIL ์์ด ์คํ๋๋)์ ์ค๋ ๋ ์์ ์ฑ์ ์ ์งํ๊ธฐ ์ํด ๊ฐ ๋ฐ์ดํธ ์ฝ๋๋ ํ ๋ฒ๋ง ํน์ํ๋ฉ๋๋ค. ์ด๋ ์ผ๋ถ ํ๋ก๊ทธ๋จ์์ ์ฑ๋ฅ์ ์ ํ์ํฌ ์ ์์ต๋๋ค. ์ฌ๋ฌ ๋ฒ ํน์ํํ๋ ๊ฒ์ ์ง์ํ ์ ์์ง๋ง, ์ด๋ ์ถ๊ฐ ์กฐ์ฌ๊ฐ ํ์ํ๋ฉฐ ์ด PEP์ ์ผ๋ถ๋ ์๋๋๋ค.
Python ๋น๋ ๋ชจ๋
์ด PEP๋ ํ์ค ๋น๋ ๋ชจ๋์ ABI ํธํ๋์ง ์๋ ์๋ก์ด ๋น๋ ๋ชจ๋(--disable-gil)๋ฅผ ๋์ ํฉ๋๋ค. ์ถ๊ฐ ๋น๋ ๋ชจ๋๋ Python ์ฝ์ด ๊ฐ๋ฐ์์ ํ์ฅ ๊ฐ๋ฐ์ ์์ชฝ์ ๋ณต์ก์ฑ์ ์ถ๊ฐํฉ๋๋ค. ์ ์๋ ์ด๋ฌํ ๋น๋ ๋ชจ๋๋ฅผ ๊ฒฐํฉํ๊ณ ์ ์ญ ์ธํฐํ๋ฆฌํฐ ๋ฝ์ ๋ฐํ์์์ ์ ์ดํ๋ฉฐ ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํํ๋ ๊ฒ์ด ๊ฐ์น ์๋ ๋ชฉํ๋ผ๊ณ ์๊ฐํฉ๋๋ค. ์ด ๋ชฉํ๋ฅผ ์ํ ๊ฒฝ๋ก๋ ์ฌ์ ํ ์ด๋ฆฐ ๋ฌธ์ ์ด์ง๋ง, ๊ฐ๋ฅํ ๊ฒฝ๋ก๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค.
2024๋ , CPython 3.13์ด --disable-gil ๋น๋ ํ์ ํ๋๊ทธ๋ฅผ ์ง์ํ๋ ๊ฒ์ผ๋ก ์ถ์๋ฉ๋๋ค. CPython์๋ GIL์ด ์๋ ABI์ GIL์ด ์๋ ABI ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค. ํ์ฅ ๊ฐ๋ฐ์๋ ๋ ๊ฐ์ง ABI๋ฅผ ๋์์ผ๋ก ํฉ๋๋ค.
2
3๊ฐ์ ๋ฆด๋ฆฌ์ค ํ(์ฆ, 2026๋ 2027๋ ), CPython์ด ๋ฐํ์ ํ๊ฒฝ ๋ณ์๋ ํ๋๊ทธ๋ก GIL์ ์ ์ดํ๋๋ก ์ถ์๋ฉ๋๋ค. GIL์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ฑํ๋ฉ๋๋ค. ํ๋์ ABI๋ง ์์ต๋๋ค.
์ถ๊ฐ๋ก 2
3๊ฐ์ ๋ฆด๋ฆฌ์ค ํ(์ฆ, 2028๋ 2030๋ ), CPython์ ๊ธฐ๋ณธ์ ์ผ๋ก GIL์ด ๋นํ์ฑํ๋๋๋ก ์ ํ๋ฉ๋๋ค. GIL์ ์ฌ์ ํ ํ๊ฒฝ ๋ณ์๋ ๋ช ๋ น ์ค ํ๋๊ทธ๋ฅผ ํตํด ๋ฐํ์์์ ํ์ฑํํ ์ ์์ต๋๋ค.
์ด PEP๋ ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ฅผ ๋ค๋ฃจ๋ฉฐ, ๋๋จธ์ง ๋จ๊ณ๋ ์ด๋ฆฐ ์ด์๋ก ๋จ๊ฒจ์ง๋๋ค. ์ด ์๋๋ฆฌ์ค์์๋ ํ์ฅ ๊ฐ๋ฐ์๊ฐ ์ง์ํ๋ CPU ์ํคํ ์ฒ ๋ฐ OS๋ณ๋ก ์ถ๊ฐ CPython ๋น๋๋ฅผ ๋์์ผ๋ก ํ๋ ๊ธฐ๊ฐ์ด 2~3๋ ์ ๋ ๋ ๊ฒ์ ๋๋ค.
ํตํฉ
์ฐธ์กฐ ๊ตฌํ์ CPython์ ์ฝ 15,000์ค์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ฉฐ, ์ฝ 15,000์ค์ ์ฝ๋์ธ mimalloc์ ํฌํจํฉ๋๋ค. ๋๋ถ๋ถ์ ๋ณ๊ฒฝ ์ฌํญ์ ์ฑ๋ฅ์ ๋ฏผ๊ฐํ์ง ์์ผ๋ฉฐ --disable-gil ๋ฐ ๊ธฐ๋ณธ ๋น๋์ ํฌํจํ ์ ์์ต๋๋ค. ์ผ๋ถ ๋งคํฌ๋ก(Py_BEGIN_CRITICAL_SECTION๊ณผ ๊ฐ์)๋ ๊ธฐ๋ณธ ๋น๋์์ no-op์ด ๋ ๊ฒ์ ๋๋ค. ์ ์๋ --disable-gil ๋น๋๋ฅผ ์ง์ํ๊ธฐ ์ํด ๋ง์ #ifdef ๋ฌธ์ ์์ํ์ง ์์ต๋๋ค.
๋จ์ผ ์ค๋ ๋ ์ฑ๋ฅ ์ํ
PEP์์ ์ ์ํ ๋ณ๊ฒฝ ์ฌํญ์ GIL์ด ์๋ Python ๋น๋์ ๋นํด --disable-gil ๋น๋์ ์คํ ์ค๋ฒํค๋๋ฅผ ์ฆ๊ฐ์ํฌ ๊ฒ์ ๋๋ค. ๋ค์ ๋งํด, ๋จ์ผ ์ค๋ ๋ ์ฑ๋ฅ์ด ๋ ๋๋ ค์ง ๊ฒ์ ๋๋ค. ์คํ ์ค๋ฒํค๋๋ฅผ ์ค์ผ ์ ์๋ ๋ช ๊ฐ์ง ๊ฐ๋ฅํ ์ต์ ํ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ํนํ ๋จ์ผ ์ค๋ ๋๋ง ์ฌ์ฉํ๋ --disable-gil ๋น๋์๋ ์ด๋ฌํ ์ต์ ํ๊ฐ ์ ์ฉํ ์ ์์ต๋๋ค. ์ฅ๊ธฐ์ ์ธ ๋ชฉํ๊ฐ ํ๋์ ๋น๋ ๋ชจ๋๋ฅผ ๊ฐ๋ ๊ฒ์ด๋ผ๋ฉด ์ด๋ฌํ ์ต์ ํ์ ๊ทธ๋ค์ ํธ๋ ์ด๋์คํ ์ ํ์ ์ด๋ฆฐ ๋ฌธ์ ๋ก ๋จ์ต๋๋ค.# PEP 703: Improving Python Concurrency
์๋ก
PEP 703์ CPython ์ธํฐํ๋ฆฌํฐ์์ ํ์ด์ฌ์ ๋์์ฑ์ ๊ฐ์ ํ๊ธฐ ์ํ ๋ชฉ์ ์ผ๋ก ์ ์๋์์ต๋๋ค. ์ด PEP๋ ํ์ฌ GIL(Global Interpreter Lock)๋ก ์ธํด CPython์์ ๋ฐ์ํ๋ ๋์์ฑ ๋ฌธ์ ๋ฅผ ๋ค๋ฃจ๊ณ , ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ์ ์์ ์ ์ํฉ๋๋ค.
GIL(Global Interpreter Lock)
GIL์ CPython ์ธํฐํ๋ฆฌํฐ์ ํน์ง ์ค ํ๋๋ก, ํ์ด์ฌ ์ฝ๋๋ฅผ ์คํํ๋ ๋์์๋ ํ ๋ฒ์ ํ๋์ ์ค๋ ๋๋ง์ด ํ์ด์ฌ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํํ ์ ์๋๋ก ์ ํํ๋ ์ ๊ธ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ์ด๋ก ์ธํด ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์๋ ๋จ์ผ ์ฝ์ด๋ง ์ฌ์ฉ๋๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉฐ, CPU ๋ฐ์ด๋ ์์ ์์ ์ฑ๋ฅ ์ ํ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
์ ์๋ ๊ฐ์ ๋ฐฉ๋ฒ
- GIL ์ ๊ฑฐ: GIL์ ์์ ํ ์ ๊ฑฐํ์ฌ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์์ ๋์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํด Gilectomy์ PyParallel ๋ฑ์ ํ๋ก์ ํธ๊ฐ ์ ์๋์์ต๋๋ค.
- GIL ๋ก์ง ๊ฐ์ : GIL์ ์ ์งํ๋ฉด์ GIL ๋ก์ง์ ๊ฐ์ ํ์ฌ GIL์ด ๋๋ฌด ์์ฃผ ์ป๊ณ ๋ฐ๋ฉ๋์ง ์๋๋ก ์ ์ดํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด GIL ๊ฒฝํฉ ๋ฌธ์ ๋ฅผ ์ํํ ์ ์์ต๋๋ค.
- ๋ค์ค ์ธํฐํ๋ฆฌํฐ: ๋ค์ค ์ธํฐํ๋ฆฌํฐ๋ฅผ ์ง์ํ์ฌ, ๊ฐ๊ฐ์ ์ธํฐํ๋ฆฌํฐ๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก GIL์ ๊ฐ์ง ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ฉํฐ์ฝ์ด ํ๊ฒฝ์์์ ๋์์ฑ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
- STM(์ํํธ์จ์ด ํธ๋์ญ์ ๋ฉ๋ชจ๋ฆฌ): STM์ ๋์ ํ์ฌ ๋ฉํฐ์ค๋ ๋ ํ๊ฒฝ์์์ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํฉ๋๋ค. ์ด๋ฅผ ํตํด GIL ์์ด๋ ์์ ํ ๋์์ฑ์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
PEP 703์ CPython์์์ ๋์์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ์ ์์ ์ ์ํ๊ณ ์์ต๋๋ค. ์ด๋ฌํ ๊ฐ์ ์ ํตํด ํ์ด์ฌ์ ๋ฉํฐ์ค๋ ๋ฉ ํ๊ฒฝ์์์ ์ฑ๋ฅ๊ณผ ๋์์ฑ์ ๊ฐ์ ํ ์ ์์ ๊ฒ์ผ๋ก ๊ธฐ๋๋ฉ๋๋ค.
์ฐธ๊ณ ๋ฌธํ
- "Exploiting Parallelism Opportunities with Deep Learning Frameworks" - ๋งํฌ
- "Using Python for Model Inference in Deep Learning" - ๋งํฌ
- "Biased reference counting: minimizing atomic operations in garbage collection" - ๋งํฌ
- PEP 683 โ Immortal Objects, Using a Fixed Refcount
- "What is RCU, Fundamentally?" - ๋งํฌ
- "Global Unbounded Sequences (GUS)" - ๋งํฌ
- "Is Parallel Programming Hard, And, If So, What Can You Do About It?" - ๋งํฌ
- "HotSpot Virtual Machine Garbage Collection Tuning Guide" - ๋งํฌ
- "The DaCapo Benchmarks: Java Benchmarking Development and Analysis"
- "Exploiting memory usage patterns to improve garbage collections in Java" - ๋งํฌ
- "most things usually turn out to be reachable" - ๋งํฌ
- "The Go team observed something similar in Go, but due to escape analysis and pass-by-value instead of reference counting. Recent versions of Go use a non-generational garbage collector" - ๋งํฌ
- "https://github.com/colesbury/nogil"
- "https://github.com/colesbury/nogil-3.12"
- Python HOWTOs - ๋งํฌ
- PEP 659 โ Specializing Adaptive Interpreter
- Gilectomy - ๋งํฌ
- PyParallel - ๋งํฌ
- python-safethread - ๋งํฌ
- "https://www.python.org/ftp/python/contrib-09-Dec-1999/System/threading.tar.gz"
- "An Inside Look at the GIL Removal Patch of Lore" - ๋งํฌ
- Jython - ๋งํฌ
- IronPython - ๋งํฌ
- PyPy: Software Transactional Memory - ๋งํฌ
'๐ Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Flask - secret_key (1) (0) | 2023.08.09 |
---|---|
Flask Error : AttributeError: 'Flask' object has no attribute 'login_manager' (0) | 2023.08.08 |
[DigitalOcean] Slack_bolt deploy runtime error (0) | 2023.06.26 |
On the amortized complexity of approximate counting (0) | 2023.06.20 |
[digitalOcean] digitalOcean + Slack ChatBot (0) | 2023.06.12 |