클릭하여 터미널 활성화

Activity Monitor 대신 쓰는 105KB 작업관리자 | PulseMon Swift AppKit

// macOS · Swift · AppKit · 작업관리자 · 프로세스 모니터
Windows Task Manager가 macOS에 없어서 직접 만들었다 — PulseMon

macOS에는 작업관리자가 없다

Windows에서 넘어온 사람이라면 한 번쯤 느꼈을 거다. Ctrl+Shift+Esc 눌렀는데 아무것도 안 뜬다. Activity Monitor가 있긴 한데 느리고 UI도 불편하다.

"Windows Task Manager처럼 프로세스 목록 보고, 정렬하고, 바로 종료할 수 있는 게 필요했다."

지난번에 만든 SystemPulse(메뉴바 모니터)의 모니터링 코드를 기반으로 이번엔 제대로 된 작업관리자를 만들었다. DMG 105KB, 메모리 10.4MB, Activity Monitor의 1/8 수준.

PulseMon v1.0.0
언어      : Swift 5.9 (순수 AppKit)
최소 OS   : macOS 13.0 Ventura 이상
DMG 크기  : 105 KB
메모리 사용: 10.4 MB (Peak RSS)
바이너리  : 270 KB
외부 의존성: 없음 (Zero dependencies)
라이선스  : MIT

Activity Monitor와 비교

Activity Monitor
메모리   : 80MB+
프로세스 종료: 메뉴 여러 단계
검색     : 있음
그래프   : 있음
PulseMon
메모리   : 10.4 MB
프로세스 종료: 우클릭 → 바로 종료
검색     : ⌘F 즉시 필터링
그래프   : 60초 히스토리

두 개의 탭

프로세스 탭

실행 중인 모든 프로세스를 테이블로 보여준다. Windows Task Manager 쓰던 사람이라면 바로 익숙할 거다.

프로세스 탭 기능
실시간 목록 — 이름, PID, CPU%, 메모리, 사용자, 상태
컬럼 정렬 — 헤더 클릭으로 오름차순/내림차순
검색 필터 — ⌘F → 이름 또는 PID로 즉시 필터링
우클릭 메뉴 — 종료(SIGTERM) / 강제 종료(SIGKILL) / PID 복사
확인 다이얼로그 — 실수로 종료 방지
성능 탭

CPU, 메모리, 네트워크, 디스크를 실시간 라인 그래프로 보여준다. 60초 히스토리가 함께 표시된다.

CPU 그래프
실시간 사용률
60초 히스토리
메모리 그래프
실시간 사용률
60초 히스토리
네트워크 그래프
업로드/다운로드
실시간 속도
디스크
사용량 표시
⌨️
단축키
⌘Q앱 종료
⌘F검색 필드 포커스
Delete선택된 프로세스 종료

기술 스택

TECH STACK
언어Swift 5.9
프레임워크순수 AppKit (NSTableView, NSTabViewController)
프로세스 APIlibproc (proc_listallpids, proc_pidinfo, proc_pid_rusage)
시스템 APIMach API (host_processor_info, host_statistics64)
아키텍처MVVM
기반 코드SystemPulse CPU/Memory/Disk/Network 모니터 재활용
의존성없음 (Zero dependencies)

프로세스 목록은 libproc을 직접 써서 구현했다. proc_listallpids()로 전체 PID를 가져오고, proc_pid_rusage()로 CPU 시간과 메모리를 읽는다. CPU% 계산은 이전 CPU 시간과의 델타를 경과 시간으로 나눠서 산출한다.

그래프는 NSView 기반으로 직접 그렸다. 외부 차트 라이브러리 없이 60개 데이터 포인트를 실시간으로 렌더링한다.

성능 벤치마크

프로세스 633개 기준 실측 결과다.

BENCHMARK — 프로세스 633개 기준
ProcessMonitor.sample()4.8ms633개 프로세스 전체 조회
CPUMonitor.sample()0.009ms
MemoryMonitor.sample()0.003ms
DiskMonitor.sample()0.005ms
NetworkMonitor.sample()0.019ms
Sort + Filter (633개)0.37ms
전체 리프레시 사이클~4.9ms2000ms 중 4.9ms 사용 (headroom 99.8%)
💡
주요 최적화 포인트
UID→사용자명 조회는 딕셔너리 캐시로 getpwuid() 반복 호출 방지
ByteCountFormatter는 싱글턴으로 재사용
테이블 새로고침 시 PID 기반으로 선택 상태 보존
배열 초기화에 reserveCapacity()로 불필요한 재할당 제거

설치 방법

방법 1 — DMG 다운로드 (간단)
설치 순서
01github.com/LowAHN/PulseMon/releases → Releases 이동
02PulseMon.dmg 다운로드
03PulseMon.app → Applications 드래그
04Applications에서 실행
⚠️
첫 실행 시 보안 경고 뜰 수 있음
시스템 설정 → 개인 정보 보호 및 보안 → 아래로 스크롤 → "그래도 열기" 클릭
방법 2 — 소스 빌드
macOS Terminal
# Xcode Command Line Tools + macOS 13.0+ 필요
user@mac:~$ git clone https://github.com/LowAHN/PulseMon.git
user@mac:~$ cd PulseMon
user@mac:~$ make release
user@mac:~$ open PulseMon.app

SystemPulse와 함께 쓰기

PulseMon은 이전에 만든 SystemPulse의 모니터링 코드를 기반으로 만들었다. 두 앱을 같이 쓰면 서로 잘 맞는다.

조합 활용
SystemPulse메뉴바에 항상 표시 — CPU/MEM/DSK/NET 한눈에
PulseMon   뭔가 이상할 때 열어서 프로세스 확인 + 종료
// 결론
105KB. 메모리 10.4MB. Activity Monitor의 1/8.
macOS에도 이제 작업관리자가 생겼다.
Tags: #Swift #macOS #AppKit #작업관리자 #프로세스모니터 #오픈소스 #PulseMon #TaskManager #libproc