Python ๊ด€๋ จ ๋‚ด์šฉ ์ •๋ฆฌ

Basic [[Python_Distilled]]

April 21, 2025

ํ”„๋กœ๊ทธ๋ž˜๋จธ๋กœ ์‚ฌ๋Š”๋ฒ• ๊ฐ„๋žตํ•œ ์ธ์šฉ๊ณผ ํ›„๊ธฐ ๐Ÿ‘จโ€๐Ÿ’ป

๋ง์ณ๋ฒ„๋ฆฐ ์†Œํ”„ํŠธ์›จ์–ด ํ”„๋กœ์ ํŠธ์™€ ๋ฌด์šฉ๋‹ด โ€œ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋“  ์†Œํ”„ํŠธ์›จ์–ด๋Š” ์ •๋ง ์ข‹์•˜๋Š”๋ฐ, ์‹œ์žฅ์ด ๋ฌด๋ฅด์ต์ง€ ์•Š์•˜์–ดโ€ -> ์†Œ๋น„์ž ์š”๊ตฌ๋ฅผ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. โ€œ์†Œํ”„ํŠธ์›จ์–ด๋Š” ์ž˜ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ ์˜์—… ํŒ๋งค๊ฐ€ ์ž˜ ๋˜์ง€ ์•Š์•˜์–ดโ€ -> ์•„๋ฌด๋„ ๊ทธ๋Ÿฐ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์›ํ•˜์ง€ ์•Š์•˜๋‹ค. โ€œ์ œํ’ˆ์€ ๋๋‚ด์คฌ๋Š”๋ฐ ์ œ๋Œ€๋กœ ์ข€ ํ•ด๋ณด๋ ค๋Š” ๋งˆ๋‹น์— ์œ—์„ ์—์„œ ์ž˜๋ ธ์–ดโ€ -> ์ˆ˜์ต์„ ์ฐฝ์ถœํ•˜๊ธฐ๊นŒ์ง€ ๋„ˆ๋ฌด ์˜ค๋ž˜๊ฑธ๋ ธ๋‹ค. โ€œ์ข‹์€ ์†Œํ”„ํŠธ์›จ์–ด๋ž€ ๊ทธ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์„ฑ์ˆ™๋„ ์‚ฌ์ดํด์—์„œ ์–ด๋””์— ์žˆ๋Š”์ง€, ์–ด๋–ค ์‚ฌ์šฉ์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š”์ง€, ์–ด๋–ป๊ฒŒ ์ง„ํ™”ํ•˜๊ณ  ์„ฑ์žฅํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š”์ง€ ๋“ฑ์— ๋”ฐ๋ผ ๋งค์šฐ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋‹ค. ์†Œํ”„ํŠธ์›จ์–ด์—์„œ ๊ณ ๊ฐ์ด ์ง„์ • ๋ฌด์—‡์„ ํ•„์š”๋กœ ํ• ์ง€, ๊ทธ๋ฆฌ๊ณ  ์ œ๊ฐ์ž์™€ ๊ณ ๊ฐ์ด ๋ชจ๋‘ ์ œํ’ˆ ์„ฑ์ˆ™๋„ ์‚ฌ์ดํด๊ณผ ๋ฆฌ์Šคํฌ ํ—ˆ์šฉ๋„ ๋ฉด์—์„œ ์–ด๋–ค ์œ„์น˜์— ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์ง„์ง€ํ•˜๊ฒŒ ๊ณ ๋ฏผ์„ ์‹œ์ž‘ํ•ด ๋ณด๋ฉด ๋” ๋‚˜์€ ์ „๋žต ๊ฒฐ์ •์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ๊ณ , ์‹œ์žฅ์— ์ง„์ • ํ›Œ๋ฅญํ•œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋‚ด๋†“์„ ์ˆ˜ ์žˆ๋‹ค....

April 15, 2025

์Šคํ”„๋ง ํŠธ๋žœ์žญ์…˜ ์ „ํŒŒ ์†์„ฑ

ํŠธ๋žœ์žญ์…˜ ๊ด€๋ฆฌ ์Šคํ”„๋ง์˜ ๋นˆ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹ฑ๊ธ€ํ†ค์ด๋‹ค. ์ฆ‰, ํ•˜๋‚˜์˜ ์„œ๋น„์Šค ๊ฐ์ฒด ์ธ์Šคํ„ด์Šค๊ฐ€ ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ๊ณต์œ ๋˜์–ด ์‚ฌ์šฉ๋œ๋‹ค. ํ•˜์ง€๋งŒ ํŠธ๋žœ์žญ์…˜์€ ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ThreadLocal๋กœ ๊ด€๋ฆฌํ•œ๋‹ค. TransactionSynchronizationManager ์Šคํ”„๋ง์€ TransactionSynchronizationManager ํด๋ž˜์Šค๋ฅผ ํ†ตํ•ด ํŠธ๋žœ์žญ์…˜ ๋ฆฌ์†Œ์Šค์™€ ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ThreadLocal ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ ์Šค๋ ˆ๋“œ๋ณ„๋กœ ๋…๋ฆฝ์ ์ธ ํŠธ๋žœ์žญ์…˜ ์ปจํ…์ŠคํŠธ๋ฅผ ์œ ์ง€ํ•œ๋‹ค. // TransactionSynchronizationManager์˜ ์ผ๋ถ€ (๊ฐ„๋žตํ™”๋จ) public abstract class TransactionSynchronizationManager { // ๋ฆฌ์†Œ์Šค๋ฅผ ์Šค๋ ˆ๋“œ๋ณ„๋กœ ์ €์žฅํ•˜๋Š” ThreadLocal ๋งต private static final ThreadLocal<Map<Object, Object>> resources = new NamedThreadLocal<>("Transactional resources"); // ํŠธ๋žœ์žญ์…˜ ๋™๊ธฐํ™” ํ™œ์„ฑํ™” ์ƒํƒœ private static final ThreadLocal<Boolean> actualTransactionActive = new NamedThreadLocal<>("Actual transaction active"); // ํ˜„์žฌ ํŠธ๋žœ์žญ์…˜ ์ด๋ฆ„ private static final ThreadLocal<String> currentTransactionName = new NamedThreadLocal<>("Current transaction name"); // ์ฝ๊ธฐ ์ „์šฉ ํ”Œ๋ž˜๊ทธ private static final ThreadLocal<Boolean> currentTransactionReadOnly = new NamedThreadLocal<>("Current transaction read-only status"); // ๊ฒฉ๋ฆฌ ์ˆ˜์ค€ private static final ThreadLocal<Integer> currentTransactionIsolationLevel = new NamedThreadLocal<>("Current transaction isolation level"); // ํŠธ๋žœ์žญ์…˜ ๋™๊ธฐํ™” ์ฝœ๋ฐฑ ๊ฐ์ฒด private static final ThreadLocal<List<TransactionSynchronization>> synchronizations = new NamedThreadLocal<>("Transaction synchronizations"); // ๋ฆฌ์†Œ์Šค ๋ฐ”์ธ๋”ฉ ๋ฉ”์„œ๋“œ public static void bindResource(Object key, Object value) { Map<Object, Object> map = resources....

March 28, 2025

์–‘๋ฐฉํ–ฅ ์ˆœํ™˜์ฐธ์กฐ ์ •๋ฆฌ

์‚ฌ์‹ค ๊ฐ์ฒด์˜ ์ฐธ์กฐ๊ณผ ์„œ๋กœ ์žˆ๋Š” ๊ฐ์ฒด๋ผ๋ฉด ๋ฐœ์ƒํ•˜์ง€, JPA์™€ ์ง์ ‘์ ์ธ ์—ฐ๊ด€์€ ์—†๋‹ค. ์–‘๋ฐฉํ–ฅ ์ฐธ์กฐ 1. toString() ๋ฉ”์„œ๋“œ ๊ตฌํ˜„ ์‹œ ๋ฌดํ•œ๋ฃจํ”„ @Entity public class Parent { @Id @GeneratedValue private Long id; private String name; @OneToMany(mappedBy = "parent") private List<Child> children = new ArrayList<>(); @Override public String toString() { return "Parent{id=" + id + ", name='" + name + "', children=" + children + "}"; } } @Entity public class Child { @Id @GeneratedValue private Long id; private String name; @ManyToOne private Parent parent; @Override public String toString() { return "Child{id=" + id + ", name='" + name + "', parent=" + parent + "}"; } } ์ด ๊ฒฝ์šฐ Parent์˜ toString()์ด Child์˜ toString()์„ ํ˜ธ์ถœํ•˜๊ณ , Child์˜ toString()์ด ๋‹ค์‹œ Parent์˜ toString()์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฌดํ•œ๋ฃจํ”„๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค....

March 27, 2025

๊ฐ€์ƒ ๋ฉด์ ‘ ์‚ฌ๋ก€๋กœ ๋ฐฐ์šฐ๋Š” ๋Œ€๊ทœ๋ชจ ์‹œ์Šคํ…œ ์„ค๊ณ„

์ฑ…์˜ ๋‚ด์šฉ์„ ์ผ๋ถ€ โ€˜๋ฐœ์ทŒโ€™ํ•ด์„œ ์ •๋ฆฌ ๊ฐ ์žฅ๋ณ„ ๊ฐ„๋‹จํ•œ ๊ฐœ์š”๋Š” ์ž‘์„ฑํ•˜์ง€๋งŒ, ์‹ค์งˆ์ ์œผ๋กœ๋Š” ๋‚ด๊ฐ€ ์กฐ๊ธˆ ๋” ๊ธฐ์–ตํ•˜๊ณ  ์‹ถ์€ ๋‚ด์šฉ๋งŒ ์ผ๋ถ€ ๋ฐœ์ทŒํ•ด์„œ ๊ธฐ๋ก 1์žฅ ์‚ฌ์šฉ์ž ์ˆ˜์— ๋”ฐ๋ฅธ ๊ทœ๋ชจ ํ™•์žฅ์„ฑ ๊ฐœ์š” ๊ธฐ๋ณธ์ ์ธ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค๊ฒŒ์™€ ๋งค์šฐ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ ํ˜น์€ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ์š”๊ตฌ์‚ฌํ•ญ์— ๋Œ€ํ•ด์„œ ์†Œ๊ฐœํ•ด ์ฃผ๋Š”์žฅ ์˜ˆ๋ฅผ๋“ค์–ด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์„ ๊ฐœ๋…์„ ๊ฐœ๋žต์ ์œผ๋กœ ์„ค๋ช…ํ•ด์ค€๋‹ค. ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ ์ˆ˜์ง์  ํ™•์žฅ,์ˆ˜ํ‰์  ํ™•์žฅ ๋‹ค์ค‘ํ™” ์บ์‹œ ์•ˆ์ •์„ฑ๊ณผ, ๊ฐ€์šฉ์„ฑ๊ณผ๊ฐ™์€ ์‹œ์Šคํ…œ์„ ์ธก์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์š”์†Œ๋“ค๋„ ์„ค๋ช…ํ•ด์ค€๋‹ค. ๋‚ด์šฉ ์บ์‹œ ์‚ฌ์šฉ์‹œ ์œ ์˜ ํ•  ์  ์–ด๋–ค ์ƒํ™ฉ์— ๋ฐ”๋žŒ์งํ•œ์ง€ ์ƒ๊ฐํ•˜๊ธฐ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹œํ• ์ง€ ์ƒ๊ฐํ•˜์ง€ ๋งŒ๋ฃŒ๊ธฐํ•œ์„ ์ž˜ ์„ค์ •ํ•˜๊ธฐ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ƒ๊ฐํ•˜๊ธฐ ์ €์žฅ์†Œ์˜ ์›๋ณธ์„ ๊ฐฑ์‹ ํ•˜๋Š” ์—ฐ์‚ฐ๊ณผ ์บ์‹œ๋ฅผ ๊ฐฑ์‹ ํ•˜๋Š” ์—ฐ์‚ฐ์ด ๋‹จ์ผ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ์ฒ˜๋ฆฌ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ?...

March 10, 2025

java, jvm

JVM JVM ๊ตฌ์„ฑ์š”์†Œ ์œ ์ €๋ชจ๋“œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ์„ธ์Šค, ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์„ ํ™œ์šฉ, ๋จธ์‹ ์œผ๋กœ์„œ ์—ฐ์‚ฐ, os์˜ ์ผ๋ถ€๊ธฐ๋Šฅ jvm ๊ตฌ์„ฑ์š”์†Œ ํด๋ž˜์Šค ๋กœ๋”(Class Loader) ์ž๋ฐ” ํด๋ž˜์Šค ํŒŒ์ผ(.class)์„ ๋กœ๋“œํ•˜๊ณ  ๋งํฌํ•˜๋Š” ์—ญํ•  ๋กœ๋”ฉ, ๋งํ‚น, ์ดˆ๊ธฐํ™” ๋‹จ๊ณ„๋กœ ๊ตฌ์„ฑ๋จ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ํด๋ž˜์Šค ๋กœ๋”, ํ™•์žฅ ํด๋ž˜์Šค ๋กœ๋”, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋ž˜์Šค ๋กœ๋”๋กœ ๊ตฌ์„ฑ ํด๋ž˜์Šค ๋กœ๋”ฉ ๋งํ‚น๋“ฑ์ด ๋Ÿฐํƒ€์ž„์— ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ๋ฐ์ดํ„ฐ ์˜์—ญ(Runtime Data Area) ๋ฉ”์„œ๋“œ ์˜์—ญ(Method Area): ํด๋ž˜์Šค ๊ตฌ์กฐ, ๋ฉ”์„œ๋“œ ๋ฐ์ดํ„ฐ, ์ƒ์ˆ˜, ์ •์  ๋ณ€์ˆ˜ ๋“ฑ ์ €์žฅ ํž™(Heap): ๊ฐ์ฒด์™€ ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ณต๊ฐ„ ์Šคํƒ(Stack): ์Šค๋ ˆ๋“œ๋งˆ๋‹ค ๋ณ„๋„๋กœ ์กด์žฌํ•˜๋ฉฐ ์ง€์—ญ ๋ณ€์ˆ˜, ๋งค๊ฐœ๋ณ€์ˆ˜, ๋ฆฌํ„ด ๊ฐ’ ๋“ฑ ์ €์žฅ PC ๋ ˆ์ง€์Šคํ„ฐ(Program Counter Register): ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ช…๋ น์–ด ์ฃผ์†Œ ์ €์žฅ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์Šคํƒ(Native Method Stack): ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ์œ„ํ•œ ์Šคํƒ ์‹คํ–‰ ์—”์ง„(Execution Engine) ์ธํ„ฐํ”„๋ฆฌํ„ฐ(Interpreter): ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ํ•œ ์ค„์”ฉ ํ•ด์„ํ•˜๊ณ  ์‹คํ–‰ JIT ์ปดํŒŒ์ผ๋Ÿฌ(Just-In-Time Compiler): ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ ์„ฑ๋Šฅ ํ–ฅ์ƒ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํ„ฐ(Garbage Collector): ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ž๋™ ์ •๋ฆฌ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ์ธํ„ฐํŽ˜์ด์Šค(JNI, Java Native Interface) ์ž๋ฐ” ์ฝ”๋“œ๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋‚˜ C, C++ ๋“ฑ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฉ”์„œ๋“œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(Native Method Libraries) C, C++ ๋“ฑ์œผ๋กœ ์ž‘์„ฑ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชจ์Œ ํด๋ž˜์Šค๋กœ๋” ....

March 4, 2025

JVM-๋ฐ‘๋ฐ”๋‹ฅ๋ถ€ํ„ฐ-ํŒŒํ•ด์น˜๊ธฐ

JVM ๋ฐ‘๋ฐ”๋‹ฅ๋ถ€ํ„ฐ ํŒŒํ•ด์น˜๊ธฐ์ฑ…์„ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ด๋ฉฐ, ๋ชจ๋“  ๋‚ด์šฉ์€ ํ•ด๋‹น ๋„์„œ ๊ธฐ๋ฐ˜์ž…๋‹ˆ๋‹ค. 1๋ถ€ ์ž๋ฐ”์™€ ์นœํ•ด์ง€๊ธฐ 1์žฅ ์ž๋ฐ” ๊ธฐ์ˆ  ์‹œ์Šคํ…œ ์†Œ๊ฐœ 1.1 ๋“ค์–ด๊ฐ€๋ฉฐ ํ•˜๋“œ์›จ์–ด ํ”Œ๋žซํผ ์กฑ์‡„ ์ œ๊ฑฐ ์•ˆ์ „ํ•œ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ๋Ÿฐํƒ€์ž„ ํ•ซ์ฝ”๋“œ ๊ฐ์ง€, ์ปดํŒŒ์ผ ์ตœ์ ํ™”ํ•˜๋ฉฐ ์ตœ์ƒ์˜ ์„ฑ๋Šฅ ๋„์›€ ํ‘œ์ค€ api๋„ ํ’๋ถ€ํ•˜๊ณ  ์„œ๋“œํŒŒํ‹ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ๋งŽ๋‹ค. ์ด๋ฒˆ ์žฅ์—๋Š” ์ž๋ฐ” ์‹œ์Šคํ…œ์˜ ๊ตฌ์„ฑ์š”์†Œ, ์—ญ์‚ฌ, ์ž๋ฐ”์˜ ํ˜„์žฌ์™€ ๋ฏธ๋ž˜๋ฅผ ๋‹ค๋ฃฌ๋‹ค. 1.2 ์ž๋ฐ” ๊ธฐ์ˆ  ์‹œ์Šคํ…œ ํฌ๊ฒŒ๋Š” ์•„๋ž˜๋ฅผ ํฌ๊ด„ํ•œ๋‹ค ์ž๋ฐ” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ๊ฐ€์ƒ ๋จธ์‹  ๊ตฌํ˜„ ํด๋ž˜์Šค ํŒŒ์ผ ํฌ๋งท ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ api (ํ‘œ์ค€ api) ์˜คํ”ˆ์†Œ์Šค ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์–ธ์–ด, vm, ํด๋ž˜์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฌถ์–ด jdk๋ผ๊ณ  ํ•œ๋‹ค, ๋˜ํ•œ java se api, vm, ๋ฐฐํฌ๊ธฐ์ˆ ๊นŒ์ง€๋ฅผ ๋ฌถ์œผ๋ฉด jre๋ผ๊ณ ํ•œ๋‹ค....

March 3, 2025

Concurrency-Intro

25 ๋ณ‘ํ–‰์„ฑ์— ๊ด€ํ•œ ๋Œ€ํ™” ์—ฌ๋Ÿฌ์‚ฌ๋žŒ์ด ๋™์‹œ์— ๋ณต์ˆญ์•„๋ฅผ ์ง‘์„ ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์„๋•Œ๋Š” ๋นจ๋ž์–ด์š”, ๋ฐ˜๋ฉด์— ์ œ ๋ฐฉ๋ฒ•์€ ํ•œ๋ฒˆ์— ํ•œ๋ช…์”ฉ ์ง‘๊ธฐ ๋•Œ๋ฌธ์— ์ •ํ™•ํ•˜๊ฒ ์ง€๋งŒ ๊ฝค ๋А๋ฆฌ๊ฒ ๊ตฐ์š”. ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋žจ์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ํ”„๋กœ๊ทธ๋žจ๋“ค์ด ์žˆ๋„ค, ๊ฐ ์“ฐ๋ ˆ๋“œ๋Š” ๋…๋ฆฝ๋œ ๊ฐ์ฒด๋กœ์„œ ํ”„๋กœ๊ทธ๋žจ ๋‚ด์—์„œ ํ”„๋กœ๊ทธ๋žจ์„ ๋Œ€์‹ ํ•˜์—ฌ ์ผ์œผ ํ•˜์ง€, ์ด ์“ฐ๋ ˆ๋“œ๋“ค์€ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•˜๋Š”๋ฐ, ์“ฐ๋ ˆ๋“œ ์ž…์žฅ์—์„œ ๋ณด๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋Š” ์•„๊นŒ ์ด์•ผ๊ธฐํ–ˆ๋˜ ๋ณต์ˆญ์•„์™€ ๊ฐ™์€ ๊ฑฐ์•ผ ๋™์‹œ์„ฑ์„ ์šด์˜์ฒด์ œ์—์„œ ๋‹ค๋ค„์•ผ ํ•  ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ์ง€. ์šด์˜์ฒด์ œ๋Š” ๋ฝ๊ณผ ์ปจ๋””์…˜ ๋ณ€์ˆ˜์™€ ๊ฐ™์€ ๊ธฐ๋ณธ ๋™์ ์œผ๋กœ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋žจ์„ ์ง€์›ํ•ด์•ผ ํ•œ๋‹ค๋„ค. ๋‘˜์งธ๋กœ ์šด์˜์ฒด์ œ๋Š” ๊ทธ ์ž์ฒด๋กœ ์ตœ์ดˆ์˜ ๋™์‹œ ํ”„๋กœ๊ทธ๋žจ์ด๊ธฐ ๋•Œ๋ฌธ์ด์•ผ...

March 3, 2025

OSTEP, ํŽ˜์ด์ง•

19 ํŽ˜์ด์ง•: ๋” ๋น ๋ฅธ ๋ณ€ํ™˜(TLB) ๋งคํ•‘ ์ •๋ณด ์ €์žฅ(ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ์ €์žฅ)์„ ์œ„ํ•ด ํฐ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ์š”๊ตฌ๋จ ๊ฐ€์ƒ ์ฃผ์†Œ์—์„œ ๋ฌผ๋ฆฌ ์ฃผ์†Œ๋กœ์˜ ์ฃผ์†Œ ๋ณ€ํ™˜์„ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฆฌ์— ์กด์žฌํ•˜๋Š” ๋งคํ•‘์ •๋ณด๋ฅผ ์ฝ์–ด์•ผํ•จ. ํ•ต์‹ฌ ์งˆ๋ฌธ: ์ฃผ์†Œ ๋ณ€ํ™˜ ์†๋„๋ฅผ ์–ด๋–ป๊ฒŒ ํ–ฅ์ƒํ• ๊นŒ? ์ฃผ์†Œ ๋ณ€ํ™˜์„ ๋น ๋ฅด๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๋ณ€ํ™˜-์ƒ‰์ธ ๋ฒ„ํผ(translation-lookaside-buffer) ์ค„์—ฌ์„œ TLB๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์„ ๋„์ž…ํ•œ๋‹ค. ์นฉ์˜ MMU(memory-management unit)์˜ ์ผ๋ถ€๋ผ๊ณ  ํ•œ๋‹ค. ์ž์ฃผ ์ฐธ์กฐ๋˜๋Š” ๊ฐ€์ƒ์ฃผ์†Œ - ์‹ค์ฃผ์†Œ ๋ณ€ํ™˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•˜๋Š” ํ•˜๋“œ์›จ์–ด ์บ์‹œ์ด๋‹ค. ์ฃผ์†Œ-๋ณ€ํ™˜ ์บ์‹œ๊ฐ€ ์ข€ ๋” ์ ํ•ฉํ•œ ๋ช…์นญ์ด๋‹ค. 19.1 TLB์˜ ๊ธฐ๋ณธ ์•Œ๊ณ ๋ฆฌ์ฆ˜ // ๊ฐ€์ƒ ์ฃผ์†Œ์—์„œ VPN(๊ฐ€์ƒ ํŽ˜์ด์ง€ ๋ฒˆํ˜ธ) ์ถ”์ถœ VPN = (VirtualAddress & VPN_MASK) >> SHIFT; // TLB ์กฐํšŒ (TLB ํžˆํŠธ ์—ฌ๋ถ€ ํ™•์ธ) (Success, TlbEntry) = TLB_Lookup(VPN); if (Success == True) { // TLB Hit if (CanAccess(TlbEntry....

March 2, 2025

์ž์ฃผ ์“ฐ์ด๋Š” ๋ฐ์ดํ„ฐ ์••์ถ• ์ •๋ฆฌ

MySQL LZ77 ๋นˆ๋„๋ฅผ ์ฒดํฌํ•ด์„œ ์น˜ํ™˜ํ•˜๋Š” ๋ฐฉ์‹ ์ž์„ธํ•œ ๊ตฌํ˜„์€ -> ์—ฌ๊ธฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜ LZ77_์••์ถ•(์ž…๋ ฅ๋ฌธ์ž์—ด): ์••์ถ•๊ฒฐ๊ณผ = ๋นˆ ๋ฆฌ์ŠคํŠธ ๊ฒ€์ƒ‰๋ฒ„ํผํฌ๊ธฐ = N ์ „๋ฐฉ๋ฒ„ํผํฌ๊ธฐ = M ํ˜„์žฌ์œ„์น˜ = 0 while ํ˜„์žฌ์œ„์น˜ < ์ž…๋ ฅ๋ฌธ์ž์—ด์˜ ๊ธธ์ด: // ๊ฒ€์ƒ‰ ๋ฒ„ํผ์™€ ์ „๋ฐฉ ๋ฒ„ํผ ์„ค์ • ๊ฒ€์ƒ‰๋ฒ„ํผ์‹œ์ž‘ = max(0, ํ˜„์žฌ์œ„์น˜ - ๊ฒ€์ƒ‰๋ฒ„ํผํฌ๊ธฐ) ๊ฒ€์ƒ‰๋ฒ„ํผ๋ = ํ˜„์žฌ์œ„์น˜ ์ „๋ฐฉ๋ฒ„ํผ๋ = min(ํ˜„์žฌ์œ„์น˜ + ์ „๋ฐฉ๋ฒ„ํผํฌ๊ธฐ, ์ž…๋ ฅ๋ฌธ์ž์—ด์˜ ๊ธธ์ด) ์ตœ๋Œ€์ผ์น˜์œ„์น˜ = 0 ์ตœ๋Œ€์ผ์น˜๊ธธ์ด = 0 // ๊ฒ€์ƒ‰ ๋ฒ„ํผ์—์„œ ๊ฐ€์žฅ ๊ธด ์ผ์น˜ ์ฐพ๊ธฐ for ๊ฒ€์ƒ‰์œ„์น˜ = ๊ฒ€์ƒ‰๋ฒ„ํผ์‹œ์ž‘ to ๊ฒ€์ƒ‰๋ฒ„ํผ๋ - 1: ํ˜„์žฌ์ผ์น˜๊ธธ์ด = 0 while ํ˜„์žฌ์œ„์น˜ + ํ˜„์žฌ์ผ์น˜๊ธธ์ด < ์ „๋ฐฉ๋ฒ„ํผ๋ AND ๊ฒ€์ƒ‰์œ„์น˜ + ํ˜„์žฌ์ผ์น˜๊ธธ์ด < ํ˜„์žฌ์œ„์น˜ AND ์ž…๋ ฅ๋ฌธ์ž์—ด[๊ฒ€์ƒ‰์œ„์น˜ + ํ˜„์žฌ์ผ์น˜๊ธธ์ด] == ์ž…๋ ฅ๋ฌธ์ž์—ด[ํ˜„์žฌ์œ„์น˜ + ํ˜„์žฌ์ผ์น˜๊ธธ์ด]: ํ˜„์žฌ์ผ์น˜๊ธธ์ด += 1 if ํ˜„์žฌ์ผ์น˜๊ธธ์ด > ์ตœ๋Œ€์ผ์น˜๊ธธ์ด: ์ตœ๋Œ€์ผ์น˜๊ธธ์ด = ํ˜„์žฌ์ผ์น˜๊ธธ์ด ์ตœ๋Œ€์ผ์น˜์œ„์น˜ = ๊ฒ€์ƒ‰์œ„์น˜ if ์ตœ๋Œ€์ผ์น˜๊ธธ์ด > 0: // ์ƒ๋Œ€์  ์œ„์น˜ ๊ณ„์‚ฐ (๊ฒ€์ƒ‰ ๋ฒ„ํผ ๋‚ด์˜ ์˜คํ”„์…‹) ์˜คํ”„์…‹ = ํ˜„์žฌ์œ„์น˜ - ์ตœ๋Œ€์ผ์น˜์œ„์น˜ ๋‹ค์Œ๋ฌธ์ž = ์ž…๋ ฅ๋ฌธ์ž์—ด[ํ˜„์žฌ์œ„์น˜ + ์ตœ๋Œ€์ผ์น˜๊ธธ์ด] (์ „๋ฐฉ๋ฒ„ํผ๋์— ๋„๋‹ฌํ–ˆ๋‹ค๋ฉด null ๋˜๋Š” ํŠน์ˆ˜ ๋ฌธ์ž) ์••์ถ•๊ฒฐ๊ณผ....

February 28, 2025