정의
태스크의 시작을 전역 시간의 진행이 촉발하면 그 실행 구조는 시간 구동(time-triggered)이고, 환경에서 온 외부 이벤트나 앞선 태스크의 종료가 촉발하면 이벤트 구동(event-triggered)이다.[1]
소프트웨어 아키텍처가 고정하는 축 가운데 실행 구조는 시간 거동을 직접 좌우한다. 태스크의 시작 시각과 최악 종료 시각만 남기고 내부 로직을 지워 보면 태스크 열의 시간 제어 구조가 드러나는데, 그 구조를 무엇이 만드느냐가 두 방식을 가른다.[1]
이벤트 구동 실행
이벤트 구동 쪽의 뼈대는 이벤트 루프다. 무언가 일어나기를 기다렸다가, 일어난 것이 어떤 종류인지 확인해, 그에 필요한 만큼의 일을 처리하는 반복이 전부다.[2] 각 이벤트를 처리하는 코드가 이벤트 핸들러이고, 핸들러가 도는 동안에는 그것이 시스템에서 벌어지는 유일한 활동이므로 다음에 어떤 이벤트를 처리할지 고르는 일이 곧 스케줄링이 된다.
기다리는 방식은 두 가지다. select()나 poll() 같은 시스템 콜은 처리해야 할 입출력이 있는지 확인해 주는데, 타임아웃을 NULL로 두면 이벤트가 생길 때까지 무기한 블록되고 0으로 두면 곧바로 돌아온다. 뒤쪽이 폴링이다. 어느 쪽이든 루프를 막는 호출은 금물이다 — 루프가 블록되면 시스템 전체가 그동안 놀기 때문이다.
시간 구동 실행
시간 구동 시스템의 근본 성질은 시간 영역을 값 영역에서 떼어 놓는 데 있다. 태스크나 프로토콜 실행이 시작하는 시점은 다루는 데이터와 무관하다고 가정하고, 각 실행의 최악 실행 시간을 미리 안다고 가정한다. 그러면 최악의 종료 시점도 미리 알 수 있고, 시작 시점과 최악 종료 시점이 시간 제어 구조를 이룬다.[1]
실행 시각이 미리 정해져 있으므로 환경을 살피는 방식도 달라진다. 시간 구동 시스템에서 각 태스크는 주기적으로 환경 상태를 관측해 — 이를테면 샘플링해 — 해야 할 계산이 있는지 스스로 판단한다. 이 배치를 설계 시점에 테이블로 굳혀 두는 스케줄링 방식은 순환 스케줄링에서, 그 테이블을 운영체제 객체로 규정한 예는 AUTOSAR OS에서 다룬다.
유연성과 예측 가능성
두 방식의 강점은 서로 다른 곳에 있다. 이벤트 구동 시스템은 유연성에서 앞서고, 시간 구동 시스템은 시간 예측 가능성에서 앞선다.[1] 이벤트 구동에서는 실행 스케줄이 실제 수요에 따라 실행 중에 펼쳐지므로, 어떤 이벤트가 어떤 순서로 언제 몰리느냐에 따라 매번 다른 스케줄이 나타난다.
그래서 이벤트 구동 시스템에서 결정적인 외부 가정은 이벤트 발생 분포다. 평상시와 최대 부하 시의 이벤트 분포를 가정해 시험하고 데드라인 충족을 예측하는데, 그 가정이 현실의 분포와 다르면 예측의 근거 자체가 무너진다. 시간 구동 쪽에서는 드문 이벤트가 언제 일어나는지는 어차피 좌우할 수 없다고 보고, 그 결과로 바뀐 상태를 인식하는 시점만 미리 정해진 관측 격자 위로 묶어 둔다. 이렇게 강제된 규칙성이 시간 구동 구조가 본래 더 예측 가능한 이유다.
다만 이 예측 가능성은 공짜가 아니다. 시간 구동 시스템은 자원 충분성 원칙 위에 설계된다 — 명세된 최대 부하 시나리오를 모든 hard 실시간 태스크가 감당할 만큼의 자원이 갖춰져 있다고 전제하는 것이다. 부하가 몰리는 상황은 실행 중에 스케줄이 적응해 흡수하는 것이 아니라 설계 시점에 미리 계획된다.
버스에서의 같은 구분
같은 구분이 차량 네트워크에도 그대로 나타난다. 이벤트 구동 통신은 의미 있는 사건이 생겼음을 알리려 메시지를 보내므로 비동기적인 사건을 되도록 빨리 반영할 수 있고, 필요한 메시지만 오가니 대역 사용이 효율적이며, 기존 노드를 다시 설계하지 않고 시스템을 넓히기도 쉽다. 대신 시간 제약이 지켜지는지 확인하는 일이 만만치 않고 노드 고장을 검출하기도 어렵다. CAN이 프레임마다 우선순위를 두고 가장 높은 프레임에 버스를 넘기는 방식이 이 계열이며, 그 절차는 CAN 중재에서 다룬다.
시간 구동 통신은 TDMA로 접근 시각을 나눈다. 프레임 스케줄이 정적으로 정해져 있어 시간 거동이 완전히 예측 가능하고 데이터 교환에 걸린 시간 제약이 지켜지는지 확인하기 쉬우며, 오지 않은 메시지가 곧바로 드러나므로 더 이상 동작하지 않는 노드를 짧고 유한한 시간 안에 짚어낼 수 있다. 대가는 주기적으로 보내지 않는 메시지에 대한 비효율과 유연성 부족이다 — 예정에 없던 노드를 붙이면 메시지 스케줄이 바뀌고, 그러면 다른 노드를 모두 갱신해야 한다. 버스별 위치는 차량용 버스 시스템에서 다룬다.