미들웨어 프로세스 관리
📌 개요
- 미들웨어 위 로봇 소프트웨어 = 수십 개의 프로세스(노드)가 동시에 도는 시스템
- 프로세스 관리 = 이들을 띄우고·통신시키고·충돌 없이 협력시키고·죽으면 살려내는 것
- 빈출 핵심: 프로세스 상태 천이(준비↔실행→대기), 프로세스와 스레드의 비교, IPC 기법 비교(공유 메모리가 가장 빠름), 뮤텍스·세마포어, 교착상태의 4가지 필요조건
📖 핵심 개념
프로세스의 일생 — 5가지 상태
프로세스(Process)는 실행 중인 프로그램이며, OS는 프로세스를 다섯 상태로 관리한다.
- 생성(New) → 준비(Ready): 실행 준비 완료, CPU 배정만 기다림
- 준비 → 실행(Running): 스케줄러가 CPU를 배정(디스패치)
- 실행 → 준비: 시간 할당량(타임 슬라이스) 만료 또는 더 급한 프로세스에 선점당함
- 실행 → 대기(Waiting/Blocked): 입출력 등 이벤트를 기다리며 CPU를 내놓음
- 대기 → 준비: 기다리던 이벤트 완료 (바로 실행이 아니라 준비로 감에 주의!)
- 실행 → 종료(Terminated)
준비(Ready) 는 "CPU만 주면 당장 뛸 수 있는" 상태, 대기(Waiting) 는 "CPU를 줘도 못 뛰는(I/O 결과를 기다리는)" 상태다. 대기가 끝나면 실행이 아니라 준비 큐로 들어간다.
- 각 프로세스의 정보(상태, 레지스터, 메모리 정보)는 PCB(Process Control Block) 에 저장
- 컨텍스트 스위칭(Context Switching) = CPU를 다른 프로세스로 넘길 때 현재 상태를 PCB에 저장하고 다음 것을 복원하는 작업
- 공짜가 아니며, 너무 잦으면 오버헤드가 커짐
프로세스 vs 스레드
| 구분 | 프로세스 | 스레드 |
|---|---|---|
| 메모리 | 독립 공간 (서로 침범 불가) | 프로세스 안에서 코드·전역 데이터·힙 공유 (스택만 개별) |
| 생성·전환 비용 | 크다 | 작다 |
| 하나가 죽으면 | 다른 프로세스는 생존 (격리) | 같은 프로세스 전체가 위험 |
| 통신 | IPC 필요 (아래) | 메모리 공유로 간단 (대신 동기화 필수) |
- 로봇 미들웨어 전형적 구성 — 노드 = 프로세스로 분리해 장애를 격리 (카메라 노드가 죽어도 모터 노드는 산다)
- 노드 내부는 멀티스레드로 콜백·통신을 병렬 처리
프로세스 간 통신 (IPC, Inter-Process Communication)
독립된 메모리를 가진 프로세스들이 데이터를 주고받는 OS 차원의 수단들:
| 기법 | 방식 | 특징 |
|---|---|---|
| 파이프(Pipe) | 한쪽이 쓰면 한쪽이 읽는 단방향 통로 | 단순, 주로 부모-자식 간 |
| 메시지 큐(Message Queue) | 커널의 큐에 메시지를 넣고 꺼냄 | 구조화된 비동기 전달 |
| 공유 메모리(Shared Memory) | 같은 메모리 영역을 함께 매핑 | 복사가 없어 가장 빠름 — 대신 동기화(뮤텍스 등) 필수 |
| 소켓(Socket) | 네트워크 프로토콜로 통신 | 다른 컴퓨터 간에도 가능 — 미들웨어 통신의 기반 |
| 신호(Signal) | 비동기 이벤트 통지 | 데이터 전달보다는 알림용 (종료 요청 등) |
- 미들웨어의 토픽 통신도 결국 이 IPC 위에 구현됨
- 원격 노드 ↔ 소켓(UDP/TCP), 같은 컴퓨터 안 ↔ 공유 메모리로 대용량(영상)을 복사 없이 넘기는 최적화
동기화 — 경쟁 상태를 막아라
- 경쟁 상태(Race Condition): 둘 이상의 실행 흐름이 공유 데이터에 동시 접근하여, 실행 순서에 따라 결과가 달라지는 오류
- 임계 구역(Critical Section): 공유 자원에 접근하는 코드 구간 — 한 번에 하나만 들어가야 한다 (상호 배제, Mutual Exclusion)
- 뮤텍스(Mutex): 임계 구역의 자물쇠. 잠근(소유한) 스레드만 풀 수 있다 — 1개 자원의 상호 배제
- 세마포어(Semaphore): 카운터 기반 — N개까지 동시 접근 허용(자원 풀), 이진 세마포어는 뮤텍스와 유사하게 사용
- ISR 수준의 원자성 문제는 임베디드 특성에서 본 것과 같은 뿌리다
교착상태 (Deadlock)
- 두 프로세스가 서로가 가진 자원을 기다리며 영원히 멈추는 상태
- 다음 4가지 조건이 모두 성립할 때만 발생 (단골 출제):
- 상호 배제(Mutual Exclusion): 자원을 한 번에 하나만 사용할 수 있다
- 점유와 대기(Hold and Wait): 자원을 쥔 채로 다른 자원을 기다린다
- 비선점(No Preemption): 남의 자원을 강제로 빼앗을 수 없다
- 순환 대기(Circular Wait): A→B→…→A로 기다림이 원을 이룬다
대응:
- 예방 — 조건 중 하나를 깸 (예: 모든 프로세스가 자원을 같은 순서로 획득하게 하여 순환 대기 제거)
- 회피 — 안전 상태를 검사하며 할당 (은행가 알고리즘)
- 탐지·복구 — 발생 후 처리 (프로세스 강제 종료)
미들웨어의 노드(프로세스) 관리
OS의 일반 이론이 미들웨어에서는 이렇게 나타난다:
- 일괄 기동 — 런치(Launch) 시스템: 수십 개 노드와 파라미터를 설정 파일 하나로 한 번에 기동 (ROS launch)
- 라이프사이클 관리: ROS 2의 관리형 노드(Managed Node)는 Unconfigured → Inactive → Active → Finalized 상태를 가지며, 전이를 외부에서 제어할 수 있다 — "센서 노드가 Active가 된 것을 확인한 후 제어 노드를 Active로" 같은 기동 순서 보장이 가능해진다
- 감시와 복구: 하트비트(주기적 생존 신호)·워치독으로 이상을 감지하고, 죽은 노드를 자동 재시작(respawn) — 워치독 타이머의 시스템판
- 자원 배정: 중요 노드에 높은 스케줄링 우선순위나 전용 CPU 코어를 배정(친화도, affinity)해 실시간성을 확보
📊 다이어그램 · 수식
프로세스 상태 천이도
stateDiagram-v2
state "생성 (New)" as NEW
state "준비 (Ready)" as READY
state "실행 (Running)" as RUN
state "대기 (Waiting)" as WAIT
state "종료 (Terminated)" as TERM
[*] --> NEW
NEW --> READY : 승인
READY --> RUN : 디스패치 (CPU 배정)
RUN --> READY : 타임슬라이스 만료 / 선점
RUN --> WAIT : 입출력·이벤트 요청
WAIT --> READY : 입출력·이벤트 완료
RUN --> TERM : 완료교착상태의 순환 대기
flowchart LR
P1["프로세스 A
(자원 X 점유)"] -- "자원 Y 요청 → 대기" --> R2["자원 Y"]
P2["프로세스 B
(자원 Y 점유)"] -- "자원 X 요청 → 대기" --> R1["자원 X"]
R2 -. "B가 점유" .-> P2
R1 -. "A가 점유" .-> P1(A와 B가 서로의 자원을 기다리는 원 — 자원 획득 순서를 X→Y로 통일하면 이 원이 생기지 않는다)
🎯 핵심 요약 · 암기 포인트
교착상태 예방의 대표적 방법은?::자원 획득 순서를 모든 프로세스에서 동일하게 통일해 순환 대기를 제거 ROS 2 관리형(라이프사이클) 노드의 4가지 기본 상태는?::Unconfigured → Inactive → Active → Finalized (전이를 외부에서 제어해 기동 순서 보장)
✏️ 예상문제
1. 실행(Running) 중인 프로세스가 입출력을 요청하면 어느 상태로 전이되는가?
① 준비(Ready) ② 생성(New) ③ 대기(Waiting) ④ 종료(Terminated)
정답 및 해설
정답: ③ 입출력이 끝날 때까지는 CPU를 줘도 할 일이 없으므로 대기 상태로 가서 CPU를 내놓는다. 입출력이 완료되면 실행이 아니라 준비 상태로 돌아가 다시 CPU 배정을 기다린다는 것까지가 단골 출제다.
2. 프로세스와 스레드에 대한 설명으로 옳지 않은 것은?
① 프로세스는 독립된 메모리 공간을 가진다 ② 같은 프로세스의 스레드들은 전역 데이터와 힙을 공유한다 ③ 스레드의 생성·전환 비용은 프로세스보다 작다 ④ 스레드는 각자 완전히 독립된 힙 영역을 가진다
정답 및 해설
정답: ④ 스레드가 개별로 갖는 것은 스택뿐이고, 힙과 전역 데이터는 프로세스 안에서 공유한다. 그래서 스레드 간 통신은 간단하지만 공유 데이터 접근에 동기화가 반드시 필요하다.
3. IPC(프로세스 간 통신) 기법 중 데이터 복사가 없어 가장 빠르지만, 별도의 동기화 수단이 반드시 필요한 것은?
① 공유 메모리 ② 파이프 ③ 소켓 ④ 신호(Signal)
정답 및 해설
정답: ① 공유 메모리는 두 프로세스가 같은 메모리 영역을 직접 읽고 쓰므로 커널을 거치는 복사가 없어 가장 빠르다. 대신 동시 접근을 막을 뮤텍스·세마포어가 필수다. 같은 컴퓨터 안에서 대용량 영상을 노드 간에 넘길 때 이 방식이 활용된다.
4. 교착상태(Deadlock)의 4가지 필요조건에 해당하지 않는 것은?
① 상호 배제 ② 자원의 선점 허용 ③ 점유와 대기 ④ 순환 대기
정답 및 해설
정답: ② 교착상태의 조건은 상호 배제, 점유와 대기, 비선점, 순환 대기다. "선점을 허용"하면 남의 자원을 빼앗을 수 있으므로 오히려 교착상태가 성립하지 않는다 — 조건의 부정형을 끼워 넣는 전형적 함정이다.
5. ROS 2에서 여러 노드를 정해진 순서로 구성·활성화하기 위해, 노드의 상태(Unconfigured→Inactive→Active)를 외부에서 전이시킬 수 있게 만든 개념은?
① 파라미터 서버 ② 정적 라이브러리 ③ 관리형(라이프사이클) 노드 ④ 데드락 탐지기
정답 및 해설
정답: ③ 관리형 노드(Managed/Lifecycle Node)는 표준화된 상태 머신을 갖고 상태 전이를 외부 명령으로 제어한다. "센서가 Active인 것을 확인한 뒤 제어 노드를 Active로" 같은 기동 순서 보장이 가능해져, 대규모 시스템의 안정적 기동·종료에 쓰인다.
🔗 관련 노트
- 로봇 소프트웨어 운영체제 — 스케줄링·RTOS 등 프로세스 관리의 기반
- 모듈화 프로그래밍 — 프로세스로 배치되는 모듈의 설계
- 로봇 미들웨어 구조 설계 — 노드 통신(토픽)과 디스커버리
- 임베디드 프로그래밍 특성 — 원자성·워치독의 임베디드 관점
- _MOC 로봇소프트웨어구조설계