[OS] ์ค๋ ๋(Thread)
์ค๋ ๋(Thread)๋?
์ค๋ ๋(Thread)๋ ํ๋ก์ธ์ค(Process) ์์์ ์ค์ ๋ก ์์ ์ ์ํํ๊ณ ์๋ ํ๋์ ์ฃผ์ฒด์ด๋ค.
ํ๋ก์ธ์ค๊ฐ ์คํ๋๊ณ ์๋ ํ๋ก๊ทธ๋จ (์ฐธ๊ณ : [๐ฅ๏ธ Computer Science/OS] - [OS] ํ๋ก์ธ์ค vs ํ๋ก๊ทธ๋จ)์ด๋ผ๋ฉด, ์ค๋ ๋๋ ํ๋ก์ธ์ค ์์์ ์งํ๋๋ ์คํ์ ํ๋ฆ์ด๋ค. ์ค๋ ๋๋ ์ค์ง ํ ํ๋ก์ธ์ค ์์๋ง ์ํด์๋ค.
์ค๋ ๋๋ ํ๋ก์ธ์ค์ ํน์ง์ ์ง๋๊ธฐ ๋๋ฌธ์ ๊ฒฝ๋ ํ๋ก์ธ์ค(lightweight process)๋ผ๋ ์ด๋ฆ์ ๊ฐ์ง๊ณ ์๊ธฐ๋ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด ํ๋ก์ธ์ค๋ง ์ฌ์ฉํ๋ฉด ๋์ง ์ค๋ ๋๊น์ง ๊ท์ฐฎ๊ฒ ๋ ๋ง๋ค์ด์ ์ฌ์ฉํ๋ ๊ฒ์ผ๊น?
์์๋ฅผ ๋ค์ด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค. (์ด ์์๋ ์ธํ๋ ๋ธ๋ก๊ทธ์ ์ค๋ช ์ ์ฐธ๊ณ ํ์์์ ๋ฐํ๋ค.)
์๋ฅผ ๋ค์ด ํฌ๋กฌ์ด๋ผ๋ ํ๋ก์ธ์ค๊ฐ ์คํ๋๊ณ ์๋ค๊ณ ํ์. ์ด๋ ํฌ๋กฌ ๋ฒํผ์ ๋๋ฒ ๋๋ฅด๋ฉด ํฌ๋กฌ 'ํ๋ก์ธ์ค'๊ฐ ๋ ๋ฒ ์คํ๋๋ค. ํ์ง๋ง ์ค๋ ๋๋ ๋ค๋ฅด๋ค. ์ฐ๋ฆฌ๋ ํฌ๋กฌ์ ํตํด ํ์ผ์ ๋ค์ด๋ฐ์ผ๋ฉด์ ๋ ธ๋๋ฅผ ๋ฃ๊ธฐ๋ ํ๊ณ ์น ์ํ์ ํ๊ธฐ๋ ํ๋ค. ์ฆ, ํฌ๋กฌ์ด๋ผ๋ ํ๋ก์ธ์ค ๋ด์์๋ ์ฌ๋ฌ๊ฐ์ง ์์ ์ ํ๋ฆ์ด ์๋ ๊ฒ์ด๋ค. ์ด ๊ฐ๊ฐ์ ์์ ํ๋ฆ์ ์ฐ๋ฆฌ๋ ์ค๋ ๋๋ผ๊ณ ํ๋ค.
ํํธ ์ง๋ ์ด๊ฐ ๋๊ฒจ ์๋ ๋ชจ์ต๋ ๋ณด์ด๋๋ฐ ์ด์ฒ๋ผ ์ค๋ ๋๋ context-switching์ ํตํด ๋ฒ๊ฐ์๊ฐ๋ฉด์ ์คํ๋๋ ๋ชจ์ต์ ๋ํ๋ธ ๊ฒ์ด๋ค.
ํํธ, ํ ํ๋ก์ธ์ค์์๋ ์ต์ํ ๋ฌด์ธ๊ฐ๋ผ๋ ์คํ๋์ด์ผ ํ ๊ฒ์ด๋ฏ๋ก ์ต์ ํ๊ฐ์ ์ค๋ ๋๋ ์กด์ฌํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ค๋ ๋๊ฐ ์ฌ๋ฌ๊ฐ์ธ ํ๋ก์ธ์ค๋ฅผ ๋ฉํฐ์ค๋ ๋ ํ๋ก์ธ์ค๋ผ๊ณ ํ๋ค.
์ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ํ ํ๋ก์ธ์ค์ ์ค๋ ๋๋ค์ด ์ด๋ป๊ฒ ์์์ ์ฌ์ฉํ๋์ง ์ ์ ์๋ค. ์ค๋ ๋ 1,2,3์ CPU๊ด๋ จ, ์ฆ ์คํ ๊ด๋ จํ ์ ๋ณด๋ค ๊ธฐ์ค์ผ๋ก ๋๋๊ณ (๋ฌด์์ ์คํํ๋์ง์ ๋ฐ๋ผ ๋๋๊ณ ) ๋๋จธ์ง ์์์ ๋ค ๊ณต์ ํ๋ค. ์ด์ฒ๋ผ ๋ฉํฐ์ค๋ ๋ฉ ๊ธฐ๋ฒ์ ์ด์ฉํ๋ฉด ํ๋ก์ธ์ค๋ค๋ผ๋ฆฌ ์์์ ๊ณต์ ํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ์์์ ์ฝ๊ฒ ๊ณต์ ํ ์ ์๋ค.
์ฌ๊ธฐ์ ๋ ์ค๋ ๋์ ์ ์๋ฅผ ๋ค๋ฅด๊ฒ ํํํด๋ณด๋ฉด "CPU utilization์ ๊ธฐ๋ณธ ๋จ์" ๋ผ๊ณ ํ ์ ์๊ฒ ๋ค.
๋ํ ์ค๋ ๋๋ ์คํ ํ๋ฆ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฐ์ ์ค๋ ๋๋ง๋ค ๋ ์ง์คํฐ ์ ๋ณด๋ PC ๋ฑ์ด ๋ค ๋ค๋ฅผ ๊ฒ๋ ์์ฐ์ค๋ฝ๊ฒ ์ถ์ธกํ ์ ์๊ฒ ๋ค.
๋ฉํฐ ์ค๋ ๋ vs ๋ฉํฐ ํ๋ก์ธ์ค
๋ฉํฐ ์ค๋ ๋๋ ํ ํ๋ก์ธ์ค ๋ด์์ ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ์ํํ๋ ๊ฒ์ ์๋ฏธํ๋ค. ๊ทธ๋ ๋ค๋ฉด ์ ๊ตณ์ด ๋ฉํฐ ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ์ง ๋ฉํฐ ์ค๋ ๋๊น์ง ์ธ๊น?
- ์ผ๋จ ํ๋ก์ธ์ค๋ฅผ ์์ฑํ๊ณ ๋๋ด๋ ๊ฒ๋ณด๋ค ์ค๋ ๋๋ฅผ ์์ฑํ๊ณ ๋๋ด๋ ๊ฒ์ด overhead๊ฐ ์ ๋ค
- ๋ฉ๋ชจ๋ฆฌ ๊ณต์ ๊ฐ ์ฝ๊ณ ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๊ฐ ์ ๋ค.
- ๋ฉํฐ ํ๋ก์ธ์ค์ ๊ฒฝ์ฐ shared-memory๋ฅผ ์ด์ฉํ๊ฑฐ๋ message-passing๊ธฐ๋ฒ์ ์ด์ฉํ๋๋ฐ ์ด๊ฑด ๊ฝค๋ ๋ถํธํ ์ ์๋ค.
- ํ์ง๋ง ๋ฉํฐ ์ค๋ ๋์ธ ๊ฒฝ์ฐ ํ๋ก์ธ์ค ์์ ์์์ ๊ณต์ ํ๊ณ ์คํ์ ๋ฐ๋ก ๋ง๋ค์ด ์์ ์ ์์์ ๋ฐ๋ก ์ ์ฅํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ๊ณต์ ๊ฐ ์ฝ๋ค.
- ์ฆ ํ๋ก์ธ์ค๋ ์๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ์ง ์์ง๋ง ์ค๋ ๋๋ ์๋ก ๋งค์ฐ ์ฝ๊ฒ ๊ณต์ ํ๋ค.
- ๋ํ ๋ฉํฐ ํ๋ก์ธ์ค์ ๊ฒฝ์ฐ ํ๋ก์ธ์ค ๋ณ๋ก ๊ฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ์ง๋ง ์ค๋ ๋๋ ํ ํ๋ก์ธ์ค ๋ด์์ ํ ๋นํ๋ฏ๋ก ๋ฉ๋ชจ๋ฆฌ ๋ญ๋น๋ ์ ๋ค.
- ํ ์ค๋ ๋๊ฐ ์คํ๋ ๋ ๋ค๋ฅธ ์ค๋ ๋๋ ์คํ๋ ์ ์์ด ์ฌ์ฉ์ ์ ์ฅ์์ ํธ๋ฆฌํ๋ค.
๋ฉ์ธ ์ค๋ ๋ & ์๋ธ ์ค๋ ๋
- main thread๋ ํ๋ก๊ทธ๋จ์ ์คํ์ ์์ํ๋ ์ฃผ ์ค๋ ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ๊ฐ๋ ์ด๋ค.
๋๋ถ๋ถ์ ์ด์ ์ฒด์ ์์๋ ํ๋ก๊ทธ๋จ์ด ์์๋ ๋ main ์ค๋ ๋๊ฐ ์์ฑ๋๊ณ , ๋ณดํต main ์ค๋ ๋๋ ํ๋ก๊ทธ๋จ์ ์ง์ ์ ์ธ main() ํจ์๋ฅผ ์คํํ๋ค.
main ์ค๋ ๋๋ ๋ค๋ฅธ ์ค๋ ๋๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ์ญํ ์ ์ํํ๋ค. ์๋ฅผ๋ค์ด ๋ฉํฐ์ค๋ ๋ ํ๋ก๊ทธ๋จ์์ main thread๋ ์ด๊ธฐํ ์์ , ์์ํ ๋น, ์ค๋ ๋ ์์ฑ ๋ฑ์ ์ํํ๋ค. ๋ํ main thread๊ฐ ์ข ๋ฃ๋๋ฉด ํ๋ก๊ทธ๋จ ์ ์ฒด๊ฐ ์ข ๋ฃ๋ ์ ์๋ค.
- Sub thread๋ ์ฃผ๋ก main thread ์ด์ธ์ ์ค๋ ๋๋ฅผ ๊ฐ๋ฆฌํค๋ ์ฉ์ด์ด๋ค. ์ผ๋ฐ์ ์ผ๋ก main thread ์ด์ธ์ ์ค๋ ๋๋ฅผ sub thread๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๋ฉํฐ ์ค๋ ๋ ์์
(์ฐธ๊ณ : https://modoocode.com/269)
๋ณ๋ ฌ ๊ฐ๋ฅํ(Parallizable) ์์ ๋ค
- 1~10000๊น์ง ๋ํ๋ ์์
์ฑ๊ธ์ค๋ ๋๋ก ํ๋ฉด 1~10000๊น์ง ํ ์ค๋ ๋๊ฐ ๋ค ํ๊ฒ ๋๋ค.
ํ์ง๋ง ๋ฉํฐ์ค๋ ๋๋ก 1~1000, 1001~2000, ....,90001~10000 ์ด๋ฐ์์ผ๋ก ๋๋ ์ ์ฒ๋ฆฌํ๋ค๋ฉด?
CPU ์ฝ์ด์์ ๋ง์ ํ๋ฒ์ 1์ด๊ฐ ๊ฑธ๋ฆฐ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์ด๋ ๋จ์ผ ์ฐ๋ ๋๋ก ๊ณ์ฐํ๋ฉด ์ด 10000์ด๊ฐ ๊ฑธ๋ฆด ๊ฒ์ด๋ค.
ํ์ง๋ง ๋ฉํฐ์ค๋ ๋๋ก ๊ณ์ฐํ๋ค๋ฉด 1000์ด + ํฉ์น๋ ์๊ฐ 10์ด ํด์ ๋๋ต 1010์ด๋ง ๊ฑธ๋ฆฌ๊ฒ ๋๋ค.
์ด์ฒ๋ผ ์๊ฐ์ ์์ฒญ๋๊ฒ ๋จ์ถํ ์ ์๋ค!!
์ฐธ๊ณ ) ์ด๊ฒ์ ๋ณ๋ ฌํ(Parallize)๋ผ๊ณ ํ๋๋ฐ, ์ด๊ฒ์ด ๊ฐ๋ฅํ ์ด์ ๋ ๊ฐ ์ค๋ ๋๋ค๋ผ๋ฆฌ ํ๋ ์์ ์ด ๊ฑฐ์ ๋ ๋ฆฝ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๋ง์ฝ์ ์๋ก ๋ ๋ฆฝ์ ์ด์ง ์๊ณ ์์กด์ ์ด๋ผ๋ฉด(dependant), ๋ณ๋ ฌํ๊ฐ ์ด๋ ค์ธ ๊ฒ์ด๋ค.(ex: ํผ๋ณด๋์น ์์ด ๊ณ์ฐ)
๋๊ธฐ ์๊ฐ์ด ๊ธด ์์ ๋ค
์๋์ ๊ฐ์ด ์น์ฌ์ดํธ๋ฅผ ๊ธ์ด์ค๋ ์ด๋ค ํ๋ก๊ทธ๋จ์ด ์๋ค๊ณ ํ์.
int main() {
// ๋ค์ด ๋ฐ์ผ๋ ค๋ ์น์ฌ์ดํธ์ ๋ด์ฉ์ ์ ์ฅํ๋ ๋งต
map<string, string> url_and_content;
for (auto itr = url_and_content.begin(); itr != url_and_content.end();
++itr) {
const string& url = itr->first;
// download ํจ์๋ ์ธ์๋ก ์ ๋ฌ๋ฐ์ url ์ ์๋ ์ฌ์ดํธ๋ฅผ ๋ค์ด๋ฐ์ ๋ฆฌํดํ๋ค.
itr->second = download(url);
}
}
์ ํ๋ก๊ทธ๋จ์ url๋ฅผ ์ธ์๋ก ๋ณด๋ด์ downloadํจ์๋ฅผ ํตํด์ ์ฌ์ดํธ๋ฅผ ๋ค์ด๋ฐ๋๋ค.
ํ์ง๋ง ์ด ํ๋ก๊ทธ๋จ์ ๊ต์ฅํ ๋๊ธฐ์๊ฐ์ด ๊ธธ ์ ๋ฐ์ ์๋ค. ์๋ํ๋ฉด CPU์ ์ฒ๋ฆฌ ์๋๋ณด๋ค ์น์ฌ์ดํธ์ ์๋๊ฐ ํจ์ฌ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฐ๋ผ์ ์น์ฌ์ดํธ์์ ์์ฒญ์ ๋ณด๋ด๊ณ ๋ค์ด๋ก๋ ํ๊ธฐ ์ ๊น์ง ๊ธฐ๋ค๋ ค์ผํ๋ ์๊ฐ์ด ์๊ธฐ๊ฒ ๋๋ค. ๊ทธ๋ฌ๋ฉด ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ๊ทธ๋ฅ ๊ธฐ๋ค๋ฆด๋๋ CPU๊ฐ ๋๊ณ ์๊ฒ ๋๋ค.
ํ์ง๋ง ๋ง์ผ download ํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ ์ฌ๋ฌ ์ฐ๋ ๋์์ ๋ถ๋ฅด๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
์ ๊ทธ๋ฆผ์ ๊ฐ์ ์ฝ์ด ์์์ ์ฐ๋ ๋๋ค์ด ์ปจํ ์คํธ ์ค์์นญ์ ํตํด ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ ์์ด CPU ๋ฅผ ์ต๋ํ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๋ก์ ์ฐ๋ ๋์์ ์น์ฌ์ดํธ 1 ์ ์์ฒญ์ ๋ณด๋ธ ํ, ์ด์ ์๋ ์น์ฌ์ดํธ 1 ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค์ด๋ก๋๋ฅผ ์์ํ๊ธฐ ๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ์ง๋ง, ์ด ๊ฒฝ์ฐ ์ฃผํฉ์ ์ฐ๋ ๋๋ก ์ปจํ ์คํธ ์ค์์นญ ๋์ด์, ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ์ ๋ญ๋นํ์ง ์๊ณ ๋น๋๊ธฐ์ ์ผ๋ก ๋ฐ๋ก ์น์ฌ์ดํธ 2 ์ ์์ฒญ์ ๋ณด๋ด๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์์ ๊ฐ์ด ์ฒ๋ฆฌํ๊ฒ ๋๋ค๋ฉด CPU ์๊ฐ์ ๋ญ๋นํ์ง ์๊ณ ํจ์จ์ ์ผ๋ก ์์ ์ ์ฒ๋ฆฌํ ์ ์๊ฒ ๋๋ค.
๋ฉํฐ ์ค๋ ๋๋ฅผ ์ด์ฉํ๋ฉด ์ฌ๋ฌ ํจ๊ณผ๋ฅผ ์ป์ ์์๊ณ ์ฌ๋ฌ ์ค๋ ๋๋ฅผ ๋์์ ์คํํ ์ ์์ผ๋ฏ๋ก ์๋๋ ๋นจ๋ผ์ง๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ฉํฐ ์ค๋ ๋๊ฐ ๋ฌด์กฐ๊ฑด ์ข์ ๊ฒ์ผ๊น?
์ค๋ ๋๊ฐ ๋ฒ๊ฐ์๊ฐ๋ฉด์ ์คํ๋ ๋๋ (์๋ฅผ๋ค์ด ์ฝ์ด์ ์๋ณด๋ค ์ค๋ ๋ ์๊ฐ ๋ง์ ๊ฒฝ์ฐ) context-switching(๋ฌธ๋งฅ๊ตํ)์ด ์ผ์ด๋๋ค.
context switching(๋ฌธ๋งฅ ๊ตํ)
context switching์ด๋, ํ์ฌ๊น์ง์ ์์ ์ํ๋ ๋ค์ ์์ ์ ํ์ํ ๊ฐ์ข ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ์ฝ์ด์ค๋ ์์ ์ ๊ฐ๋ฆฌํจ๋ค. ์ด๋ฅผ ํตํด ์ค๋ ๋๊ฐ ๊ต์ฒด๋๋ค. ์์ ์ง๋ ์ด ๊ทธ๋ฆผ์์ threadA ๊ฐ ๋๊ธฐ๊ณ thread B๊ฐ ์คํ๋๊ณ ๋ค์ thread A๊ฐ ์คํ๋ ๋ context switching์ด ์ผ์ด๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๋ ์ค๋ ๋ ๊ฐ๋ง์ด ์๋๋ผ ํ๋ก์ธ์ค ์ฌ์ด์์๋ ์ผ์ด๋๋ค.
์ ์ฅํ๊ณ ๋ค์ ๋ถ๋ฌ์ค๊ณ .. ์ด๋ฐ ๊ณผ์ ์ด ์๊ธฐ ๋๋ฌธ์ context switching ์๋ ๋ถ๋ช overhead๊ฐ ์กด์ฌํ ๊ฒ์ด๋ค. ๋ฐ๋ผ์ ์ค๋ ๋๊ฐ ๋๋ฌด ๋ง์์ง๋ฉด context switching์ overhead๋ํ ๋ง์์ง๊ฒ ๋์ด์ ํจ์จ์ด ๋ ๋๋น ์ง ์๋ ์๋ค.
๋ฐ๋ผ์ ์ ๋นํ ์ค๋ ๋์ ๊ฐ์๋ฅผ ์กฐ์ ํ๋ ๊ฒ์ด ์ค์ํ๋ค.
๊ฐ์ข ์ฉ์ด
- ์ค๋ ๋ ๊ทธ๋ฃน : ๋น์ทํ ๊ธฐ๋ฅ์ ํ๋ ์ค๋ ๋๋ค์ ๋ฌถ์ด๋์ ์ ์๋ค. ์ด๋ฅผ ์ค๋ ๋ ๊ทธ๋ฃน์ด๋ผ๊ณ ํ๋ค. ๊ทธ๋ฃน์ ๋ค๋ฅธ ๊ทธ๋ฃน์ ์ํ ์ ์๋ค.
- TLS(Thread Local Storage) : ์ฐ๋ฆฌ๋ ์์์ ์ค๋ ๋๋ ์คํ์ ์์ ๋ค๋ง์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค๊ณ ํ๋ค. ๊ทธ๋ฐ๋ฐ ์คํ์ ๋ค์ด์๋ ์ ๋ค์ local variable์ด๋ฏ๋ก ์ ์ญ ๋ณ์๋ฑ์ ์ ์ฅํ ์ ์๋ค. ์ด๋ด ๊ฒฝ์ฐ TLS๋ผ๋ ์ ์ฅ๊ณต๊ฐ์ ๋ง๋ค์ด ์ ์ฒด์์ ๋ชจ๋ visibleํ ๋ณ์๋ค(static ํน์ globalํ)์ ์ ์ฅํ ์ ์๋ค. (์ฐธ๊ณ : [๐ฅ๏ธ Computer Science/OS] - [OS] Thread Local Storage (TLS))
๋ค์ ํฌ์คํธ์์๋ ์ค๋ ๋๋ค์ด ์ด๋ป๊ฒ ๋์์ ์คํ๋๋์ง ๊ทธ ์๋ฆฌ์ ๋ํด์ ์์๋ณด๋๋ก ํ๊ฒ ๋ค.
์์ฝ
- ์ค๋ ๋๋ ํ๋ก์ธ์ค ์์์ ์งํ๋๋ ์คํ์ ํ๋ฆ.
- ์คํ๋ง ๋ฐ๋ก ์ฐ๊ณ ๋ค๋ฅธ ์์๋ค์ ๊ฐ์ ํ๋ก์ธ์ค ๋ด์ ๋ค๋ฅธ ์ค๋ ๋๋ค๊ณผ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ์์ ๊ณต์ ๊ฐ ํธํจ
- ํ๋ก์ธ์ค ๋ด์๋ ์ต์ ํ๊ฐ์ ์ค๋ ๋๊ฐ ์กด
Reference
๐ฉ๐ป ์์ ํ ์ ๋ณตํ๋ ํ๋ก์ธ์ค vs ์ค๋ ๋ ๊ฐ๋ (tistory.com)
https://www.geeksforgeeks.org/thread-in-operating-system/