19강 / 20강

결함 검출 — 고장부터 설계한다

워치독 · 범위 · 정체 · 타임아웃 · 페일세이프

결함 검출 — 고장부터 설계한다
여덟 시간 가운데 어디서 멈춰도 안전해야 합니다.

이 강의에서 가장 중요한 강입니다. 그리고 순서가 거꾸로인 것처럼 보이지만— 고장을 먼저 설계하고 기능을 나중에 붙이는 것이 옳습니다.

먼저, 소프트웨어가 할 수 없는 일을 인정한다

고장을 하나 일으켜 보세요. 어느 검출기가 잡고 어느 것이 못 잡는지 보입니다.
불러오는 중…

try/finally 는 안전장치가 아니다

이런 일이 생기면finally 가 도나
보통 예외 · Ctrl-C✅ 돈다 — 이것이 본래 용도다
systemd 의 SIGTERM⚠️ 핸들러를 달아 둔 경우에만
SIGKILL (강제 종료 · 메모리 부족)❌
C 라이브러리(드라이버!)의 세그폴트❌
커널 패닉 · SD 카드 사망 · 정전❌
교착(deadlock) — 살아 있는데 멈춤❌ 그리고 이것이 가장 흔하다

게다가 finally 가 돌더라도 그 안의 valve.close() 는 버스가 살아 있어야 동작합니다. I²C 가 멈춰 있으면 아무것도 못 씁니다.

try/finally 는 질서 있는 종료를 위한 것입니다. 안전은 배선이 맡습니다.

“시켰는데 반응이 없다” 가 가장 많은 고장을 한 번에 잡습니다. 센서 값만 보는 검사로는 못 잡는 것들입니다.
Python 브라우저에서 실행

워치독은 넷을 겹쳐 쌓는다

층무엇을 잡나
하드웨어 (/dev/watchdog)커널이 통째로 멈춤 → SoC 리셋. 상한이 약 15초다
systemd RuntimeWatchdogSecsystemd 수준의 죽음
서비스 WatchdogSec + sd_notify“돌고는 있는데 멈춘” 우리 프로그램
응용 (하위 작업 심장박동)프로그램은 살아 있는데 한 루프만 멈춤

요령은 “모든 하위 작업이 싱싱할 때만 systemd 를 쓰다듬는다” 입니다. 온도 루프가 멈췄는데 심장박동만 계속 보내면 워치독이 아무 일도 하지 않습니다.

🤔 확인 문제
전원이 나갔을 때 시약 밸브가 닫혀 있게 하려면?
🤔 확인 문제
결함 검출 가운데 한 검사로 가장 많은 고장을 잡는 것은?