C#

[C#] 비동기 코드 async / await / Task 작성 및 내부 구현
·
C# .NET
비동기 코드 작성 C# 5의 핵심 기능으로 기존에 사용하던 TPL을 기반으로한 async / await이 등장했고, 이 기능을 이용하면 동기 코드와 매우 유사한 방식으로 비동기 코드를 작성할 수 있다. 작업이 완료될 때까지 아래에 있는 코드가 수행되지 않는다는 면에서 블로킹 호출과 유사하지만, 현재 수행 중인 스레드를 블로킹하지 않는다는 점에서 큰 차이가 있다. 비동기 함수란, async 한정자를 사용하여 선언한 메서드의 익명 함수를 말하며, await 연산자를 이용하여 '대기' 를 표현할 수 있다.await의 주요 목적은 시간을 많이 소비하는 작업이 완료될 때까지 수행이 중단되는 것을 막는 것이다. public class Program { private static async Task Main(s..
[C#] CancellationToken / CancellationTokenSource 작성 및 내부 구현
·
C# .NET
.Net Framework 4부터 비동기 또는 장기 실행되는 동기 작업의 협조적 취소(Cooperative Cancellation)를 위해 통합 모델을 사용한다. 이 모델은 취소 토큰이라는 경량 개체를 기반으로 한다. 각 작업에 토큰을 전달한다. 일정한 시점에서 토큰을 만든 개체는 각 작업을 멈추도록 요청할 수 있다.토큰을 받은 수신 측은 취소 요청을 확인하고 적절한 방식으로 응답할 책임이 있다. 하지만 가능한 빠르게 정리하고 종료해야 한다.작업이 취소되었을 때 적절한 취소 메커니즘을 구현하지 못한다면 사용자의 만족도를 낮출 수 있고, 메모리 누수나 불필요한 연산 낭비가 일어날 수 있다. 취소 토큰을 사용하는 일반적인 패턴은 아래와 같다.1. CancellationTokenSource를 인스턴스화하여 C..
[C#] HttpClient 내부 구현 파헤치기
·
C# .NET
HTTP (Hypertext Transfer Protocol) 은 HTML과 같은 하이퍼미디어 문서를 전송하기 위한 애플리케이션 계층 프로토콜이다. HTTP는 웹에서 이루어지는 모든 데이터 교환의 기초이며, 클라이언트가 요청을 하기 위해 연결을 연 다음 응답을 받을때 까지 대기하는 전통적인 클라이언트-서버 모델을 따른다. 클라이언트와 서버는 개별적인 메시지 교환에 의해 통신한다. 클라이언트에 의해 전송되는 메시지를 요청(requests)이라고 부르며, 그에 대해 서버에서 응답으로 전송되는 메시지를 응답(responses)이라고 부른다. 이 요청과 응답 사이에는 여러 개체들이 있는데, 다양한 작업을 수행하는 게이트웨이, 캐시 역할을 하는 프록시 등이 있다.실제로는 클라이언트와 서버 사이에는 라우터, 모뎀 ..
[C#] ClientWebSocket 내부 구현 파헤치기
·
C# .NET
WebSocket은 ws 프로토콜을 기반으로 클라이언트와 서버 사이에 지속적인 완전 양방향 연결 스트림을 만들어 주는 기술이자 프로토콜이다. WebSocket은 HTTP와 구별된다. 두 프로토콜 모두 OSI 모델의 제7계층에 위치해 있으며 제4계층의 TCP에 의존한다. HTTP polling은 클라이언트가 주기적으로 요청을 보내고 서버가 응답하는 request/response 패턴이라, WebSocket처럼 하나의 연결에서 지속적으로 양방향 메시지를 주고받는 구조와 다르다. WebSocket 연결은 HTTP 기반 handshake로 시작된다.HTTP/1.1에서는 GET + Upgrade 방식으로 연결을 WebSocket 프로토콜로 전환하고,HTTP/2에서는 extended CONNECT 방식으로 WebS..
[C#] 람다 표현식(Lambda Expression) 이해하기
·
C# .NET
람다 표현식은 코드를 간결하게 표현하기 위한 기능으로 C# 3.0에 도입되었다. 기본 문법은 항상 다음과 같은 모습을 띤다.parameter => body 중괄호가 포함된 경우 문장 본문, 간략하게 한 줄로 쓰는 경우는 표현식 본문이라고 한다. // 문장 본문Func multiplay = (int x, int y) ⇒ { return x * y; };// 표현식 본문Func multiplay = (int x, int y) ⇒ return x * y;Func multiplay = (x, y) ⇒ x * y; 아래의 경우에도 위와 비슷하지만, 매개변수가 1개이기 때문에 매개변수 부분의 소괄호도 생략할 수 있다. Func squareLength = (string text) => { int length = t..

Operating System

[UNIX] 멀티 프로세스 및 스레드 공유 데이터 동기화
·
System Programming
개념협력적 멀티 프로세스 및 멀티 스레드는 공유 데이터를 동시에 접근하면 그 결과가 접근 순서에 의존되어 데이터의 일관성을 망칠 수 있다.따라서 이들의 질서있는 실행을 보장하여, 데이터의 일관성을 유지해야 한다. 멀티 프로세스와 멀티 스레드에 대한 자세한 내용은 아래의 링크 참고 [UNIX] 멀티 프로세스 (Multi Process) 프로그래밍개념 프로세스란 실행 중인 프로그램(실행 파일)이자, 현대의 컴퓨팅 시스템에서 작업의 단위이다. 프로세스는 실행되는 동안 여러 개의 새로운 프로세스들을 생성할 수 있다. 생성하는 프로세sikpang.tistory.com [UNIX] 멀티 스레드 (Multi Thread) 프로그래밍개념 프로세스 내에서 실행되는 흐름을 말한다. 기본적으로 하나의 프로세스에는 하나의 ..
[UNIX] 파이프 (Pipe) 제대로 사용하기
·
System Programming
개념파이프는 두 프로세스가 통신할 수 있게 하는 전달자로,UNIX 기반 운영체제에서 제공하는 프로세스 간 통신 (Inter-Process Communication, IPC) 기법 중 하나이다. 멀티 프로세스에 대한 자세한 설명은 아래의 링크 참고. [UNIX] 멀티 프로세스 (Multi Process) 프로그래밍개념 프로세스란 실행 중인 프로그램(실행 파일)이자, 현대의 컴퓨팅 시스템에서 작업의 단위이다. 프로세스는 실행되는 동안 여러 개의 새로운 프로세스들을 생성할 수 있다. 생성하는 프로세sikpang.tistory.com 사용법 #include int pipe(int pipefd[2]); pipe()의 인자로 파이프의 fd가 들어갈 크기 2개짜리 int 배열을 받는다.pipe()가 성공하면, 인..
[UNIX] TCP/IP 소켓 (Socket) 프로그래밍
·
System Programming
-->개념물리적으로 연결된 네트워크상에서의 데이터 송수신에 사용할 수 있는 소프트웨어적 장치다.(네트워크 망의 연결에 사용되는 도구, 더 나아가서 네트워크를 통한 두 컴퓨터의 연결) 커널에 내부 버퍼를 가지고 있고, 꽉 차면 더이상 전송과 수신을 하지 않으므로 데이터 손실이 없다.리눅스는 소켓 조작을 파일 조작과 동일하게 간주한다. 즉, 소켓을 파일의 일종으로 구분한다. 네트워크의 연결에는 TCP와 UDP가 나뉘지만, 해당 포스팅에서는 TCP를 다룬다. 함수서버 측에서의 소켓과 클라이언트 측에서의 소켓은 사용법이 다르다. 서버 측#include int socket(int domain, int type, int protocol); // 소켓 생성int bind(int sockfd, struct socka..

Computer Architecture

[CS] 동적 메모리 할당과 할당기의 원리 (Dynamic Memory Allocation)
·
Computer System
프로그램이 동적 메모리 할당을 사용하는 가장 중요한 이유는 프로그램을 실제로 실행시키기 전에는 자료 구조의 크기를 알 수 없는 경우들이 있기 때문이다.배열을 정해진 크기를 사용해서 할당하는 것은 종종 나쁜 방법이 된다. 실제 머신에서 가용한 가상메모리의 크기와는 무관하게 설정되어 만약 그 크기보다 더 큰 데이터를 읽으려고 한다면 더 큰 수로 수정하고 컴파일을 다시 하는 방법 밖에 없다. 동적 메모리 할당기가상메모리의 영역을 저수준의 mmap과 munmap 함수를 사용해서 생성 및 삭제할 수 있지만, 대개 동적 메모리 할당기를 사용하는 것을 더 편리하고 호환성이 좋다고 생각한다.동적 메모리 할당기는 힙이라고 하는 프로세스의 가상메모리 영역을 관리한다. 시스템마다 다르지만, 대부분 힙이 데이터 영역 직후에 ..
[CS] 메모리 매핑 (Memory Mapping)
·
Computer System
메모리 매핑은 가상메모리 영역의 내용을 디스크의 객체에 연결해서 초기화하는 작업이다. 가상메모리 영역들은 다음 두 종류의 객체 중 하나로 매핑될 수 있다. 1. 리눅스 파일 시스템 내의 일반 파일파일 섹션은 페이지 크기의 조각들로 나누어지고 이들은 각각 가상페이지의 초기 내용을 포함하고 있다.요구 페이징때문에 CPU가 처음 페이지에 접근할 때 까지는 실제로 물리 메모리로 스왑되어 들어오지 않는다.일반 디스크 파일의 연속적인 섹션 (ex. 실행 가능한 목적 파일) 으로 매핑될 수 있다. 2. 무기명 파일CPU가 이 영역의 가상페이지를 접근할 때 커널은 물리 메모리 내에 적당한 희생자 페이지를 찾아내고, 만약 이게 수정되었다면 (dirty) 희생자 페이지를 스왑 아웃하고, 희생자 페이지를 이진수 0으로 덮어..
[CS] 가상 메모리와 주소 공간 (Virtual Memeory)
·
Computer System
메모리를 보다 효율적이고 더 적은 에러 발생으로 관리하기 위해 현대의 시스템은 가상 메모리(virtual memory)라고 알려진 메인 메모리의 추상화를 제공한다.가상 메모리는 각 프로세스에 하나의 크고 통합된 사적 주소공간을 제공한다.가상 메모리는 한 개의 깔끔한 메커니즘을 사용해서 세 개의 중요한 기능을 제공한다.메인 메모리를 디스크에 저장된 주소 공간에 대한 캐시로 취급해서, 메인 메모리 내 활성화 영역만 유지하고, 데이터를 디스크와 메모리 간에 필요에 따라 전송하여 효율적으로 사용한다.각 프로세스에 통일된 주소 공간을 제공함으로써 메모리 관리를 단순화한다.각 프로세스의 주소 공간을 다른 프로세스에 의한 손상으로부터 보호한다. 물리 및 가상주소 방식 컴퓨터 시스템의 메인 메모리는 M개의 연속적인 바..

Data Structure

[C] 해시 테이블 (Hash Table) 개념 및 구현
·
Data Structure
개념해시 함수를 이용하여 키(key)를 index로 만들어 배열의 해당 index에 데이터를 보관하는 자료구조 보통 키(key)로 값(value)을 맵핑하는 식으로 사용한다. C++ STL의 unordered_map, unordered_set, 그리고 여러 언어들의 Dictionary나 HashMap, HashSet 등이 포함된다. 특징- 배열의 각 요소는 키와 값 등으로 이루어진 구조체(및 클래스)로 이루어져 있다. - key를 index로 변환시키는 다양한 해시 함수가 존재하며, 이의 성능에 따라 더욱 성능이 좋아질 수 있다. - 특정 요소 삽입, 삭제, 탐색이 O(1)이며, 최악의 경우 O(N)이다. 장점특정 요소를 탐색할 때 O(1)으로 굉장히 빠르다. 단점1. 충돌 가능성을 줄이기 위해 데..
[C] 이진 탐색 트리 (Binary Search Tree) 개념 및 구현
·
Data Structure
개념각각의 노드가 최대 두 개의 자식 노드(왼쪽 자식, 오른쪽 자식)를 가지고 있는 이진 트리 구조다. 데이터를 삽입할 때, 각각의 노드와 비교하며 삽입할 데이터가 노드의 데이터보다 작을 시 왼쪽 자식으로,클 시 오른쪽 자식으로 내려가며 비어있는 곳까지 내려가 삽입된다. 특징1. 트리에서 데이터를 검색할 때 이진 탐색 알고리즘과 동일한 시간 복잡도의 성능을 가진다. 2. 중위 순회로 데이터들을 정렬된 상태로 순회할 수 있다. 3. 배열로도 구현이 가능하고, 연결 리스트로도 구현이 가능하다. 따라서 구현한 자료구조에 따라서 해당 자료구조의 특징을 갖는다. 4. 요소의 삽입, 삭제, 접근은 O(logN), 최악의 경우 O(N) 이다. 장점1. 특정 데이터를 검색할 때 꽤나 빠른 편이다. O(logN..
[C] 동적 배열 (Dynamic Array) 개념 및 구현
·
Data Structure
개념가변 배열이라고도 불리며, 크기가 고정되어 있지 않은 배열이다. 배열을 조금 더 쉽고 활용도 높게 사용하기 위한 자료구조다. C++ STL에서의 vector, Java에서의 ArrayList 등이 해당된다. 특징1. 배열이기 때문에 메모리가 연속적이다. 2. 일반 배열과는 다르게 배열의 데이터가 용량보다 많아지는 순간 배열을 더욱 크게 재할당 한다. 3. 일반 배열과는 다르게 중간에 데이터 삽입이 가능하며 데이터 손실이 없다. 4. 일반 배열과는 다르게 중간의 데이터 삭제가 일어날 경우, 빈 공간 없이 한 칸씩 당겨진다. 5. 요소의 삽입은 맨 뒤에 삽입할 경우 O(1), 이외에는 O(N) 이며 요소의 삭제는 맨 뒤를 삭제할 경우 O(1), 이외에는 O(N) 이다. 특정 원소 접근은 O(..

Computer Graphics

[CG] 레이캐스팅 (Ray casting) 이해 및 구현
·
Computer Graphics
본 포스팅은 Lode's Computer Graphics Tutorial: Raycasting (이하 레퍼런스)을 보고 정리한 글입니다.또한, 창을 띄우고 그래픽을 랜더링하는 부분은 본 포스팅에서 다루지 않습니다. 개념 카메라에서 각 픽셀을 통과하는 가상의 광선을 쏘아 무엇이 보이는지 결정하는 기법이다.이를 통해 2차원 맵에서 원근감을 포현한 3D 랜더링을 할 수 있다.레이캐스팅 기술을 사용한 게임은 Wolfenstein 3D, Doom 등이 있다. 알고리즘 2차원 맵이 존재하고, 플레이어(카메라)의 위치에서 플레이어가 바라보는 방향으로 모든 x축 픽셀을 대상으로 가상의 광선을 쏜다.광선이 벽과 충돌하면 수직의 벽을 그리는데, 플레이어와의 거리에 따라서 벽의 높이를 정한다. 벽의 높이를 구하면 모니..

Unity

[Unity] Navigation - NavMeshAgent
·
Unity
유니티에서 최단 거리를 탐색하여 추적할 수 있는 캐릭터를 생성하는데에 사용되는 Navigation에 대해 알아보자. 그 중, 이번 포스팅은 NavMeshAgent를 중점적으로 알아보고, NavMeshObstacle에 대해서도 간단하게 알아보고자 한다. 개념유니티의 Navigation 시스템을 사용하면 씬 내에서 지능적으로 탐색하여 이동할 수 있는 캐릭터를 만들 수 있다. 이때, 자동으로 씬에 생성되는 NavMesh는 게임 월드에서 걸을 수 있는 표면을 뜻하며, 이를 이용하여 목적지까지 경로를 찾고 이동하는 캐릭터에 부착되는 컴포넌트가 NavMeshAgent이다. 내부 작업 Navigation을 사용하여 캐릭터를 지능적으로 움직이려면 크게 두가지의 기능으로 나뉘는데, 첫째로 맵을 탐색하여 목적지까지의..
[Unity] 레이캐스트 (Physics.Raycast)
·
Unity
Unity에서 광선을 쏘아 충돌체를 감지할 수 있는 Physics.Raycast알아보고, 이를 디버깅할 때 사용할 수 있는 Draw.Debug에 대해 간단히 알아보자. 개념시작 지점에서 특정 방향으로 씬의 모든 충돌체를 상대하는 광선을 투사한다. ※ 주의할 점: Raycast의 시작 지점과 충돌해있는 Collider은 감지되지 않는다. 매개변수Physics.Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance, int layerMask); - origin에서 direction 방향으로 maxDistance 길이의 광선을 쏜다. 해당 layerMask의 Collider만 충돌하며, 충돌체에 대한 정보를 ..
[Unity] 코루틴 (Coroutine)
·
Unity
Unity의 Coroutine에 대해 알아보자. 개념싱글스레드에서 동시성으로 진행되는 일시 중단, 재개가 가능한 프로그램 구성 요소 필요성1. 시간이 지남에 따라 점진적으로 결과를 보여주고자 할 때2. 어느 시점으로부터 일정 시간 이후 작업을 진행하고자 할 때3. 프레임마다 호출이 아닌, 일정 시간마다 호출하여 연산의 수를 줄이고자 할 때 4. 너무 무거운 작업을 Update에서 진행할 시의 오버헤드 방지 설명1. 동시성동시성 (Concurrency) : 일을 여러개로 나누어 번갈아 가면서 실행하여 동시에 처리하는 것처럼 보이는 것 병렬성 (Parallelism) : 멀티코어 환경에서 실제로 여러개의 일을 동시에 처리하는 것 기본적으로 싱글스레드로 진행되는 유니티는 Coroutine을 사용하여도 ..