ìì ëíë (Double Buffering)
íì ìììí (3ì ìì)
- ëì: ìì ëíë(Double Buffering)ì ëì ëíê êì "ëìíë ë ììê ëìë ëì ììëì ëìì íë ëë íì(Dead Time)"ì íêë ëìê ìí, ë(RAM)ì ëêì íêì ëí ë ê(A, B)ë ëìëê íí ìë ëêì êë ìê ìë êêì I/O ëëí íë êëìë.
- êì: íì ëí(A)ìì ëìíë ëìíë ëëëë ê ìëì ìê ëì, ëìì ìê ëëì ë ëí(B)ì ëíìí ííì ëìì ììëììëì **CPU, ëìí, ëìë ë ëë íëìì ììëì ë 1íëì ìë ìê(Idle) ìì 100% íêëìíë êíì ìëí(Throughput)**ì ëìëë.
- ìí: ì êëì ëìë 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ë ìëë ëìêë.
-
ëì ëê ë ëë ìëì êíí:
- ëì ëíì íê: I/O ììì CPUê ëêì êë ìë(Idle) ìëì íìíëì ëì ëì.
- Flip-Flop (íí) ììëì ëì: ëëë êêì ìì ìê(ëí 1ê ëë) ë íìíë ëêë ìê(ìë)ì 2ëë ëíêíë ëëì ëë.
- êëíìììì êì: ëëíê íëì êëë ëìì êëíìëê íëì ëììì íìì ìììë íìì ìëí íêíë íë ëìíëìì íìì ë.
ëì ëí(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% ëìíê ëìëì ììì ìëíê ìë.
- ëì ìí: ìëëíì(k8s) ìëì ì ëì(v2) ìì ìëìíí ë, êì ì(v1)ì ëê ì ìì ìë 10ì ëì ììëì ììì ìë(502 Bad Gateway)ë ëëë. (ëì ëíì ëë íì).
- ìì ëíë ëì (Blue-Green Deployment):
- íëëì íêì ìì ìë ëìì 2ìí(ëë, êë) ëëìëë.
- íì ìì íëíì ëë ìë(v1)ë ëê ìë (Front Buffer).
- êëíì ìëë ì ëë êë ìë(v2)ì ì ìëë ììëê ìëê íìíêì ë ëìë (Back Bufferì ëìí ìê).
- ìì(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êë ëì ëìë, ë ëê ìëíí "ë ì!" í ë ìëê ìë êì íìë ëì ëë êê êëëì íììì?
- êë ìëê ëìì ëëì? ëêëì ìì 2ê ëëê ëë êìì! ëê 1ë êëì ìëê íëë ëì ìëë 2ë êëì ëì ëë êë ììëê ëêíë êì.
- ììëê ëëêëì? ëìì! 1ë êëì ë ëìë ìê 1ìë ì ìê ê ì 2ë êëìë ìêëì ìêì ëë ëê ëëì ë ëë ìëê 2ëë íëíëëë!