ìì ëíë (Double Buffering)

íì ìììí (3ì ìì)

  1. ëì: ìì ëíë(Double Buffering)ì ëì ëíê êì "ëìíë ë ììê ëìë ëì ììëì ëìì íë ëë íì(Dead Time)"ì íêë ëìê ìí, ë(RAM)ì ëêì íêì ëí ë ê(A, B)ë ëìëê íí ìë ëêì êë ìê ìë êêì I/O ëëí íë êëìë.
  2. êì: íì ëí(A)ìì ëìíë ëìíë ëëëë ê ìëì ìê ëì, ëìì ìê ëëì ë ëí(B)ì ëíìí ííì ëìì ììëììëì **CPU, ëìí, ëìë ë ëë íëìì ììëì ë 1íëì ìë ìê(Idle) ìì 100% íêëìíë êíì ìëí(Throughput)**ì ëìëë.
  3. ìí: ì êëì ëìë I/O ìíëë ììíë ëì, íë ìíí êëíì(êì ìì, ëëí ììì)ìì íëì ìììë íìë(Tearing) íìì ëëíë íëí/ë ëí ìì(Swap)ì íì ëëë ìíëì ìëê ëëëì 144Hz ììì ë ì ìë ëëì êëì ììíë.

. êì ë íìì (Context & Necessity)

  • êë: ëì ëíëì "ëí 1ê"ë. ëì êë ììë, ê ëì ë ëìë ëêì ìëêìë ìêê ëíë êëëì íë. ìì ëíëì "ëí 2ê"ë ìëíë êìë. 1ë íì ëì ê ìë, 1ë íì ëì ëìë(ìëíë) ëì ìëêìë ìêì ìê ëë 2ë íìë íìë ìê ëì êì ììë. 2ë íì ë ìë ëì ëìì 1ë íìë ìêë. ì ëìë íí ëëìë.

  • íìì: CPUê ëìíìì 4KBìë ëëì ë ëíì ìììë. CPUê ê 4KB ëíìì ëìíë íëì êë ìì(ìë)íë ëì, ëí êêì ê ì ììëë ëìíë ëì 4KBë ëìë ëëì ëíê ëí íìì ëì ì ëëëì íë. CPU ììì ëëë ëíê ëê, êëìì ëìíê ëì 4KBë ëêëêëë ìì ëëë. ì "ììê ëìê"ê ììììë(ìëë) ììëëì ììíì ìëì íì ëë ìíê ëìë. "ìë, ë ë ìì ìê ëìì(ëëë) ìíê ëë ì ìì?"ëë íëìì 100% íì(êëë)ì ëí êêê ìì ëíëì íìììë.

  • ð ëì: ìì ëíëì êììì ëë ëëê 2ììì êë. ìë(ëí)ê 1êì ë, ìê Aê ìëì ëëì êë ììë ìê Bê ê ìëë ëê ëììêì êì ëëì ë ëë ëêì Aë ëëëë ëë íìë ëìì íë(ëì ëíì ëë). íìë ìëê 2ê(ìì ëí)ë ììêê ëëë. Bê 1ë ìëë ëê ìì ëëë êë ê ìê ëì, Aë ìì ìê 2ë ìëì ëëì ëì ëì ìì ëëë. Aì B ì ëê íë ëë íì í ìì êììì 2ë ìëë ëìêë.

  • ëì ëê ë ëë ìëì êíí:

    1. ëì ëíì íê: I/O ììì CPUê ëêì êë ìë(Idle) ìëì íìíëì ëì ëì.
    2. Flip-Flop (íí) ììëì ëì: ëëë êêì ìì ìê(ëí 1ê ëë) ë íìíë ëêë ìê(ìë)ì 2ëë ëíêíë ëëì ëë.
    3. êëíìììì êì: ëëíê íëì êëë ëìì êëíìëê íëì ëììì íìì ìììë íìì ìëí íêíë íë ëìíëìì íìì ë.

        ëì ëí(Sync) vs ìì ëí(Async/Parallel) êëë ìêí    

                                                                      
  1. ëì ëí (Single Buffering) - íìì ëëì ëë               
   [ìê]     T1         T2         T3         T4                     
   [ëìí] ð(ëíìì)   ð(ëê)   ð(ëíìì)   ð(ëê)         
   [ CPU  ] ð(ëê)   ð(ëíëì) ð(ëê)   ð(ëíëì)           
   ð êê: íëììê 50%ì ìê ëì ëëëë ëê ìì. íì ìì. 
                                                                      
  2. ìì ëí (Double Buffering) - 1ìë ì ìë ëìë             
   [ìê]     T1         T2         T3         T4                     
   [ëìí] ð(Aìì)  ð(Bìì)  ð(Aìì)  ð(Bìì)                
   [ CPU  ] ð(ëê)   ð(Aëì)  ð(Bëì)  ð(Aëì)                
    êê: T2ëí ëìíì CPUê ëí A, Bë ëêìêë ìê         
           ëì(Parallel)ì ìí! ìë(Throughput) êì 2ë ìì!     

[ëììêë íì] ëì ëíê ììì(Sequential)ì íëëíëë, ìì ëíë ë êì íëëíê ìëíê ëëë ëìì ëìêë ëë(Parallel) íìíëìì êìë. ë(RAM)ì ìëì êì ì KB(ëí 1ê íê) ë ëììë êëìë, ìëë ììë CPUì ëìíì ëëëë êë ìêì 100% êê ìì ëìëë êíì êìëì ëìííìë.

  • ð ìì ìì ëì: ììë ëëìí ë êë ìêìëë. êë(ëì ëí)ì 1ê ìíë, ëê ììëì ë ëê ëëìì êëì ìêí êì ìê ëì êêì ëìì ëêì ëë ììí êìì íëë. íìë êë ìíê 2ê(ìì ëí)ë, ëê 1ë êëì ëì ê ëëìëì ëëìì 2ë êëì ì ììëì ëì ìê, ëë 2ëì ëë ëì ëëìì 1ë êëì ìì ì ììëì ëììë ëí íí ììê êëíëë.

. ìííì ë íì ìë (Deep Dive)

ììì-ìëì ëì (Producer-Consumer Problem)ì ëëì íë

ìì ëíëì ìíí êíì ëìì 'ìììì ìëì' ëìë êì ììììë íêí íííë.

  • ììì(Producer): ëìí ëëìë. ëìíë ë ëíì ìì ëë ë.
  • ìëì(Consumer): CPU ììê. ë ëíì ëìíë ììëë ë. ì ëì 1êì ëíë ëê "ëê ëìê ëì!" "ëê ëê ëì!" íê ë(Lock/Mutex) êíì ëìë ììë ìëë ììì ëìíë. íìë 2êì ëíë ìë ëì ê íìê ìë. ìììê Buffer 1ì ëë ëì, ìëìë ììíê Buffer 2ìì ëëìë ëë. ë ëëë ììê ëëììë ììí ëëëì ììëë ëìíê êì(Race Condition) ìë ìê, ìíìí ììì ëë ìë $O(1)$ ëêíê ìëíë.

ìì (Swap) íìíì 0ì ììì

ëí Aë ë ìê ëí Bë êìí ë, 10MBìë ëìëë ëìíì ëêë ëìí ìì íë ì êìì ìíë.

  • êì ìëì ëëë ëíë êëíë *front_ptr, *back_ptr ë êì íìí ëìë ëë.

  • CPUì GPUê êì íìíë ëê 10MBì ììêë ëìë.

  • ë ëëë swap(front_ptr, back_ptr) íìë 8ëìíìë ììê 2êë ìë í ëêìêíë. (0.0001ì ì).

  • 10MB ëìíë ëì êëë êëí ìê, êêëì ìì(íìí)ë êììíìëì êëí íí êìì êëë êëê ìììíë.

  • ð ìì ìì ëì: ììì ì 10kgìë ëí 2êì ëìëì ìë ëêëë ëì ë ëìì ìêë ëì êì(ëìí ëì)ì íì íëë. íìë ìì ëíë ììì êë "ìëìì ì ê 1ë, ììì ì ê 2ëìëê ëëì"ëê ë ë ìì ìëí(íìí)ë ë ëêìêíì í(CPU ìì)ì 1ë ì ëìë ëììëë.


. ìí ëê ë ëêë ëì

ëê 1: ìíí êëíì(ëëí)ììì íë ììì(Tearing) ëì

ìì ëíëì êì ëëìê íìíê ëìëìê êì ì ìëì ëìê ëë êëí ìë(GPU)ì ëëí ììì ìììë.

ëê íëëì ëíë (Single Buffering)ìì ëíë (Double Buffering)
ëì êìëëì ë(VRAM)ì ëíì 1ìì GPUê ìì êëGPUë ëì(Back) ëíìì êëê, ëëíë ìì(Front) ëíìë ëìì
ìëì ìëíìë(Tearing - íë ììì) ëìíë ììì ìë ëì
íìë ììëëíê êëì ììì ìëë ììíë ëììë ììì, GPUê ê ëíì ìì ëì íëìì ììêìë ëìí ëëì íë ìëëì ìë ìë, ìëëëì ì ìëì ëìë êêí íì íì íìëëíê ì ëíìë ë ë ëêì, GPUë ë ëíììë ììí êëê ìëê ëëë ìê ëíì 2êë ëì ìëë ìì(Swap)íëëëë ìì íì ìì ìì

íëí ëíë (Triple Buffering)ì ëì

ìêì ììì ëì ìë. ìì ëíëë ììì ììë.

  • GPUê ë(Back) ëíì êëì ë êëë. ëëíê íëí(Front) ëíë ë ììê ëêì ëì ìì(Swap)í ìê ìë. (ìëë V-Sync ë).
  • ê ìëì ìê ëì GPUë êë ëíìê ììì ë "ëìì(Idle)" íë. (êìëëì íìíë ìí ë, Input Lag ëì).
  • íêì: ëíìë 3ì(Triple)ìë ëëë! ëëíê íëí ìì ëê, GPUê ë ìì ë êëëë ìì ë ëêìë? GPUë ëì ìê ëì 'ìë(Third) ëíì'ì êëì íëìì ë ëì ëì êëë. íëììì ìë ìêì 0ìë ììí ëëë êêì íëì ìììê êëìë.

 ëí êì   VRAM ìëë íë ììì ëì ìí ë(í ìí) ëì 

 1ê (ëì) êì ìì    ï ììì ëì  ìì (ëë)            
 2ê (ìì) 2ë ìë     ð ìë ëì   ð ìêì ìí ë íì  
 3ê (ìì) 3ë ìë     ð ìë ëì   ð ìí ëêì ëë!    

[ëíëì íì] ëíë íë ë ìêí ëëë VRAMì ìì ëêëìíì ëìêìë, êìëëì 144Hz ììíì ìí êê ëëë ëëìì êêì ìëíë êì íë êì ìì(ìëì, ìëí)ê ìëëì(NVIDIA) ììíì ìë íë êìë.

  • ð ìì ìì ëì: ìì ëíëì ëì(GPU)ê ëë ë(Back)ìì íìì ë ëëê êëëëê, ëë ì(Front)ì 1ëì ëëë í ìëë ëêë êëë. ëìì ëìê ìì íìì ëëë 1ëì ëë ëêì ëë ëìì ëëëì(ìí ë) íëë êì. ìì ëíëì ëë ë ëêìì 2êë íì, íì ëë ëìê 1ëêììì ëëëë ëì ëë ëìê 2ëêììì ë íì(ëì íëì ëëë)ì ììíê íì êììë ëëë ëììëë.

. ìë ìì ë êììì íë (Strategy & Decision)

ìë ìëëì: Zero-Downtime(ëìë) ëíì Blue-Green ëí ìííì

ìííìì ëí(CI/CD) ìíëììë ì ìì ëíëì 'ìì(Swap)' ìíì 100% ëìíê ëìëì ììì ìëíê ìë.

  1. ëì ìí: ìëëíì(k8s) ìëì ì ëì(v2) ìì ìëìíí ë, êì ì(v1)ì ëê ì ìì ìë 10ì ëì ììëì ììì ìë(502 Bad Gateway)ë ëëë. (ëì ëíì ëë íì).
  2. ìì ëíë ëì (Blue-Green Deployment):
    • íëëì íêì ìì ìë ëìì 2ìí(ëë, êë) ëëìëë.
    • íì ìì íëíì ëë ìë(v1)ë ëê ìë (Front Buffer).
    • êëíì ìëë ì ëë êë ìë(v2)ì ì ìëë ììëê ìëê íìíêì ë ëìë (Back Bufferì ëìí ìê).
  3. ìì(Swap)ì ìê (Zero-Downtime):
    • ëëëëì(L4 ììì/Nginx)ì íëí ëìí íìí íìíë ëëìì êëìë 0.001ì ëì í êìëëë!
    • ììëì 1ìì ëêë ìì ëëëê ì ëìì íëì ëê ëë.
    • ëì ì ëìì ëêê íìë? íìíë ëì ëëë í êìëëë 1ì ëì ìëí ëë(Roll-back)ì ìêíë. ìêì ììë ëì ìëë ëììë ìëìííë ìììë ëìëì ìíë ëí ìíìë.

C++ ëëê ëê(Logger)ì ìì ëí ëêëìë ëí

êìë êì êë ìëìì ëêë í ìì ëìí íìì ììë(fputs) I/O ë ëëì ëë íìëì ëì íìíë. ìêì êëìëì ëì A, B 2êì êë í(ëí)ë ëìëëë. íëìë ëì ìëëë A ëíì ìë 10ë ìì ëêë ëì ìëë ëëëìë ìì ëëë. Aê ê ìë íìíë Bë ì ëë Bì ìê ììíë. ìë ëêëìëì ëê ìì ìì ìëëê êìëì ê ì A ëíë ìê ëëëë íëëìíì íìë ëëìëë(Flush). ëì ìëëì êë ìëë 1ë êì ëì ìë êìì ëê ìííìë.

  • ð ìì ìì ëì: êìì ëë ì êê(íëí)ì ìììí ë, 1ê(ëë ëí)ì ë ììê êìì ëììë ëì ììëì ë 2ê(êë ëí)ì ììí ììíê ìííëë. 1ê êìì ëë êêì íìíë êëëë ëì êêì ëëì ìì ëë 2êìë ììëë, ëííëì ìíêì ìëí íìì ìëê êììëë.

. êëíê ë êë (Future & Standard)

ìë/ìì êëíê

êëëì
íëìì êëë(Utilization) 100% ëìëìíë ìë ìê ìë ìì íìë ìêëìë ëìíë íì ìê(Idle)ì ìêíì I/O ìëí(Throughput)ì êì 2ëë ëíê
Race Condition ìì ìëìê ìì(Front)ê ìê ìì(Back)ì ëëì ë ììë ììí êëíì, ë(Lock) ììë ìëí ìëë-ììí(Thread-safe) íê êì
UI/UX íìë(Tearing)ì ììí ëìëëí êì ìê(V-Sync)ì GPU ëëë ìêë ìêëë íìí ìì(Swap)ìë ëëíì ëëëì íë ìêì ìë íì íë

êë ë ëë ìë

ìì ëíë (Double Buffering)ì "êê(ëëë)ì ë ëë ëëíì, ìê(ìë)ì êëì ììí ëìëëêë"ë ìíí êí íìì ìëììì íëìëìíì êì ìêììê ìêìì ëëìë. ëëë ë ëìíê ìêìë íëì ëë íìë ìììë ììë ë í ììììë, ëì ëìëë íë ìíí íêììë ì 'íí ëì'ììëë ëìí I/O, ëíìí íí í, êëíì ëëë, íëìë ëìë ëí(Blue-Green) ë ëë ëëê(Asynchronous) íìíëìì ììëìì íë ëê íë ëëëìë. ììë ìêì ëíëì ëëë(NVDIMM)ë CXL ììì êëì ìííìê ëììë, ë ìì-ìëì êì ìë ììê ììíë í ì 'ëí 2ê êë êë'ì ìë ìì ìë ìê ëëì ëìì ííìë êëí êìë.

  • ð ìì ìì ëì: ëëí ëëì(ëì ëí)ììë ëê ëíì ëêìë ëì ììê ë ëêì ëë êëí ììì íì í ìì ìëê ëëëë. ìì ëíëì ìì íë 2êë íëê ë ëìê ë íìì ëìì ëìì íëì ëë ëíë íêìì íí ëì êííë ëì ìë ìì ëëêìëë. ìë(ë)ì ë ëë ëìë êìììë ìëììë ëë ëìíëë.

ð êë êë ë (Knowledge Graph)

  • ëíë (Buffering) | ìë ììë ëìê ìí ëíì íë íëë êë êë. ì ëíì ê ì ë ëìíë ëì êëìê ìí ìì ëíëì ëìí
  • V-Sync (ìì ëêí) | ìì ëíë íêìì ëëíê ììì ë ë ëêì GPUê ëìì ë êëê ëêíê ëëë íë ììì ëì ë
  • Blue-Green ëí | ìì ëíëì êëì íëìë ìë 100ë ëìë ëíêíì ììí íë IT ìíë ëìë ìëìíì êêì
  • ìíìí ììì (Context Switch) | íìíë í ëêìë ëí ìì(Swap)ì 0ì ëëìì ëìììë, ììììê ìì ëë ìêëë êë ëìí ìëíë
  • ë íë (Lock-Free) í | ìììì ìëìê ìì ëíìë êìì ììììë ëê íì ëíì ë ìì ìêì íìì íê íìë ìë ììí ìëêì

ð ìëìë ìí 3ì ëì ìë

  1. ìì ëíëì ëêì? ëê ëêë(ëí) 1êë ëì ëìë, ë ëê ìëíí "ë ì!" í ë ìëê ìë êì íìë ëì ëë êê êëëì íììì?
  2. êë ìëê ëìì ëëì? ëêëì ìì 2ê ëëê ëë êìì! ëê 1ë êëì ìëê íëë ëì ìëë 2ë êëì ëì ëë êë ììëê ëêíë êì.
  3. ììëê ëëêëì? ëìì! 1ë êëì ë ëìë ìê 1ìë ì ìê ê ì 2ë êëìë ìêëì ìêì ëë ëê ëëì ë ëë ìëê 2ëë íëíëëë!