분류 전체보기 262

[컴퓨터 구조] 1. 명령어

내장 프로그램 - 여러 종류의 데이터와 명령어를 메모리에 숫자로 저장할 수 있는 모든 프로그램 RISC-V: UC 버클리가 개발한 2010년대 이후 컴퓨터 구조 - 컴파일러는 C 프로그램을 RISC-V 어셈블리 언어 명령어로 바꾸는 작업을 한다. 1. 명령어 기초 피연산자 - 64 비트, 더블 워드 크기를 가지는 레지스터에 피연산자가 저장된다. - 레지스터 개수는 32개가 최대이다. --- 예시 f = (g + h) - (i +j); // f, g, h, i, j가 각각 레지스터 x19, x20, x21, 22에 할당되었다면, add x5, x20, x21 // x5에 g + h 결과를 저장한다. add x6, x21, x22 // x6에 i + j 결과를 저장한다. sub x19, x5, x6 // x..

[Modern C++] (5-2) 오른값 참조, 이동 의미론, 완벽전달

이번 포스트에서는 보편 참조를 사용할 때 주의사항에 관해 정리해본다. 4. 보편 참조에 대한 중복적재(오버로딩)을 피해라 사람이름을 받아 현재 시간을 기록하고 그 이름을 전역 자료구조에 추가하는 코드를 보자. std::mutliset names; void logAndAdd(const std::string& name) { auto now = std::chrono::system_clock:now(); // 현재 시간 측정 log(now, "logAndAdd"); // 로그를 기록 name.emplace(name); // 이름을 추가 } std::string petName("Darla"); logAndAdd(petName); // 1. 왼값 std::string logAndAdd(std::string("Per..

Advanced C++ 2021.04.14

[Modern C++] (5-1) 오른값 참조, 이동 의미론, 완벽전달

이동 의미론(Move Semantics)과 완벽 전달(Perfect Forwarding) Move Semantics: 비싼 복사 연산을 덜 비싼 이동 연산으로 대체할 수 있다. Perfect Forwarding: 임의의 인수들을 받아서 다른 함수로 전달하는 함수를 작성할 때, 정확히 같은 타입의 인수로 전달할 수 있다. 1. std::move와 std::forward를 숙지한다. std::move는 주어진 인수를 무조건 오른값으로 캐스팅하고, std::forward는 특정 조건이 만족될 때에만 그런 캐스팅을 수행한다. - std::move의 구현 namespace std { // C++ 11 template typename remove_reference::type&& move(T&& param) { us..

Advanced C++ 2021.04.12

[디자인 패턴] 행동 패턴 (11) 템플릿 메서드 Template Method

템플릿 메서드 (Template Method) 패턴 1. 의도 객체 연산에 알고리즘의 뼈대만 정의하고 알고리즘을 구성하는 연산의 구현은 서브 클래스로 미룬다. 2. 활용 Application 클래스와 Document 클래스를 제공하는 응용프로그램의 프레임워크의 예를 들어보자. Application의 클래스는 Document에 관한 연산들을 선언하고 있고 Document는 실제 문서를 열고 저장하고 닫는 연산을 선언한다. Applcation 클래스는 Document 인스턴스를 소유하며 이에 대한 OpenDocument 연산의 예시를 보면, void Application::OpenDocument (const char* name) { if(!CanOpenDocument(name) { // 이 문서를 처리할 수..

[TCP/IP 소켓 프로그래밍] (18) IOCP 서버

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 IOCP 서버 Overlapped IO는 입출력 자체를 중첩하여 수행하는 의미이다. IOCP에서는 중첩뿐만아니라 입출력이 완료된 이후 처리를 별도의 쓰레드가 담당하도록 해준다. Completion Port 오브젝트 IOCP에서 완료된 IO의 정보가 Completion Port 오브젝트라는 커널 오브젝트에 등록된다. 어떤 IO의 완료 상황을 처리할 것인가 그것을 트리거하는 주체는 누가될 것인가를 정해야한다. 그 주체는 바로 epoll과 같이 소켓 핸들이며 CP 오브젝트와 연결하여 사용한다. HANDLE CreateIoCompletionPort(HANDLE FileHandle, HANDLE ExistingCompletionPort, ULONG_PTR Co..

[TCP/IP 소켓 프로그래밍] (17) Overlapped IO 서버

IOCP 서버 모델을 구현하기 앞서 Overlappd IO를 수행하는 Sender와 Receiver로 Overlapped IO 서버를 구현해본다. 리눅스의 epoll과 대비되는 윈도우의 IOCP는 논블로킹 소켓을 기반으로 Overlapped IO 입출력 기능을 사용한다. 논블로킹 모드의 소켓 구성하기 SOCKET hListnSock; int mode = 1; //... hListnSock = WSASocket(PF_INET, SOCK_STREAM, 0, NULL, 0, WS_FLAG_OVERLAPPED); ioctlsocket(hLisnSock, FIOBIO, &mode); // for non-blocking socket //... 리눅스에서 epoll의 엣지 트리거 서버를 구현할 때, fcntl(파일 ..

[자료구조] 알아야 할 자료구조 Red-Black Tree

AVL 트리와 마찬가지로 자가 균형 트리의 종류 모든 노드는 레드 혹은 블랙으로 표현되며 이 색깔의 성질에 의해 트리의 균형이 맞춰진다. 균형이 완벽하지는 않지만 여전히 트리의 높이가 O(logN)에 보장되며 이는 탐색, 삽입, 삭제를 O(logN)에 보장하게 된다. 레드 블랙 트리의 성질 모든 노드는 레드 혹은 블랙이다. 루트 노드는 항상 검정이다. 레드 노드의 자식노드는 항상 검정이다. 한 노드에서 리프 노드까지 가는 모든 경로상에 만나는 검정 노드의 수는 모든 경로가 같은 수를 가져야 한다. Null 자식 노드는 검정 노드이다. 레드 블랙트리의 정의에 따라 한 노드에서 자기 자신을 제외한 리프 노드까지 도달하는데 만나는 블랙 노드의 수를 black height라고 하고 bh(v)라고 표현할 수 있다..

C++/자료 구조 2021.04.07

[TCP/IP 소켓 프로그래밍] (16) 비동기 모델 Overlapped IO

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 비동기 Notification IO IO 완료에 대한 알림이 비동기적으로 처리되는 것 IO(입출력)의 중첩(Overlapped) 하나의 쓰레드 내에서 동시에 둘 이상의 영역으로 데이터를 전송함으로 인해서 입출력이 중첩되는 상황을 가리켜 'IO 중첨' 이라 한다. 이러한 일이 가능하려면 기본적으로 IO 입출력 함수는 논블로킹 (바로 반환하는) 함수여야 된다. 위 그림에서 각 소켓 B, C, D을 목적으로하는 출력버퍼를 통해 데이터를 중첩하여 보내는 모델이 Overlapped IO 모델이자 비동기 IO 모델이라 할 수 있다. Overlapped IO 모델의 중점 IO가 비동기적으로 일어나는 점보다 중요한 것은 IO가 완료된 상황을 확인하는 방법에 있다. ..

[TCP/IP 소켓 프로그래밍] (15) 비동기 모델 Asynchronous Notification IO

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 동기화된 입출력 함수의 동작 방식 전송 : send가 호출되는 순간 출력 버퍼로 데이터 쓰기가 시작되고 데이터 쓰기가 완료되면 send 함수가 반환된다. 수신 : recv가 호출되는 순간 입력 버퍼로 데이터를 읽기가 시작되고 데이터 읽기가 완료되면 recv 함수가 반환된다. select 함수는 대표적인 동기적 Notification 모델의 예로 관찰대상의 파일 디스크립터 중 하나라도 변화가 있을 시 반환하는 함수이기 때문이다. 즉, IO가 필요한 상황이 알림이 되는 시점이 함수가 반환되는 시점과 일치한다. 동기화된 "입출력"의 단점 입출력이 진행되는 동안 호출된 함수가 반환을 하지 않으니, 다른 일을 할 수가 없다. 비동기적 입출력 함수의 동작 방식 ..

[디자인 패턴] 행동 패턴 (10) 방문자 Visitor

방문자 (Visitor) 패턴 1. 의도 객체 내부 원소에 대해 수행할 연산을 표현하는 방법. 연산을 적용할 원소의 클래스를 변경하지 않고 새로운 연산을 정의한다. 2. 활용 - 추상 구문트리 프로그램 코드를 구성하는 구문의 의미를 분석하는 컴파일러가 있다 하자. 컴파일러는 트리 구조의 코드를 추적하며 각 구문이 의미하는 변수 타입, 최적화, 흐름 분석, 문법 검사 등을 수행할 것이다. 이러한 연산을 각 구문을 구성하는 노드에 정의하면 다음과 같이 클래스 구조가 정의된다. 위와 같이 새로운 노드 클래스를 정의할 때마다 그에 맞는 컴파일러 연산을 정의해야한다. 문제는 이러한 연산이 클래스 전반적으로 퍼져있기 때문에 컴파일러 연산에 대한 유지보수와 새로운 기능 정의 등이 어렵다는 점이다. 따라서 각 노드에 ..