League Of Legends - Link Select [01์ฃผ์ฐจA] ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์†Œ๊ฐœ
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿค“ Study/MultiThread

[01์ฃผ์ฐจA] ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์†Œ๊ฐœ

by GAMEMING 2024. 3. 12.
728x90

 

ํ•œ๊ตญ๊ณตํ•™๋Œ€ํ•™๊ต ๊ฒŒ์ž„๊ณตํ•™๋ถ€ ์ •๋‚ดํ›ˆ ๊ต์ˆ˜๋‹˜ ์ˆ˜์—… ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค


 

๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ OS์˜ ์—ญํ• ์€ ๊ฑฐ์˜ ์—†๊ณ  CPU์— ๋‹ฌ๋ฆผ

 

- Single Core Computer vs Parallel Computer

: ์‹ฑ๊ธ€์ฝ”์–ด ์ปดํ“จํ„ฐ๋Š” ํ˜„์žฌ ๋ฉธ์ข…, ๋ณ‘๋ ฌ ์ปดํ“จํ„ฐ๊ฐ€ ์šฐ๋ฆฌ๊ฐ€ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ปดํ“จํ„ฐ.

: ํ•˜๋‚˜์˜ ์ž‘์—…์„ ๋ณด๋‹ค ๋นจ๋ฆฌ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ์Œ

: ๊ธฐ์กด ํ”„๋กœ๊ทธ๋žจ์„ ๋ณ‘๋ ฌ ์ปดํ“จํ„ฐ์—์„œ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ์†๋„ ์ฆ๊ฐ€๋Š” 0, ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ๋•Œ๋ถ€ํ„ฐ ๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ํ•„์š”

: ์ง€๊ธˆ๊นŒ์ง€ ๋ฐฐ์šด ์ž๋ฃŒ๊ตฌ์กฐ/์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์ „๋ถ€ ์ง๋ ฌ ์ปดํ“จํ„ฐ๋ฅผ ๊ฐ€์ •ํ•˜๊ณ  ์žˆ์–ด ๋ฌธ์ œ. ์ฝ”์–ด ๊ฐœ์ˆ˜๊ฐ€ ๋Š˜์–ด๋‚˜๋„ ์„ฑ๋Šฅ ํ–ฅ์ƒ์ด ์ผ์–ด๋‚˜์ง€ ์•Š์•„...

 

 

 

- ๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋žจ

: ํ”„๋กœ์„ธ์Šค์˜ ๋‚ด๋ถ€ ์—ฌ๋Ÿฌ ํ๋ฆ„(process)์—์„œ ๋™์‹œ ์‹คํ–‰๋จ, ํ”„๋กœ๊ทธ๋žจ ํ•˜๋‚˜์—์„œ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ

: Context ์‚ฌ์ด Synchronization(๋™๊ธฐํ™”) ํ•„์ˆ˜

: ๊ณต์œ ๋ฉ”๋ชจ๋ฆฌ(Shared Memory) ๋ชจ๋ธ๊ณผ ๋ฉ”์‹œ์ง€ ํŒจ์‹ฑ(Message Passing) ๋ชจ๋ธ ๆœ‰

 

 

 

- Process Context

: Process is a Program execution -> ํ”„๋กœ์„ธ์Šค๋Š” ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ๊ทธ๋žจ์„ ์˜๋ฏธ

: Context -> ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ˜„์žฌ ์–ด๋–ค ์ƒํƒœ์—์„œ ์ˆ˜ํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€ ์ •ํ™•ํžˆ ๊ทœ๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ •๋ณด

: ํ˜„์žฌ ์šด์˜์ฒด์ œ๋Š” ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ•จ๊ป˜ ์ˆ˜ํ–‰๋˜๋Š” ์‹œ๋ถ„ํ•  ์‹œ์Šคํ…œ ํ™˜๊ฒฝ์ž„

: ํ”„๋กœ์„ธ์Šค ๋ฌธ๋งฅ(Process Context) -> ์ด์ „์— ์–ด๋””๊นŒ์ง€ ๋ช…๋ น์„ ์ˆ˜ํ–‰ํ–ˆ๋Š”์ง€์™€ ์ •ํ™•ํ•œ ์ˆ˜ํ–‰์‹œ์ ๊ณผ ์ƒํƒœ๋ฅผ ์žฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด

 

 

 

- Process Synchronization (ํ”„๋กœ์„ธ์Šค ๋™๊ธฐํ™”)

: ํ”„๋กœ์„ธ์Šค์˜ ์‹คํ–‰ ์ˆœ์„œ๋ฅผ ์ œ์–ดํ•˜๊ณ  ๋™์‹œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋Š” ์ž์›์— ํ•˜๋‚˜์˜ ํ”„๋กœ์„ธ์Šค๋งŒ์„ ์ ‘๊ทผํ•˜๊ฒŒ ํ•ด ๋ฐ์ดํ„ฐ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€

 

 

 

- IPC (Inter Process Communication)

: https://plas.tistory.com/148

: ์šฐ๋ฆฌ๊ฐ€ ์ˆ˜์—… ๋•Œ ๋‹ค๋ฃฐ ๊ฒƒ์€ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ !

 

 

 

- ๋ณ‘๋ ฌ ํ”„๋กœ๊ทธ๋žจ ์š”๊ตฌ ์‚ฌํ•ญ

: ์ •ํ™•์„ฑ ! ์„ฑ๋Šฅ !

: ์—ฌ๋Ÿฌ context์—์„œ ๋™์‹œ ๋‹ค๋ฐœ์ ์œผ๋กœ ํ˜ธ์ถœํ•ด๋„ ๋ฌธ์ œ x

: context ์ฆ๊ฐ€์— ๋”ฐ๋ฅธ ์„ฑ๋Šฅ ํ–ฅ์ƒ ๋˜ํ•œ ๊ณ ๋ ค ์‚ฌํ•ญ

: CPU๊ฐ€ ๋А๋ฆฌ๊ธฐ์— ๋ฉ€ํ‹ฐ์ฝ”์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž„์œผ๋กœ ๋ฉ€ํ‹ฐ์ฝ”์–ด๋ฅผ ์จ์„œ ์‹ฑ๊ธ€๋ณด๋‹ค ๋А๋ ค์ง€๋ฉด ์•ˆ๋จ

 

 

 

- Process

: ์šด์˜์ฒด์ œ๋Š” ์‚ฌ์šฉ์ž์˜ ํ”„๋กœ๊ทธ๋žจ์„ ํ”„๋กœ์„ธ์Šค ๋‹จ์œ„๋กœ ๊ด€๋ฆฌํ•จ

: ์‹คํ–‰ ํŒŒ์ผ ์‹คํ–‰ = OS๊ฐ€ ํŒŒ์ผ ๋‚ด์šฉ์„ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค ์‹œ์ž‘ ์ฃผ์†Œ๋กœ ์ ํ”„ํ•˜๋Š” ๊ฒƒ

: ์‹œ๋ถ„ํ•  ์šด์˜์ฒด์ œ -> ์—ฌ๋Ÿฌ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ณ ์†์œผ๋กœ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ (๊ฐ•์ œ๋กœ ready ์ƒํƒœ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)

 

 

 

- ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

 

Stack : ์ง€์—ญ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฆฌํ„ด๊ฐ’ ๋“ฑ ์ž ์‹œ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค๊ฐ€ ์‚ฌ๋ผ์ง€๋Š” ๋ฐ์ดํ„ฐ, ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ ํ• ๋‹น - ํ•จ์ˆ˜ ๋ฐ˜ํ™˜ ์‹œ ์†Œ๋ฉธ (์ปดํŒŒ์ผ ํƒ€์ž„)

Heap : ๋™์  ๋ฐ์ดํ„ฐ ์˜์—ญ, ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ ๊ฐ’์— ์˜ํ•ด ์ฐธ์กฐ๋˜๊ณ  ์‚ฌ์šฉ๋จ, ๋”ฐ๋ผ ํ”„๋กœ๊ทธ๋žจ ๋™์ž‘ ์‹œ์— ํฌ๊ธฐ๊ฐ€ ๊ฒฐ์ • (๋Ÿฐํƒ€์ž„)

Data : ์ „์—ญ๋ณ€์ˆ˜์™€ ์ •์  ๋ณ€์ˆ˜ ์ €์žฅ, ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘ ์‹œ ํ• ๋‹น, ์ข…๋ฃŒ ์‹œ ์†Œ๋ฉธ / BSS (Read-Write)

Code : ์‹คํ–‰ํ•  ํ”„๋กœ๊ทธ๋žจ์˜ ์ฝ”๋“œ ์ €์žฅ, CPU๊ฐ€ ์ด ์˜์—ญ์—์„œ ๋ช…๋ น์–ด๋ฅผ ํ•˜๋‚˜์”ฉ ๊ฐ€์ ธ์™€ ์ฒ˜๋ฆฌ (์ปดํŒŒ์ผ ํƒ€์ž„์— ๊ฒฐ์ •, Read-Only)

 

* ๋Ÿฐํƒ€์ž„ - ์ปดํŒŒ์ผ ํƒ€์ž„(๊ธฐ๊ณ„์–ด์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ ๋˜์–ด ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ”„๋กœ๊ทธ๋žจ์ด ๋˜๋Š” ๊ณผ์ •), ๋Ÿฐํƒ€์ž„(์‘์šฉํ”„๋กœ๊ทธ๋žจ์ด ๋™์ž‘๋  ๋•Œ)

์ปดํŒŒ์ผํƒ€์ž„ ์˜ค๋ฅ˜ ์œ ํ˜• -> ์‹ ํƒ์Šค ์˜ค๋ฅ˜, ํƒ€์ž…์ฒดํฌ ์˜ค๋ฅ˜, ๋Ÿฐํƒ€์ž„ ์˜ค๋ฅ˜ ์œ ํ˜• -> 0๋‚˜๋ˆ„๊ธฐ ์˜ค๋ฅ˜, ๋„์ฐธ์กฐ ์˜ค๋ฅ˜, ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ ์˜ค๋ฅ˜

 

 

 

- ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ - ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์™€ ์ž์‹ ํ”„๋กœ์„ธ์Šค

: ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค -> ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ”„๋กœ์„ธ์Šค

: ์ž์‹ ํ”„๋กœ์„ธ์Šค -> ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์˜ํ•˜์—ฌ ์ƒ์„ฑ๋œ ํ”„๋กœ์„ธ์Šค, ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„๊ณผ ์ž์›์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์™€ ํ†ต์‹  ๊ฐ€๋Šฅํ•จ. ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์™€๋Š” ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋จ

 

์ •๋‚ดํ›ˆ ๊ต์ˆ˜๋‹˜ ์ˆ˜์—… ์ž๋ฃŒ

 

 

- ํ”„๋กœ์„ธ์Šค์™€ ์“ฐ๋ ˆ๋“œ

์ •๋‚ดํ›ˆ ๊ต์ˆ˜๋‹˜ ์ž๋ฃŒ

๊ธฐ์กด ๊ฐ€์ƒ ๊ณต๊ฐ„์— ๊ณต์œ  ์˜์—ญ์€ ๊ณ ์ •, ์“ฐ๋ ˆ๋“œ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค ํ•ด์„œ ๋ณ€ํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ๋˜, stack๋งŒ ์ƒˆ๋กœ ์ƒ๊ฒจ ๋Œ์•„๊ฐ„๋‹ค 

: ํ”„๋กœ์„ธ์Šค -> ์ดˆ๊ธฐ์— ํ•˜๋‚˜์˜ ์‹œ์ž‘ ์“ฐ๋ ˆ๋“œ๋ฅผ ๊ฐ€์ง

: ์“ฐ๋ ˆ๋“œ๋Š” ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ ์“ฐ๋ ˆ๋“œ ์ƒ์„ฑ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ง€์‹œํ•จ

: ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๋Š” ์ž์‹  ๊ณ ์œ ์˜ ์Šคํƒ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , Data์™€ Code, Heap์„ ๊ณต์œ ํ•จ

: ์“ฐ๋ ˆ๋“œ๋Š” CPU์—์„œ ํ•˜๋“œ์›จ์–ด์ ์œผ๋กœ ๊ด€๋ฆฌ๋จ (x86)

 

 

 

- ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ณต์œ 

#include <iostream>
#include <thread>
using namespace std;

int a;
void func()
{
	for (int i = 0; i < 10; ++i) {
		a = a + i; 
		cout << " a = " << a << ", i = " << i << endl;
	}

}
int main()
{
	thread child1(func);
	thread child2(func);
	func();
}
 
๊ฒฐ๊ณผ๊ฐ’

 

์•„๋ž˜์˜ ๊ทธ๋ฆผ์—์„œ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ๊ตฌํ˜„ ์‹œ ์Šคํƒ์ด ์—ฌ๋Ÿฌ๊ฐœ ๋งŒ๋“ค์–ด์ง€๋ฉด์„œ (local์— ๋ณ€์ˆ˜๋ฅผ ๋งŽ์ด ๋‘๋ฉด์„œ) ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง. ์˜ˆ์ „์—” ํฐ ๋ฌธ์ œ์˜€์œผ๋‚˜ ์ตœ๊ทผ 64๋น„ํŠธ๋กœ ๋Š˜์–ด๋‚˜๋ฉฐ ์‚ฌ์†Œํ•œ ๋ฌธ์ œ๋กœ ๋ณ€ํ™”.

 

a์˜ ๊ฐ’์€ ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•˜๋‚˜ i์˜ ๊ฐ’์€ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  ์“ฐ๋ ˆ๋“œ์—์„œ ๋‹ค๋ฅธ ๊ฐ’์ด ๋‚˜์˜ด

๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ

 

 

- ์“ฐ๋ ˆ๋“œ์˜ ์žฅ๋‹จ์ 

(๋ฉด์ ‘) ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์•ผํ•˜๋Š”๋ฐ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋ฉ€ํ‹ฐํ”„๋กœ์„ธ์Šค๋ณด๋‹ค ๋ญ๊ฐ€ ๋” ์ข‹์€๊ฐ€?

- ์žฅ์  : ์ƒ์„ฑ Overhead๊ฐ€ ์ ๋‹ค, Context Switch Overhead๊ฐ€ ์ ๋‹ค(Virtual memory), ์“ฐ๋ ˆ๋“œ ๊ฐ„์˜ ํ†ต์‹ ์ด ๊ฐ„๋‹จํ•˜๋‹ค(๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ฝ๊ณ  ์“ฐ๋Š” ๊ฒƒ์œผ๋กœ ๋๋‚จ, ํ”„๋กœ์„ธ์Šค ํ†ต์‹ ์€ ์šด์˜์ฒด์ œ์—๊ฒŒ ์š”์ฒญ์„ ํ•ด์•ผํ•ด์„œ ๋ณต์žกํ•˜๋‹ค ๋ณผ ์ˆ˜ ์žˆ์Œ)

- ๋‹จ์  : ํ•˜๋‚˜์˜ ์“ฐ๋ ˆ๋“œ์—์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ๊ฐ€ ์ „์ฒด ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ฉˆ์ถ”๊ฒŒ ํ•œ๋‹ค(๋‹จ์ ์ด๋ผ ๋ณผ ์ˆ˜ ์—†๊ณ ), ๋””๋ฒ„๊น…์ด ์–ด๋ ต๋‹ค(์ด๊ฒŒ ๋‹จ์ !)

 

 

 

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

: ๋ฉ€ํ‹ฐ ์ฝ”์–ด CPU(ํ•œ ๊ฐœ ์ด์ƒ์˜ ์ฝ”์–ด๋กœ ๊ตฌ์„ฑ๋œ CPU)์—์„œ์˜ ํ”„๋กœ๊ทธ๋žจ ์„ฑ๋Šฅ ํ–ฅ์ƒ

: ๋ฉ€ํ‹ฐ CPU ์ปดํ“จํ„ฐ์—์„œ์˜ ํ”„๋กœ๊ทธ๋žจ ์„ฑ๋Šฅ ํ–ฅ์ƒ

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

( ๋ถ„์‚ฐ ์ปดํ“จํ„ฐ, ์‹ฑ๊ธ€ ์ฝ”์–ด, ํ”„๋กœ๊ทธ๋žจ์„ ๋ชจ๋“ˆํ™”ํ•ด์„œ ์•Œ์•„๋ณด๊ธฐ ์‰ฝ๊ฒŒ? -> X )

 

 

 

- ๋ฉ€ํ‹ฐ์ฝ”์–ดํ”„๋กœ์„ธ์„œ

: ํด๋Ÿญ ์†๋„ ๋ฐœ์ „์—๋Š” ๋ฐœ์—ด์ด๋ผ๋Š” ํ•œ๊ณ„ ์กด์žฌ.. ๊ทธ๋Ÿฌ๋ฉด?

: ์ฝ”์–ด (ALU + Register + CU + Cache) -> CPU๋ž‘ ๋˜‘๊ฐ™์Œ

: ๋ฉ€ํ‹ฐ์ฝ”์–ด CPU -> ํ•˜๋‚˜์˜ ์นฉ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ”„๋กœ์„ธ์„œ๋ฅผ ๊ฐ™์ด ๋„ฃ์€ ๊ฒƒ

: ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•  ๋•Œ ์ „ํ˜€ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์„ ์‚ฌ์šฉํ•ด์•ผ ํ•จ -> ๋””๋ฒ„๊น… ๋‚œ์ด๋„ UP