본문 바로가기
C.W.K.
Stream
Lesson 01 of 04 · published

프로세스 하나가 소리를 소유해

~9 min · launchd, one-process, lifecycle

Level 0침묵
0 XP0/36 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"단일 launchd 소유 프로세스가 제품 몸통 전부야. UI 액션은 그 안으로 호출하지, 절대 두 번째 daemon을 안 낳아."

스피커는 단일 자원이야

오디오 출력은 물리적 물건 하나야. 두 프로세스가 둘 다 그걸 소유하려 들면 끊김이랑 레이스, 겹치거나 끊기는 오디오가 나와. 그래서 Bellows는 launchd가 관리하는 프로덕션 프로세스 딱 하나로 돌아. 그 프로세스가 제품 몸통 전체야. API를 서빙하고, 빌드된 UI를 서빙하고, 자기 lifespan 안에서 오디오 worker를 소유해. 별개 오디오 daemon도 side socket도 없어.

launchd가 살려두고, 앱이 하나로 지켜

launchd job은 load 때 시작해서 살아있게 설정돼. 프로세스가 죽으면 launchd가 되살리고. 그게 가용성을 맡아. 다른 절반은 앱이 자기한테 거는 규칙이야. UI 액션은 '돕겠다고' shadow daemon을 절대 fork 안 해. 모든 요청이 하나의 기존 worker를 몰아. 가용성은 launchd의 일이고, 단일성은 앱의 규율이야. 둘이 합쳐지면 스피커 소유자가 늘 정확히 하나, 늘 같은 하나가 돼.

왜 shadow daemon이 적이냐면

솔깃한 버그는 특정 작업 하려고 띄운 백그라운드 헬퍼야. 재생하는 빠른 두 번째 프로세스, 요청마다 fork된 worker. 각각이 단일 오디오 디바이스에 대한 새 청구자고, 이제 '지금 누가 재생하나'가 하나 넘는 답을 갖게 돼. 프로세스 수를 양쪽에서 눌러 정확히 하나로 유지하는 게, 오디오가 단일하고 멀쩡한 소유자를 가진 것처럼 굴게 만들어.

Code

관리되는 프로세스 하나, 재시작되되 절대 복제 안 됨·bash
# launchd owns exactly ONE production process. No app code spawns another.
$ launchctl print gui/$(id -u)/com.cwk.bellows-serve | grep -E 'state|pid'
    state = running
    pid = 4123

# The plist sets RunAtLoad + KeepAlive: the process starts at login and is
# restarted if it dies. That single process owns the audio worker in-lifespan.
# UI actions call INTO it -- they never fork a second daemon or open a socket.

$ launchctl kickstart -k gui/$(id -u)/com.cwk.bellows-serve   # clean restart

External links

Exercise

네가 아는 시스템에서 진짜 하나의 소유 프로세스를 가져야 하는 단일 물리적/논리적 자원을 찾아. 프린터, GPU, 시리얼 디바이스, lock 파일, 하드웨어 토큰. 두 프로세스가 둘 다 소유하려 들면 뭐가 깨지는지 묘사해. 그다음 보증을 둘로 쪼개. 뭐가 가용성(재시작)을 주고, 뭐가 단일성(절대 둘째 없음)을 강제해?
Hint
가용성이랑 단일성은 다른 부분이 하는 다른 약속이야. 감독자가 죽은 프로세스를 재시작하고, 라이벌 낳는 걸 막는 건 앱 자체 규율뿐이야. 둘 중 하나만 없어도 자원은 경쟁되거나 못 쓰게 돼.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.