1. Executive Summary: 소프트웨어 실습실의 무한 루프 재앙과 프로세스 관리의 구조적 한계
초·중·고교 소프트웨어(SW) 및 인공지능(AI) 코딩 실습 시간, 그리고 국방 소프트웨어 개발 환경에서 가장 빈번하게 발생하는 컴퓨터실 대혼란은 초보 학습자의 코드 실수로 인한 무한 루프(Infinite Loop)와 비정상 종료된 백그라운드 좀비 프로세스(Zombie Process)입니다.
파이썬이나 C/C++ 입문자가 작성한 while True: 탈출 조건 누락 코드나 메모리를 계속 할당하는 누수 스크립트가 실행되면, 해당 PC의 CPU 점유율은 즉시 100%로 치솟고 쿨링 팬이 굉음을 내며 컴퓨터가 완전히 프리징됩니다. 더욱 심각한 문제는 학생들이 웹 서버(Flask, FastAPI, Node.js) 실습 중 터미널 창을 그냥 닫아버렸을 때 발생합니다. 화면상으로는 프로그램이 꺼진 것처럼 보이지만 백그라운드에서 여전히 Port 8080이나 Port 3000을 점유하고 있어, 다음 실습생이 코드를 실행할 때마다 "Address already in use (EADDRINUSE)" 에러를 뿜어내며 수업 진행을 원천 봉쇄합니다.
Windows 기본 작업 관리자(Taskmgr)는 학교 전산실 보안 정책에 의해 실행이 차단되어 있거나, 수백 개의 시스템 프로세스 속에서 학생이 방금 띄운 파이썬 프로세스를 찾아내기 극히 어렵습니다. 결국 교사나 전산 조교가 일일이 PC 전원 버튼을 길게 눌러 강제 재부팅을 반복해야 하는 막대한 시간적 손실이 발생합니다.
ZeliProc은 관리자 권한 차단 환경에서도 가볍게 구동되는 WinUI 3 네이티브 온디바이스 프로세스 진단 및 제어 도구입니다. 커널 레벨의 2단계 델타 시간 샘플링으로 멀티코어 환경의 정확한 CPU 점유율을 0.5초 만에 산출하고, 포트 번호 하나만 입력하면 충돌을 일으킨 범인 프로세스(PID)를 즉각 역추적하며, 안전한 확인 다이얼로그를 통해 좀비 프로세스를 0초 만에 강제 종료(Kill)합니다.
2. 디지털 교실과 국방 단말기 백그라운드 프로세스의 3대 위협
학교 전산실과 작전 시설에서 프로세스 관리가 부재할 때 발생하는 치명적인 3대 문제는 다음과 같습니다.
| 위협 유형 | 기존 작업 관리자 및 수동 대처의 한계 | ZeliDesk ZeliProc의 온디바이스 해결책 |
|---|---|---|
| 1. 무한 루프로 인한 컴퓨터실 프리징 | CPU 100% 상태에서 작업 관리자 자체가 켜지지 않거나 렌더링 지연으로 멈춤 현상 심화 | 비동기 백그라운드 스레드에서 500ms 델타 샘플링으로 UI 블로킹 없이 점유율 최상위 프로세스 즉각 식별 |
| 2. 고아(Orphaned) 프로세스의 포트 점유 | 포트 번호(예: 8080)만으로는 윈도우 작업 관리자에서 어떤 프로세스가 충돌을 냈는지 역추적 불가 | netstat -ano 스트림 실시간 파싱으로 포트 번호 입력 시 소유 PID 및 프로세스명 원클릭 추출 |
| 3. 실수로 인한 OS 필수 프로세스 오폭 종료 | 시스템 프로세스를 잘못 강제 종료하여 블루스크린(BSOD) 또는 시스템 크래시 유발 | 대상 프로세스 이름과 PID를 명시한 네이티브 ContentDialog 확인 모달로 2중 안전 장치 보장 |
3. ZeliProc 코어 아키텍처: 2단계 델타 CPU 샘플링과 멀티코어 정규화 알고리즘
단순히 Process.TotalProcessorTime을 1회 조회하는 것만으로는 현재 시점의 실시간 CPU 점유율을 알 수 없습니다. 이는 프로세스가 생성된 이래 소비한 총 누적 CPU 시간이기 때문입니다. 순간적인 CPU 사용률(%)을 정확히 구하려면 반드시 **일정 시간 간격(Delta Time)을 두고 두 번 측정한 뒤, 그 차이값을 경과 시간과 논리 코어 수로 나누는 수학적 정규화**가 필요합니다.
ZeliProc은 Process.GetProcesses()로 전체 프로세스의 1차 TotalProcessorTime 스냅샷을 딕셔너리에 담은 후, 정확한 500ms 동안 await Task.Delay(500)를 수행합니다. 그 후 2차 스냅샷을 비교하여 deltaMs / (elapsedMs * coreCount) * 100.0 공식을 통해 0.0% ~ 100.0%의 정밀한 실시간 CPU 점유율을 산출합니다. 접근 권한이 거부된 보안 시스템 프로세스는 예외 처리를 통해 안전하게 0%로 수렴시킵니다.
var procs = await Task.Run(async () =>
{
var processes = Process.GetProcesses();
int coreCount = Environment.ProcessorCount; // 논리 CPU 코어 수
// 1차 샘플: 프로세스별 누적 CPU 시간 스냅샷
var firstCpu = new Dictionary<int, TimeSpan>();
foreach (var proc in processes)
{
try { firstCpu[proc.Id] = proc.TotalProcessorTime; }
catch { } // 권한 거부 프로세스는 스킵
}
// 고정밀 스톱워치 기반 500ms 비동기 지연
var sw = Stopwatch.StartNew();
await Task.Delay(500);
sw.Stop();
double elapsedMs = sw.Elapsed.TotalMilliseconds;
// 2차 샘플: 델타 시간 / 경과 시간 / 코어 수 기반 점유율(%) 산출
var list = new List<ProcItem>();
foreach (var proc in processes)
{
try
{
double cpu = 0;
if (firstCpu.TryGetValue(proc.Id, out var t0))
{
try
{
double deltaMs = (proc.TotalProcessorTime - t0).TotalMilliseconds;
cpu = deltaMs / (elapsedMs * coreCount) * 100.0;
if (cpu < 0) cpu = 0;
if (cpu > 100) cpu = 100;
}
catch { cpu = 0; }
}
list.Add(new ProcItem
{
Pid = proc.Id,
Name = proc.ProcessName,
MemoryMB = proc.WorkingSet64 / (1024 * 1024), // MB 환산
CpuPercent = cpu
});
}
catch { }
finally
{
try { proc.Dispose(); } catch { } // 커널 핸들 누수 방지
}
}
return list;
});
4. 비동기 재진입 방지 락 및 보류 큐 (_isRefreshing & _pendingRefresh)
500ms의 델타 샘플링 대기 시간 동안 성급한 사용자가 새로고침 버튼을 연타하거나, 타이핑 필터 이벤트를 지속적으로 발생시키면 백그라운드 스레드 풀에 수십 개의 측정 태스크가 중복 스케줄링되어 시스템이 급격히 느려지는 재진입성 스레드 폭풍(Reentrancy Thread Storm)이 발생합니다.
ZeliProc은 _isRefreshing과 _pendingRefresh 두 개의 불리언 플래그를 결합한 보류 큐(Pending Refresh Queue) 상태 머신을 도입했습니다. 진행 중인 새로고침이 있으면 새로운 요청을 실행하지 않고 즉시 _pendingRefresh = true만 마킹한 뒤 리턴합니다. 그리고 현재 루프가 끝나는 시점에 do { ... } while (_pendingRefresh) 구문이 보류된 최신 요청을 딱 1회만 추가 실행함으로써, 스레드 누수 없이 항상 최신 상태를 유지합니다.
private bool _isRefreshing = false; // 실행 중 가드 플래그
private bool _pendingRefresh = false; // 진행 중 들어온 최신 요청 보류
private async Task RefreshProcessesAsync()
{
// 이미 500ms 샘플링이 진행 중이면 최신 요청 예약만 걸고 즉각 리턴
if (_isRefreshing)
{
_pendingRefresh = true;
return;
}
_isRefreshing = true;
try
{
do
{
_pendingRefresh = false;
// [500ms 델타 CPU 샘플링 백그라운드 태스크 수행]
_allProcs = procs;
ApplyFilterAndSort();
} while (_pendingRefresh); // 대기 중 들어온 최신 요청이 있으면 1회 더 실행
}
finally
{
_isRefreshing = false; // 안전하게 락 해제
}
}
5. 원클릭 포트 충돌 역추적 엔진: netstat -ano 소켓 상관분석 파이프라인
웹 프로그래밍이나 백엔드 API 실습에서 가장 짜증을 유발하는 오류는 Port Already in Use입니다. 학생들은 자신이 이전에 실행했던 파이썬 웹서버가 백그라운드에 여전히 살아있다는 사실을 깨닫지 못합니다.
ZeliProc의 BtnPortSearch_Click 기능은 사용자가 포트 번호(예: 8080)만 입력하면, OS 커널의 netstat -ano 명령을 백그라운드 무창 프로세스로 비동기 실행하여 해당 포트를 바인딩하고 있는 소켓 행을 필터링합니다. 그리고 마지막 열에 적힌 소유자 PID를 추출한 뒤, Process.GetProcessById(pid).ProcessName을 호출하여 "TCP 0.0.0.0:8080 LISTENING ➔ python.exe"와 같은 완벽한 상관분석 결과를 0.05초 만에 목록에 띄워줍니다. 사용자는 해당 아이템을 클릭하고 종료 버튼만 누르면 포트 충돌이 즉각 해결됩니다.
var psi = new ProcessStartInfo("netstat", "-ano")
{
RedirectStandardOutput = true,
UseShellExecute = false,
CreateNoWindow = true
};
using var proc = Process.Start(psi);
string output = await proc.StandardOutput.ReadToEndAsync();
await proc.WaitForExitAsync();
// 해당 포트를 점유하고 있는 소켓 라인 필터링
var matching = output.Split('\n')
.Where(l => l.Contains($":{portStr} ") || l.Contains($":{portStr}\t"))
.Select(l => l.Trim())
.ToList();
foreach (var line in matching)
{
var parts = line.Split(new[] { ' ', '\t' }, StringSplitOptions.RemoveEmptyEntries);
var pidStr = parts.LastOrDefault(); // 마지막 토큰이 PID
string procName = "?";
if (int.TryParse(pidStr, out int pid))
{
try { procName = Process.GetProcessById(pid).ProcessName; }
catch { procName = "(종료됨/접근불가)"; }
}
// "TCP 127.0.0.1:8080 ... LISTENING 14220 → python" 형식 출력
ProcListView.Items.Add(new ListViewItem
{
Content = new TextBlock { Text = $"{line} → {procName}" },
Tag = pid
});
}
6. ContentDialog 확인 기반 안전 프로세스 종료(Kill) 거버넌스와 리소스 누수 차단
프로세스를 강제 종료하는 기능은 강력하지만 위험합니다. 사용자가 마우스 클릭 실수로 svchost.exe나 explorer.exe 같은 윈도우 핵심 셸 프로세스를 종료하면 화면이 꺼지거나 시스템이 재부팅되는 부작용이 발생합니다.
ZeliProc은 선택된 프로세스의 이름과 고유 PID를 정확히 바인딩한 네이티브 ContentDialog 모달을 띄워 사용자에게 명시적 2차 확인(Confirmation)을 요구합니다. 사용자가 [종료]를 승인할 때만 proc.Kill()이 호출되며, 직후 자동으로 프로세스 목록을 재샘플링하여 프로세스가 깨끗이 증발했음을 시각적으로 확인시켜 줍니다. 또한 루프 내부의 모든 Process 인스턴스에 대해 proc.Dispose()를 반드시 호출하여 OS 커널 핸들 누수를 원천 차단합니다.
7. Consolas 모노스페이스 뷰포트 클램핑 및 실시간 다축 정렬 필터링
수백 개의 프로세스를 렌더링할 때 열(Column)의 너비가 제각각이면 가독성이 급격히 떨어집니다. ZeliProc은 Consolas 모노스페이스 폰트와 고정폭 패딩(PadRight(8), PadRight(35), MemoryMB,6, CpuPercent,5:F1%)을 적용하여 터미널처럼 한눈에 들어오는 데이터 그리드를 구성했습니다.
또한 AutoSuggestBox를 통해 프로세스 이름이나 PID 숫자로 0초 만에 실시간 필터링을 지원하며, 콤보박스를 통해 CPU 점유율 내림차순, 메모리 점유율 내림차순, PID 순, 이름 순으로 0.01초 만에 재정렬합니다. 화면 성능 유지를 위해 상위 500개 프로세스만 뷰포트에 적재(Take(500))하는 클램핑 기법을 적용했습니다.
8. 상용 프로세스 진단 도구(작업 관리자, Process Explorer 등) vs ZeliProc 비교 벤치마크
아래 비교표는 실제 교육 현장과 폐쇄망 관리 관점에서 기존 도구들과 ZeliProc의 특징을 정량 비교한 결과입니다.
| 비교 항목 | Windows 작업 관리자 (Taskmgr) | Sysinternals Process Explorer | ZeliDesk ZeliProc |
|---|---|---|---|
| 배포 방식 | OS 내장 (학교 정책에 따라 차단 빈번) | 별도 압축 해제 포터블 유틸리티 | Microsoft Store 정식 서명 네이티브 앱 |
| 포트 충돌 역추적 | 미지원 (포트-PID 매핑 기능 없음) | 핸들 검색(Ctrl+F) 수동 탐색 필요 | 포트 번호 입력 시 0초 자동 역추적 |
| CPU 점유율 산출 방식 | 시스템 전역 커널 샘플러 | 드라이버 레벨 샘플러 | 2단계 500ms 델타 멀티코어 정규화 |
| 비동기 재진입 방어 | 해당 없음 | 해당 없음 | _isRefreshing & _pendingRefresh 락 |
| Always-On-Top 플로팅 | 옵션 메뉴 깊숙이 위치 | 지원 | 타이틀바 📌 원클릭 토글 핀 제공 |
| 프로그램 메모리 | 60 MB ~ 120 MB | 45 MB ~ 90 MB | 18 MB 이하 초경량 |
9. 컴퓨터실 수업 파이썬 좀비 1초 정리 실전 시나리오와 향후 로드맵
시나리오 A: 파이썬 무한 루프로 멈춰버린 컴퓨터실 12번 좌석의 즉각 구조
학생이 실수로 탈출 조건이 없는 while True: 코드를 실행하여 PC 팬이 심하게 돌고 마우스 커서가 버벅거립니다. 교사는 ZeliProc을 실행하고 정렬 기준을 [CPU 높은 순]으로 변경합니다. 상단 맨 첫 줄에 CPU 98.5%를 차지하고 있는 python.exe (PID: 8412)가 선명한 텍스트로 즉각 부각됩니다. 교사는 해당 항목을 선택하고 [종료]를 누른 뒤 확인 팝업을 승인합니다. 0.1초 만에 CPU 점유율이 2%로 정상 복귀하며, PC 재부팅 없이 학생은 수업을 계속 이어갈 수 있습니다.
시나리오 B: 웹 개발 실습 중 포트 8080 충돌 1초 해결
학생이 웹 서버 실습 중 Port 8080 already in use 에러로 고통받고 있습니다. ZeliProc의 포트 검색창에 8080을 입력하고 [검색]을 누르자, 이전에 닫았던 터미널에서 살아남은 node.exe (PID: 15304)가 즉각 검출됩니다. 해당 PID를 클릭하고 원클릭 종료를 누르자마자 포트 점유가 해제되어 정상적인 웹 실습이 재개됩니다.
ZeliDesk 시스템 거버넌스 로드맵
- ZeliPort(#971) 소켓 텔레메트리와의 통합 연동: 포트 검색 시 프로세스명뿐만 아니라 원격 연결 IP, 프로토콜 종류(TCP/UDP)를 통합 시각화하는 네트워크 매핑 강화.
- ZeliService(#947) 서비스 거버넌스와의 결합: 일반 프로세스뿐만 아니라 윈도우 백그라운드 서비스(Win32_Service) 중 교착(Deadlock)에 빠진 서비스 프로세스를 UAC 승격으로 자동 연계 종료.
- 자동 좀비 프로세스 감지 가디언: 5분 이상 CPU 90% 이상을 점유하고 있는 비정상 개발 프로세스에 대해 경고 토스트 알림을 띄우는 스마트 백그라운드 워처 탑재.
소프트웨어 실습의 방해 요소를 완벽히 제거하고, 언제나 예측 가능하고 안정적인 학습 환경을 유지하는 것—ZeliDesk가 현장 중심의 엔지니어링 도구를 끊임없이 완성해 나가는 확고한 방향성입니다.