SlideShare une entreprise Scribd logo
1  sur  54
면접 대비를 위한 베이스
기초지식
데브루키 박수찬(ACA)
벡터
벡터란?
벡터 : 크기와 방향만을 가진 값.
벡터 공간 : 벡터에 대해 정의된 연산
법칙(덧셈, 스칼라 배수)이 적용되는
공간
(x, y, z)
벡터의 한계점 : 크기와 방향만을 가졌기 때문에, 위치를 표
현할 수 없다.
즉 게임의 오브젝트를 벡터만으로는 표현할 수 없다.
P = (𝑃𝑥, 𝑃𝑦, 𝑃𝑧)
그래서 ‘점(point)’을 더했습니다.
즉 벡터 공간에 점의 개념을 추가한 공간이 아핀 공간.
우리가 흔히 사용하는 좌표계(데카르트 좌표계)과
똑같이 사용합니다.
벡터란?
(2,2,
1)
(3,1,5)
아핀 공간에서의 점과 벡터의 연
산
점 + 점은 아핀 공간에서 사용할 수
없다.
(3,1,5)
(2,2,
1)
V = (1, -
1, 4)
1. 𝑃 ± 𝑉 = 𝑃
2. 𝑉 ± 𝑉 = 𝑉
3. 𝑃 − 𝑃 = 𝑉
벡터란?
1. 𝑃 ± 𝑉 = 𝑃
2. 𝑉 ± 𝑉 = 𝑉
3. 𝑃 − 𝑃 = 𝑉2 5 1 − 2 5 0
= 0 0 1
점 – 벡터 = 점
2 5 0 + 2 5 0
= 4 10 0
벡터 + 벡터 = 벡터
이제 아핀 공간에서 점과 벡터를 구분할 수 있다.
W = 1이면 점, w= 0이면 벡터
벡터란?
벡터의 내적
내적(Dot Product, 스칼라곱)
𝐴 ∙ 𝐵 = | 𝐴| ∗ 𝐵 ∗ cos 𝜃
방향을 가지지 않는 스칼라(Scalar)값이며,
여러가지 용도로 쓰인다.
https://www.falstad.com/dotproduct/
벡터의 내적
내적을 이용한 벡터의 투영(사영)
A dot B = |A|*|B|*cosθ
스칼라값
= 단, B는 단위벡터
내적의 사용예시
1. 상대가 내 앞에 있을까?
𝜃
𝐵 = Foward vector
𝐴 = 𝑒𝑛𝑒𝑚𝑦 − 𝑚𝑒
A dot B = |A|*|B|*cosθ
내적값이 앞에 있다면 양수, 뒤에 있다면 음수
2. 사이각 𝜃 와 시야벡터 2개가 주어질 때 상대가 시야 내에 있는지
확인하는 법을 서술하세요.
𝜃 = 60°
cos60 = 1/2이므로,
내적값이 0.5보다 크면
시야각 안에 존재한다.
A dot B =
|A|*|B|*cosθ
A와 B가 단위벡터라면,
A dot B =
|1|*|1|*cosθ
내적의 사용예시
내적의 사용예시
𝜃 = ?
‘마비노기 영웅전’의 보스 라바스타드
3. 사이각의 각도를 모를 때, 사이각을 구하는 법을 서술
하세요
내적의 사용예시
3. 사이각의 각도를 모를 때, 사이각을 구하는 법을 서술
하세요
𝜃 = ?
A dot B = |A|*|B|*cosθ
cos θ = x 라면, cos−1
𝑋 = θ
즉 두 벡터를 알면
arccos(A dot B) = θ 로 사이각을 구할 수 있다.
A B
내적의 사용예시
4. 난반사광(Diffuse Light) 계산
𝐼𝑖 = 입사광의 세기
𝑘𝑑 = 확산반사율
(상수)
L : 입사광
N : 표면의 법선벡터
내적의 사용예시
5. 문제 : 입사벡터 P와 표면의 법선벡터 N이 있을 때 반사벡터 R을 구하시오
입사벡터 P
반사벡터 R
표면의 법선벡터 N
내적의 사용예시
입사벡터 P
표면의 법선벡터 N
입사벡터 -P
표면의 법선벡터 N(단위벡터)
(−𝑃 ∙ 𝑁 ) ∗ 𝑁
스칼라 * 벡터 = 벡터
5. 문제 : 입사벡터 P와 표면의 법선벡터 N이 있을 때 반사벡터 R을 구하시오
내적의 사용예시
입사벡터 P
표면의 법선벡터 N
입사벡터 P
입사벡터 P
입사벡터 P
(−𝑃 ∙ 𝑁 ) ∗ 𝑁 ∗ 2
즉 반사벡터 R = P + 2(−𝑃 ∙ 𝑁 ) ∗ 𝑁
5. 문제 : 입사벡터 P와 표면의 법선벡터 N이 있을 때 반사벡터 R을 구하시오
벡터의 외적
외적(Cross Product, 벡터곱)
| 𝐴 × 𝐵 | = 𝐴 ∗ |𝐵| sin 𝜃
교환법칙 성립 안함(역벡터가 된다)
분배법칙 성립함
결과물은 두 벡터에 수직한 벡터가
된다
DirectX, Unity, Unreal : 왼손 좌표계
OpenGL, 3ds Max : 오른손 좌표계
벡터의 외적
1. 두 벡터의 외적은 수직임을 이용하여 카메라의 기저벡터를 구하는 법을 서술하세요.
벡터의 외적
2. 상대가 나의 왼쪽에 있는지 오른쪽에 있는지 판별
Forward
vector
Forward
vector
enemy
me
컴퓨터
벡터 vs 리스트
각종 컨테이너들의 특징
Vector : 연속된 자료구조이므로 캐시 친화적, Capacity 변경 가능(Dynamic array), 임의 접근 반복자
List : 삽입, 삭제에 유리함.
Hash : 탐색이 O(1)로 매우 빠름.
Map : 균형 트리로 구성되어 탐색에 유리함, 삽입/삭제에 불리
캐시 친화적?
캐시란?
너무 멀고, 느리다.
CPU 칩 안에 있는 레지스터에서 데이터를 가져오는 시간 : 1~2 cycle
DRAM에서 데이터를 가져오는 시간 : 100~ cycle
캐시는 중간 병목을 완화해주는 완충장치
기본적인 컨셉 : 메인 메모리는 느릴 뿐더러, CPU<->메모리엔 병목이 발생한다. 그렇
다면
‘다음에 사용할 것 같은‘ 요소들을 더 빠른 메모리에 미리 저장해 두자.
빠름
느림
시간적 지역성(Temporal Locality) :
한 번 참조된 메모리 주소는 이후 다시 참조될 가능성이 높다
공간적 지역성(Spatial Locality) :
한 번 참조된 메모리 주소의 주변은 이후 참조될 가능성이 높
다
특히 I/O 작업에서 혁신적인 속도 상승!
멜트다운 버그의 원인이 되기도..
캐시란?
프로세스와 스레드
프로세스와 스레드의 차이점은?(K)
프로세스 : 실행 중인 각각의 프로그램(feat. 공룡책)
‘각각’의 프로그램이므로, 알집이 5개 켜져 있다면 각각
의 알집들은 다른 프로세스로 취급된다.
- 가상 메모리를 사용하며, 그로 인해 독립적인 메모리 공간을 보장받
는다
- 스레드보다 무겁다(생성/삭제 시 가상 메모리 확보 및 할당, 프로세
스 세팅 등..)
- 락 문제에서 자유롭다
프로세스와 스레드
스레드 : CPU 이용의 기본 단위
- 레지스터, 스택 메모리 영역을 제외한 메모리(데이터, 힙 등..)을 공유한
다.
- 그렇기 때문에 경제적이고 빠르지만, 락 문제가 존재한다.(30배 이상)
코드 영역 : 프로그램의 명령어들이 적재됨
스택 영역 : 지역 변수, 멤버 변수, 함수의 파라미터,
리턴 주소값 등이 저장됨
힙 영역 : 동적 할당한 메모리가 저장됨
데이터 영역 : 전역변수, static 변수 등이 저장됨
프로세스와 스레드의 차이점은?(K)
컨텍스트 스위칭(K)
많은 프로세스, 스레드들이 한정된 CPU 자원을 사용할
때, 실제로 CPU 계산 자원이 많이 필요한 부분은 극히
일부이다.
(대개 전체의 약 4%)
그렇기 때문에, CPU가 놀지 않으려면 계속해서 새로운
스레드가 CPU자원을 할당받아야 한다.
이를 위해 CPU를 이용한 계산을 끝낸 스레드와 계산이
필요한 스레드를 서로 교체하는 것이 문맥 교환
(Context Switcing)이다.
Ex) CPU 자원을 다 사용했을 때, I/O를 요청했을 때
(I/O는 느리다!)
프로세스와 스레드
문맥(Context)
프로세스와 스레드
프로세스/스레드가 자원을 반납하고, 이후에
다시 사용할 때 기억해놓아야 할 정보들
PCB(Process Control Block), TCB(Thread Control
Block)에 저장된다.
문맥 교환이 일어나는 조건
1. I/O 요청이 들어왔을 때
2. 스레드가 CPU 연산을 마치고 반납할 때
3. 기타 OS가 상황을 보고 필요할 때..
== 예측할 수 없다. 스레드의 경우 락 문제를 염
두에 두어야 함(프로세스는 데드락이 일어나지 않
음)
스케줄링
프로세스/스레드 스케줄링(S, K)
그렇다면, 이렇게 스레드를 교체하면 다음 CPU 자원을 가져갈 스레드는 누구일까?
그것을 정하기 위한 것이 스케줄링 정책(Policy)/알고리즘이다.
FCFS(First Come Fisrt Serve) : 선착순
RR(Round-Robin) : 시분할 방식, 모든 프로세스/스레드를 같은 단위로 나누어 수행
SJF/SRJF(Shortest (Remain) Job First) : 가장 빨리 끝나는 프로세스/스레드에 우선순위를 주어 먼저 수행
Lottery : 랜덤게임 랜덤게임
이 외에도 많은 정책이 있
다.
질문 : 어떤 정책을 선택해야 할까?
스케줄링
우선순위 정책의 한계 – Starvation(기아 상태)
- 만약 낮은 우선순위 스레드가 대기중인데, 끊임없이 높은 우선
순위 스레드가 들어온다면 어떻게 될까?
- 영원한 대기상태…
해결 방법의 예시 – aging
오래 대기할 수록 우선순위를 높여준다.
프로세스와 스레드
멀티스레드 환경에서 나타날 수 있는 문제 – Deadlock, Data race
데드락 : 각각의 스레드가 자원을 하나씩만 들고 서로의 자원
을 반납하기를 기다리는 상태(서로의 자원이 필요하다)
Deadlock ⊂ Starvation
OS가 관여하지 않으면 영원히 지속되므로, 프로그램이 멈추
게 된다.
게임에선 치명적인 문제.
프로세스와 스레드
1. mutual exclusion -> 상호 배제가 있어야 데드락이 발생한다. (어떤 자원
이 한순간 하나의 쓰레드만 사용할 수 있을 경우) 한 순간 하나의 자원을
내가 독점적으로 획득, 이용하고 내가 자발적으로 release하기 전까지는 같
은 자원을 공유할 수 없다.
2. hold & wait -> 자원 하나를 점유하였으면, 원하는 자원을 다 점유할 때
까지 무한정 대기한다.
3. no preemption -> preempt(뺏을 수 있는 상태, 선점가능한) 하지 않아
야 한다. 즉 스레드가 자발적으로 내려놓기 전까지는 스레드가 가진 자원
을 빼앗을 수 없다.
4. Circular wait ->
나는 오른쪽이 가진 자원을 기다리고,. 오른쪽은 오른쪽의 오른쪽이 가진
자원을 기다리고, 오른쪽의 오른쪽은... 결국 내가 가진 자원을 기다리는 것
같이 일종의 cycle이 생긴다.
데드락의 4가지 필요조건
Circular wait의 예시
‘필요조건’이기 때문에 하나라도 회피할 수 있으면 데드락이 일어나지 않는다. 그리고 이 네 가지가 모두
충족된다고 해서 데드락이 반드시 일어나는것도 아니다.
프로세스와 스레드
필요조건과 충분조건
프로세스와 스레드
OS가 수행하는 데드락의 해소 방법
1. Detection & Recovery
데드락 판별 알고리즘을 사용하여 데드락이 발생했는지
여부를 판단한 뒤, 발생했다고 판단되면 회복시킨다
2. Prevention / Avoidance
데드락이 아예 발생하지 않는 방향으로 수행시킨다.
(데드락이 발생할 수 있는 필요조건을 회피한다)
3. ignore
데드락 발생을 무시하거나, 응용 프로그래머에게 데드락
회피를 맡긴다.
프로세스는 일반적으로 데드락이 발생하지 않는다. 애초에 자원을 공유하지 않기 때문
(단, IPC 등을 하면서 자원을 공유하면 문제가 생길 수 있음)
Q. 현대의 운영체제는 어떤 방식을 사용할까?
프로세스와 스레드
애초에 응용 프로그래머가 잘 설계 해야 한다.
Lock, Mutex, Critical Section등을 잘 이용하여 자원 하나에 여러 스레드가 동시에 점유를 시도하지 않도록 설계
한 자원은 한 스레드만 이용할 수 있게 애초에 논리를 분리
OS가 수행하는 데드락의 해소 방법
1. Detection & Recovery
데드락 판별 알고리즘을 사용하여 데드락이 발생했는지
여부를 판단한 뒤, 발생했다고 판단되면 회복시킨다
2. Prevention / Avoidance
데드락이 아예 발생하지 않는 방향으로 수행시킨다.
(데드락이 발생할 수 있는 필요조건을 회피한다)
3. ignore
데드락 발생을 무시하거나, 응용 프로그래머에게 데드락
회피를 맡긴다.
프로세스와 스레드
멀티스레드 환경에서, 해당 코드의 문제점은? (K)
프로세스와 스레드
가장 간단해보이는 덧셈마저도 하나의 명령어로 이루어져있
지 않다. 그렇기 때문에 멀티스레드에서 해당 코드를 실행하
면 100000이 아닌 값이 나오게 된다.
데이터 레이스(Data Race)
해결 방법
1. Lock을 적절히 사용하여 계산 중에는 다른 스레드가 사용할 수 없게 만듦.
2. Atomic 변수로 만들어서 연산
주의 : Lock이나 Atomic 둘 다 성능 비용이 높다.
메모리 단편화에 대해 설명하고 해결책을 말하세요(P)
30
15
20
15
21
메모리는 충분한데 연속적인 메모리를 넣을 수가 없네..
(ex. 배열, 벡터)
외부 단편화
메모리
단편화(斷片化, fragmentation)는 기억 장치의 빈 공간 또는 자료가 여러 개
의 조각으로 나뉘는 현상을 말한다. -위키백과
메모리 단편화에 대해 설명하고 해결책을 말하세요(P)
4
3
4
4만큼 할당됨
4만큼 할당됨
4만큼 할당됨
내부 단편화
4만큼씩 할당받아서 썼더니 중간에 공간이 남네…
메모리
메모리
프로그래머의 해결법
메모리 풀(memory pool)은 고정된 크기의 블록을 할당하여 malloc이나 C++의 new 연산자와 유사한 메모리 동적 할당을 가능하
게 해준다. malloc이나 new 연산자 같은 기능들은 다양한 블록사이즈 때문에 단편화를 유발시키고, 파편화된 메모리들은 퍼포
먼스 때문에 실시간 시스템에서 사용할 수 없게 된다. 좀더 효율적인 방법은 memory pool이라고 불리는 동일한 사이즈의 메모
리 블록들을 미리 할당해 놓는 것이다.
- from 위키백과
장점 : 단편화를 완화할 수 있다.
빈번한 할당,해제에서 new를 통해 생성할 필요가 없으므로 비용상 이점이 있다.
단점 : 메모리를 직접 관리해야 하므로, 모든 관리에 필요한 노동과 책임은 프로그래머에게 가게 된다.
사용하지 않을 때도 풀을 유지해야 하므로, 메모리 낭비가 생긴다.
메모리
OS, GC의 해결법
통합(Coalescing) : 인접해 있는 단편화가 된 공간을 하나의 공간으로 통합한다.
압축(Compaction) : 분산되어 있는 단편화가 된 빈 공간을 결합하여 하나의 큰 가용 공간을 만든다.
메모리
OS의 해결법
페이징(Paging), 세그멘테이션(Segmentation) 기법을 사용해 해결한다.
근데, 페이징이 뭐지?
그걸 알려면 우선..
메모리
가상 메모리
1. 내 컴퓨터의 램 용량이 2기가밖에 없다면 해당 코드는 오류가 날까?
2. 내 컴퓨터의 램 용량이 1.5기가인데, 다른 프로세스에서 1기가를 쓰
고 있다면 해당 코드는 오류가 날까?
메모리
가상 메모리
1. 네, 오류납니다.
- 32bit exe 프로세스의 ‘유저 영역’ 용량은 2GB가 최대 한도입니다.
- 2GB를 넘기면 new의 경우 bad_alloc을 리턴합니다.
메모리
가상 메모리
- 32bit exe 프로세스의 프로세스당 ‘유저 영역’ 용량은 2GB가 최대 한도입니다.
- 2GB를 넘기면 new의 경우 std::bad_alloc을 리턴합니다.
2. 안 납니다. 64bit에서는요.
3. 이론적으로는 절대 나지 않습니다.
1. 네, 오류납니다.
- 하지만 엄청나게 느려집니다.
메모리
OS (커널)
프로세스 1
총 메모리 용량 : 4GB
“난 4GB 메모리를 가
지고 있어!”
프로세스 2
“난 4GB 메모리를 마
음대로 쓸 수 있어!”
프로세스 3
“난 4GB 메모리를
전부 가지고 있어!”
그래 다 가져다 써라..
각자의 프로세스들은 자신이 PC가
가진 ‘모든'메모리를 다 자유롭게 사용
할 수 있다고 생각하며, 실제로 프로그
래머들 또한 구글 크롬이 먹을 메모리를
염두에 두면서
코딩하진 않는다.
메모리
가상 메모리 때문입니다.
OS가 메모리를 할당할 때 실제 메모리 주소로 직접 할당하지 않고
프로세스별로 가상 메모리 주소공간을 각각 따로 만들어서 제공한다.
가상 주소는 실제 메모리 주소와 1:1로 매핑된다.
- 가상 주소이므로, 서로 다른 프로세스가 같은 주소값을 참조해도 다
른 물리 주소값을 참조하게 된다. 즉 가상 메모리의 주소값은 프로세
스별로 독립적이다.
(데이터 안정성. 이 때문에 히오스 프로세스와 롤 프로세스가 실행되
어 있어도 히오스 프로세스는 롤의 고퀄리티 스킨 데이터
를 멋대로 가져올 수 없다.)
- 데이터가 실제 메모리에 들어있지 않아도 사용할 수 있다.
(물리 메모리에 없으면 필요 시에 디스크에서 읽어온다)
- 2의 이유로 인해, 실제 메모리보다 큰 데이터를 가져오거나, 다른 프
로세스에서 메모리를 모두 점유하고 있어도 자신이 필요한 데이터를
사용할 수 있다.
가상 메모리를 지원하지 않아 프로그래머가 메모리 범위를 직접 잡고 할당해야
했던 MSDOS의 COM 파일 확장자.
예전엔 mp3 플레이어를 틀었는데 작업중이던 PPT가 날아가는 것 같은 경우가
흔했다고…
메모리
페이징
가상 메모리를 일정 크기로 나누어 저장한다.
가상 주소 <-> 물리 주소 를 수행하는 테이블을
만들고, 실제 메모리 정보가 필요할 때 페이지
테이블을 참조하여 물리 주소를 찾는다.
가상 메모리의 ‘페이지'와 물리 메모리의 ‘프레
임은 1:1로 매핑된다.
메모리
그래서 뭐가 좋은데?
1. 물리적으로 비연속적인 메모리라 해도, 가상메모리에서 연속적으로 만들
면 된다.
2. 이렇게 메모리를 각각의 페이지로 나누어 따로 저장하기 때문에, 외부 단
편화 문제가 해결된다.
물리메모리가상메모리
각 칸이 하나의 페이지
1
2
3
4
다른 부분에서
사용하는 메모
리
2
4
3
1
만약 int array[4]라고 가정하면..
.
.
.
메모리
그래서 뭐가 좋은데?
1. 물리적으로 비연속적인 메모리라 해도, 가상메모리에서 연속적으로 만들
면 된다.
2. 이렇게 메모리를 각각의 페이지로 나누어 따로 저장하기 때문에, 외부 단
편화 문제가 해결된다.
페이지의 크기는 OS별로 상이하다(512byte~1GB). 단 페이지의 크기가
클 경우 내부 단편화 문제가 생길 수 있으며(큰 페이지를 쓰면 빈 공간
이 커질 수 있으므로…) 반대로 페이지의 크기가 너무 작으면 가상->
물리 주소를 변환하는 페이지 테이블이 너무 커져서 탐색에 시간이
오래 걸린다.
(페이지 테이블은 수백만개의 페이지가 있으므로 캐시나 레지스터에
보관할 수 없다. 필연적으로 메인 메모리에 위치하므로, 페이지 테이
블이 작으면 메모리 참조하겠다고 가상->물리 주소를 변환하기 위해
물리 메모리에 여러 번 들어가야 하는 아이러니가 발생)
현대의 Windows나 Linux같은 OS는 페이지의 크기를 4KB로 잡는다고
한다.
메모리
페이지 폴트와 쓰레싱(K)
만약 메인 메모리에 원하는 페이지가 없다면, 이건 결국 가상 메모리->물리 메모리
로 변환할 수 있는 경로가 없다는 뜻이고, 메인 메모리에 원하는 데이터가 올라와 있
지 않다는 뜻입니다.
이렇게 되면 결국 하드디스크에서 없는 정보를 읽어와야 합니다.
이를 페이지 폴트(Page Fault)라고 하며, 하드 디스크는 굉장히 느린 저장장치이므로
심각한 성능 저하를 일으킵니다.
메모리
페이지 폴트와 쓰레싱(K)
만약 너무 많은 프로세스를 동시에 돌리거나, 메모리를 너무 많이 할당받으면 어떻
게 될까?
1. 메인 메모리에 올라올 수 있는 데이터는 한계가 있으므로, 새로운 요청을 하는 프
로세스에서 페이지 폴트가 일어난다.
2. 그러면 그 페이지 데이터를 디스크에서 가져와야 한다. 이때 메모리에 공간이 없
다면 이 페이지는 기존의 페이지를 내쫓고 들어가게 된다.
3. 다음 프로세스는 쫓겨난 이 페이지를 참조하려다 또 페이지 폴트가 발생한다.
4. 그 다음 프로세스는 쫓겨난 또 다른 페이지를 참조하려다 페이지 폴트가 발생한
다.
5. 이러면서 페이지를 바꾸는데만(페이지 교체는 공짜가 아니다!) 자원을 소모하게
되고, 정작 연산에 필요한 귀중한 CPU 이용률은 떨어진다.
6. OS는 CPU를 최대한 놀게 놔두지 않으려 하므로 새로운 프로세스를 추가해서 병
렬성을 높이려 한다.
7. 혼돈과 파괴의 1~6을 반복한다.
메모리
주의 : 컴퓨터가 실제로 죽습니다.
실제로 죽어서 테스트 스크린샷을 찍는데에 실
패했다.
페이지 폴트 관측
메모리가 꽉 차자 페이지 폴트가 증가하는 것을
볼 수 있습니다.
출처 : [NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
메모리
왜 면접에서 물어보고, 왜 알고 있어야 좋을까?
출처 : [NDC2018] 당신이 '유니티'로 모바일 MMORPG를 만들 때 겪을 수 있는 이야기
출처 : [NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
대략적 구조를 알고 있어야,
메모리에 대한 이슈를 해결하거나,
효율적인 개발을 할 수 있다.
수고하셨습니다.
출처 : 공룡책(Operating System Concepts 8th Edition. Abraham Silberschatz 외)
컴퓨터 구조 및 설계(Computer Organization and Design 5th Edition. David A. Patterson 외)
[NDC 2018] 당신이 '유니티'로 모바일 MMORPG를 만들 때 겪을 수 있는 이야기
[NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
운영체제 (KOCW – 국민대학교 이시윤 교수님) <- 강의 잘하심
그 외 구글링으로 찾은 출처가 기억 안나는 여러 가지 블로그들…
Q/A

Contenu connexe

Tendances

노말 맵핑(Normal mapping)
노말 맵핑(Normal mapping)노말 맵핑(Normal mapping)
노말 맵핑(Normal mapping)
QooJuice
 
[0122 구경원]게임에서의 충돌처리
[0122 구경원]게임에서의 충돌처리[0122 구경원]게임에서의 충돌처리
[0122 구경원]게임에서의 충돌처리
KyeongWon Koo
 
Brdf기반 사전정의 스킨 셰이더
Brdf기반 사전정의 스킨 셰이더Brdf기반 사전정의 스킨 셰이더
Brdf기반 사전정의 스킨 셰이더
동석 김
 
Windows system - memory개념잡기
Windows system - memory개념잡기Windows system - memory개념잡기
Windows system - memory개념잡기
ChangKyu Song
 
5강 알파와알파소팅
5강 알파와알파소팅5강 알파와알파소팅
5강 알파와알파소팅
JP Jung
 
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
devCAT Studio, NEXON
 
[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드
[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드
[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드
MinGeun Park
 

Tendances (20)

MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현MMOG Server-Side 충돌 및 이동처리 설계와 구현
MMOG Server-Side 충돌 및 이동처리 설계와 구현
 
LockFree Algorithm
LockFree AlgorithmLockFree Algorithm
LockFree Algorithm
 
노말 맵핑(Normal mapping)
노말 맵핑(Normal mapping)노말 맵핑(Normal mapping)
노말 맵핑(Normal mapping)
 
[0122 구경원]게임에서의 충돌처리
[0122 구경원]게임에서의 충돌처리[0122 구경원]게임에서의 충돌처리
[0122 구경원]게임에서의 충돌처리
 
Brdf기반 사전정의 스킨 셰이더
Brdf기반 사전정의 스킨 셰이더Brdf기반 사전정의 스킨 셰이더
Brdf기반 사전정의 스킨 셰이더
 
멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)멀티스레드 렌더링 (Multithreaded rendering)
멀티스레드 렌더링 (Multithreaded rendering)
 
Windows system - memory개념잡기
Windows system - memory개념잡기Windows system - memory개념잡기
Windows system - memory개념잡기
 
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
 
CNN 초보자가 만드는 초보자 가이드 (VGG 약간 포함)
CNN 초보자가 만드는 초보자 가이드 (VGG 약간 포함)CNN 초보자가 만드는 초보자 가이드 (VGG 약간 포함)
CNN 초보자가 만드는 초보자 가이드 (VGG 약간 포함)
 
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
시즌 2: 멀티쓰레드 프로그래밍이 왜이리 힘드나요?
 
자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다.
자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다.자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다.
자습해도 모르겠던 딥러닝, 머리속에 인스톨 시켜드립니다.
 
5강 알파와알파소팅
5강 알파와알파소팅5강 알파와알파소팅
5강 알파와알파소팅
 
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
〈야생의 땅: 듀랑고〉 서버 아키텍처 Vol. 3
 
실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략실시간 게임 서버 최적화 전략
실시간 게임 서버 최적화 전략
 
Recast Detour.pptx
Recast Detour.pptxRecast Detour.pptx
Recast Detour.pptx
 
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이  왜 이리 힘드나요?  (Lock-free에서 Transactional Memory까지)
Ndc2014 시즌 2 : 멀티쓰레드 프로그래밍이 왜 이리 힘드나요? (Lock-free에서 Transactional Memory까지)
 
PBR 기초 이론과 사용되는 맵들 Vol.3
PBR 기초 이론과 사용되는 맵들 Vol.3PBR 기초 이론과 사용되는 맵들 Vol.3
PBR 기초 이론과 사용되는 맵들 Vol.3
 
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
전형규, M2 클라이언트 스레딩 아키텍쳐, NDC2013
 
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
[IGC2018] 유영천 개발자 - Voxel기반 네트워크 게임 최적화기법
 
[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드
[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드
[Gpg2권 박민근] 3.2 게임 객체 ai를 위한 마이크로 스레드
 

Similaire à 면접 대비 벡터, CS 개념과 사례

Tdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalabilityTdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalability
흥배 최
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
devCAT Studio, NEXON
 
Optimizing the graphics_pipeline_
Optimizing the graphics_pipeline_Optimizing the graphics_pipeline_
Optimizing the graphics_pipeline_
ozlael ozlael
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
devCAT Studio, NEXON
 

Similaire à 면접 대비 벡터, CS 개념과 사례 (20)

System+os study 5
System+os study 5System+os study 5
System+os study 5
 
프로그래머가 알아야 하는 메모리 관리 기법
프로그래머가 알아야 하는 메모리 관리 기법프로그래머가 알아야 하는 메모리 관리 기법
프로그래머가 알아야 하는 메모리 관리 기법
 
프로그래머가 몰랐던 멀티코어 CPU 이야기 - 15, 16장
프로그래머가 몰랐던 멀티코어  CPU 이야기 - 15, 16장프로그래머가 몰랐던 멀티코어  CPU 이야기 - 15, 16장
프로그래머가 몰랐던 멀티코어 CPU 이야기 - 15, 16장
 
Rankwave MOMENT™ (Korean)
Rankwave MOMENT™ (Korean)Rankwave MOMENT™ (Korean)
Rankwave MOMENT™ (Korean)
 
Tdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalabilityTdc2013 선배들에게 배우는 server scalability
Tdc2013 선배들에게 배우는 server scalability
 
Spark machine learning & deep learning
Spark machine learning & deep learningSpark machine learning & deep learning
Spark machine learning & deep learning
 
Rankwave moment™ desc3
Rankwave moment™ desc3Rankwave moment™ desc3
Rankwave moment™ desc3
 
[IGC 2017] 에픽게임즈 최용훈 - 밤낮으로 부수고 짓고 액션 빌딩 게임 만들기 - 포트나이트
[IGC 2017] 에픽게임즈 최용훈 - 밤낮으로 부수고 짓고 액션 빌딩 게임 만들기 - 포트나이트[IGC 2017] 에픽게임즈 최용훈 - 밤낮으로 부수고 짓고 액션 빌딩 게임 만들기 - 포트나이트
[IGC 2017] 에픽게임즈 최용훈 - 밤낮으로 부수고 짓고 액션 빌딩 게임 만들기 - 포트나이트
 
서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드서버 아키텍처 이해를 위한 프로세스와 쓰레드
서버 아키텍처 이해를 위한 프로세스와 쓰레드
 
임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012임태현, MMO 서버 개발 포스트 모템, NDC2012
임태현, MMO 서버 개발 포스트 모템, NDC2012
 
Optimizing the graphics_pipeline_
Optimizing the graphics_pipeline_Optimizing the graphics_pipeline_
Optimizing the graphics_pipeline_
 
초초초 (초고속 초저지연 초연결) 5G IoT 플랫폼 개발 이야기
초초초 (초고속 초저지연 초연결) 5G IoT 플랫폼 개발 이야기초초초 (초고속 초저지연 초연결) 5G IoT 플랫폼 개발 이야기
초초초 (초고속 초저지연 초연결) 5G IoT 플랫폼 개발 이야기
 
실전프로젝트 정서경 양현찬
실전프로젝트 정서경 양현찬실전프로젝트 정서경 양현찬
실전프로젝트 정서경 양현찬
 
Exploring Deep Learning Acceleration Technology Embedded in LLMs
Exploring Deep Learning Acceleration Technology Embedded in LLMsExploring Deep Learning Acceleration Technology Embedded in LLMs
Exploring Deep Learning Acceleration Technology Embedded in LLMs
 
Kubernetes
Kubernetes Kubernetes
Kubernetes
 
Image Deep Learning 실무적용
Image Deep Learning 실무적용Image Deep Learning 실무적용
Image Deep Learning 실무적용
 
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
홍성우, 게임 서버의 목차 - 시작부터 출시까지, NDC2019
 
Hadoop engineering v1.0 for dataconference.io
Hadoop engineering v1.0 for dataconference.ioHadoop engineering v1.0 for dataconference.io
Hadoop engineering v1.0 for dataconference.io
 
Hotspot JVM GC_Wh apm
Hotspot JVM GC_Wh apmHotspot JVM GC_Wh apm
Hotspot JVM GC_Wh apm
 
Java와 go 간의 병렬 프로그램 성능 비교
Java와 go 간의 병렬 프로그램 성능 비교Java와 go 간의 병렬 프로그램 성능 비교
Java와 go 간의 병렬 프로그램 성능 비교
 

면접 대비 벡터, CS 개념과 사례

  • 1. 면접 대비를 위한 베이스 기초지식 데브루키 박수찬(ACA)
  • 3. 벡터란? 벡터 : 크기와 방향만을 가진 값. 벡터 공간 : 벡터에 대해 정의된 연산 법칙(덧셈, 스칼라 배수)이 적용되는 공간 (x, y, z) 벡터의 한계점 : 크기와 방향만을 가졌기 때문에, 위치를 표 현할 수 없다. 즉 게임의 오브젝트를 벡터만으로는 표현할 수 없다.
  • 4. P = (𝑃𝑥, 𝑃𝑦, 𝑃𝑧) 그래서 ‘점(point)’을 더했습니다. 즉 벡터 공간에 점의 개념을 추가한 공간이 아핀 공간. 우리가 흔히 사용하는 좌표계(데카르트 좌표계)과 똑같이 사용합니다. 벡터란?
  • 5. (2,2, 1) (3,1,5) 아핀 공간에서의 점과 벡터의 연 산 점 + 점은 아핀 공간에서 사용할 수 없다. (3,1,5) (2,2, 1) V = (1, - 1, 4) 1. 𝑃 ± 𝑉 = 𝑃 2. 𝑉 ± 𝑉 = 𝑉 3. 𝑃 − 𝑃 = 𝑉 벡터란?
  • 6. 1. 𝑃 ± 𝑉 = 𝑃 2. 𝑉 ± 𝑉 = 𝑉 3. 𝑃 − 𝑃 = 𝑉2 5 1 − 2 5 0 = 0 0 1 점 – 벡터 = 점 2 5 0 + 2 5 0 = 4 10 0 벡터 + 벡터 = 벡터 이제 아핀 공간에서 점과 벡터를 구분할 수 있다. W = 1이면 점, w= 0이면 벡터 벡터란?
  • 7. 벡터의 내적 내적(Dot Product, 스칼라곱) 𝐴 ∙ 𝐵 = | 𝐴| ∗ 𝐵 ∗ cos 𝜃 방향을 가지지 않는 스칼라(Scalar)값이며, 여러가지 용도로 쓰인다. https://www.falstad.com/dotproduct/
  • 8. 벡터의 내적 내적을 이용한 벡터의 투영(사영) A dot B = |A|*|B|*cosθ 스칼라값 = 단, B는 단위벡터
  • 9. 내적의 사용예시 1. 상대가 내 앞에 있을까? 𝜃 𝐵 = Foward vector 𝐴 = 𝑒𝑛𝑒𝑚𝑦 − 𝑚𝑒 A dot B = |A|*|B|*cosθ 내적값이 앞에 있다면 양수, 뒤에 있다면 음수
  • 10. 2. 사이각 𝜃 와 시야벡터 2개가 주어질 때 상대가 시야 내에 있는지 확인하는 법을 서술하세요. 𝜃 = 60° cos60 = 1/2이므로, 내적값이 0.5보다 크면 시야각 안에 존재한다. A dot B = |A|*|B|*cosθ A와 B가 단위벡터라면, A dot B = |1|*|1|*cosθ 내적의 사용예시
  • 11. 내적의 사용예시 𝜃 = ? ‘마비노기 영웅전’의 보스 라바스타드 3. 사이각의 각도를 모를 때, 사이각을 구하는 법을 서술 하세요
  • 12. 내적의 사용예시 3. 사이각의 각도를 모를 때, 사이각을 구하는 법을 서술 하세요 𝜃 = ? A dot B = |A|*|B|*cosθ cos θ = x 라면, cos−1 𝑋 = θ 즉 두 벡터를 알면 arccos(A dot B) = θ 로 사이각을 구할 수 있다. A B
  • 13. 내적의 사용예시 4. 난반사광(Diffuse Light) 계산 𝐼𝑖 = 입사광의 세기 𝑘𝑑 = 확산반사율 (상수) L : 입사광 N : 표면의 법선벡터
  • 14. 내적의 사용예시 5. 문제 : 입사벡터 P와 표면의 법선벡터 N이 있을 때 반사벡터 R을 구하시오 입사벡터 P 반사벡터 R 표면의 법선벡터 N
  • 15. 내적의 사용예시 입사벡터 P 표면의 법선벡터 N 입사벡터 -P 표면의 법선벡터 N(단위벡터) (−𝑃 ∙ 𝑁 ) ∗ 𝑁 스칼라 * 벡터 = 벡터 5. 문제 : 입사벡터 P와 표면의 법선벡터 N이 있을 때 반사벡터 R을 구하시오
  • 16. 내적의 사용예시 입사벡터 P 표면의 법선벡터 N 입사벡터 P 입사벡터 P 입사벡터 P (−𝑃 ∙ 𝑁 ) ∗ 𝑁 ∗ 2 즉 반사벡터 R = P + 2(−𝑃 ∙ 𝑁 ) ∗ 𝑁 5. 문제 : 입사벡터 P와 표면의 법선벡터 N이 있을 때 반사벡터 R을 구하시오
  • 17. 벡터의 외적 외적(Cross Product, 벡터곱) | 𝐴 × 𝐵 | = 𝐴 ∗ |𝐵| sin 𝜃 교환법칙 성립 안함(역벡터가 된다) 분배법칙 성립함 결과물은 두 벡터에 수직한 벡터가 된다 DirectX, Unity, Unreal : 왼손 좌표계 OpenGL, 3ds Max : 오른손 좌표계
  • 18. 벡터의 외적 1. 두 벡터의 외적은 수직임을 이용하여 카메라의 기저벡터를 구하는 법을 서술하세요.
  • 19. 벡터의 외적 2. 상대가 나의 왼쪽에 있는지 오른쪽에 있는지 판별 Forward vector Forward vector enemy me
  • 21. 벡터 vs 리스트 각종 컨테이너들의 특징 Vector : 연속된 자료구조이므로 캐시 친화적, Capacity 변경 가능(Dynamic array), 임의 접근 반복자 List : 삽입, 삭제에 유리함. Hash : 탐색이 O(1)로 매우 빠름. Map : 균형 트리로 구성되어 탐색에 유리함, 삽입/삭제에 불리 캐시 친화적?
  • 22. 캐시란? 너무 멀고, 느리다. CPU 칩 안에 있는 레지스터에서 데이터를 가져오는 시간 : 1~2 cycle DRAM에서 데이터를 가져오는 시간 : 100~ cycle 캐시는 중간 병목을 완화해주는 완충장치
  • 23. 기본적인 컨셉 : 메인 메모리는 느릴 뿐더러, CPU<->메모리엔 병목이 발생한다. 그렇 다면 ‘다음에 사용할 것 같은‘ 요소들을 더 빠른 메모리에 미리 저장해 두자. 빠름 느림 시간적 지역성(Temporal Locality) : 한 번 참조된 메모리 주소는 이후 다시 참조될 가능성이 높다 공간적 지역성(Spatial Locality) : 한 번 참조된 메모리 주소의 주변은 이후 참조될 가능성이 높 다 특히 I/O 작업에서 혁신적인 속도 상승! 멜트다운 버그의 원인이 되기도.. 캐시란?
  • 24. 프로세스와 스레드 프로세스와 스레드의 차이점은?(K) 프로세스 : 실행 중인 각각의 프로그램(feat. 공룡책) ‘각각’의 프로그램이므로, 알집이 5개 켜져 있다면 각각 의 알집들은 다른 프로세스로 취급된다. - 가상 메모리를 사용하며, 그로 인해 독립적인 메모리 공간을 보장받 는다 - 스레드보다 무겁다(생성/삭제 시 가상 메모리 확보 및 할당, 프로세 스 세팅 등..) - 락 문제에서 자유롭다
  • 25. 프로세스와 스레드 스레드 : CPU 이용의 기본 단위 - 레지스터, 스택 메모리 영역을 제외한 메모리(데이터, 힙 등..)을 공유한 다. - 그렇기 때문에 경제적이고 빠르지만, 락 문제가 존재한다.(30배 이상) 코드 영역 : 프로그램의 명령어들이 적재됨 스택 영역 : 지역 변수, 멤버 변수, 함수의 파라미터, 리턴 주소값 등이 저장됨 힙 영역 : 동적 할당한 메모리가 저장됨 데이터 영역 : 전역변수, static 변수 등이 저장됨 프로세스와 스레드의 차이점은?(K)
  • 26. 컨텍스트 스위칭(K) 많은 프로세스, 스레드들이 한정된 CPU 자원을 사용할 때, 실제로 CPU 계산 자원이 많이 필요한 부분은 극히 일부이다. (대개 전체의 약 4%) 그렇기 때문에, CPU가 놀지 않으려면 계속해서 새로운 스레드가 CPU자원을 할당받아야 한다. 이를 위해 CPU를 이용한 계산을 끝낸 스레드와 계산이 필요한 스레드를 서로 교체하는 것이 문맥 교환 (Context Switcing)이다. Ex) CPU 자원을 다 사용했을 때, I/O를 요청했을 때 (I/O는 느리다!) 프로세스와 스레드
  • 27. 문맥(Context) 프로세스와 스레드 프로세스/스레드가 자원을 반납하고, 이후에 다시 사용할 때 기억해놓아야 할 정보들 PCB(Process Control Block), TCB(Thread Control Block)에 저장된다. 문맥 교환이 일어나는 조건 1. I/O 요청이 들어왔을 때 2. 스레드가 CPU 연산을 마치고 반납할 때 3. 기타 OS가 상황을 보고 필요할 때.. == 예측할 수 없다. 스레드의 경우 락 문제를 염 두에 두어야 함(프로세스는 데드락이 일어나지 않 음)
  • 28. 스케줄링 프로세스/스레드 스케줄링(S, K) 그렇다면, 이렇게 스레드를 교체하면 다음 CPU 자원을 가져갈 스레드는 누구일까? 그것을 정하기 위한 것이 스케줄링 정책(Policy)/알고리즘이다. FCFS(First Come Fisrt Serve) : 선착순 RR(Round-Robin) : 시분할 방식, 모든 프로세스/스레드를 같은 단위로 나누어 수행 SJF/SRJF(Shortest (Remain) Job First) : 가장 빨리 끝나는 프로세스/스레드에 우선순위를 주어 먼저 수행 Lottery : 랜덤게임 랜덤게임 이 외에도 많은 정책이 있 다. 질문 : 어떤 정책을 선택해야 할까?
  • 29. 스케줄링 우선순위 정책의 한계 – Starvation(기아 상태) - 만약 낮은 우선순위 스레드가 대기중인데, 끊임없이 높은 우선 순위 스레드가 들어온다면 어떻게 될까? - 영원한 대기상태… 해결 방법의 예시 – aging 오래 대기할 수록 우선순위를 높여준다.
  • 30. 프로세스와 스레드 멀티스레드 환경에서 나타날 수 있는 문제 – Deadlock, Data race 데드락 : 각각의 스레드가 자원을 하나씩만 들고 서로의 자원 을 반납하기를 기다리는 상태(서로의 자원이 필요하다) Deadlock ⊂ Starvation OS가 관여하지 않으면 영원히 지속되므로, 프로그램이 멈추 게 된다. 게임에선 치명적인 문제.
  • 31. 프로세스와 스레드 1. mutual exclusion -> 상호 배제가 있어야 데드락이 발생한다. (어떤 자원 이 한순간 하나의 쓰레드만 사용할 수 있을 경우) 한 순간 하나의 자원을 내가 독점적으로 획득, 이용하고 내가 자발적으로 release하기 전까지는 같 은 자원을 공유할 수 없다. 2. hold & wait -> 자원 하나를 점유하였으면, 원하는 자원을 다 점유할 때 까지 무한정 대기한다. 3. no preemption -> preempt(뺏을 수 있는 상태, 선점가능한) 하지 않아 야 한다. 즉 스레드가 자발적으로 내려놓기 전까지는 스레드가 가진 자원 을 빼앗을 수 없다. 4. Circular wait -> 나는 오른쪽이 가진 자원을 기다리고,. 오른쪽은 오른쪽의 오른쪽이 가진 자원을 기다리고, 오른쪽의 오른쪽은... 결국 내가 가진 자원을 기다리는 것 같이 일종의 cycle이 생긴다. 데드락의 4가지 필요조건 Circular wait의 예시 ‘필요조건’이기 때문에 하나라도 회피할 수 있으면 데드락이 일어나지 않는다. 그리고 이 네 가지가 모두 충족된다고 해서 데드락이 반드시 일어나는것도 아니다.
  • 33. 프로세스와 스레드 OS가 수행하는 데드락의 해소 방법 1. Detection & Recovery 데드락 판별 알고리즘을 사용하여 데드락이 발생했는지 여부를 판단한 뒤, 발생했다고 판단되면 회복시킨다 2. Prevention / Avoidance 데드락이 아예 발생하지 않는 방향으로 수행시킨다. (데드락이 발생할 수 있는 필요조건을 회피한다) 3. ignore 데드락 발생을 무시하거나, 응용 프로그래머에게 데드락 회피를 맡긴다. 프로세스는 일반적으로 데드락이 발생하지 않는다. 애초에 자원을 공유하지 않기 때문 (단, IPC 등을 하면서 자원을 공유하면 문제가 생길 수 있음) Q. 현대의 운영체제는 어떤 방식을 사용할까?
  • 34. 프로세스와 스레드 애초에 응용 프로그래머가 잘 설계 해야 한다. Lock, Mutex, Critical Section등을 잘 이용하여 자원 하나에 여러 스레드가 동시에 점유를 시도하지 않도록 설계 한 자원은 한 스레드만 이용할 수 있게 애초에 논리를 분리 OS가 수행하는 데드락의 해소 방법 1. Detection & Recovery 데드락 판별 알고리즘을 사용하여 데드락이 발생했는지 여부를 판단한 뒤, 발생했다고 판단되면 회복시킨다 2. Prevention / Avoidance 데드락이 아예 발생하지 않는 방향으로 수행시킨다. (데드락이 발생할 수 있는 필요조건을 회피한다) 3. ignore 데드락 발생을 무시하거나, 응용 프로그래머에게 데드락 회피를 맡긴다.
  • 35. 프로세스와 스레드 멀티스레드 환경에서, 해당 코드의 문제점은? (K)
  • 36. 프로세스와 스레드 가장 간단해보이는 덧셈마저도 하나의 명령어로 이루어져있 지 않다. 그렇기 때문에 멀티스레드에서 해당 코드를 실행하 면 100000이 아닌 값이 나오게 된다. 데이터 레이스(Data Race) 해결 방법 1. Lock을 적절히 사용하여 계산 중에는 다른 스레드가 사용할 수 없게 만듦. 2. Atomic 변수로 만들어서 연산 주의 : Lock이나 Atomic 둘 다 성능 비용이 높다.
  • 37. 메모리 단편화에 대해 설명하고 해결책을 말하세요(P) 30 15 20 15 21 메모리는 충분한데 연속적인 메모리를 넣을 수가 없네.. (ex. 배열, 벡터) 외부 단편화 메모리 단편화(斷片化, fragmentation)는 기억 장치의 빈 공간 또는 자료가 여러 개 의 조각으로 나뉘는 현상을 말한다. -위키백과
  • 38. 메모리 단편화에 대해 설명하고 해결책을 말하세요(P) 4 3 4 4만큼 할당됨 4만큼 할당됨 4만큼 할당됨 내부 단편화 4만큼씩 할당받아서 썼더니 중간에 공간이 남네… 메모리
  • 39. 메모리 프로그래머의 해결법 메모리 풀(memory pool)은 고정된 크기의 블록을 할당하여 malloc이나 C++의 new 연산자와 유사한 메모리 동적 할당을 가능하 게 해준다. malloc이나 new 연산자 같은 기능들은 다양한 블록사이즈 때문에 단편화를 유발시키고, 파편화된 메모리들은 퍼포 먼스 때문에 실시간 시스템에서 사용할 수 없게 된다. 좀더 효율적인 방법은 memory pool이라고 불리는 동일한 사이즈의 메모 리 블록들을 미리 할당해 놓는 것이다. - from 위키백과 장점 : 단편화를 완화할 수 있다. 빈번한 할당,해제에서 new를 통해 생성할 필요가 없으므로 비용상 이점이 있다. 단점 : 메모리를 직접 관리해야 하므로, 모든 관리에 필요한 노동과 책임은 프로그래머에게 가게 된다. 사용하지 않을 때도 풀을 유지해야 하므로, 메모리 낭비가 생긴다.
  • 40. 메모리 OS, GC의 해결법 통합(Coalescing) : 인접해 있는 단편화가 된 공간을 하나의 공간으로 통합한다. 압축(Compaction) : 분산되어 있는 단편화가 된 빈 공간을 결합하여 하나의 큰 가용 공간을 만든다.
  • 41. 메모리 OS의 해결법 페이징(Paging), 세그멘테이션(Segmentation) 기법을 사용해 해결한다. 근데, 페이징이 뭐지? 그걸 알려면 우선..
  • 42. 메모리 가상 메모리 1. 내 컴퓨터의 램 용량이 2기가밖에 없다면 해당 코드는 오류가 날까? 2. 내 컴퓨터의 램 용량이 1.5기가인데, 다른 프로세스에서 1기가를 쓰 고 있다면 해당 코드는 오류가 날까?
  • 43. 메모리 가상 메모리 1. 네, 오류납니다. - 32bit exe 프로세스의 ‘유저 영역’ 용량은 2GB가 최대 한도입니다. - 2GB를 넘기면 new의 경우 bad_alloc을 리턴합니다.
  • 44. 메모리 가상 메모리 - 32bit exe 프로세스의 프로세스당 ‘유저 영역’ 용량은 2GB가 최대 한도입니다. - 2GB를 넘기면 new의 경우 std::bad_alloc을 리턴합니다. 2. 안 납니다. 64bit에서는요. 3. 이론적으로는 절대 나지 않습니다. 1. 네, 오류납니다. - 하지만 엄청나게 느려집니다.
  • 45. 메모리 OS (커널) 프로세스 1 총 메모리 용량 : 4GB “난 4GB 메모리를 가 지고 있어!” 프로세스 2 “난 4GB 메모리를 마 음대로 쓸 수 있어!” 프로세스 3 “난 4GB 메모리를 전부 가지고 있어!” 그래 다 가져다 써라.. 각자의 프로세스들은 자신이 PC가 가진 ‘모든'메모리를 다 자유롭게 사용 할 수 있다고 생각하며, 실제로 프로그 래머들 또한 구글 크롬이 먹을 메모리를 염두에 두면서 코딩하진 않는다.
  • 46. 메모리 가상 메모리 때문입니다. OS가 메모리를 할당할 때 실제 메모리 주소로 직접 할당하지 않고 프로세스별로 가상 메모리 주소공간을 각각 따로 만들어서 제공한다. 가상 주소는 실제 메모리 주소와 1:1로 매핑된다. - 가상 주소이므로, 서로 다른 프로세스가 같은 주소값을 참조해도 다 른 물리 주소값을 참조하게 된다. 즉 가상 메모리의 주소값은 프로세 스별로 독립적이다. (데이터 안정성. 이 때문에 히오스 프로세스와 롤 프로세스가 실행되 어 있어도 히오스 프로세스는 롤의 고퀄리티 스킨 데이터 를 멋대로 가져올 수 없다.) - 데이터가 실제 메모리에 들어있지 않아도 사용할 수 있다. (물리 메모리에 없으면 필요 시에 디스크에서 읽어온다) - 2의 이유로 인해, 실제 메모리보다 큰 데이터를 가져오거나, 다른 프 로세스에서 메모리를 모두 점유하고 있어도 자신이 필요한 데이터를 사용할 수 있다. 가상 메모리를 지원하지 않아 프로그래머가 메모리 범위를 직접 잡고 할당해야 했던 MSDOS의 COM 파일 확장자. 예전엔 mp3 플레이어를 틀었는데 작업중이던 PPT가 날아가는 것 같은 경우가 흔했다고…
  • 47. 메모리 페이징 가상 메모리를 일정 크기로 나누어 저장한다. 가상 주소 <-> 물리 주소 를 수행하는 테이블을 만들고, 실제 메모리 정보가 필요할 때 페이지 테이블을 참조하여 물리 주소를 찾는다. 가상 메모리의 ‘페이지'와 물리 메모리의 ‘프레 임은 1:1로 매핑된다.
  • 48. 메모리 그래서 뭐가 좋은데? 1. 물리적으로 비연속적인 메모리라 해도, 가상메모리에서 연속적으로 만들 면 된다. 2. 이렇게 메모리를 각각의 페이지로 나누어 따로 저장하기 때문에, 외부 단 편화 문제가 해결된다. 물리메모리가상메모리 각 칸이 하나의 페이지 1 2 3 4 다른 부분에서 사용하는 메모 리 2 4 3 1 만약 int array[4]라고 가정하면.. . . .
  • 49. 메모리 그래서 뭐가 좋은데? 1. 물리적으로 비연속적인 메모리라 해도, 가상메모리에서 연속적으로 만들 면 된다. 2. 이렇게 메모리를 각각의 페이지로 나누어 따로 저장하기 때문에, 외부 단 편화 문제가 해결된다. 페이지의 크기는 OS별로 상이하다(512byte~1GB). 단 페이지의 크기가 클 경우 내부 단편화 문제가 생길 수 있으며(큰 페이지를 쓰면 빈 공간 이 커질 수 있으므로…) 반대로 페이지의 크기가 너무 작으면 가상-> 물리 주소를 변환하는 페이지 테이블이 너무 커져서 탐색에 시간이 오래 걸린다. (페이지 테이블은 수백만개의 페이지가 있으므로 캐시나 레지스터에 보관할 수 없다. 필연적으로 메인 메모리에 위치하므로, 페이지 테이 블이 작으면 메모리 참조하겠다고 가상->물리 주소를 변환하기 위해 물리 메모리에 여러 번 들어가야 하는 아이러니가 발생) 현대의 Windows나 Linux같은 OS는 페이지의 크기를 4KB로 잡는다고 한다.
  • 50. 메모리 페이지 폴트와 쓰레싱(K) 만약 메인 메모리에 원하는 페이지가 없다면, 이건 결국 가상 메모리->물리 메모리 로 변환할 수 있는 경로가 없다는 뜻이고, 메인 메모리에 원하는 데이터가 올라와 있 지 않다는 뜻입니다. 이렇게 되면 결국 하드디스크에서 없는 정보를 읽어와야 합니다. 이를 페이지 폴트(Page Fault)라고 하며, 하드 디스크는 굉장히 느린 저장장치이므로 심각한 성능 저하를 일으킵니다.
  • 51. 메모리 페이지 폴트와 쓰레싱(K) 만약 너무 많은 프로세스를 동시에 돌리거나, 메모리를 너무 많이 할당받으면 어떻 게 될까? 1. 메인 메모리에 올라올 수 있는 데이터는 한계가 있으므로, 새로운 요청을 하는 프 로세스에서 페이지 폴트가 일어난다. 2. 그러면 그 페이지 데이터를 디스크에서 가져와야 한다. 이때 메모리에 공간이 없 다면 이 페이지는 기존의 페이지를 내쫓고 들어가게 된다. 3. 다음 프로세스는 쫓겨난 이 페이지를 참조하려다 또 페이지 폴트가 발생한다. 4. 그 다음 프로세스는 쫓겨난 또 다른 페이지를 참조하려다 페이지 폴트가 발생한 다. 5. 이러면서 페이지를 바꾸는데만(페이지 교체는 공짜가 아니다!) 자원을 소모하게 되고, 정작 연산에 필요한 귀중한 CPU 이용률은 떨어진다. 6. OS는 CPU를 최대한 놀게 놔두지 않으려 하므로 새로운 프로세스를 추가해서 병 렬성을 높이려 한다. 7. 혼돈과 파괴의 1~6을 반복한다.
  • 52. 메모리 주의 : 컴퓨터가 실제로 죽습니다. 실제로 죽어서 테스트 스크린샷을 찍는데에 실 패했다. 페이지 폴트 관측 메모리가 꽉 차자 페이지 폴트가 증가하는 것을 볼 수 있습니다. 출처 : [NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅
  • 53. 메모리 왜 면접에서 물어보고, 왜 알고 있어야 좋을까? 출처 : [NDC2018] 당신이 '유니티'로 모바일 MMORPG를 만들 때 겪을 수 있는 이야기 출처 : [NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅 대략적 구조를 알고 있어야, 메모리에 대한 이슈를 해결하거나, 효율적인 개발을 할 수 있다.
  • 54. 수고하셨습니다. 출처 : 공룡책(Operating System Concepts 8th Edition. Abraham Silberschatz 외) 컴퓨터 구조 및 설계(Computer Organization and Design 5th Edition. David A. Patterson 외) [NDC 2018] 당신이 '유니티'로 모바일 MMORPG를 만들 때 겪을 수 있는 이야기 [NDC 2018] 신입 개발자가 알아야 할 윈도우 메모리릭 디버깅 운영체제 (KOCW – 국민대학교 이시윤 교수님) <- 강의 잘하심 그 외 구글링으로 찾은 출처가 기억 안나는 여러 가지 블로그들… Q/A