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 RuntimeWatchdogSec | systemd 수준의 죽음 |
서비스 WatchdogSec + sd_notify | “돌고는 있는데 멈춘” 우리 프로그램 |
| 응용 (하위 작업 심장박동) | 프로그램은 살아 있는데 한 루프만 멈춤 |
요령은 “모든 하위 작업이 싱싱할 때만 systemd 를 쓰다듬는다” 입니다. 온도 루프가 멈췄는데 심장박동만 계속 보내면 워치독이 아무 일도 하지 않습니다.
🤔 확인 문제
전원이 나갔을 때 시약 밸브가 닫혀 있게 하려면?
해설 전원이 나가면 코드도 죽습니다. 안전한 상태는 에너지가 사라졌을 때 빠지는 상태여야 합니다 — 이것은 부품 선택의 문제이지 코드의 문제가 아닙니다.
🤔 확인 문제
결함 검출 가운데 한 검사로 가장 많은 고장을 잡는 것은?
해설 센서가 떨어졌든, 히터가 끊겼든, 통이 비었든, 액체가 없든 — 전부 “가열했는데 안 오른다” 로 나타납니다.