πŸ€“ Study/MultiThread

[01μ£Όμ°¨A] λ©€ν‹°μ“°λ ˆλ“œ ν”„λ‘œκ·Έλž˜λ° μ†Œκ°œ

GAMEMING 2024. 3. 12. 22:38
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