[TIL ํ”„๋กœ์ ํŠธ] 9์ผ์ฐจ - ์‹œ๊ฐ„ ๋ณต์žก๋„ 1
ยท
์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ
๋น…์˜ค ํ‘œ๊ธฐ๋ฒ•์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋‚˜ ๊ณต๊ฐ„๋ณต์žก๋„๋ฅผ ํ‘œํ˜„ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ์ˆ˜ํ•™์  ํ‘œ๊ธฐ๋ฒ•์ž…๋ ฅ ํฌ๊ธฐ n์— ๋Œ€ํ•ด ๊ฐ€์žฅ ์ง€๋ฐฐ์ ์ธ ์—ฐ์‚ฐ ํšŸ์ˆ˜(์„ฑ์žฅ๋ฅ )๋ฅผ ์ˆ˜ํ•™์ ์œผ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ์œผ๋กœ ์ตœ์•…์˜ ๊ฒฝ์šฐ ๊ธฐ์ค€์œผ๋กœ ํ‘œํ˜„ํ•จa = arr[0] ์˜ ๊ฒฝ์šฐ ์ž…๋ ฅ ํฌ๊ธฐ์™€ ๊ด€๊ณ„์—†์ด ํ•ญ์ƒ ์ผ์ •ํ•œ ์‹œ๊ฐ„์œผ๋กœ O(1)์ด์ง„ ํƒ์ƒ‰์˜ ๊ฒฝ์šฐ ์ž…๋ ฅ์„ ์ ˆ๋ฐ˜์”ฉ ์ค„์ด๊ธฐ ๋•Œ๋ฌธ์— O(log n)์„ ํ˜• ํƒ์ƒ‰์˜ ๊ฒฝ์šฐ ํ•œ ๋ฒˆ์”ฉ ๋‹ค ํ›‘๊ธฐ ๋•Œ๋ฌธ์— O(n)๋จธ์ง€ ์ •๋ ฌ์˜ ๊ฒฝ์šฐ ๊ฑฐ์˜ ๋ชจ๋“  ํšจ์œจ์ ์ธ ์ •๋ ฌ๋กœ O(n log n)์ค‘์ฒฉ ๋ฐ˜๋ณต๋ฌธ์˜ ๊ฒฝ์šฐ O(n^2)์žฌ๊ท€ ์กฐํ•ฉ์˜ ๊ฒฝ์šฐ O(2^n)์™„์ „ํƒ์ƒ‰(์ˆœ์—ด)์˜ ๊ฒฝ์šฐ ๋ชจ๋“  ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— O(n!)O(n+n^2)์˜ ๊ฒฝ์šฐ n^2๊ฐ€ n๋ณด๋‹ค ํ›จ์”ฌ ๋นจ๋ฆฌ ์ปค์ง์œผ๋กœ ๋น…์˜ค ํ‘œ๊ธฐ๋ฒ•์œผ๋กœ๋Š” O(n^2)๋กœ ํ‘œ๊ธฐํ•จvoid example1(int n){ for(..
[TIL ํ”„๋กœ์ ํŠธ] 8์ผ์ฐจ - Garbage Collection (GC)์™€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ
ยท
๊ณต๋ถ€
1. Garbage Collection(GC)์ด๋ž€?GC๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ํšŒ์ˆ˜ํ•ด์ฃผ๋Š” ๊ธฐ๋ŠฅC#, Java ๊ฐ™์€ ๊ด€๋ฆฌํ˜• ์–ธ์–ด ์—์„œ ์ œ๊ณต๋จ๊ธฐ๋ณธ ๊ฐœ๋…- ํž™(Heap) ์˜์—ญ์— ํ• ๋‹น๋œ ๊ฐ์ฒด ์ค‘ ๋” ์ด์ƒ ์ฐธ์กฐ๋˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์ฐพ์•„์„œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšŒ์ˆ˜ํ•จ- ์ˆ˜๋™ ํ•ด์ œ๊ฐ€ ํ•„์š” ์—†๋Š” ๋Œ€์‹ , GC ํƒ€์ด๋ฐ์— ๋”ฐ๋ผ ์„ฑ๋Šฅ ์ €ํ•˜ ๋ฐœ์ƒ ๊ฐ€๋Šฅ2. GC ๋™์ž‘ ๋ฐฉ์‹ (C# ๊ธฐ์ค€)Mark and Sweep ๋ฐฉ์‹1. Mark : ๋ฃจํŠธ(Root) ๊ฐ์ฒด์—์„œ ์‹œ์ž‘ํ•ด ์ฐธ์กฐ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋ฅผ ๋ชจ๋‘ “์‚ด์•„์žˆ๋‹ค”๊ณ  ํ‘œ์‹œ2. Sweep : ํ‘œ์‹œ๋˜์ง€ ์•Š์€ ๊ฐ์ฒด๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ œ๊ฑฐ์„ธ๋Œ€๋ณ„ ๊ด€๋ฆฌ(Generational GC)- Generation 0 : ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด (๋น ๋ฅด๊ฒŒ ์ˆ˜๊ฑฐ)- Generation 1 : ์กฐ๊ธˆ ์˜ค๋ž˜๋œ ๊ฐ์ฒด- Generat..
[TIL ํ”„๋กœ์ ํŠธ] 7์ผ์ฐจ - CPU ์บ์‹œ ํžˆํŠธ์™€ ์บ์‹œ ๋ฏธ์Šค
ยท
๊ณต๋ถ€
1. ์บ์‹œ๋ž€?CPU๋Š” ๋งค์šฐ ๋น ๋ฅด์ง€๋งŒ, RAM์€ ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆผ๊ทธ๋ž˜์„œ CPU์™€ RAM ์‚ฌ์ด์— ์ž‘์€ ๊ณ ์† ๋ฉ”๋ชจ๋ฆฌ์ธ “์บ์‹œ(Cache)"๊ฐ€ ์กด์žฌํ•จ- L1,L2,L3 ์บ์‹œ : ์ ์  ๋А๋ฆฌ์ง€๋งŒ ํฌ๊ธฐ๋Š” ์ปค์ง- CPU๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•  ๋•Œ: - ์บ์‹œ์— ์žˆ์œผ๋ฉด -> Cache Hit (๋น ๋ฆ„) - ์—†์œผ๋ฉด -> Cache Miss (๋А๋ฆผ, RAM๊นŒ์ง€ ๋‚ด๋ ค๊ฐ)2. Cache Hit vs Cache Miss- Cache Hit : CPU๊ฐ€ ์ฐพ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์บ์‹œ์— ์ด๋ฏธ ์กด์žฌ : ๋น ๋ฆ„ (์ˆ˜ ns)- Cache Miss : CPU๊ฐ€ ์ฐพ๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์บ์‹œ์— ์—†์Œ -> RAM์—์„œ ๊ฐ€์ ธ์˜ด (์ˆ˜์‹ญ~์ˆ˜๋ฐฑ ns)3. Spatial & Temporal Locality (์ง€์—ญ์„ฑ)CPU ์บ์‹œ๋Š” ์ง€์—ญ์„ฑ(Locality)์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•จ- Tempo..
[TIL ํ”„๋กœ์ ํŠธ] 6์ผ์ฐจ - ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ & ์บ์‹œ ์ผ๊ด€์„ฑ (Memory Model & Cache Coherency)
ยท
๊ณต๋ถ€
1. ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ์ด๋ž€?๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•  ๋•Œ์˜ ๊ทœ์น™๊ณผ ๋ณด์žฅ ๋ฒ”์œ„๋ฅผ ์ •์˜ํ•œ ๊ฒƒ- ์šฐ๋ฆฌ๊ฐ€ x = 10 ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์“ด๋‹ค๊ณ  ํ•ด๋„, ์‹ค์ œ ์‹คํ–‰ ์ˆœ์„œ๋‚˜ ์ฝ๋Š” ๊ฐ’์€ CPU, ์ปดํŒŒ์ผ๋Ÿฌ, ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”์— ์˜ํ•ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์Œ-> ์–ธ์ œ ์–ด๋–ค ๊ฐ’์ด ๋ณด์žฅ๋˜๋Š”์ง€? -> ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ์ด ์ด๊ฑธ ์ •์˜ํ•ด์„œ ์คŒ2. ์™œ ์ค‘์š”ํ•œ๊ฐ€?๋ฉ€ํ‹ฐ์ฝ”์–ด CPU์—์„œ๋Š” ๊ฐ ์ฝ”์–ด๋งˆ๋‹ค ์บ์‹œ๊ฐ€ ์žˆ์Œ-> ๋ณ€์ˆ˜ ๊ฐ’์„ ๋ฐ”๋กœ RAM์—์„œ ์ฝ์ง€ ์•Š๊ณ , ์ž๊ธฐ ์บ์‹œ์—์„œ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ์Œ-> ๊ทธ๋Ÿฌ๋ฉด ๋ฌธ์ œ๊ฐ€ ์ƒ๊น€:A ์ฝ”์–ด๊ฐ€ x=10 ํ–ˆ๋Š”๋ฐ, B ์ฝ”์–ด๋Š” x๊ฐ€ 0์ธ์ค„ ์•Œ๊ณ  ์ž˜๋ชป๋œ ๊ณ„์‚ฐ์„ ํ•  ์ˆ˜ ์žˆ์Œ3. Cache Coherency (์บ์‹œ ์ผ๊ด€์„ฑ)๋ฉ€ํ‹ฐ์ฝ”์–ด CPU๋Š” ์ฝ”์–ด๋“ค ๊ฐ„ ์บ์‹œ์˜ ๊ฐ’์„ ๋™๊ธฐํ™”ํ•ด์•ผ ํ•จ-> ์ด๊ฑธ ์บ์‹œ ์ผ๊ด€์„ฑ(coherency)๋ผ๊ณ  ํ•จ๋Œ€ํ‘œ์ ์ธ ํ”„๋กœํ† ์ฝœ : ..
[TIL ํ”„๋กœ์ ํŠธ] 5์ผ์ฐจ - ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ์—์„œ ์ƒ๊ธฐ๋Š” ๋ฌธ์ œ, ๊ฒฝ์Ÿ ์กฐ๊ฑด(Race Condition)
ยท
๊ณต๋ถ€
1. ๊ฒฝ์Ÿ์กฐ๊ฑด์ด๋ž€?๋‘ ๊ฐœ ์ด์ƒ์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๊ณต์œ  ์ž์›(์˜ˆ: ๋ณ€์ˆ˜, ๋ฆฌ์ŠคํŠธ ๋“ฑ)์— ๋™์‹œ์— ์ ‘๊ทผํ•˜๋ ค ํ•  ๋•Œ, ์‹คํ–‰ ์ˆœ์„œ์— ๋”ฐ๋ผ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ์˜ˆ์‹œ int counter = 0;Thread t1 = new Thread(()=> { for(int i=0; i { for(int i=0; i๊ธฐ๋Œ€๊ฐ’์€ 2000์ด์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” 1500 ~ 2000 ์‚ฌ์ด์˜ ๊ฐ’์ด ๋‚˜์˜ฌ ์ˆ˜๋„ ์žˆ์Œ์›์ž์ (atomic) ์—ฐ์‚ฐ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์›์ž์ (atomic) ์—ฐ์‚ฐ์ด๋ž€?ํ•˜๋‚˜์˜ ์—ฐ์‚ฐ์ด “๋” ์ด์ƒ ์ชผ๊ฐค ์ˆ˜ ์—†๋Š” ๋‹จ์œ„”๋กœ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ- ์‹คํ–‰ ์ค‘ ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ๊ฐ€ ๋ผ์–ด๋“ค ์ˆ˜ ์—†๊ณ ,- ๋ฐ˜๋“œ์‹œ ์ „๋ถ€ ์„ฑ๊ณตํ•˜๊ฑฐ๋‚˜, ์ „๋ถ€ ์‹คํŒจํ•จ. ์ค‘๊ฐ„ ์ƒํƒœ๊ฐ€ ์—†์Œ์ฆ‰, “ํ•œ ๋ฒˆ์— ๋”ฑ ์ฒ˜๋ฆฌ๋œ๋‹ค” ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋จ์™œ counter++๋Š” ์›์ž์ ์ด์ง€ ์•Š์€๊ฐ€?counter++๋Š” 3๋‹จ๊ณ„๋กœ..
[TIL ํ”„๋กœ์ ํŠธ] 4์ผ์ฐจ - ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ์™€ ๊ณ„์ธต ๊ตฌ์กฐ
ยท
๊ณต๋ถ€
CPU์™€ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์ด์˜ ์†๋„ ์ฐจ์ด๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋„์ž…๋œ ๊ฒƒ์ด ์บ์‹œ(Cache)๊ฒŒ์ž„์ฒ˜๋Ÿผ ์—ฐ์‚ฐ์ด ๋งŽ์€ ํ™˜๊ฒฝ์—์„œ๋Š” ์บ์‹œ์˜ ํ™œ์šฉ์ด ์„ฑ๋Šฅ์— ์—„์ฒญ๋‚œ ์˜ํ–ฅ์„ ์คŒ1. ์™œ ์บ์‹œ๊ฐ€ ํ•„์š”ํ• ๊นŒ?- CPU๋Š” ์—„์ฒญ ๋น ๋ฆ„- RAM(๋ฉ”์ธ ๋ฉ”๋ชจ๋ฆฌ)์€ ์ƒ๋Œ€์ ์œผ๋กœ ๋А๋ฆผ- ๋งค๋ฒˆ RAM์— ์ ‘๊ทผํ•˜๋ฉด ์„ฑ๋Šฅ ์ €ํ•˜ ๋ฐœ์ƒ-> ๊ทธ๋ž˜์„œ CPU ๊ทผ์ฒ˜์— ๋” ๋น ๋ฅด๊ณ  ์ž‘์€ ๊ธฐ์–ต์žฅ์น˜์ธ ์บ์‹œ๋ฅผ ๋‘ฌ์„œ ์„ฑ๋Šฅ์„ ๋†’์ž„2. ์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๊ณ„์ธต ๊ตฌ์กฐ๋ณดํ†ต ์บ์‹œ๋Š” L1 -> L2 -> L3 ์ˆœ์„œ๋กœ ๊ตฌ์„ฑ๋จ๊ณ„์ธต / ์œ„์น˜ / ํฌ๊ธฐ / ์†๋„ / ์—ญํ• L1 / CPU ๋‚ด๋ถ€ / ์ ์Œ(์ˆ˜์‹ญ KB) / ๊ฐ€์žฅ ๋น ๋ฆ„ / ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ช…๋ น๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅL2 / CPU ๋‚ด๋ถ€ or ์™ธ๋ถ€ / ์ˆ˜๋ฐฑ KB~MB / L1๋ณด๋‹ค ๋А๋ฆผ / L1์—์„œ ๋ชป ์ฐพ์„ ๋•Œ ์‚ฌ์šฉL3 / CPU ์™ธ๋ถ€ (๊ณต์œ ) / ์ˆ˜ MB / ..