← 백서 및 기술 블로그 목록으로 돌아가기
ZeliDesk Core Engineering Architecture Whitepaper #709 [통산 290편 금자탑 돌파 대작!]

초·중·고 정보 과학(실시간 스케줄링·우선순위 큐·다중 자원 최적화)·물리(전자기파 주파수 대역·레이다 단면적 RCS·도플러 필터) 교육과 국방 해군 KDDX 한국형 차기 구축함 통합 마스트(I-MAST) S-대역(광역 탐색/탄도탄 조기경보) + X-대역(초정밀 사격통제/저고도 순항유도탄 요격) 능동위상배열(AESA) 동시 운용: ZeliDesk의 온디바이스 순수 C# 실시간 시간 분할 다중 빔 방사 스케줄러(Time-Budget Beam Scheduling), 0-Alloc SIMD 가속 다표적 위협도 동적 가중치 산출 및 K-SAAM(해궁)/SM-2 유도 펄스 인터리빙 엔진 아키텍처

대한민국 해군 함대의 최신예 차세대 스마트 이지스 구축함 KDDX는 단일 함교 구조물 위에 모든 센서와 통신 안테나를 일체형으로 통합한 통합 마스트(I-MAST, Integrated Mast)를 탑재합니다. I-MAST의 심장은 4면에 고정 배치된 원거리 광역 탐색용 S-대역 AESA와 초정밀 저고도 사격통제용 X-대역 AESA가 단일 두뇌 아래 한 치의 시간 낭비 없이 빔 자원을 동시 분배하는 다기능 레이더(MFR) 스케줄링 엔진입니다. 본 백서는 2022 개정 정보 과학(실시간 스케줄링 알고리즘·우선순위 큐·다차원 자원 배분)과 물리학(전자기파 파장별 감쇄·RCS·레이더 방정식)을 결합하여, 동시 다발로 쇄도하는 대함 탄도탄과 초음속 시스키밍 미사일을 0.001초 단위의 빔 시간 예산(Time-Budget)으로 인터리빙 요격하는 순수 C# 0-Alloc 코어 아키텍처를 제시합니다.

1. 듀얼 밴드 AESA 레이더 전자기 물리학: S-대역과 X-대역의 상호보완성

1.1 주파수 대역별 전파 감쇄 및 레이더 방정식

레이더 탐지 거리 $R_{max}$는 송신 전력 $P_t$, 안테나 이득 $G$, 반사 면적(RCS) $\sigma$, 파장 $\lambda$에 의해 레이더 방정식으로 지배됩니다:

$$R_{max} = \left[ rac{P_t G^2 \lambda^2 \sigma}{(4\pi)^3 P_{min} L_{sys}} ight]^{1/4}$$

KDDX I-MAST에 탑재된 두 대역의 특성 비교:

  • S-대역 ($2\sim 4 ext{ GHz}, \lambda pprox 10 ext{ cm}$): 대기 중 수증기 및 강우 감쇄가 극히 적어 장거리 전파 투과율이 탁월합니다. 수백 kW의 대출력 송신으로 최대 $450 ext{ km}$ 밖의 탄도탄 궤적 탐지 및 광역 3차원 공중 감시를 전담합니다.
  • X-대역 ($8\sim 12 ext{ GHz}, \lambda pprox 3 ext{ cm}$): 짧은 파장으로 인해 동일 안테나 개구면에서 $0.8^\circ$ 이하의 극침상 빔(Pencil Beam)을 형성합니다. 도플러 해상도와 각도 분해능이 극대화되어, 해면 밀착 비행(Sea-Skimming, 고도 5m 이하) 순항미사일 탐지 및 K-SAAM(해궁)/SM-2 함대공 유도탄의 종말 조사(Illumination)를 담당합니다.

1.2 안테나 송수신 모듈(TRM) 듀티 사이클과 열 부하 한계

질화갈륨(GaN) 반도체 소자로 제작된 수천 개의 TRM은 막대한 고주파 전력을 방사하는 과정에서 급격한 줄열(Joule Heat)을 발생시킵니다. 송신 듀티비(Duty Ratio)는 통상 최대 $20\%$ 이하로 엄격히 통제되어야 하며, 그렇지 않을 경우 마스트 냉각계가 과열되어 레이더 전원이 강제 차단됩니다. 따라서 레이더 스케줄러는 펄스 반복 주기(PRI) 내에서 송신(Tx), 대기/수신(Rx), 냉각(Cooling) 시간을 마이크로초 단위로 정밀 분할 패킹해야 합니다.

2. 실시간 시간 예산(Time-Budget) 빔 스케줄링 및 인터리빙 알고리즘

2.1 레이더 작업 우선순위 및 갱신 주기 매트릭스

총 스케줄링 타임 프레임($T_{frame} = 100 ext{ ms}$) 내에서 다음과 같은 4개 범주의 레이더 빔 작업이 경쟁합니다:

KDDX I-MAST 시간 분할 다중 빔 인터리빙 구조
[Tier 1] 요격 유도
해궁/SM-2 업링크
주기: 10ms (최우선)
[Tier 2] 고위협 추적
탄도탄/초음속 표적
주기: 25ms (TWS)
[Tier 3] 확증/재추적
신규 표적 검증 빔
주기: 50ms
[Tier 4] 광역 탐색
체적 래스터 스캔
주기: 1000ms

2.2 다표적 위협도 동적 가중치 산출 및 0-Alloc 큐잉

각 표적 $i$의 위협도 점수 $W_i$는 거리 $R_i$, 시선 상대 속도 $V_{r, i}$, 고도 $Z_i$, 최근접점 접근 시간(TTC)의 비선형 가중합으로 산출됩니다:

$$W_i = w_R \left( rac{R_{max} - R_i}{R_{max}} ight) + w_V \left( rac{|V_{r, i}|}{V_{max}} ight) + w_{TTC} \left( rac{TTC_{max} - TTC_i}{TTC_{max}} ight)$$

스케줄러는 가비지 컬렉터 없이 힙 할당을 전무하게 유지하면서, $100 ext{ ms}$ 시간 윈도우 안에 가장 위협도가 높은 빔 작업들을 정렬 및 패킹하여 송신 TRM에 즉시 디스패치합니다.

3. ZeliDesk 순수 C# 온디바이스 0-Alloc SIMD 수치 엔진 구현

마이크로초 단위의 빔 스위칭과 다표적 위협도 계산을 100% 결정론적(Deterministic)으로 실행하기 위해, 순수 C# 구조체 인메모리 스케줄러와 AVX2 위협도 벡터화 커널을 구현합니다.

AesaRadarScheduler.cs (Pure C# .NET 9.0 Zero-Alloc SIMD Engine)
using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Intrinsics;
using System.Runtime.Intrinsics.X86;

namespace ZeliDesk.Core.NavalRadar
{
    public enum RadarBand : byte { SBandVolumeSearch, XBandFireControl }
    public enum TaskTier : byte { Tier1MissileGuidance = 0, Tier2PrecisionTrack = 1, Tier3Confirmation = 2, Tier4VolumeSearch = 3 }

    /// <summary>
    /// 단일 빔 방사 요청 태스크 (16바이트 정렬 구조체)
    /// </summary>
    [StructLayout(LayoutKind.Sequential, Pack = 16)]
    public struct AesaBeamTask
    {
        public float AzimuthDeg;       // 방위각 (0 ~ 360)
        public float ElevationDeg;     // 앙각 (-10 ~ +85)
        public ushort DurationMicroSec;// 방사 시간 (us, 예: 200us)
        public TaskTier Tier;          // 우선순위
        public RadarBand Band;         // S 또는 X 밴드
        public float ThreatScore;      // 동적 위협도 가중치

        public AesaBeamTask(float az, float el, ushort durationUs, TaskTier tier, RadarBand band, float threat)
        {
            AzimuthDeg = az; ElevationDeg = el; DurationMicroSec = durationUs;
            Tier = tier; Band = band; ThreatScore = threat;
        }
    }

    /// <summary>
    /// 0-Alloc 시간 예산(Time-Budget) 빔 스케줄러 엔진
    /// 100ms 타임 프레임 내 수백 개 빔 작업 실시간 인터리빙 패킹
    /// </summary>
    public sealed class DualBandAesaScheduler
    {
        private const int MaxTasksPerFrame = 256;
        private readonly AesaBeamTask[] _taskQueue;
        private int _taskCount;
        private readonly ushort _totalTimeBudgetUs; // 100,000 us (100ms)

        public DualBandAesaScheduler(ushort frameDurationMs = 100)
        {
            _totalTimeBudgetUs = (ushort)(frameDurationMs * 1000);
            _taskQueue = new AesaBeamTask[MaxTasksPerFrame];
            _taskCount = 0;
        }

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        public void EnqueueTask(in AesaBeamTask task)
        {
            if (_taskCount < MaxTasksPerFrame)
            {
                _taskQueue[_taskCount++] = task;
            }
        }

        /// <summary>
        /// 시간 예산 내에서 Tier 및 위협도 기준 빔 스케줄링 및 인터리빙 실행 (0-Alloc 루프)
        /// </summary>
        [MethodImpl(MethodImplOptions.AggressiveOptimization)]
        public int ScheduleFrame(Span<AesaBeamTask> outScheduledTimeline, out ushort outUsedTimeUs)
        {
            // 1. 0-Alloc 단순 삽입 정렬 (Tier 우선, 위협도 내림차순)
            for (int i = 1; i < _taskCount; i++)
            {
                var key = _taskQueue[i];
                int j = i - 1;

                while (j >= 0 && CompareTasks(in _taskQueue[j], in key) > 0)
                {
                    _taskQueue[j + 1] = _taskQueue[j];
                    j--;
                }
                _taskQueue[j + 1] = key;
            }

            // 2. 시간 예산(Time-Budget) 패킹 (Bin-Packing)
            ushort currentTimelineUs = 0;
            int scheduledCount = 0;

            for (int i = 0; i < _taskCount; i++)
            {
                ref readonly var task = ref _taskQueue[i];
                if (currentTimelineUs + task.DurationMicroSec <= _totalTimeBudgetUs)
                {
                    if (scheduledCount < outScheduledTimeline.Length)
                    {
                        outScheduledTimeline[scheduledCount++] = task;
                        currentTimelineUs += task.DurationMicroSec;
                    }
                }
            }

            outUsedTimeUs = currentTimelineUs;
            _taskCount = 0; // 다음 프레임을 위한 큐 클리어
            return scheduledCount;
        }

        [MethodImpl(MethodImplOptions.AggressiveInlining)]
        private static int CompareTasks(in AesaBeamTask a, in AesaBeamTask b)
        {
            if (a.Tier != b.Tier) return a.Tier.CompareTo(b.Tier);
            return b.ThreatScore.CompareTo(a.ThreatScore); // 위협도 높은 순
        }
    }

    /// <summary>
    /// AVX2 SIMD 가속 다표적 위협도 벡터 평가기
    /// </summary>
    public static class SimdThreatEvaluator
    {
        [MethodImpl(MethodImplOptions.AggressiveOptimization)]
        public static void EvaluateThreatScores(ReadOnlySpan<float> ranges, ReadOnlySpan<float> radialVelocities, Span<float> outScores)
        {
            const float maxRange = 100000.0f; // 100km
            const float maxVelocity = 1500.0f; // 마하 4.5+

            if (Avx2.IsSupported && ranges.Length >= 8)
            {
                var vMaxRange = Vector256.Create(maxRange);
                var vInvMaxRange = Vector256.Create(1.0f / maxRange);
                var vInvMaxVel = Vector256.Create(1.0f / maxVelocity);
                var vWeightR = Vector256.Create(0.4f);
                var vWeightV = Vector256.Create(0.6f);

                for (int i = 0; i <= ranges.Length - 8; i += 8)
                {
                    var vR = Vector256.Create(ranges.Slice(i, 8));
                    var vV = Vector256.Create(radialVelocities.Slice(i, 8));

                    // 거리 항: (maxRange - R) / maxRange
                    var vRScore = Avx.Multiply(Avx.Subtract(vMaxRange, vR), vInvMaxRange);
                    // 속도 항: V / maxVelocity
                    var vVScore = Avx.Multiply(vV, vInvMaxVel);

                    var vTotal = Avx.Add(Avx.Multiply(vRScore, vWeightR), Avx.Multiply(vVScore, vWeightV));
                    vTotal.CopyTo(outScores.Slice(i, 8));
                }
            }
            else
            {
                for (int i = 0; i < ranges.Length; i++)
                {
                    float rScore = (maxRange - ranges[i]) / maxRange;
                    float vScore = radialVelocities[i] / maxVelocity;
                    outScores[i] = 0.4f * rScore + 0.6f * vScore;
                }
            }
        }
    }
}

4. 2022 개정 교육과정 연수 교구 및 국방 해군 함정 작전 연계

4.1 2022 개정 초·중·고 정보·물리 교육과정 성취기준

과목 및 영역 2022 개정 교육과정 성취기준 ZeliDesk 온디바이스 실습 교구 구현
고등 정보
(운영체제와 스케줄링)
[12정보03-01] 한정된 시스템 자원(시간, 메모리, 프로세서)을 효율적으로 분배하는 실시간 스케줄링 기법을 분석하고 구현한다. KDDX I-MAST 시간 예산(Time-Budget) 기반 다중 빔 방사 인터리빙 0-Alloc 스케줄러.
고등 물리학
(전자기파와 레이더)
[12물리02-03] 전자기파의 진동수에 따른 직진성, 회절성, 감쇄 특성을 비교하고 목적에 맞는 주파수 대역 선택 원리를 탐구한다. S-대역 광역 탐색 및 X-대역 저고도 사격통제 듀얼 밴드 레이더 방정식 수치 시뮬레이터.
고등 수학
(선형대수와 벡터)
[12고수02-02] 다차원 벡터의 가중합과 내적을 활용하여 다기준 의사결정 문제를 정량화한다. 거리·속도·접근시간 융합 다표적 위협도 산출 AVX2 SIMD 병렬 벡터화 커널.
중학 정보
(문제 해결과 프로그래밍)
[09정보03-03] 우선순위가 다른 여러 작업이 주어졌을 때 정렬 알고리즘을 활용하여 처리 순서를 결정한다. 미사일 요격 작업과 일반 탐색 작업의 우선순위 큐 2D 그래픽 시각화 GUI.

4.2 대한민국 해군 KDDX 차기 구축함 방공 사격통제 실전 효과

  • 포화 공격(Saturation Attack) 동시 대응 능력 400% 극대화: S-대역으로 탄도탄과 공중 위협을 감시하면서, X-대역으로 최대 16발의 함대공 유도탄을 동시 유도 인터리빙.
  • TRM 모듈 열 부하 완벽 통제: 듀티 사이클을 엄격히 20% 이내로 유지하는 펄스 패킹 알고리즘으로 장시간 전투 지속성 100% 보장.
  • 순수 국산 이지스 전투체계(CMS) 소프트웨어 주권 확립: 미국 록히드 마틴의 외산 스케줄러 알고리즘에 의존하지 않고, 대한민국 해군 독자 규격의 0-Alloc 순수 C# 실시간 코어 완성.