전체 글 269

[디자인 패턴] 행동 패턴 (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. 활용 - 추상 구문트리 프로그램 코드를 구성하는 구문의 의미를 분석하는 컴파일러가 있다 하자. 컴파일러는 트리 구조의 코드를 추적하며 각 구문이 의미하는 변수 타입, 최적화, 흐름 분석, 문법 검사 등을 수행할 것이다. 이러한 연산을 각 구문을 구성하는 노드에 정의하면 다음과 같이 클래스 구조가 정의된다. 위와 같이 새로운 노드 클래스를 정의할 때마다 그에 맞는 컴파일러 연산을 정의해야한다. 문제는 이러한 연산이 클래스 전반적으로 퍼져있기 때문에 컴파일러 연산에 대한 유지보수와 새로운 기능 정의 등이 어렵다는 점이다. 따라서 각 노드에 ..

[TCP/IP 소켓 프로그래밍] (14) 쓰레드 동기화 (윈도우)

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 유저 모드와 커널 모드 유저 모드: 응용 프로그램이 실행되는 기본 모드, 하드웨어 접근이 제한되고 사용할 수 있는 메모리 공간에도 제약이 있다. 커널 모드: 운영체제가 실행될 때의 모드, 메모리, 하드웨어 접근에 제약이 없다. 운영체제는 일반 프로그램이 실행되는 모드는 유저 모드로 두어 컴퓨터 자원을 보호한다. 쓰레드와 같은 운영체제 자원을 생성할 시 유저 모드에서 커널 모드의 변환이 필요하며 생성된 쓰레드를 다시 커널모드에서 유저 모드로 전환하여 전달한다. 쓰레드 동기화, 유저 모드 vs 커널 모드 유저 모드에서 사용하는 동기화 기법은 운영체제의 힘을 빌리지 않기 때문에 빠르다. 커널 모드에서 사요하는 동기화 기법은 운영체제의 힘을 빌리기 떄문에 비..

[TCP/IP 소켓 프로그래밍] (13) 커널 오브젝트 (윈도우)

출처 : 열혈 TCP/IP 소켓 프로그래밍 윤성우 저 커널 오브젝트란? 윈도우 운영체제가 생성해서 관리하는 모든 리소스 파일 데이터의 입출력, 스레드, 프로세스등 윈도우에서 운영체제가 관리하기 위해 리소스 정보를 위한 데이터 블록을 생성하고 관리하도록 한다. 이러한 데이터 블록을 '커널 오브젝트'라하며 리소스마다 관리되는 정보량이 다르기 때문에 데이터 블록의 크기도 각각 다르다. 커널 오브젝트의 소유자는 운영체제이며, 생성, 관리 그리고 소멸시점까지 결정하는 것은 모두 운영체제의 몫이다. 윈도우기반의 스레드 생성 main 함수가 프로그램의 시작이 되는 프로그램에서 main 함수를 호출하는 주체는 스레드이다. 예전 운영체제 시스템에서는 프로세스가 실행 흐름의 최소 단위였던 적이 있었으나 현대 운영체제에서는..

[TCP/IP 소켓 프로그래밍] (12) 다중 접속 서버 - 쓰레드

멀티 프로세스 기반 서버의 단점 새로운 클라이언트가 연결될 때마다 프로세스를 생성하는 것은 기존 프로세스의 메모리를 복사하는 것으로 비용이 크다. 두 프로세스간 통신을 위해 IPC라는 방법을 사용해야한다. 결정적으로 CPU 사용 시간을 나누어 사용하기 때문에 두 프로세스 간 문맥 교환이 일어난다. 프로세스 문맥 교환은 한 프로세스를 메인 메모리에서 내리고 다른 프로세스를 메인 메모리로 올리기 때문에 시간이 오래 걸리게 된다. 쓰레드란 쓰레드는 프로세스를 구성하는 실행 흐름으로 단위가 작다. 프로세스는 독립적인 메모리공간을 사용하기 때문에 데이터, 스택, 힙의 영역을 각 프로세스마다 독립적으로 갖는다. 쓰레드는 프로세스의 일부분으로 한 프로세스 내 여러 쓰레드는 프로세스 메모리 공간을 공유할 수 있다. 데..