728x90

1. ν”„λ‘œμ„ΈμŠ€ vs μŠ€λ ˆλ“œ

- ν”„λ‘œμ„ΈμŠ€ : μ‹€ν–‰ 쀑인 ν”„λ‘œκ·Έλž¨
- μŠ€λ ˆλ“œ : ν”„λ‘œμ„ΈμŠ€ λ‚΄λΆ€μ—μ„œ μ‹€ν–‰λ˜λŠ” μž‘μ—… λ‹¨μœ„

κ²Œμž„ κ°œλ°œμ—μ„œ μ–΄λ–»κ²Œ μ“°μΌκΉŒ?

κ²Œμž„μ—”μ§„μ€ λ©€ν‹°μŠ€λ ˆλ”©μ„ μ‚¬μš©ν•΄μ„œ μ—¬λŸ¬ μž‘μ—…μ„ λ™μ‹œμ— 싀행함
- λ Œλ”λ§ μŠ€λ ˆλ“œ : κ·Έλž˜ν”½ μ—°μ‚° λ‹΄λ‹Ή
- 물리 엔진 μŠ€λ ˆλ“œ : 좩돌 감지 캐릭터 μ›€μ§μž„ 계산
- AI μŠ€λ ˆλ“œ : NPC 행동 μ—°μ‚°
- μ˜€λ””μ˜€ μŠ€λ ˆλ“œ : λ°°κ²½μŒμ•…κ³Ό 효과음 처리
λ©€ν‹°μŠ€λ ˆλ”©μ„ 잘λͺ» μ“°λ©΄?
- 데이터 좩돌(레이슀 μ»¨λ””μ…˜)이 λ°œμƒ
- 동기화 문제둜 인해 μ„±λŠ₯ μ €ν•˜
ν•΄κ²° 방법 : 락(lock) μ΅œμ†Œν™”, μ“°λ ˆλ“œ μ•ˆμ „ν•œ 데이터 ꡬ쑰 μ‚¬μš©

2. μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­κ³Ό μ˜€λ²„ν—€λ“œ

- μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­(Context Switching) : CPUκ°€ μ—¬λŸ¬ μž‘μ—…μ„ λ²ˆκ°ˆμ•„ μ‹€ν–‰ν•  λ•Œ, μž‘μ—… κ°„ μ „ν™˜μ„ μœ„ν•œ μ €μž₯/볡ꡬ κ³Όμ •
- ν•˜λ‚˜μ˜ CPUκ°€ μ—¬λŸ¬ 개의 μž‘μ—…(ν”„λ‘œμ„ΈμŠ€ λ˜λŠ” μŠ€λ ˆλ“œ)을 μ‹€ν–‰ν•  λ•Œ, ν˜„μž¬ μž‘μ—…μ˜ μƒνƒœ(Context)λ₯Ό μ €μž₯ν•˜κ³  λ‹€μŒ μž‘μ—…μ˜ μƒνƒœλ‘œ λ³€κ²½ν•˜λŠ” κ³Όμ •
- 운영체제(OS)κ°€ μž‘μ—…μ„ 효율적으둜 λΆ„λ°°ν•˜κΈ° μœ„ν•΄ μˆ˜ν–‰ν•¨

μ»¨ν…μŠ€νŠΈ(Context)λž€?

- CPUκ°€ ν˜„μž¬ μ‹€ν–‰ 쀑인 μž‘μ—…μ˜ μƒνƒœ 정보λ₯Ό λœ»ν•¨
- ν¬ν•¨λ˜λŠ” 정보
  - ν”„λ‘œκ·Έλž¨ μΉ΄μš΄ν„°(ν˜„μž¬ μ‹€ν–‰ 쀑인 λͺ…λ Ήμ–΄ μœ„μΉ˜)
  - CPU λ ˆμ§€μŠ€ν„° κ°’
  - λ©”λͺ¨λ¦¬ 맀핑 정보
  - μŠ€μΌ€μ₯΄λ§ 정보

μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­ κ³Όμ •

μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­μ€ CPUκ°€ λ‹€λ₯Έ μž‘μ—…μ„ μ‹€ν–‰ν•  λ•Œ λ°˜λ“œμ‹œ 거쳐야 ν•˜λŠ” κ³Όμ •
1. ν˜„μž¬ μ‹€ν–‰ 쀑인 μŠ€λ ˆλ“œ/ν”„λ‘œμ„ΈμŠ€μ˜ μƒνƒœλ₯Ό μ €μž₯ (PCB : Process Control Block)
2. μƒˆλ‘œμš΄ μŠ€λ ˆλ“œ/ν”„λ‘œμ„ΈμŠ€λ₯Ό 선택 (μŠ€μΌ€μ€„λŸ¬κ°€ κ²°μ •)
3. μƒˆλ‘œμš΄ μž‘μ—…μ˜ μƒνƒœλ₯Ό λΆˆλŸ¬μ™€ μ‹€ν–‰
이 κ³Όμ •μ—μ„œ CPU의 계산 μ‹œκ°„μ΄ λ‚­λΉ„λ˜κΈ° λ•Œλ¬Έμ— μ˜€λ²„ν—€λ“œκ°€ λ°œμƒν•¨

κ²Œμž„ κ°œλ°œμ—μ„œ μ–΄λ–»κ²Œ 영ν–₯을 μ€„κΉŒ?

κ²Œμž„μ€ μ—¬λŸ¬ 개의 μŠ€λ ˆλ“œλ₯Ό μ‚¬μš©ν•˜μ§€λ§Œ, κ³Όλ„ν•œ μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­μ΄ λ°œμƒν•˜λ©΄ μ„±λŠ₯이 μ €ν•˜λ¨
- AI, 물리 엔진, λ Œλ”λ§μ΄ λ™μ‹œμ— 싀행될 λ•Œ μ»¨ν…μŠ€νŠΈ μŠ€μœ„μΉ­μ΄ λ„ˆλ¬΄ 많으면 CPU μ‹œκ°„μ΄ 낭비됨
μ΅œμ ν™” 방법
- μŠ€λ ˆλ“œ 개수λ₯Ό μ μ ˆν•˜κ²Œ μœ μ§€ (λ„ˆλ¬΄ 많으면 μ˜€λ²„ν—€λ“œ 증가)
  - 물리 μ½”μ–΄ μˆ˜λ³΄λ‹€ λ§Žμ€ μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜λ©΄ μ„±λŠ₯ μ €ν•˜κ°€ 심해짐
- μž‘μ—…μ„ κ·Έλ£Ήν™”ν•˜μ—¬ ν•œ λ²ˆμ— μ‹€ν–‰ (μΊμ‹œ 미슀λ₯Ό 쀄이기 μœ„ν•΄)

3. 동기(Synchronous) vs. 비동기(Asynchronous) μ—°μ‚°

- 동기 방식 : ν•˜λ‚˜μ˜ μž‘μ—…μ΄ λλ‚˜μ•Ό λ‹€μŒ μž‘μ—…μ„ μ‹€ν–‰
- 비동기 방식 : μ—¬λŸ¬ μž‘μ—…μ„ λ™μ‹œμ— μ‹€ν–‰ κ°€λŠ₯

κ²Œμž„ κ°œλ°œμ—μ„œ μ–΄λ–»κ²Œ μ“°μΌκΉŒ?

κ²Œμž„μ—μ„œ λ‘œλ”©μ„ μ΅œμ ν™”ν•˜κΈ° μœ„ν•΄ 비동기 λ‘œλ”©(Async Loading)을 ν™œμš©ν•¨
- ν…μŠ€μ²˜, 였브젝트λ₯Ό 비동기 λ‘œλ“œν•˜λ©΄ ν”„λ ˆμž„ λ“œλž 없이 진행 κ°€λŠ₯
- λ„€νŠΈμ›Œν¬ 톡신(λ©€ν‹°ν”Œλ ˆμ΄ κ²Œμž„)μ—μ„œ μ„œλ²„ 응닡을 기닀리지 μ•Šκ³  UIλ₯Ό 계속 μ—…λ°μ΄νŠΈ κ°€λŠ₯
예제(Unity, Unreal)
- Unity : Resources.LoadAsync()
- Unreal Engine : Async Loading System
비동기 λ‘œλ”©μ„ 잘λͺ» μ“°λ©΄?
- 비동기 μž‘μ—… κ°„ μš°μ„ μˆœμœ„ 문제 λ°œμƒ
- λ©”λͺ¨λ¦¬ λΆ€μ‘±μœΌλ‘œ ν¬λž˜μ‹œ λ°œμƒ κ°€λŠ₯
ν•΄κ²° 방법 : ν•„μš” μ—†λŠ” λ¦¬μ†ŒμŠ€λŠ” μ¦‰μ‹œ μ–Έλ‘œλ“œ

4. μΊμ‹œ λ©”λͺ¨λ¦¬μ™€ μΊμ‹œ 미슀(Cache Miss)

- CPU μΊμ‹œ(Cache Memory) : 자주 μ‚¬μš©ν•˜λŠ” 데이터λ₯Ό λΉ λ₯΄κ²Œ μ ‘κ·Όν•˜κΈ° μœ„ν•œ μ΄ˆκ³ μ† λ©”λͺ¨λ¦¬
- μΊμ‹œ 미슀(Cache Miss) : CPUκ°€ μ›ν•˜λŠ” 데이터가 μΊμ‹œμ— 없을 λ•Œ RAMμ—μ„œ κ°€μ Έμ˜€λŠ” 상황 (속도 μ €ν•˜)

κ²Œμž„ κ°œλ°œμ—μ„œ μ–΄λ–»κ²Œ μ΅œμ ν™”ν• κΉŒ?

CPU μΊμ‹œλ₯Ό 효율적으둜 μ‚¬μš©ν•˜λ©΄ ν”„λ ˆμž„ λ“œλžμ„ 쀄일 수 있음
- μ—°μ†λœ 데이터 ꡬ쑰(λ°°μ—΄) μ‚¬μš© -> λ©”λͺ¨λ¦¬ μ ‘κ·Ό 속도 ν–₯상
- ꡬ쑰체 크기 μ΅œμ ν™” -> μΊμ‹œ 라인에 맞게 데이터 배치

λΉ„νš¨μœ¨μ μΈ μ½”λ“œ(μΊμ‹œ 미슀 λ°œμƒ κ°€λŠ₯)

struct Data{
	int id;
	float posX,posY,posZ;
};
Data data[1000];

- λ©”λͺ¨λ¦¬ μƒμ—μ„œ λΆˆκ·œμΉ™ν•œ 배치

μΊμ‹œ μΉœν™”μ  μ½”λ“œ

struct Data{
	int ids[1000];
	float posX[1000],posY[1000],posZ[1000];
};
Data data;

- 데이터λ₯Ό μ—°μ†λœ λ°°μ—΄λ‘œ μ €μž₯ν•˜λ©΄ CPU μΊμ‹œ 효율이 증가함

λ°˜μ‘ν˜•

+ Recent posts