ACE (ADAPTIVE Communication Environment)
: ADAPTIVE (A Dynamically Assembled Protocol Transformation, Integration eValution Environment)
네트워크, 쓰레드 어플리케이션 등의 핵심 패턴을 제공해주는 오픈소스 기반 크로스 플랫폼 C++ 객체지향 프레임워크

ACE 강좌 사이트

ACE 관련 서적
ACE 설치 및 빌드

ACE echo 서버 샘플
ACE 로깅 (a sample chapter 3)
ACE_Log_Msg_Callback 클래스 : 로그가 기록되기 직전에 조작이나 처리를 가능하게 해줌
ACE_Logging_Strategy 클래스 : 실시간 로깅 레벨 변경 지원
sample) 간단한 로깅
#include "ace/Log_Msg.h"
#include "ace/streams.h"
#include <windows.h>
#pragma comment(lib, "ACE.lib")
void TestLogging (void)
{
//ACE_TRACE, ACE_DEBUG, ACE_ERROR는 사실상 차이 없음
ACE_DEBUG((LM_TRACE, ACE_TEXT("%ITRACE\n")));
ACE_DEBUG((LM_TRACE, ACE_TEXT("%ITRACE\n")));
ACE_DEBUG((LM_DEBUG, ACE_TEXT("%IDEBUG\n")));
ACE_DEBUG((LM_INFO, ACE_TEXT("%IINFO\n")));
ACE_DEBUG((LM_NOTICE, ACE_TEXT("%INOTICE\n")));
ACE_DEBUG((LM_WARNING, ACE_TEXT("%IWARNING\n")));
ACE_DEBUG((LM_ERROR, ACE_TEXT("%IERROR\n")));
ACE_DEBUG((LM_CRITICAL, ACE_TEXT("%ICRITICAL\n")));
ACE_DEBUG((LM_ALERT, ACE_TEXT("%IALERT\n")));
ACE_DEBUG((LM_EMERGENCY, ACE_TEXT("%IEMERGENCY\n")));
printf("----------------------------------------------\n");
}
int ACE_TMAIN(int, ACE_TCHAR *[])
{
TestLogging();
ACE_LOG_MSG->priority_mask (0, ACE_Log_Msg::PROCESS); //모든 로그 비활성화
ACE_LOG_MSG->priority_mask (LM_DEBUG | LM_NOTICE, ACE_Log_Msg::THREAD); //현재 스레드에 대해 DEBUG, NOTICE 활성화
TestLogging();
ACE_Log_Msg::disable_debug_messages(LM_DEBUG); //DEBUG 비활성화
ACE_Log_Msg::enable_debug_messages(LM_ERROR); //ERROR 활성화
TestLogging();
//출력방식 변경
ACE_LOG_MSG->open("프로그램이름", ACE_Log_Msg::STDERR); //출력방식 지정 방법1
ACE_LOG_MSG->set_flags(ACE_Log_Msg::VERBOSE_LITE); //출력방식 지정 방법2
TestLogging();
//시스템 로깅장치 사용 : 윈도우 라면 관리도구 > 이벤트 뷰어 에서 확인 가능
ACE_LOG_MSG->open("프로그램 이름", ACE_Log_Msg::SYSLOG, ACE_TEXT("syslogtest"));
TestLogging();
//기본로그 방식으로 변경
ACE_LOG_MSG->open("프로그램 이름"); //stderr로 출력
TestLogging();
//파일에 로깅
ACE_OSTREAM_TYPE *outfile = new std::ofstream("test.out");
ACE_LOG_MSG->msg_ostream(outfile, 0);
ACE_LOG_MSG->set_flags(ACE_Log_Msg::OSTREAM);
TestLogging();
ACE_LOG_MSG->clr_flags(ACE_Log_Msg::OSTREAM);
delete outfile;
return 0;
}
ACE_Get_Opt : main 함수에 들어오는 매개 변수와 옵션에 사용
ACE_Configuration_Heap : 모든 플랫폼 대상의 설정 정보 관리
ACE_Configuration_Win32Registry : 윈도우의 레지스트리 정보 관리


ACE 컨테이너 클래스
STL 등의 컨테이너를 사용할 수 없는 경우 주로 사용
(iterator나 
ACE_DLLList : 이중 연결 리스트
ACE_Bounded_Stack : 정적 크기 스택
ACE_Fixed_Stack : 동적 크기 스택
ACE_Unbounded_Queue : 큐
ACE_Array : 배열
ACE_Bounded_Set : 동적 크기 셋(중복 불허의 순차 구조)
ACE_Unbounded_Set : 정적 크기 셋(중복 불허의 순차 구조)
ACE_Map_Manager : (key,value)의 맵 타입
ACE_Hash_Map_Manager: 해시 맵
ACE_RB_Tree : 이진 트리
ACE_Allocator : 컨테이너 메모리 관리를 위한 할당 클래스
(ACE_New_Allocater, ACE_Static_Allocator, ACE_Cached_Allocator, ACE_Dynamic_Cached_Allocator)
ACE_Malloc : 범용 메모리 할당 클래스



TCP
ACE_SOCK_Stream : 연결에 사용할 TCP 소켓
ACE_SOCK_Connector : 소켓 연결을 위한 클래스
ACE_SOCK_Acceptor : 클라이언트의 연결을 받기 위한 클래스. bint(), accept()등의 처리 담당.
ACE_INET_Addr : sockaddr_in와 같이 절적한 연결 주소 생성 역할


Reactor 입출력 방식 (동기식)
ACE_Reactor : reactor 패턴으로 각종 이벤트 및 입출력 처리 하며 메세지 루프를 실행(ACE_Event_Handler를 등록하여 사용)
ACE_Event_Handler : 각종 이벤트 처리를 위한 클래스 작성시 부모 클래스가 됨(시그널의 이벤트 처리에 대한 콜백 처리용)
ACE_Sig_Set : 시그널을 집합으로 관리하는 클래스
ACE_Time_Value : 타이머 값. 주기적인 시간관리를 위한 클래스
Acceptor-Connector 프레임워크
: 일반적인 연결 처리와 신규 연결의 서비스 실행을 위한 서비스 핸들러 생성 작업을 구현한 프레임 워크
대부분 TCP/IP에서 사용되며 ACE_Acceptor, ACE_Svc_Handler, ACE_Connector 사용
ACE_Acceptor : Acceptor-Connector 프레임워크 사용을 위한 클래스
ACE_Connector : Acceptor-Connector 프레임워크에서 서버로의 연결을 위한 클래스
ACE_Svc_Handler : 통신에 필요한 핸들링을 구현하기 위한 클래스
ACE_Select_Reactor : 윈도우를 제외한 곳에서의 기본 reactor 구현
ACE_WFMO_Reactor, ACE_Msg_WFMO_Reactor : 윈도우에서의 기본 reactor 구현. leader/followers 모델 사용.
ACE_TP_Reactor : ASE_Select_Reactor의 확장 클래스. 동시에 여러 스레드에서 동작하도록 구현. leader/followers 모델 사용.
ACE_Priority_Reactor: ACE_Select_Reactor의 확장 클래스. 우선순위에 따른 처리 가능.

GUI와 통합된 Reactor
ACE_QtReactor, ACE_FlReactor, ACE_TkReactor, ACE_XtReactor
Proactor 입출력 방식 (비동기식)
ACE_Service_Handler : Proactor 프레임워크에서 새로운 서비스 생성 대상 클래스. ACE_Svc_Handler와 비슷
ACE_Handler : ACE_Service_Handler의 부모 클래스. 비동기 입출력 명령의 완료를 다룸. ACE_Event_Handler와 비슷
ACE_Asynch_Read_Stream : 소켓에 읽기 명령 초기화를 위한 팩토리 클래스
ACE_Asynch_write_Stream : 소켓에 쓰기 명령 초기화를 위한 팩토리 클래스
Result : 입출력 결과를 담기 위한 클래스. ACE_Asynch_Result를 상속받아 구현.
ACE_Asynch_Acceptor : accept 받기 위한 클래스
ACE_Asynch_Connector: 접속 요청을 받기 위한 클래스
ACE_Proactor : 입출력 완료시 이벤트 전달 및 hook 메소드 호출 역할을 담당하는 클래스.
ACE_WIN_Proactor : 윈도우 전용의 ACE_Proactor 구현 클래스
ACE_POSIX_Proactor : POSIX 시스템 전용 ACE_Proactor 구현 클래스
ACE_Asynch_Read_File, ACE_Asynch_Write_File: WIndows Named Pipe 사용을 위한 클래스


UDP 관련
ACE_SOCK_Dgram : UDP용 소켓 클래스
ACE_SOCK_Dgram_Bcast : 브로드캐스트를 위한 소켓 클래스
ACE_SOCK_Dgram_Mcast : 멀티캐스트를 위한 소켓 클래스

파일 입출력
ACE_FILE_IO, ACE_FILE_Connector


파이프, POSIX FIFO
ACE_FIFO_Recv, ACE_FIFO_Send, ACE_FIFO_Recv_Msg, ACE_FIFO_Send_Msg
ACE_Pipe,
ACE_SPIPE_Acceptor, ACE_SPIPE_Connector, ACE_SPIPE_Stream, ACE_SPIPE_Addr


Shared Memory Stream
ACE_MEM_Acceptor, ACE_MEM_Connector, ACE_MEM_Stream, ACE_MEM_Addr


Process
ACE_Process_Options : 자식 프로세스 생성시 속성 정의
ACE_Process::spawn(): 새로운 프로세스 생성
ACE_Process_Manager : 프로세스 관리를 좀더 편리하게 하기위한 클래스
ACE_Process_Mutex : 프로세스 동기화를 위한 클래스


Signal
ACE_Sig_Handler, ACE_Sig_Set, ACE_Sig_Guard


Thread
ACE_Task_Base : 스레드 작업에 필요한 클래스. 상속하여 구현한다.
자원에 대한 안전하고 편리한 사용을 위한 보호자(Guard) 클래스들
ACE_Guard<T> : T의 acquire(), release() 사용
ACE_Read_Guard<T> : acquire_read() 사용
ACE_Write_Guard<T> : acquire_write() 사용
ACE_TSS_Guard<T> : 쓰레드 전용 저장소(TSS) 보호자
ACE_TSS_Read_Guard<T> : 스레드 전용 보호자 객체의 acquire_read() 사용
ACE_TSS_Read_Write<T> : 스레드 전용 보호자 객체의 acquire_wrtie() 사용
ACE_Message_Block : 메세지를 효율적으로 사용하기 위한 데이터 컨테이너
ACE_Message_Queue : 메세지 큐 클래스
ACE_Message_Queue_Vx : VxWorks 메세지 큐 기능의 래퍼 클래스
ACE_Message_Queue_Ex : ACE_Message_Queue의 안전성 강화 버전
ACE_Message_Queue_NT : IOCP 구현 버전
ACE_Dynamic_Message_Queue : 동적 우선순위 큐
ACE_At_Thread_Exit : 스레드 종료시 실행할 메소드를 갖는 클래스
ACE_Thread_Manager : 스레드 관리 클래스
ACE_Atomic_Op : 동기화를 제공해주는 클래스


동기화
ACE_Condition : 이벤트 발생시 다른 스레드에게 통지 기능 제공
ACE_Semaphore : 세마포어
ACE_Barrier : 모든 스레드 실행 후 barrier 시점에 도달할떄까지 모든 스레드 블럭시킴(스레드 동시 실행)
ACE_Event : 다른 스레드에게 이벤트 발생시키기 위한 간단한 동기화 클래스
ACE_Mutex : Mutex 동기화 (ACE_Thread_Mutex 등..)

Active Object(능동 객체) 패턴
스레드간 협력 처리에 대한 객체지향적 해결 패턴(Command와 Proxy 패턴의 조합)
처리되어야할 사항을 큐에 넣고 능동객체의 실행 흐름 안에서 처리
능동객체의 메소드 호출시 반환된 futrue 객체의 getResult 메소드에서 실제 wait가 일어남.
관련 클래스
ACE_Task, ACE_Task_Base : 스레드 관련 클래스
ACE_Future : 메소드 호출 결과 확인을 위한 클래스
ACE_Method_Requst : Execute 패턴을 구현하기 위한 인터페이스. call 메소드 제공

Thread pool 모델
Half-sync/half-async 모델
: Thread Pool 을 3가지 Layer로 만들어 구현하는 패턴(Proactor의 기본이 되는 패턴)
Asyncronous Layer : 비동기적으로 요청을 수신
Queue Layer : 요청을 적재
Synchronous :Queue Layer에 있는 요청을 Thread Pool의 Thread로 처리 할 수 있도록 함.
장점
1. 클라이언트 요청 이 갑자기 증가하여 작업 스레드가 모자랄 경우 요청이 큐에 적재되는 효과
2. 비동기와 동기부분의 독립적인 구조. 작업 스레드는 큐에 요청이 없을 경우 대기
단점
1. 동기화 및 context switching 과부하 발생. 데이터 복사 및 캐시로 메모리 과부하 발생
2. 실행 스택이나 TSS(thread-specific storage)에 요청 정보를 담을 수 없음
Leader/followers 모델
: 하나의 leader 스레드가 요청을 받아 처리하며 follower 스레드들 중 하나를 새로운 leader 스레드로 지정함.
처리가 끝난 스레드는 다시 follower 스레드로 대기.

일반적인 Thread Pool은 하나의 Boss Thread(Leader)가 나머지 Thread를 관리하는 방식으로
Boss Thread가 죽는다거나 병목현상이 발생한다면 많은 성능상의 제약 발생.
즉, Leader/Follwer는 높은 성능을 가진 Thread Pool을 만들기 위한 패턴
장점 : 스레드간 context switch가 없고 실행 스택 혹은 TSS 사용 가능
단점 : 갑자기 증가된 클라이언트 요청을 다루기 힘듦. 구현이 복잡함.

공유 메모리
process간 메모리 공유 혹은 메모리 맵 파일 등을 지원
ACE_Allocator : 동적 메모리 할당/해제를 위한 인터페이스 클래스
ACE_Malloc : 메모리 할당을 위한 텀플릿 클래스
ACE 메모리 풀 타입
ACE_MMAP_Memory_Pool : 메모리 맵 파일 기반의 메모리 풀
ACE_Lite_MMAP_Memory_Pool : 메모미 맵 파일 기반의 메모리 풀 경량 버전
ACE_Shared_Memory_Pool : 시스템 V 공유 메모리 기반의 메모리 풀
ACE_Local_Memory_Pool : C++ new 연산자 기반의 메모리 풀
ACE_Pagefile_Memory_Pool : Windows 페이지 파일에 할당된 익명 메모리 영역에 기초한 메모리 풀
ACE_Sbrk_Memory_Pool : sbrk(2)에 기초한 메모리 풀
ACE_Mem_Map : 운영체제의 메모리 매핑 명려에 대한 wrapper 클래스

ACE Stream 프레임 워크
: Pipes and Filters 패턴의 구현으로 각 처리들을 정렬된 단계로 구성하는 유용한 모델링 방법
각 처리 단계(filters 부분)는 ACE_Task 자식 클래스로 구현.
처리 완료된 데이터는 ACE_Task의 메시지 큐(pipes 부분)를 사용하여 다음단계로 전달.
ACE_Stream

ACE Service Configuration
: Component Configurator 패턴의 구현물
정적/동적 링크와 상관없이 런타임시에 서비스와 스트림 프레임워크 객체를 동적으로 설정 변경 가능.
서비스 객체와 스트림 프레임워크 객체(모듈 조립 구조)를 런타임시에 별도 설정에 따라 변경 가능
ACE_Service_Config : 설정 관련 클래스
런타임시 정적/동적 서비스 생성, 스트림 프레임워크 객체 설정, 서비스 객체 재설정, XML파일로 설정

Timer
ACE_Timer_Queue : ACE의 모든 타이머 큐의 부모 클래스
타이머 저장 클래스
ACE_Timer_Heap : 힙에 구현된 priority queue에 타이머 저장
ACE_Timer_List : 이중 연결 리스트에 타이머 보관
ACE_Timer_Hash : 타이머 wheel 알고리즘의 변형을 사용(성능은 해시함수에 의존적임)
ACE_Timer_Wheel : 정렬된 배열 포인터의 배열에 저장

ACE 네이밍 서비스
지속적인 키/값 매핑 기능을 제공
ACE_Naming_Context : 네이밍 흐름 정보상의 값과 키를 담는 클래스
ACE_Name_Options : 네이밍 흐름 인스턴스 설정시 사용