일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
31 |
- 멀티쓰레드
- 그리디 알고리즘
- 멀티프로세서
- I/O장치
- DirectX12
- 병행성 관련 오류
- 파일시스템 구현
- Direct12
- 그리디알고리즘
- 쓰레드
- directx
- 프로그래머스
- 백준
- codility
- OS
- 알고리즘
- 스케줄링
- 병행성
- 영속성
- 동적계획법
- 타입 객체
- 디자인패턴
- 자료구조
- 락
- 다이나믹프로그래밍
- 다이나믹 프로그래밍
- 렌더링 파이프라인
- 운영체제
- DirectX 12
- 컨디션 변수
- Today
- Total
목록분류 전체보기 (500)
기록공간

"여러 순차 작업의 결과를 한번에 보여준다." 본질적으로 컴퓨터는 순차적으로 동작한다. 컴퓨터의 능력은 굉장히 큰 일을 작은 단계로 쪼개어 하나씩 처리할 수 있는데 있다. 하지만 사용자 입장에서는 순차적으로 혹은 동시에 진행되는 여러 작업을 한 번에 모아서 봐야 할 때가 있다. 예를들어, 게임에서 렌더링은 꼭 필요하다. 유저에게 보여줄 게임 화면을 그릴 때는 멀리 있는 산, 언덕, 나무 등 전부를 한번에 보여준다. 이때 화면을 그리는 중간 과정이 보이면 몰입할 수가 없다. 장면은 부드럽고 빠르게 업데이트되어야 하고 매 프레임이 완성되면 한 번에 보여줘야 한다. 이중 버퍼는 이런 문제를 해결한다. 들어가기에 앞서서 컴퓨터가 화면을 어떻게 그리는지부터 살펴 보자. 컴퓨터 그래픽스 작동 원리 컴퓨터 모니터 같..

앞에서 살펴봤던 형태의 주소 공간에 대해 재미있는 사실을 발견했을 것이다. 스택과 힙 사이에 사용되지 않는 큰 공간이 존재한다. 스택과 힙 사이의 공간은 사용되지 않더라도 주소 공간을 물리 메모리에 재배치할 때 물리 메모리를 차지한다. 베이스와 바운드 레지스터 방식은 메모리 낭비가 심하다. 또한, 주소 공간이 물리 메모리보다 큰 경우 실행이 매우 어렵다. 이런 측면에서 볼 때 베이스와 바운드 방식은 유연성이 없다. 세그멘테이션 : 세그멘트의 주소변환 이 문제를 해결하기 위한 아이디어가 탄생했으니, 바로 세그멘테이션(Segmentation)이다. 상당히 오래된 아이디어이다. 아이디어는 간단하다. MMU(Memory Management Unit : 메모리 관리 장치) 안에 오직 하나의 베이스와 바운드 쌍만 ..

서술자 힙 생성 스왑 체인까지 만들었다면, 응용 프로그램에 필요한 서술자/뷰들을 담을 서술자 힙을 만들어야한다. 서술자 힙은 ID3D12DescriptorHeap 인터페이스로 대표된다. 힙을 생성하는 메서드는 ID3D12Device::CreateDescriptorHeap이다. SwapChainBufferCount에 설정된 개수만큼의 렌더 대상 뷰(RTV)들과 하나의 깊이 스텐실 뷰(DSV)가 필요하다. RTV는 스왑 체인에서 렌더링의 대상이 되는 버퍼 자원을 서술하고, DSV는 깊이 판정을 위한 버퍼 자원을 서술한다. 서술자 힙은 서술자 종류마다 따로 만들어야 한다. 따라서, SwapChainBufferCount 개의 RTV들을 담을 힙 하나와 하나의 DSV를 담을 힙이 필요하다. 다음은 이 힙들을 생성..

본격적으로 Direct3D를 초기화하는 방법을 살펴보자. 꽤 길기 때문에 2파트로 나누어 작성하였다. 또한 앞서 살펴봤던 기본지식들을 모두 알고 있다는 가정하에 진행하려고 한다. 초기화 과정은 다음과 같은 단계들로 구성된다. D3D12CreateDevice 함수를 이용해서 ID3D12Device를 생성한다. ID3D12Fence 객체를 생성하고 서술자들의 크기를 얻는다. 4X MSAA(다중 표본화) 품질 수준 지원 여부를 점검한다. 명령 큐와 명령 리스트 할당자, 그리고 주 명령 리스트를 생성한다. 스왑 체인을 서술하고 생성한다. 응용 프로그램에 필요한 서술자 힙들을 생성한다. 후면 버퍼의 크기를 설정하고, 후면 버퍼에 대한 렌더 타깃 뷰(RTV)를 생성한다. 깊이 스텐실 버퍼를 생성하고, 그와 연관된 ..

효율적인 메모리 가상화 우리는 앞에서, CPU 가상화를 위한 제한적 직접 실행(LDE)에 대해서 자세하게 살펴봤다. https://lipcoder.tistory.com/55?category=834992 2-2장. Mechanism : 제한적 직접 실행 원리 CPU를 가상화하기 위해서 운영체제는 여러 작업들이 동시에 실행되는 것처럼 보이도록 물리적인 CPU를 공유한다. 한 프로세스를 잠시 동안 실행하고 다른 프로세스를 또 잠깐 실행하고, 이런 식으로 계속해서 잠깐.. lipcoder.tistory.com 메모리 가상화에서도 비슷한 전략을 추구할 것이다. 가상화를 제공하는 동시에 효율성(Efficiency)과 제어(Control) 모두를 추구한다. 효율성을 높이려면 하드웨어 지원을 활용할 수밖에 없다. 처음..

메모리 공간의 종류 C 프로그램이 실행되면, 두 가지 유형의 메모리 공간이 할당된다. 첫 번째는 스택(Stack) 메모리라고 불리며 할당과 반환은 프로그래머를 위하여 컴파일러에 의해 암묵적으로 이루어 진다. 이러한 이유 때문에 때로는 자동(Automatic) 메모리라고 불린다. C 프로그램에서 스택에 메모리를 선언하는 것은 쉽다. 예를 들어, func() 라는 함수 안에서 x라 불리는 정수를 위한 공간이 필요하다고 하자. 이러한 메모리를 선언하려면 다음과 같이 하면 된다. void func() { int x; // 스택에 int 형을 선언 // .... } 컴파일러가 나머지 작업을 수행하여, func()가 호출될때 스택에 공간을 확보한다. 함수에서 리턴하면 컴파일러는 프로그래머 대신에 메모리를 반환한다...

"객체의 내부 상태에 따라 스스로 행동을 변경할 수 있게 허가하는 패턴으로, 이렇게 하면 객체는 마치 자신의 클래스를 바꾸는 것처럼 보입니다. (GoF의 디자인패턴, p395)" 이번 장에서는 상태 패턴을 다루지만 좀 더 근본 개념인 유한 상태 기계(Finite State Machine : FSM)도 언급한다. 그러다 보니 계층형 상태 기계(Hierarchical State Machine)와 푸시다운 오토마타(Pushdown Automata)도 언급한다. 상태 기계는 AI나 컴파일러 개발자라면 익숙한 개념인 만큼 이러한 분야들에 자주 쓰이고 있다. 상태 기계는 알아두면 좋기 때문에, 다른 분야에서는 어떻게 활용 가능한지 살펴보도록 하겠다. 추억의 게임 만들기 간단한 플랫포머(슈퍼마리오 같은 게임)를 만든..

초기에는 컴퓨터 시스템을 구현하는 것이 쉬웠다. 사용자가 많은 것을 기대하지 않았기 때문이다. 하지만 시대가 변화하면서 사용자들은 점점 편의성, 고성능, 신뢰성을 추구하게 되었다. 초기 시스템 메모리 관점에서 초기 컴퓨터는 많은 개념을 사용자에게 제공하지 않았다. 컴퓨터의 물리 메모리는 다음과 같이 생겼다. 운영체제는 메모리에(그림에서는 물리주소 0부터) 상주하는 루틴(라이브러리)의 집합이였다. 물리 메모리에 하나의 실행 중인 프로그램(프로세스)이 존재하였고(그림에서는 물리 주소 64KB부터 시작하여) 나머지 메모리를 사용하였다. 특별한 가상화는 거의 존재하지 않았고 사용자는 운영체제로부터 그리 많은 것을 기대하지 않았다. 멀티프로그래밍과 시분할 시간이 흐른 후, 컴퓨터는 고가 장비였기 때문에, 사람들이..