일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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장치
- 컨디션 변수
- 병행성 관련 오류
- 락
- 다이나믹 프로그래밍
- 프로그래머스
- codility
- 그리디알고리즘
- 백준
- 쓰레드
- 렌더링 파이프라인
- OS
- 디자인패턴
- 멀티쓰레드
- 다이나믹프로그래밍
- 영속성
- 파일시스템 구현
- 타입 객체
- Direct12
- DirectX12
- 병행성
- DirectX 12
- 멀티프로세서
- directx
- 운영체제
- 그리디 알고리즘
- 동적계획법
- 스케줄링
- 알고리즘
- 자료구조
- Today
- Total
목록분류 전체보기 (500)
기록공간

Fetch-And-Add 마지막 하드웨어 기반의 기법은 Fetch-And-Add 명령어로 원자적으로 특정 주소의 예전 값을 반환하면서 값을 증가시킨다. C, C++ 코드로 표현하면 다음과 같다. // C int FetchAndAdd(int *ptr) { int old = *ptr; *ptr = old + 1; return old; } // C++ #include int FetchAndAdd(std::atomic_int &ptr) { return ptr++; } C++ 코드를 보면 atomic_int이 보일 것이다. 이건 무엇일까? C++11부터 지원하는 Atomic 자료구조이다. 이것은 기본 자료 구조의 일부를 원자적으로 구현해놓은 것이다.(char, int, short, bool) Atomic 자료구조..

위에서 살펴봤듯 멀티 프로세서에서는 인터럽트를 중지시키는 것이 의미가 없기 때문에 시스템 설계자들은 락 지원을 위한 하드웨어 설계를 하기 시작했다. 오늘날 모든 시스템들은 하드웨어 지원 기능을 가지고 있으며, 단일 CPU 시스템 또한 이런 기능이 존재한다. Test-And-Set (Atomic Exchange) 하드웨어 기법 중 가장 기본은 Test-And-Set 명령어 또는 원자적 교체(atomic exchange) 라고 불리는 기법이다. Test-And-Set 명령어를 사용하면 락을 간단하게 구현할 수 있다. ptr이 가리키는 이전 값을 old로 받아 리턴(TEST)한다. 동시에 그 값을 new로 바꾼다(SET). 이 동작은 원자적으로 수행되어야 하며 중간에 인터럽트 될 수 없다. 때문에, 소프트웨어..

여러 개의 명령어들을 원자적(atomic)으로 실행해보고 싶지만 병행성으로 인한 여러 쓰레드의 개입으로 인해(임계영역) 그렇게 할 수가 없었다. 여기서는 앞서 다룬 락(lock)을 이용하여 이 문제를 직접적으로 다루고자 한다. 프로그래머들은 소스 코드의 임계 영역을 락으로 둘러 그 임계 영역이 하나의 원자 단위 명령어인 것처럼 실행되도록 한다. 락 : 기본 개념 예를 위해 다음의 임계 영역이 있다고 하자. 공유 변수의 갱신이다. balance = balance + 1; 그리고 락으로 임계 영역을 다음과 같이 감쌌다. mutex mylock; // 전역 변수로 선언된 mylock ... mylock.lock(); balance = balance + 1; mylock.unlock(); 락은 하나의 변수이므로..
C++은 유연한 언어이지만 안전한 언어는 아니다. 엉뚱한 메모리 참조나 비정상적인 연산(0으로 나누기)을 시도해도 컴파일러가 걸러주지 않는다. C++의 exception은 코드의 안정성을 한 단계 높이기 위해 언어 차원에서 제공하는 기능이다. exception에는 몇 가지 새로운 용어가 도입되었다. 특정 코드가 예외적인 상황을 인지하면 exception을 던진다(throw). 그리고 다른 코드가 던져진 exception을 받아서(catch) 필요한 처리를 한다. 다음은 0 나누기가 발생할 때 exception을 던지는 예제이다. #include double divideNumbers(double numerator, double denominator) { if(denominator == 0) { throw ..

테셀레이션 단계들 테셀레이션은 주어진 메시의 삼각형들을 더 잘게 쪼개서 새로운 삼각형들을 만드는 과정을 말한다. 새 삼각형들을 새로운 위치로 이동함으로써 원래 메시에 없는 세부적인 특징을 만들어 낼 수 있다. 테셀레이션은 여러 장점이 있다. 1. 카메라에 가까운 삼각형들에는 테셀레이션을 적용해서 세부도를 높이고, 먼 삼각형들에는 테셀레이션을 적용하지 않는 방식의 세부 수준(Level-Of-Detail, LOD)을 구현할 수 있다. 이렇게 하면 관찰자가 실제로 볼 수 있는 부분에만 많은 삼각형을 사용하게 되므로 효율적이다. 2. 적은 수의 삼각형들로 이루어진 메시를 메모리에 담아두고 즉석으로 삼각형을 추가하여 메모리를 절약할 수 있다. 3. 애니메이션이나 물리 처리 같은 연산들을 단순한 저 다각형 메시에 ..

쓰레드 생성 멀티 쓰레드 프로그램을 작성 시, 가장 먼저 할 일은 새로운 쓰레드 생성이다. 쓰레드 생성을 위해서는 해당 인터페이스가 존재해야 한다. 우선 thread 라이브러리를 포함시켜야 한다. 그리고 std::thread 클래스의 thread_object를 만든다. thread_function에는 생성된 쓰레드가 실행할 함수가 들어간다. arg는 thread_function에 넘길 매개변수이다. 다만 thread_function 선언에 사용된 매개변수와 일치해야 한다. 다음은 예시 코드이다. #include #include void thread_function(int a, int b) { std::cout

개발에서 게임분야는 재미있을지는 몰라도, 절대 쉽지 않다. 요즘 게임을 만들기 위해서는 엄청난 양의 소스 코드를 구현해야 한다. 심지어 유통사에서 품질을 엄격히 심사하기 때문에 버그나 크래시가 나는 경우 출시가 불가능해진다. 또한 플랫폼의 성능도 최대한 뽑아내야 한다. 게임은 다른 소프트웨어보다 성능이 중요하다. 성능이 나오도록 하기 위해서는 불가피하게 최적화 작업이 필요하다. 게임 개발은 성능과 안전을 위해 C++과 같은 중량 언어(Heavyweight language)를 사용한다. 이런 언어는 하드웨어 성능을 최대한 끌어낼 수 있는 저 수준 표현과 버그를 막거나 회피하기 위한 시스템을 함께 제공한다. 게임 개발자 되기 위한 비용은 만만치 않다. 몇 년간 집중 훈련이 필요하고, 그런 후에도 엄청난 규모..

정렬은 순서가 없는 사물들을 순서대로 재배열하는 것을 뜻한다. 순서에는 오름차순(ascending order)과 내림차순(descending order)이 있다. 다음 그림은 순서대로 오름차순과 내림차순의 예시를 보여준다. 예를 들면, 책은 '제목'이나 '저자명', 그리고 '발간 연도' 등을 기준으로 오름차순이나 내림차순으로 정렬할 수 있다. 인터넷 쇼핑몰에서는 물건들을 '판매 인기순'이나, '가격 낮은 순', '상품 평순' 등으로 정렬할 수 있고, 엑셀 프로그램도 성적처리를 하는 경우 '학번', '성적', '실습 점수' 등의 기준으로 정렬할 수 있다. 정렬은 자료 탐색에서 매우 중요하다. 예를 들면, 사전에서 우리가 단어를 쉽게 찾을 수 있는 것은 단어들이 알파벳순으로 정렬되어 있기 때문이다. 만약 사..