실행·통신 아키텍처 패턴 — 소프트웨어 아키텍처 3축 중 통신 구조와 실행 구조의 세부 패턴 모음. 호출 인터페이스(Sync/Async), 이벤트 처리 방식(Event-Driven, Time-Driven), 메시지 전달 방식(Publish-Subscribe, Client-Server), 실행 트리거(Time-Triggered, Event-Triggered)를 포괄한다.
호출 인터페이스 — Sync vs Async
Synchronous Call Interface
함수 호출 기반. 호출한 쪽이 반환을 기다린다. 제어 흐름이 소프트웨어 내부에서 어떻게 흐르는지가 핵심.
- Layered Architecture가 이 모델을 사용한다.
- 호출한 태스크는 호출된 함수가 끝날 때까지 진행하지 못함.
Asynchronous Message Passing Interface
int main(...) {
send_message(...); // 송신자
}
int main(...) {
recv_message(...); // 수신자
}Asynchronous란 송신자가 수신자가 언제 반응할지 모른다는 의미. 송신 즉시 제어를 돌려받고, 수신자는 자기 일정대로 처리한다. Component-Based 스타일(Component-Based Architecture)이 주로 채택.
실행 구조 — Event-Driven vs Time-Driven
Event-Driven Architecture
Event Handler를 등록하고 이벤트가 도착하면 핸들러를 호출하는 구조. 예: 계산기 UI의 onClickAdd(...), onClickSub(...).
Blocking 버전
int main(...) {
Register Event Handlers
while (TRUE) { // ← Event Loop
Wait Events // 이벤트 없으면 블록
Accept Events
Call Event Handlers
}
}이벤트가 없을 때 블록 — CPU를 소모하지 않는다.
Non-Blocking 버전
int main(...) {
Register Event Handlers
while (TRUE) { // ← Event Loop
if (pending events) {
Accept Events
Call Event Handlers
}
}
}폴링 방식. 블록하지 않고 루프를 계속 돈다 — 다른 일을 사이사이 처리할 수 있지만 CPU 사용률은 높다.
Time-Driven Architecture
int main(...) {
Register Timer Handlers
while (TRUE) { // ← Event Loop
Wait Timer Events
Timer Expires
Call Timer Handlers
}
}트리거가 타이머로 고정된 형태. Event-Driven의 특수한 경우로, 이벤트 소스가 시계뿐이다.
통신 구조 — Pub-Sub vs Client-Server
Publish-Subscribe Architecture
- 일반 message passing: 송신자가 수신자가 누구인지 알고 보낸다.
- Pub-Sub message passing: 주제(Topic) 구독(Subscribe) 기반. 송신자는 수신자가 누구인지 모르고, 수신자는 관심 주제만 구독한다.
송·수신자가 서로 모르는 느슨한 결합. 새 구독자 추가 시 송신자 변경이 불필요.
Client-Server Architecture
Client가 Server에 요청을 보내고 응답을 받는 전통적 인터넷 모델. 송·수신자가 서로 식별한다.
실행 트리거 — Time-Triggered vs Event-Triggered
시간 관점에서 예측 가능성이 중요할 경우 Time-Triggered를 사용한다.
자동차 버스 사례
| 버스 | 트리거 방식 | 성격 |
|---|---|---|
| CAN | Event-Triggered | 이벤트 발생 시마다 전송 |
| FlexRay | Time-Triggered | 예정된 시각에만 전송, 예측 가능 |
Time-Triggered는 타임라인 상의 슬롯에서 통신이 일어나도록 미리 계획하므로, 최악 지연이 설계 시점에 정해진다. 실시간성이 중요한 X-by-wire에는 Time-Triggered 접근이 선호된다 (FlexRay, CAN 참고).
패턴 조합
실제 시스템은 이 패턴들을 조합한다. 예:
- Layered + Sync Call + Event-Driven (Blocking): 전통적 OS 애플리케이션
- Component-Based + Async Message Passing + Pub-Sub + Time-Triggered: AUTOSAR + FlexRay 기반 자동차 도메인