Upload
vail
View
88
Download
0
Embed Size (px)
DESCRIPTION
DPD-Tool & TMO. 2007. 1. 5 안 동 인. 목 차. 연구 배경 연구 필요성 DPD-Tool 의 설계 및 구현 분산객체그룹 프레임워크 기반의 DPD-Tool 구성요소 설계 GUI 환경 구현 DPD-Tool 을 이용한 분산응용 분산응용 개발절차 DPD-Tool 설치 및 실행 사칙연산 TMO 소개 개념 및 구조 , 특성 TMO 설정 프로젝트 속성 설정 config.ini TMO 프로그래밍 방법 TMO 선언 및 등록 TMO 예제 - PowerPoint PPT Presentation
Citation preview
WONKWANG UNIVERSITY
DPD-Tool & TMO
2007. 1. 5
안 동 인
2WONKWANG UNIVERSITY
목 차 연구 배경 연구 필요성 DPD-Tool 의 설계 및 구현
분산객체그룹 프레임워크 기반의 DPD-Tool 구성요소 설계 GUI 환경 구현
DPD-Tool 을 이용한 분산응용 분산응용 개발절차 DPD-Tool 설치 및 실행 사칙연산
TMO 소개 개념 및 구조 , 특성
TMO 설정 프로젝트 속성 설정 config.ini
TMO 프로그래밍 방법 TMO 선언 및 등록
TMO 예제 Appendix C (one_node, two_node)
3WONKWANG UNIVERSITY
연구 배경 분산객체그룹 프레임워크 간편한 적용 필요
효율적인 분산객체 관리 기술 객체 그룹
다양한 분산서비스 지원 네이밍 , 동적 바인딩 , 다중복 객체 지원 서비스 실시간 서비스 지원
프레임워크의 지원기능을 DLL 로 개별적으로 호출
분산객체그룹 프레임워크 기반의 분산 프로그래밍 개발 툴 (Distributed Programming Developing Tool, DPD-Tool) GUI 환경에서 분산객체그룹 프레임워크 서비스를 편리하게 제공 .
4WONKWANG UNIVERSITY
연구 필요성 분산응용의 편리한 개발 환경 지원
분산객체의 편리한 인터페이스 확인 다양한 분산서비스 제공 독립적인 분산응용 개발 환경 지원
Distributed Object
Distributed Object
Human Factors Language Architecture
Distributed Object GroupFramework
Research Area
UserUser
UserUserModelModel
Distributed Programming Developing Tool
Interface
PresentationPresentationModelModel
Conceptual ModelConceptual Model
5WONKWANG UNIVERSITY
DPD-Tool 의 설계 및 구현 분산객체그룹 프레임워크 기반의 DPD-Tool
GROUPMANAGER
OBJECT
SECURITYOBJECT
INFORMATIONREPOSITORY
OBJECT
DYNAMICBINDEROBJECT
REAL-TIMEMANAGER
OBJECT
SCHEDULEROBJECT
Object Management Service Real-Time Service
OBJECT GROUPADMINISTRATOR
GUI
SERVERPROGRAMMING
DEVELOPERGUI
CLIENTPROGRAMMING
DEVELOPERGUI
Dis
trib
ute
d P
rogr
amm
ing
Dev
elop
ing
En
viro
nm
ent
and
Too
l
DISTRIBUTEDAPPLICATION
OBJECT GROUP
DISTRIBUTEDAPPLICATIOND
istr
ibu
ted
Ob
ject
Gro
up
Con
cep
ts
Object GroupsNon-grouped object
Replicated objects
Shared object
PROGRAMEDITOR
DISTRIBUTED OBJECT GROUP FRAMEWORK
GROUPMANAGER
OBJECT
SECURITYOBJECT
INFORMATIONREPOSITORY
OBJECT
DYNAMICBINDEROBJECT
REAL-TIMEMANAGER
OBJECT
SCHEDULEROBJECT
Object Management Service Real-Time Service
OBJECT GROUPADMINISTRATOR
GUI
SERVERPROGRAMMING
DEVELOPERGUI
CLIENTPROGRAMMING
DEVELOPERGUI
Dis
trib
ute
d P
rogr
amm
ing
Dev
elop
ing
En
viro
nm
ent
and
Too
l
DISTRIBUTEDAPPLICATION
OBJECT GROUP
DISTRIBUTEDAPPLICATIOND
istr
ibu
ted
Ob
ject
Gro
up
Con
cep
ts
Object GroupsNon-grouped object
Replicated objects
Shared object
PROGRAMEDITOR
DISTRIBUTED OBJECT GROUP FRAMEWORK
6WONKWANG UNIVERSITY
분산객체그룹 프레임워크 기반의 DPD-Tool 이종의 응용 프로그래밍 언어와 분산 미들웨어에 독립적인 환경에서
분산응용 프로그램을 개발가능
CORBA
DPD-Tool
C
TMOSM
DPD-Tool
C++
Java-ORB
DPD-Tool
Java
DistributedApplication
7WONKWANG UNIVERSITY
구성요소 설계 분산객체그룹 프레임워크의 기능들을 편리하게 제공할 수 있도록 3
개의 모듈로 설계 객체그룹 운영자 모듈
전체적인 수행환경을 관리 신뢰할 수 있는 서버 개발자와 클라이언트 개발자들에게 객체그룹을 사용할
권한을 부여 그룹별 동적 바인딩 알고리즘을 설정
서버 프로그램 개발자 모듈 서버 프로그램 개발자 자신들이 구현한 서버 객체들의 그룹 등록 및 철회 . 클라이언트 개발자의 서버 객체 사용 요청에 대한 접근권한 설정 .
클라이언트 프로그램 개발자 모듈 서비스 검색 및 접근권한 요청 . 접근이 허가된 서비스들의 그룹 재구성 .
8WONKWANG UNIVERSITY
GUI 환경 구현 (1/3) 각 모듈에 따른 GUI 환경 제공 객체그룹 운영자 GUI
① : 분산응용들의 구성요소인 서버객체들의 제공서비스에 따라 그룹별로 등록된 DOGF 의 객체정보저장소 내의 정보를 .
② : 객체그룹 내에 중복객체들 중 서비스 수행에 적절한 객체를 선택하여 동적으로 바인딩 하기 위한 알고리즘을 적용 .
③ : 현재 DOGF 내의 분산응용의 그룹관리를 위한 설정 및 상태 정보 표시 .
①
②
③
9WONKWANG UNIVERSITY
GUI 환경 구현 (2/3) 서버 프로그램 개발자 GUI
① : 서버객체들이 제공하는 서비스에 따라 그룹별로 관리되고 있는 객체그룹 정보를 확인 . ② : 클라이언트로부터 접수된 서버객체에 대한 접근권한 허가요청 목록을 확인하고 , 접근권한을
설정 . ③ : 개발된 서버객체들을 그룹으로 등록하거나 수정 및 삭제 . ④ : DOGF 의 그룹설정 및 상태 정보 표시 .
②
④
①
③
10WONKWANG UNIVERSITY
GUI 환경 구현 (3/3) 클라이언트 프로그램 개발자 GUI
① : DOGF 에 등록된 서버객체들을 검색하고 , 사용할 서버객체에 대한 접근권한을 서버 개발자에게 요청 . 접근권한이 부여된 서버객체들은 클라이언트 개발자가 새로운 그룹으로 재구성 .
② : 클라이언트 개발자 시스템 내의 프로그램 에디터를 사용할 수 있도록 링크 . ③ : 접근권한이 허가된 서버객체들로 재구성된 그룹을 보임 . ④ : DOGF 의 그룹설정 및 상태 정보 표시 .
②①
④
③
11WONKWANG UNIVERSITY
DPD-Tool 을 이용한 분산응용 분산응용 개발절차
Step 1: 서버 프로그램 개발자는 클라이언트로부터 요청을 받을 수 있는 서버 프로그램을 개발한 후 , 서버 프로그램 개발자 GUI 를 이용해 객체그룹에 서버 프로그램을 등록 .
Step 2: 클라이언트 프로그램 개발자는 객체그룹에 등록된 전체 서버 프로그램에서 자신이 사용할 서버 프로그램들을 선정한 후 접근권한을 요청 .
Step 3: 서버 개발자로부터 접근권한을 허가받고 그룹을 재구성한 후 서비스를 요청하는 클라이언트 프로그램을 개발 .
Step 4: 서버 및 클라이언트 프로그램 수행 시 클라이언트 프로그램은 분산객체그룹 프레임워크에게 자신이 이용할 서버의 속성정보를 요청 후 반환
Step 5: 서버 프로그램에 접속하여 서비스를 이용 .
Step 1
Step 3
Step 2OBJECT GROUPADMINISTRATOR
GUI
SERVERPROGRAM
SERVERPROGRAM
DEVELOPERGUI
CLIENTPROGRAM
DEVELOPERGUI
CLIENTPROGRAM
DOGF
Step 4
Step 5
12WONKWANG UNIVERSITY
DPD-Tool 설치 및 실행 DPD-Tool v0.43.zip 압축을 해제
Admin.exe 는 관리 컴퓨터에서 실행 Server.exe 는 서버 개발자 컴퓨터에서 실행 Client.exe 는 클라이언트 개발자 컴퓨터에서 실행
실행하는 PC 에 Visual Studio 설치가 안되었을 경우 압축 파일에 동봉된 DLL 파일도 실행파일 ( 확장자 exe) 과 함께 가지고 있어야 함 .
차후 자동 설치 할 수 있는 배포판 개발 예정 .
DPD-Tool v0.43 실행 Admin 실행 포트번호 설정 후 ‘ Connect’ 버튼 클릭 Server 실행
아이디 , 패스워드 입력 . 객체그룹 생성 및 객체 등록
Client 실행 아이디 , 패스워드 입력 . 서비스 검색 및 접근권한 요청 .
Server 등록한 객체에 대한 클라이언트의 접근권한 요청 처리 Client 허가된 서비스를 이용하여 클라이언트 프로그램 작성
13WONKWANG UNIVERSITY
사칙연산 (1/4) 개발 절차
서버 객체 구현(add, subtract, multiple, divide)
서버 객체 등록(Operator 그룹 생성 )
등록된 서비스 검색(add, subtract, multiple, divide)
서비스 접근권한 요청(add, subtract, multiple, divide)
그룹 재구성(Operator 그룹 , divide 제외 )
클라이언트 접근권한 요청 처리(add, subtract, multiple 만 허가 )
클라이언트 객체 구현(Client)
분산응용 실행(Client)
분산응용 실행(add, subtract, multiple)
서버 개발자 클라이언트 개발자Add_TMO1Add_TMO2Add_TMO3
Subtract_TMOMultiple_TMODivide_TMO
Client_TMO
14WONKWANG UNIVERSITY
사칙연산 (2/4) 분산 응용의 4 개의 연산자 (add(), subtract(), multiple(), divid
e()) 는 DOGF 에 그룹 (Operator) 으로 등록되었음 . Client_TMO add() 서비스를 DOGF 에 요청 (Add_TMO1, Add
_TMO2, Add_TMO3 중 선택 )
Client_TMOClient_TMO
Securityobject
Add_TMO2Add_TMO2
Multiple_TMOMultiple_TMO
Add_TMO1Add_TMO1Group
Managerobject
InformationRepository
object
DynamicBinderobject
Distributed Object Group
Other object Group
①
②
③④
⑥
⑦
⑤
⑥
Add_TMO2.add(5, 3);
add(x, y)
add(x, y)
multiple(x, y)
Where is “add” ?
“Add_TMO2”
Return result is “8”
Subtract_TMOSubtract_TMO
Divide_TMODivide_TMO
divide(x, y)
subtract(x, y)
⑥
Add_TMO3Add_TMO3
add(x, y)
System ASystem ASystem BSystem B
15WONKWANG UNIVERSITY
사칙연산 (3/4) 실행 결과
16WONKWANG UNIVERSITY
사칙연산 (4/4) DPD-Tool 매뉴얼 ‘사칙연산’ 소스 참조
서버 객체 Add_TMO1,2,3 Subtract_TMO Multiple_TMO Divide_TMO
클라이언트 객체 Client_TMO
17WONKWANG UNIVERSITY
TMO 소개 TMO 개념
Time-triggered Message-triggered Object 기존 객체 모델에 대한 확장으로 객체 자체적인 실시간 특성에 따라
동작하는 실시간 객체 기존 객체는 클라이언트의 서비스 요청 메시지에 의해 동작하지만 , TMO 는
기존 객체 특성에 자치적인 동작 추가 TMO 구조
ODS(Object Data Store) EAC(Environment Access Capability) AAC(Autonomous Activation Condition) SpMs(Spontaneous Methods) SvMs(Service Methods)
TMO 특성 분산 컴퓨팅 컴포넌트 SpM 과 SvM Basic Concurrency Constraint(BCC) 모든 TMO 객체의 메소드에 마감시간 부여
18WONKWANG UNIVERSITY
TMO 설정 (1/6) TMO 사용환경 .
Windows XP/2000/NT/CE Visual Studio .NET 2003 Linux
TMOSL 의 Appendix G 에 설정 방법 소개 . Appendix G 단점 – 불편하다 .
프로젝트 설정 시 라이브러리 등 모든 경로가 절대 경로로 잡힘 . TMO 지원 라이브러리의 위치가 변경될 경우 ,
프로젝트 속성 재설정 . TMO 프로그램을 다른 컴퓨터로 옮길 경우 ,
해당 컴퓨터에 설치된 TMO 지원 라이브러리 위치로 프로젝트 속성 재설정 .
새로운 설정 방법 상대 경로 이용 .
19WONKWANG UNIVERSITY
TMO 설정 (2/6) 새 프로젝트 생성
새 프로젝트 Visual C++ 프로젝트 Win32 콘솔 프로젝트 응용 프로그램 설정 빈 프로젝트 체크
빌드 실행 (Debug 폴더 생성됨 )
20WONKWANG UNIVERSITY
TMO 설정 (3/6) 라이브러리 파일 생성된 Debug 폴더로 복사
config.ini msvcp71d.dll msvcr71d.dll TMOSL.dll TMOSL.h TMOSL.lib
프로젝트 속성 설정 소스 파일에 cpp 파일 추가
속성 설정을 위해 최소 하나 필요 프로젝트 명 오른쪽 버튼 클릭 속성 선택
21WONKWANG UNIVERSITY
TMO 설정 (4/6) 디버깅 작업 디렉터리
./Debug C/C++ 일반 추가 포함 디렉터리
./Debug C/C++ 전처리기 전처리기 정의
클릭 후 UNICODE;_UNICODE 입력 C/C++ 코드 생성 런타임 라이브러리
다중 스레드 디버그 DLL (/MDd) 선택 링커 일반 추가 라이브러리 디렉터리
./Debug 링커 입력 추가 종속성
TMOSL.lib
확인 버튼 클릭
22WONKWANG UNIVERSITY
TMO 설정 (5/6) 기타 사항
TMO 에서 소켓 사용 시 ‘링커명령줄추가옵션’ 에 ‘ ws2_32.lib’ 입력
TMO 라이브러리를 이용한 객체 선언 시 상단에 아래 소스 추가 예 ) TMO 선언부 , RMMC 선언부 , ODSS 선언부 뒤에 소스에서 확인 .
#include "TMOSL.h"#pragma comment(lib, "TMOSL")
using namespace TMO;
23WONKWANG UNIVERSITY
TMO 설정 (6/6) config.ini 파일 설정
ip_addr = 서버 IP 입력
local_ip = 로컬 IP 입력
num_of_DC_nodes = 분산 노드 개수
num_of_links = 분산 노드 개수
( 본인 IP, 본인 IP) = 0 ( 본인 IP, 분산 노드 IP) = 0
… < 분산 노드 개수 만큼 >
( 본인 IP, 분산 노드 IP) = 0
서버 IP
로컬 IP
분산 노드 개수
24WONKWANG UNIVERSITY
TMO 프로그래밍 방법 (1/5) main() 함수에서 TMO 인스턴스 생성
< 출처 : TMOSL Manual>
void main(){ StartTMOengine ();
tms TMO_start_time1 = tm4_DCS_age(3*1000*1000); Ahn_TMO Ahn(_T("Ahn_TMO"),_T("Ahn_SvM"), _T("RMMC1"), TMO_start_time1);
MainThrSleep ();}
25WONKWANG UNIVERSITY
TMO 프로그래밍 방법 (2/5) TMO 선언 및 등록
Ahn_TMO::Ahn_TMO(TCHAR * TMO_name, TCHAR * SvM_name, TCHAR * RMMC_name, tms TMO_start_time):RMMC1(RMMC_name, SvM_name){
// register SvM …
// register SpM …
// register TMO …}
class Ahn_TMO: public CTMOBase{public:
Ahn_TMO (TCHAR * TMO_name, TCHAR * SvM_name, TCHAR * RMMC_name, tms TMO_start_time);private:
Ahn_ODSS ODSS1;int Ahn_SpM();int Ahn_SvM(ParamStruct *); // SvM to be trigger by a SvM Parameter MessageCRMMC RMMC1;
};
< 생성자 : TMO 등록 >
< 클래스 : TMO 선언 >
26WONKWANG UNIVERSITY
TMO 프로그래밍 방법 (3/5) register SvM
// register SvM
SvM_RegistParam svm_spec; svm_spec.GETB = 20 * 1000; _tcscpy(svm_spec.name, SvM_name);
svm_spec.build_regist_info_ODSS(RMMC1.GetId(), RW);svm_spec.build_regist_info_ODSS(ODSS1.GetId(), RW);RegisterSvM((PFSvMBody)Ahn_SvM, &svm_spec);
27WONKWANG UNIVERSITY
TMO 프로그래밍 방법 (4/5) register SpM
// register SpM
SpM_RegistParam spm_spec;
MicroSec from = 4 * 1000 * 1000;MicroSec until = 1 * 60 * 60; until *= 1000 * 1000;MicroSec every = 1 * 1000 * 1000;MicroSec est = 0;MicroSec lst = 150 * 1000;MicroSec by = 400 * 1000;
AAC aac_spec(_T(""), tm4_DCS_age(from), tm4_DCS_age(until), every, est, lst, by);
spm_spec.build_regist_info_AAC(aac_spec);spm_spec.build_regist_info_ODSS(RMMC1.GetId(), RW);spm_spec.build_regist_info_ODSS(ODSS1.GetId(), RW);RegisterSpM((PFSpMBody)Ahn_SpM, &spm_spec);
28WONKWANG UNIVERSITY
TMO 프로그래밍 방법 (5/5) register TMO
// register TMO
TMO_RegistParam tmo_spec; _tcscpy(tmo_spec.global_name, TMO_name); tmo_spec.start_time = TMO_start_time; RegisterTMO(&tmo_spec);
29WONKWANG UNIVERSITY
TMO 예제 (1/24) TMOSL 의 Appendix C 예제 one_node 예제
30WONKWANG UNIVERSITY
TMO 예제 (2/24) TestODSS.h
#ifndef TESTODSS_H#define TESTODSS_H
#include "TMOSL.h"#pragma comment(lib, "TMOSL")
using namespace TMO;
class ODSSClass1:public ODSSBaseClass <ODSSClass1>{public:
int Count;ODSSClass1(){Count = 0; }
};
typedef struct {TCHAR name[80];MicroSec system_age;
} ParamStruct_TMO1class_SvM; // Dummy parameter
#endif//************************************************************************// end of TestODSS.h//************************************************************************
31WONKWANG UNIVERSITY
TMO 예제 (3/24) TestTMO.h
#ifndef TESTTMO_H#define TESTTMO_H#include "TestODSS.h"
#include "TMOSL.h"#pragma comment(lib, "TMOSL")
using namespace TMO;
class TMO1: public CTMOBase{private:
SvMGateClass gate1;ODSSClass1 ODSS1;int SpM1();int SvM1(ParamStruct_TMO1class_SvM *);
public:TMO1(TCHAR *, TCHAR *, AAC &, TCHAR *, TCHAR *, tms, tms);
};
#endif//************************************************************************// end of TestTMO.h//************************************************************************
32WONKWANG UNIVERSITY
TMO 예제 (4/24) TestTMO.cpp (1/4)
#include "TestTMO.h"
int TMO1::SpM1(){
tmsp Timestamp;int count;MicroSec system_age;ParamStruct_TMO1class_SvM SvMPara;
// SpM startedTMOSLprintf(_T("<SpM Started>\n"));
// SpM print out ODSS1 Counter value and Current System Agecount = ODSS1.Count;system_age = GetCurrentDCSage();TMOSLprintf(_T("<SpM> count: %d, System Age: %I64d\n"), count, system_age);
// Call SvM1 through gate1 with dummy parameter_tcscpy(SvMPara.name, _T("SpM1 of TMO1 --> SvM1 of TMO1"));SvMPara.system_age = GetCurrentDCSage();gate1.OnewaySR(&SvMPara, sizeof(SvMPara), Timestamp);return TRUE;// End SpM
}
33WONKWANG UNIVERSITY
TMO 예제 (5/24) TestTMO.cpp (2/4)
int TMO1::SvM1(ParamStruct_TMO1class_SvM * pReq){
MicroSec old_value = pReq->system_age;TMOSLprintf(_T("SvM1 (%d) is invoked, the client age is %I64d, server age
is %I64d !\n"), GetCurrentThreadId(), old_value, pReq->system_age = GetCurrentDCSage());
ODSS1.Count++;return TRUE;
}
34WONKWANG UNIVERSITY
TMO 예제 (6/24) TestTMO.cpp (3/4)
TMO1::TMO1(TCHAR * TMO_external_name, TCHAR * SvM_external_name, AAC & aac_spec, TCHAR * ServerTMO_name, TCHAR * ServerSvM_name, tms gate_start_time1, tms TMO_start_time1):gate1(ServerTMO_name, ServerSvM_name, gate_start_time1){
// register SvMSvM_RegistParam svm_spec;svm_spec.GETB = 20 * 1000;_tcscpy(svm_spec.name, SvM_external_name);svm_spec.build_regist_info_ODSS(ODSS1.GetId(), RO);RegisterSvM((PFSvMBody)SvM1, &svm_spec);
// register SpMSpM_RegistParam spm_spec;spm_spec.build_regist_info_AAC(aac_spec);spm_spec.build_regist_info_ODSS(ODSS1.GetId(), RW);RegisterSpM((PFSpMBody)SpM1, &spm_spec);
// register TMOTMO_RegistParam tmo_spec;_tcscpy(tmo_spec.global_name, TMO_external_name);tmo_spec.start_time = TMO_start_time1;RegisterTMO(&tmo_spec);
}
35WONKWANG UNIVERSITY
TMO 예제 (7/24) TestTMO.cpp (4/4)
int main(){
StartTMOengine();
tms TMO_start_time0 = tm4_DCS_age(2*1000*1000);tms gate_start_time0 = tm4_DCS_age(3*1000*1000);
// Sometimes need to decompose assignment of microsecond-based time value// because MS compiler limits constant to 32 bits.MicroSec from = 5; from *= 1000 * 1000;MicroSec until = 2 * 60 * 60;until *= 1000 * 1000;MicroSec every = 1 * 1000 * 1000;MicroSec est = 0;MicroSec lst = 5 * 1000;MicroSec by = 100 * 1000;AAC aac1(_T(""), tm4_DCS_age(from), tm4_DCS_age(until), every, est, lst,by);TMO1 T1(_T("TMO1"), _T("SvM1"), aac1,
_T("TMO1"), _T("SvM1"), gate_start_time0, TMO_start_time0);
MainThrSleep();
return TRUE;}//************************************************************************// end of TestTMO.cpp//************************************************************************
36WONKWANG UNIVERSITY
TMO 예제 (8/24) config.ini 파일 수정
서버 IP
로컬 IP
분산 노드 개수
37WONKWANG UNIVERSITY
TMO 예제 (9/24) 실행 결과
38WONKWANG UNIVERSITY
TMO 예제 (10/24) two_node 예제
39WONKWANG UNIVERSITY
TMO 예제 (11/24) TestODSS1.h
#ifndef TESTODSS1_H#define TESTODSS1_H
#include "TMOSL.h"#pragma comment(lib, "TMOSL")
using namespace TMO;
class ODSSClass1:public ODSSBaseClass <ODSSClass1>{public:
int Count;ODSSClass1():Count(0){}
};
typedef struct {int count;
} ParamStruct_TMO1class_SvM1;
typedef struct {MicroSec system_age;
} ParamStruct_TMO2class_SvM2;
#endif//**********************************// end of TestODSS1.h//**********************************
40WONKWANG UNIVERSITY
TMO 예제 (12/24) TestTMO1.h
#ifndef TESTTMO1_H#define TESTTMO1_H
#include "TestODSS1.h"
#include "TMOSL.h"#pragma comment(lib, "TMOSL")
using namespace TMO;
class TMO1: public CTMOBase{public:
TMO1(TCHAR *, TCHAR *, AAC&, TCHAR *, TCHAR *, tms, tms);private:
ODSSClass1 ODSS1;SvMGateClass gate1;int SpM1();int SvM1(ParamStruct_TMO1class_SvM1 * param);
};
#endif//**********************************// end of TestTMO1.h//**********************************
41WONKWANG UNIVERSITY
TMO 예제 (13/24) TestTMO1.cpp (1/4)
#include "TestTMO1.h"int TMO1::SpM1(){
tmsp Timestamp;int count;MicroSec system_age, system_age_again;ParamStruct_TMO2class_SvM2 SvM2Para;
// SpM startedTMOSLprintf(_T("SpM Started \n"));
// Get and print out Counter and// current System Age
count = ODSS1.Count ;system_age = GetCurrentDCSage();TMOSLprintf(_T("%d:: System Age : %I64d\n"), count, system_age);
// Call TMO2 SvM1 to get TMO2 System Age.gate1.NonBlockingSR(&SvM2Para, sizeof(SvM2Para), Timestamp);
// You might do something heregate1.BlockingGetResultOfNonBlockingSR(Timestamp, 70000);
// Print out TMO2 System Age and// Current System Agesystem_age_again = GetCurrentDCSage();
TMOSLprintf(_T("TMO2 System Age : %I64d\n"), SvM2Para.system_age);TMOSLprintf(_T("Curt System Age : %I64d + %I64d = %I64d\n"),
system_age, system_age_again - system_age, system_age_again);
return TRUE;}
42WONKWANG UNIVERSITY
TMO 예제 (14/24) TestTMO1.cpp (2/4)
int TMO1::SvM1(ParamStruct_TMO1class_SvM1 * pReq){ int count;
// SvM startedTMOSLprintf(_T("SvM1 Started\n"));
// Receive Service Request and// return Counter value
count = ODSS1.Count ;pReq->count = count;
// Increment CounterODSS1.Count = ++count ;
return TRUE;}
43WONKWANG UNIVERSITY
TMO 예제 (15/24) TestTMO1.cpp (3/4)
TMO1::TMO1(TCHAR * TMO_external_name, TCHAR * SvM_external_name, AAC & aac_spec, TCHAR * ServerTMO_name, TCHAR * ServerSvM_name, tms gate_start_time1, tms TMO_start_time1):gate1(ServerTMO_name, ServerSvM_name, gate_start_time1){
// register SvMSvM_RegistParam svm_spec;svm_spec.GETB = 20 * 1000;_tcscpy(svm_spec.name, SvM_external_name);svm_spec.build_regist_info_ODSS(ODSS1.GetId(), RW);RegisterSvM((PFSvMBody)SvM1, &svm_spec);
// register SpMSpM_RegistParam spm_spec;spm_spec.build_regist_info_AAC(aac_spec);spm_spec.build_regist_info_ODSS(ODSS1.GetId(), RW);RegisterSpM((PFSpMBody)SpM1, &spm_spec);
// register TMOTMO_RegistParam tmo_spec;_tcscpy(tmo_spec.global_name, TMO_external_name);tmo_spec.start_time = TMO_start_time1;RegisterTMO(&tmo_spec);
}
44WONKWANG UNIVERSITY
TMO 예제 (16/24) TestTMO1.cpp (4/4)
int main(){
StartTMOengine();tms TMO_start_time0 = tm4_DCS_age(5*1000*1000);tms gate_start_time0 = tm4_DCS_age(7*1000*1000);
// Sometimes need to decompose assignment// of microsecond-based time value because// MS compiler limits constant to 32 bits.
MicroSec from = 5;from *= 1000 * 1000;MicroSec until = 2 * 60 * 60;until *= 1000 * 1000;MicroSec every = 1 * 1000 * 1000;MicroSec est = 0;MicroSec lst = 5 * 1000;MicroSec by = 100 * 1000;
AAC aac1(_T(""), tm4_DCS_age(from),tm4_DCS_age(until),every, est, lst, by);TMO1 T1(_T("TMO1"), _T("SvM1"), aac1,_T("TMO2"), _T("SvM2"), gate_start_time0, TMO_start_time0);
MainThrSleep();return TRUE;
}//**********************************// end of TestTMO1.cpp//**********************************
45WONKWANG UNIVERSITY
TMO 예제 (17/24) TestODSS2.h
#ifndef TESTODSS2_H#define TESTODSS2_H
#include "TMOSL.h"#pragma comment(lib, "TMOSL")
#include "TestODSS2.h"
using namespace TMO;
typedef struct {int count;
} ParamStruct_TMO1class_SvM1;
typedef struct {MicroSec system_age;
} ParamStruct_TMO2class_SvM2;
#endif//**********************************// end of TestODSS2.h//**********************************
46WONKWANG UNIVERSITY
TMO 예제 (18/24) TestTMO2.h
#ifndef TESTTMO2_H#define TESTTMO2_H
#include "TMOSL.h"#pragma comment(lib, "TMOSL")
#include "TestODSS2.h"
using namespace TMO;
class TMO2: public CTMOBase{public:
TMO2(TCHAR *, TCHAR *, AAC &, TCHAR *, TCHAR *, tms, tms);
private:SvMGateClass gate2;int SpM2();int SvM2(ParamStruct_TMO2class_SvM2 * param);
};
#endif//**********************************// end of TestTMO2.h//**********************************
47WONKWANG UNIVERSITY
TMO 예제 (19/24) TestTMO2.cpp (1/4)
#include "TestTMO2.h"int TMO2::SpM2(){
tmsp Timestamp;MicroSec system_age;ParamStruct_TMO1class_SvM1 SvM1Para;
// SpM started.TMOSLprintf(_T("SpM Started \n"));
// Print out current System Age.system_age = GetCurrentDCSage();TMOSLprintf(_T(" :: current System Age : %I64d\n"), system_age);
// Call TMO1 SvM1 to get ODSS1 Countergate2.NonBlockingSR(&SvM1Para, sizeof(SvM1Para), Timestamp);
// You might do something heregate2.BlockingGetResultOfNonBlockingSR(Timestamp, 70000);
// Print out Counter value and// current System Age.TMOSLprintf(_T("%d:: current System Age : %I64d ::Interval\n"),
SvM1Para.count, GetCurrentDCSage() - system_age);
return TRUE;// End SpM}
48WONKWANG UNIVERSITY
TMO 예제 (20/24) TestTMO2.cpp (2/4)
int TMO2::SvM2(ParamStruct_TMO2class_SvM2 * pReq){ // int count;
// SvM startedTMOSLprintf(_T("SvM2 Started\n"));
// Return local node's System Age.pReq->system_age = GetCurrentDCSage();
return TRUE;}
49WONKWANG UNIVERSITY
TMO 예제 (21/24) TestTMO2.cpp (3/4)
TMO2::TMO2(TCHAR * TMO_external_name, TCHAR * SvM_external_name, AAC & aac_spec, TCHAR * ServerTMO_name, TCHAR * ServerSvM_name, tms gate_start_time2, tms TMO_start_time2):gate2(ServerTMO_name, ServerSvM_name, gate_start_time2){
// register SvMSvM_RegistParam svm_spec;svm_spec.GETB = 20 * 1000;_tcscpy(svm_spec.name, SvM_external_name);RegisterSvM((PFSvMBody)SvM2, &svm_spec);
// register SpMSpM_RegistParam spm_spec;spm_spec.build_regist_info_AAC(aac_spec);RegisterSpM((PFSpMBody)SpM2, &spm_spec);
// register TMOTMO_RegistParam tmo_spec;_tcscpy(tmo_spec.global_name, TMO_external_name);tmo_spec.start_time = TMO_start_time2;RegisterTMO(&tmo_spec);
}
50WONKWANG UNIVERSITY
TMO 예제 (22/24) TestTMO2.cpp (4/4)
int main(){
StartTMOengine();tms TMO_start_time0 = tm4_DCS_age(5*1000*1000);tms gate_start_time0 = tm4_DCS_age(7*1000*1000);
// Sometimes need to decompose assignment// of microsecond-based time value because// MS compiler limits constant to 32 bits.
MicroSec from = 5;from *= 1000 * 1000;MicroSec until = 2 * 60 * 60;until *= 1000 * 1000;MicroSec every = 1 * 1000 * 1000;MicroSec est = 0;MicroSec lst = 5 * 1000;MicroSec by = 100 * 1000;AAC aac2(_T(""), tm4_DCS_age(from), tm4_DCS_age(until), every, est, lst, by);TMO2 T2(_T("TMO2"), _T("SvM2"), aac2, _T("TMO1"), _T("SvM1"), gate_start_time0 ,
TMO_start_time0);MainThrSleep();
return TRUE;}//**********************************// end of TestTMO2.cpp//**********************************
51WONKWANG UNIVERSITY
TMO 예제 (23/24) config.ini – TestTMO1 과 TestTMO2
서버 IP
로컬 IP
분산 노드 개수
서버 IP
로컬 IP
분산 노드 개수
52WONKWANG UNIVERSITY
TMO 예제 (24/24) 실행 결과