League Of Legends - Link Select [01์ฃผ์ฐจB] ๋ฉ€ํ‹ฐ์ฝ”์–ด HW & ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹œ์ž‘
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿค“ Study/MultiThread

[01์ฃผ์ฐจB] ๋ฉ€ํ‹ฐ์ฝ”์–ด HW & ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹œ์ž‘

by GAMEMING 2024. 3. 28.
728x90

 

 

 

- ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ์‚ฌ์šฉ ๋ชฉ์ 

 => ๋ณ‘๋ ฌ ์ปดํ“จํ„ฐ์—์„œ์˜ ํ”„๋กœ๊ทธ๋žจ ์„ฑ๋Šฅ ํ–ฅ์ƒ

 : ๋ฉ€ํ‹ฐ ์ฝ”์–ด 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 (๋‚ด๊ฐ€ ๋‹น์žฅ ํ• ์ผ ์—†๋Š”๋ฐ, ํ•  ์ผ์ด ๊ณง ์ƒ๊ธธ ๊ฒƒ ๊ฐ™์€๋ฐ ์–ธ์  ์ง€๋Š” ์ž˜ ๋ชจ๋ฅด๊ฒ ๋‹ค)