분류 전체보기

· 기타
드로우콜CPU가 GPU에게 오브젝트를 렌더링하라고 명령 내리는 것을 드로우콜이라고 한다.  렌더링에는 메시, 쉐이더, 텍스처 등의 정보들이 필요하다. 이러한 정보들은  HDD, SSD 등의 데이터 저장 장치에 저장된다. 이러한 정보들은 CPU 메모리에 복사되어 옮겨지게 되고 GPU의 렌더링 작업을 위해 CPU 메모리에서 GPU 메모리에 데이터를 복사하는 과정을 거쳐 GPU에게로 데이터가 넘겨진다. 여기서 렌더링에 사용할 쉐이더, 텍스터의 주소, 알파 블랜딩 사용 여부 등의 렌더링 정보들이 필요하게 되고 이 정보들은 GPU의 렌더링 상태를 저장하는 테이블인 Render States에 저장된다. 이렇게 세팅된 정보들을 바탕으로 GPU는 CPU의 Draw Primitive Call이라는 명령을 받고 렌더링을 ..
· 네트워크
TCP/IP네트워크 통신에 사용되는 프로토콜은 다양하다. 그 중 라우팅에는 IP프로토콜이 주로 사용되고 IP를 기반으로 하여 통신 제어에는 TCP프로토콜이 많이 사용된다. TCP를 기반으로 하는 프로토콜로는 HTTP, SMTP, FTP 등 다양하다. 많은 프로그램등이 TCP와 IP를 기반으로 하여 통신하는 데 이를 묶어 TCP/IP라고 한다. IPIP는 3계층에 해당하는 프로토콜로 데이터를 패킷으로 변환하고 라우팅에 사용되는 IP주소를 설정한다. 이것으로 데이터는 전달될 수는 있겠지만 패킷이 손상되거나 전송 순서가 뒤죽박죽이 되는 등 전송에 대해서는 관여하지 않는다. 이것을 보환하기 위해 TCP가 사용된다. TCPTCP는 4계층에 해당하는 프로토콜로 패킷이 손상되거나 누락되지 않았는지 확인하거나 수신한 ..
· 네트워크
개념OSI모델은 네트워크 프로토콜을 기능별로 7개의 계층으로 나누어 표현한 것으로 다양한 통신 시스템이 서로 통신할 수 있도록 표준을 제시하는 개념이다. 각 계층은 명확한 역할이 있기 때문에 네트워크 통신에서 문제가 발생하였을 때 원인에 따라 어느 계층에서 문제가 발생하였는지 빠르게 파악하여 대처할 수 있다. 각 계층은 하위 계층의 기능만을 사용하고 상위 계층에게 기능을 제공한다.   7계층(응용 프로그램 계층)사용자의 데이터와 직접적으로 상호작용하는 계층이다. 에플리케이션은 이 계층에 의존하여 네트워크 통신을 시작한다. 대표적인 프로토콜로 HTTP가 있다.  6계층(프레젠테이션 계층)데이터의 변환을 담당하는 계층이다. 데이터를 송신할 때 수신 장치의 인코딩 방법에 맞게 데이터를 변화하며 암호화 작업을 ..
개념스레드들은 각자의 스택 메모리를 가지며 힙 메모리, 데이터 영역은 다른 스레드와 공유한다. 스택 메모리는 함수의 실행 정보, 지역 변수가 저장되며 데이터 영역에는 전역 변수, 정적 변수가 저장된다.이것으로 알 수 있는 것은 모든 스레드는 전역, 정적 변수를 다른 모든 스레드들과 공유하고 자신만의 고유한 전역 변수는 가질 수 없다는 것이다. 이 문제를 해결하기 위한 방법이 TLS이다. 기본적으로 각 스레드들은 TLS슬롯을 가지고 있다. 그리고 TLS변수를 선언하면 각 스레드는 그 변수에 대한 값을 저장할 메모리를 확보하고 그 주소값을 TLS배열에 저장한다. 위의 그림의 경우 TLS변수가 gdwTlsIndex1, gdwTlsIndex2이고 이 변수에 대해 스레드가 생성한 메모리의 주소값을 TLS슬롯에 저..
lock은 세 가지 방법으로 구현할 수 있다. 변수를 점유할 때 까지 쉬지않고 계속 점유를 시도하는 방법점유에 실패하면 일정 시간을 대기하고 점유를 시도하는 방법점유 종료 시점에 발행되는 이벤트를 사용하여 점유를 시도하는 방법세 가지의 lock을 구현하고 아래의 코드로 테스트 할 것이다.class Program{ static Lock _lock = new Lock(); static int number = 0; static void Thread_1() { for(int i = 0; i  1번(SpinLock)첫 번째 방법으로 구현하는 lock이다. public class Lock { //여러 스레드에서 사용되므로 volatile로 가시성 확보 ..
두 개 이상의 작업이 동시에 진행되면서 실행 순서를 예측할 수 없어 기대하는 결과가 나오지 않을 수 있는 상황이다.아래 상황이 대표적인 경합 조건이다.class Program{ static int number = 0; static void Thread_1() { for(int i = 0; i  단순히 생각해보면 같은 횟수만큼 number를 증감하였기 때문에 최종적으로 number가 0이 되는 것을 기대할 수 있다.하지만 실행해보면 아니라는것을 알 수 있다.어셈블리를 까보면 이유를 알 수 있는데, 프로그래머가 코드를 작성할 때에는 number++; 한 줄로 끝나는 작업이 어셈블리에서는 여러 작업으로 나누어져 있다는 것을 알 수 있다.이 작업을 코드로 작성한다 치면 아래와..
멀티쓰레드 프로그래밍을 하기 위해서는 프로세스와 쓰레드의 개념을 알아야 한다. 두 가지 모두 프로그램을 실행하는 단위이지만  많은 차이가 있다. 프로세스현재 실행되고 있는 프로그램을 프로세스라고 한다. 하나의 프로그램을 하나의 프로세스라고 할 수 있으며 여러 프로그램이 실행되고 있다면 그 개수만큼 프로세스가 동작하고 있는 것이다. 프로세스들은 개별적으로 실행되며 다른 프로세스에 큰 영향을 주지 않는다. 서로 공유하지 않는 개별적인 메모리 영역을 가지게 된다.  프로세스가 실행되기 위해서는 CPU가 할당되어야. 하나의 CPU는 동시에 하나의 프로세스만 실행시킬 수 있으며 여로 프로세스가 동시에 실행되는 것 처럼 보이기 위해서는 CPU가 할당되는 프로세스를 계속해서 변경해 주어야 한다. 프로세스가 전환될 때..
BFS와 다익스트라 알고리즘을 길찾기에 활용할 수 있다. 두 알고리즘의 공통된 특징은 도착점이 주어지지 않고 시작점에서 이동할 수 있는 모든 위치에 대한 최단거리를 계산한다는 것이다. 이러한 특징으로 도착점이 명확하게 주어진 상황에서 그에 대한 최단거리를 구할 때 BFS, 다익스트라는 효율적이지 않다는 것을 알 수 있다. AStar는 BFS, 다익스트라와는 다르게 두 지점 간의 최단거리만을 계산하는 알고리즘으로 시작점과 도착점이 주어졌을 때 사용하기 좋은 알고리즘이다. 이동할 수 있는 위치들에 대해 점수를 매겨가며 최단경로를 찾는 방식으로 F = G + H라는 공식으로 위치에 대한 점수가 정해진다.F : 최종 점수G : 시작점에서 해당 위치까지 이동하는데 드는 비용H : 해당 위치와 도착점까지의 거리 로..
힙 트리는 이진 트리의 하나의 종류이다. 여러 개의 값 중에서 가장 크거나 작은 값을 빠르게 찾기 위해 만들어진 이진 트리이다. 힙 트리를 활용하여 우선순위 큐 등을 구현할 수 있다. 힙 트리에는 두 가지의 조건이 있다.부모 노드의 값은는 자식 노드의 값보다 크거나 작아야 한다. 완전 이진 트리 형태여야 한다.첫 번째 조건은 트리 내 최대, 최소값을 O(1)안에 찾기 위한 조건이다.해당 조건으로 루트 노드가 항상 최대, 최소값을 유지하도록 한다. 두 번째 조건은 값의 삽입, 삭제의 효율을 위한 것이라고 할 수 있다.트리는 완전 이진 트리일 때 하나의 레벨이 항상 꽉 차도록 유지하여 데이터 삽입, 삭제에 영향을 주는 레벨의 크기를 항상 최소로 유지한다. 또한 부모 노드의 인덱스는 (i - 1) / 2, 자..
BFS로도 길찾기 알고리즘을 구현할 수 있지만 노드 간의 이동에 비용이 없을 경우에만 사용할 수 있다는 문제점이 있다.BFS의 이동 기준은 찾은 순서이기 때문에 비용을 고려하지 않기 때문이다. 이동에 비용을 고려하여 최단 경로를 찾아야 할 때는 다익스트라 알고리즘을 사용할 수 있다. 다익스트라 알고리즘의 노드 이동 기준은 노드를 찾은 순서가 아니라 노드의 이동 비용이라는 점에서 BFS와 차이가 있다.또한 항상 최소 비용으로 이동하기 위해서 이미 탐색 후 이동 비용이 정해진 노드에 대해서도 다시 탐색을 진행하여 언제든지 이동 비용을 갱신 할 수 있도록 한다. 로직방문하지 않은 노드 중 이동 비용이 가장 작은 노드 선정 선정한 노드 방문 방문한 노드와 연결되어 있는 노드들에 대해 이동 비용 계산 구현int[..
BFS의 가장 가까운 노드부터 순회하는 특징을 활용하여 최단거리 길찾기 기능을 구현할 수 있다.가장 가까운 노드부터 순회한다는 것은 어떠한 노드가 발견된 순간의 경로가 그 노드에 도착하는 데 최단거리 경로라는 것을 보장하기 때문이다. 로직BFS탐색을 한다.탐색을 진행하며 탐색된 노드가 어떠한 노드로부터 발견되었는지를 부모 노드로서 저장한다.탐색이 끝난 후 도착점에서 부모 노드를 타고 올라가며 시작점에 도착할 때 까지의 부모 노드들을 저장한다. 저장한 부모 노드들의 순서를 역전시킨다. 구현미로에서의 길찾기를 구현하였다.노드는 Pos라는 클래스를 정의하여 나타내었다. public class Pos{ public Pos(int x, int y) { X = x; Y = y; } public int X..
배열크기가 고정적이며 변경할 수 없다.요소들이 메모리상에 연속적으로 저장된다.문제점유동적으로 사용할 수 없다. 동적 배열크기가 유동적이다.요소들이 메모리상에 연속적으로 저장된다. 문제점크기가 변경될 때 많은 비용이 발생한다.삽입, 삭제가 어렵다.해결책배열이 생성될 때 지정한 크기보다 1.5~2배 정도 더 많은 공간을 미리 차지해둔다.간단 구현class MyList{ const int DEFAULT_SIZE = 1; T[] data = new T[DEFAULT_SIZE]; public int Count = 0; //실제로 사용되는 공간 개수 public int Capacity { get { return data.Length; } } //예비 공간 개수 // O(1) publ..
wnstjd
'분류 전체보기' 카테고리의 글 목록