- ๋ฉํฐ์ฐ๋ ๋ ์ฌ์ฉ ๋ชฉ์
=> ๋ณ๋ ฌ ์ปดํจํฐ์์์ ํ๋ก๊ทธ๋จ ์ฑ๋ฅ ํฅ์
: ๋ฉํฐ ์ฝ์ด CPU์์์ ํ๋ก๊ทธ๋จ ์ฑ๋ฅ ํฅ์
: ๋ฉํฐ CPU ์ปดํจํฐ์์์ ํ๋ก๊ทธ๋จ ์ฑ๋ฅ ํฅ์
: ๋ถ์ฐ ์ปดํจํฐ, ์ฑ๊ธ ์ฝ์ด ํ๊ฒฝ์์์ ์ฑ๋ฅ ํฅ์ X, ๋ชจ๋ํํด์ ์ฝ๊ฒ ์์๋ณด๊ธฐ X
- ๋ฉํฐ์ฝ์ด CPU
: ํ ๊ฐ ์ด์์ ์ฝ์ด๋ก ๊ตฌ์ฑ๋ CPU
: ํ์ฌ ์ฑ๊ธ ์ฝ์ด CPU๋ ์๋ค๊ณ ๋ด๋ ๋ฌด๋ฐฉ
: ์ฝ์ด = ALU + Register + CU + Cache ⇒ ๊ทธ๋ฅ CPU์ ๊ฐ์
: ๋ฉํฐ์ฝ์ด CPU ⇒ ํ๋์ ์นฉ์ ์ฌ๋ฌ ๊ฐ์ ํ๋ก์ธ์๋ฅผ ํฌ์ฅํด ๋ฃ์ ( ํ๋ก๊ทธ๋๋จธ ์ ์ฅ : ๋ฉํฐ ํ๋ก์ธ์์ ๊ฐ์)
: 6 Core(Quad Core) ๋์ธ
: ์์ผ๋ก ๋์ฑ ๋ง์ Core ์ฌ์ฉํ๊ฒ ๋ ๊ฒ -> ๊ธฐ์กด ํ๋ก๊ทธ๋จ์ Dual Core CPU์์ ๋๋ ค๋ ์ฑ๋ฅ ํฅ์ 0%
⇒ ๋ฉํฐ์ฐ๋ ๋ ํ๋ก๊ทธ๋๋ฐ ํ์
- OS์ thread ์ง์
1) Window
: ํ๋ก์ธ์ค๋ฅผ ๊ตฌ์ฑํ๋ ์์๋ก ๋ชจ๋ ํ๋ก์ธ์ค ์์ ์ ํ ๊ฐ์ thread๋ฅผ ๊ฐ๊ณ ์คํ๋จ.
: OS๊ฐ ์ง์ thread ์ค์ผ์ค๋ง (๋
ธ๋ thread ์์ด ์คํ์ํค๋๋ก ํจ, ์ฐ๋ฆฌ๊ฐ ํน์ thread์์ ๋๋ฆฌ๋๋ก ํ ์ ์์ง๋ง, ์ฑ๋ฅ์ด ๋ฐ ํ ๋ง ๋ ์๋ ์์ผ๋ ํจ๋ถ๋ก ํ์ง ๋ง์)
: ๋ฉํฐ CPU(๋๋ Core)๋ผ๋ฉด ์ฌ๋ฌ ๊ฐ์ thread ๋์์ ์คํ์ํด
2) ๋ฆฌ๋ ์ค
: thread๋ผ๋ ๊ฐ๋ ์ด ์์(๋ชจ๋ ๊ฒ process). Pthread๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ thread๊ฐ ์กด์ฌํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ํจ.
: ์ฌ๋ฌ ๊ฐ์ thread ์ฌ์ฉ ๋ถ๊ฐ๋ฅ.
// ์๋์ ํ๋ก๊ทธ๋จ
// ๊ฒฐ๊ณผ : Sum = 100000000
int sum;
int main()
{
for (auto i = 0; i < 50000000; ++i)
sum += 2;
cout << "Sum = " << sum << endl;
}
// ๋ฉํฐ์ฐ๋ ๋
// ๊ฒฐ๊ณผ : sum = 57390770
int sum;
void thread_work()
{
for (auto i = 0; i < 25000000; ++i)
sum += 2;
}
int main()
{
thread t1{ thread_work };
thread t2{ thread_work };
t1.join();
t2.join();
std::cout << "sum = " << sum << endl;
// ์ฌ๋ฐ๋ฅธ ๊ฒฐ๊ณผX
// BREAK -> ์คํ -> ๋๋ฒ๊ทธ -> ์ฐฝ -> ์ด์
๋ธ๋ฆฌ
}
// ๊ฐ์ฒด ๋ฉ์๋
// join() : thread์ ์ข
๋ฃ๊น์ง ๊ธฐ๋ค๋ฆผ
// joinable() : thread์ ์ข
๋ฃ ํ์ธ
// get_id() : kernel์์ ๋ค๋ฃจ๋ thread์ id
// detach() : thread๊ฐ์ฒด์์ thread ๋ถ๋ฆฌ
// hardware_concurrency() : ๋
ผ๋ฆฌ(๊ฐ์) ์ฝ์ด์ ๊ฐ์
// this_thread (namespace)
// get_id()
// sleep_for() : ์ ํด์ง ์๊ฐ ๋์ thread ์คํ ๋ฉ์ถค (busy waiting ๋ฐฉ์ง)
// sleep_until() : ์ ํด์ง ์๊ฐ๊น์ง thread ์คํ ๋ฉ์ถค (busy waiting ๋ฐฉ์ง)
// yield() : ๋ค๋ฅธ ์ค๋ ๋์๊ฒ ์คํ์๊ฐ ์๋ณด (์์ ์ ์ผ์ด ์ฐ์ ์์๊ฐ ๋ฎ์ ๊ฒฝ์ฐ)
์ฐ๋ ๋ ์์ฒด๋ ๊ฐ์ฒด๋ก. thread t1..
์์ ํ๋ผ๋ฏธํฐ : ์ด๋์ ์์ํ ์ง์ ๋ํ ์์์ฃผ์ -> ํจ์ (์ ์ผ ๋ง์ด ์)
2๋ฒ์งธ -> ์คํ๊ฐ์ฒด๋ ๊ฐ๋ฅ (๊ฑฐ์ ์์)
3๋ฒ์งธ -> ๋๋ค๋ ๋ฃ์ด์ ์คํํด๋ ๋จ (2๋ฒ์งธ๋ก ๋ง์ด์)
detach()์ ๊ดํ๊ฑด ์๋์ ๊ธ์ ์ฐธ๊ณ ํ์
https://velog.io/@dandb3/Thread-detach-vs-join
busy waiting -> OS์์๋ ์ํ๋ ์์์ ์ป๊ธฐ ์ํด ๊ธฐ๋ค๋ฆฌ๋ ๊ฒ์ด ์๋๋ผ ๊ถํ์ ์ป์ ๋๊น์ง ํ์ธํ๋ ๊ฒ์ ์๋ฏธ, CPU์ ์์์ ์ธ๋ฐ ์์ด ๋ญ๋นํ๊ธฐ ๋๋ฌธ์ ์ข์ง ์์ ์ฐ๋ ๋ ๋๊ธฐํ ๋ฐฉ์
์ฐ๋ ๋ ํ๋ค๊ฐ ๋น์ฅ ํ ์ผ์ ์๋๋ฐ 3์ด ํ์ ํ ์ผ์ด ์๊ธธ ๊ฒ -> sleep_for
์ ์ผ ๋ง์ด ์ฐ๋ ๊ฒ์ yield (๋ด๊ฐ ๋น์ฅ ํ ์ผ ์๋๋ฐ, ํ ์ผ์ด ๊ณง ์๊ธธ ๊ฒ ๊ฐ์๋ฐ ์ธ์ ์ง๋ ์ ๋ชจ๋ฅด๊ฒ ๋ค)
'๐ค Study > MultiThread' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[05์ฃผ์ฐจ] ๋๊ธฐํ ์ฐ์ฐ & CAS (0) | 2024.04.24 |
---|---|
[04์ฃผ์ฐจ] ๋ฉ๋ชจ๋ฆฌ ์ผ๊ด์ฑ (0) | 2024.04.18 |
[03์ฃผ์ฐจ] ๋ฉํฐ์ฐ๋ ๋ ํ๋ก๊ทธ๋๋ฐ ์ฃผ์์ฌํญ & ์ํธ๋ฐฐ์ ์๊ณ ๋ฆฌ์ฆ (1) | 2024.04.18 |
[02์ฃผ์ฐจ] ๋ฉํฐ์ฝ์ด HW & DataRace (0) | 2024.04.18 |
[01์ฃผ์ฐจA] ๋ฉํฐ์ฐ๋ ๋ ํ๋ก๊ทธ๋๋ฐ ์๊ฐ (0) | 2024.03.12 |