<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>forrest7 님의 블로그</title>
    <link>https://forrest7.tistory.com/</link>
    <description>forrest7 님의 블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Mon, 3 Aug 2026 08:29:54 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>forrest7</managingEditor>
    <image>
      <title>forrest7 님의 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/8224147/attach/f6cba67300324ed2a468a1c3045d5b13</url>
      <link>https://forrest7.tistory.com</link>
    </image>
    <item>
      <title>[WIL] 7주</title>
      <link>https://forrest7.tistory.com/53</link>
      <description>&lt;h2 data-path-to-node=&quot;2&quot; data-ke-size=&quot;size26&quot;&gt;[주간 회고] 7주차: 가상 메모리의 심장, Malloc Lab 구현과 OS의 이해&lt;/h2&gt;
&lt;p data-path-to-node=&quot;3&quot; data-ke-size=&quot;size16&quot;&gt;이번 7주차는 Malloc Lab 프로젝트를 통해 C언어로 직접 동적 메모리 할당기를 구현하며 시스템 프로그래밍의 깊은 곳을 탐험한 시간이었습니다. 단순히 코드를 짜는 것을 넘어, 메모리를 어떻게 하면 더 효율적으로 관리할 것인가에 대해 치열하게 고민했던 기록들을 정리합니다.&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;4&quot; data-ke-size=&quot;size23&quot;&gt;1. 힙(Heap)의 구조와 경계 처리&lt;/h3&gt;
&lt;p data-path-to-node=&quot;5&quot; data-ke-size=&quot;size16&quot;&gt;메모리 할당기를 구현하기 위해 가장 먼저 힙의 물리적 및 논리적 구조를 설계했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;6&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,0,0&quot;&gt;정렬(Alignment)과 패딩:&lt;/b&gt; 데이터 접근 성능 향상을 위해 8바이트 혹은 16바이트 경계를 맞추는 패딩(Padding)의 중요성을 배웠습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;6,1,0&quot;&gt;프롤로그 및 에필로그:&lt;/b&gt; 힙의 시작과 끝을 알리는 파수꾼(Sentinel) 블록을 두어, 메모리 순회 시 발생할 수 있는 경계 오류를 방지했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image 1.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;725&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czgtIW/dJMcafTOTuJ/ch8ZXAER6e2KKnyNvoHuGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czgtIW/dJMcafTOTuJ/ch8ZXAER6e2KKnyNvoHuGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czgtIW/dJMcafTOTuJ/ch8ZXAER6e2KKnyNvoHuGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczgtIW%2FdJMcafTOTuJ%2Fch8ZXAER6e2KKnyNvoHuGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;725&quot; data-filename=&quot;image 1.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;725&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;8&quot; data-ke-size=&quot;size23&quot;&gt;2. 가용 리스트 관리 전략: Implicit vs Explicit&lt;/h3&gt;
&lt;p data-path-to-node=&quot;9&quot; data-ke-size=&quot;size16&quot;&gt;가용 블록(Free Block)을 어떻게 찾아낼 것인가에 따라 할당기의 성능이 극명하게 갈리는 것을 확인했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,0,0&quot;&gt;Implicit Free List (묵시적 가용 리스트):&lt;/b&gt; 구현은 단순하지만 힙이 커질수록 탐색 비용이 블록 수에 비례하여 증가하는 비확장적 자료구조임을 체감했습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,0&quot;&gt;Explicit Free List (명시적 가용 리스트):&lt;/b&gt; 가용 블록 내에 next, prev 포인터를 두어 탐색 속도를 높였습니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;10,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,1,0,0&quot;&gt;LIFO (Last-In-First-Out):&lt;/b&gt; 삽입 속도가 매우 빠르지만 단편화에 취약할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;10,1,1,1,0&quot;&gt;Address-Ordered:&lt;/b&gt; 주소 순으로 정렬하여 병합(Coalescing) 효율을 극대화하고 단편화를 방지했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;image 3.png&quot; data-origin-width=&quot;1650&quot; data-origin-height=&quot;760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5F8Wt/dJMcaflYVqV/0FV7f16uWal0JOohFnCawk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5F8Wt/dJMcaflYVqV/0FV7f16uWal0JOohFnCawk/img.png&quot; data-alt=&quot;implicit first fit/ explicit first fit/ explicit best fit 비교&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5F8Wt/dJMcaflYVqV/0FV7f16uWal0JOohFnCawk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5F8Wt%2FdJMcaflYVqV%2F0FV7f16uWal0JOohFnCawk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1650&quot; height=&quot;760&quot; data-filename=&quot;image 3.png&quot; data-origin-width=&quot;1650&quot; data-origin-height=&quot;760&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;implicit first fit/ explicit first fit/ explicit best fit 비교&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-path-to-node=&quot;12&quot; data-ke-size=&quot;size23&quot;&gt;3. 더 나은 성능을 위한 고도화 기법&lt;/h3&gt;
&lt;p data-path-to-node=&quot;13&quot; data-ke-size=&quot;size16&quot;&gt;기본적인 할당기를 넘어 실제 시스템에서 사용되는 고도화된 전략들을 학습했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;14&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,0,0&quot;&gt;분리 가용 리스트(Segregated Free List):&lt;/b&gt; 가용 블록을 크기 구간별로 여러 리스트로 나누어 관리하여 탐색 시간을 단축했습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;14,1,0&quot;&gt;버디 시스템(Buddy System):&lt;/b&gt; 블록 크기를 2의 거듭제곱 단위로 관리하여 빠른 병합과 분할을 가능하게 하는 구조를 이해했습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-path-to-node=&quot;15&quot; data-ke-size=&quot;size23&quot;&gt;4. 운영체제 핵심 개념 정리&lt;/h3&gt;
&lt;p data-path-to-node=&quot;16&quot; data-ke-size=&quot;size16&quot;&gt;메모리 관리의 배경이 되는 커널의 동작 원리도 함께 정리했습니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;17&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,0,0&quot;&gt;System Call:&lt;/b&gt; sbrk나 mmap을 통해 사용자 프로세스가 커널에 메모리 자원을 요청하는 인터페이스를 학습했습니다.&lt;/li&gt;
&lt;li&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;17,1,0&quot;&gt;가상 메모리(Virtual Memory):&lt;/b&gt; 각 프로세스가 독립적인 메모리 공간을 가진 것처럼 추상화해주는 원리와 보안 및 안정성을 위한 격리의 중요성을 배웠습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-path-to-node=&quot;18&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-path-to-node=&quot;21&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Jungle/WIL(Weekly I Learned)</category>
      <author>forrest7</author>
      <guid isPermaLink="true">https://forrest7.tistory.com/53</guid>
      <comments>https://forrest7.tistory.com/53#entry53comment</comments>
      <pubDate>Thu, 16 Apr 2026 20:43:03 +0900</pubDate>
    </item>
    <item>
      <title>Explicit Free List</title>
      <link>https://forrest7.tistory.com/52</link>
      <description>&lt;h2 id=&quot;341bd214-dd7e-8027-9a1b-da1ba015a3a2&quot; data-ke-size=&quot;size26&quot;&gt;Explicit Free List: Unordered vs. Address-Ordered&lt;/h2&gt;
&lt;div style=&quot;color: #37352f; text-align: start;&quot;&gt;
&lt;ul id=&quot;341bd214-dd7e-808c-b826-e4caf1cdec45&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;Explicit Free List(명시적 가용 리스트)는 가용 블록(Free Block) 내에 next와 prev 포인터를 포함시켜, 가용 블록들끼리만 연결 리스트 형태로 관리하는 방식입니다. 이때 리스트를 유지하는 두 가지 주요 전략을 비교해 드립니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #37352f; text-align: start;&quot;&gt;&lt;hr id=&quot;341bd214-dd7e-8080-8669-fc9292f8c0f4&quot; data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;color: #37352f; text-align: start;&quot;&gt;
&lt;h3 id=&quot;341bd214-dd7e-80ef-9656-e6faaa0c05b7&quot; data-ke-size=&quot;size23&quot;&gt;1. Unordered (LIFO - Last-In-First-Out)&lt;/h3&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #37352f; text-align: start;&quot;&gt;
&lt;p id=&quot;341bd214-dd7e-80af-ad40-fa65adbb2f48&quot; data-ke-size=&quot;size16&quot;&gt;가용 블록을 리스트에 삽입할 때 특별한 순서 없이, 보통 리스트의 맨 앞(Root)에 가장 최근에 반환된 블록을 넣는 방식입니다.&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #37352f; text-align: start;&quot;&gt;
&lt;ul id=&quot;341bd214-dd7e-8010-9a11-c2449378f34b&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;동작:&lt;/b&gt; free()가 호출되면 해당 블록을 리스트의 시작 부분에 즉시 연결합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #37352f; text-align: start;&quot;&gt;
&lt;ul id=&quot;341bd214-dd7e-80b6-8d55-da55f7faa132&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;장점 (O(1)):&lt;/b&gt; 삽입 속도가 매우 빠릅니다. 단순히 포인터 몇 개만 바꿔주면 끝납니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #37352f; text-align: start;&quot;&gt;
&lt;ul id=&quot;341bd214-dd7e-806d-8ad1-e0423da52bea&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;단점:&lt;/b&gt; 메모리 주소와 상관없이 리스트가 구성되므로, 인접한 가용 블록들을 합치는 &lt;b&gt;Coalescing(병합)&lt;/b&gt; 효율이 떨어질 수 있으며, Address-ordered 방식에 비해 메모리 단편화(Fragmentation)가 더 많이 발생할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #37352f; text-align: start;&quot;&gt;&lt;hr id=&quot;341bd214-dd7e-80e7-b9ec-d1a92d61e787&quot; data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;color: #37352f; text-align: start;&quot;&gt;
&lt;h3 id=&quot;341bd214-dd7e-80a2-bd39-dcba314e7ff9&quot; data-ke-size=&quot;size23&quot;&gt;2. Address-Ordered (주소 순서 정렬)&lt;/h3&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #37352f; text-align: start;&quot;&gt;
&lt;p id=&quot;341bd214-dd7e-8045-8a1e-faa43bddbc71&quot; data-ke-size=&quot;size16&quot;&gt;가용 리스트의 블록들을 항상 &lt;b&gt;메모리 주소 순서대로&lt;/b&gt; 정렬된 상태로 유지하는 방식입니다. (예: Addr(A) &amp;lt; Addr(B) &amp;lt; Addr(C))&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #37352f; text-align: start;&quot;&gt;
&lt;ul id=&quot;341bd214-dd7e-800f-872f-ec786f3beaff&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;동작:&lt;/b&gt; free()가 호출되면 리스트를 처음부터 순회하며, 해당 블록의 주소가 들어갈 적절한 위치를 찾아 삽입합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #37352f; text-align: start;&quot;&gt;
&lt;ul id=&quot;341bd214-dd7e-805b-b32b-cd916f70a099&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;장점:&lt;/b&gt; First-fit 검색 시 메모리 낮은 주소부터 효율적으로 채울 수 있고, 인접한 블록이 리스트 상에서도 앞뒤에 위치할 가능성이 높아 &lt;b&gt;병합(Coalescing) 성능이 우수&lt;/b&gt;합니다. 결과적으로 단편화가 적습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #37352f; text-align: start;&quot;&gt;
&lt;ul id=&quot;341bd214-dd7e-8056-8750-ddc018e3d070&quot; style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: disc;&quot;&gt;&lt;b&gt;단점 (O(n)):&lt;/b&gt; 삽입할 때마다 리스트를 탐색해야 하므로 반환(free) 작업 시 시간이 더 소요됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #37352f; text-align: start;&quot;&gt;&lt;hr id=&quot;341bd214-dd7e-80c0-bc75-c9a56ebabd7d&quot; data-ke-style=&quot;style1&quot; /&gt;&lt;/div&gt;
&lt;div style=&quot;color: #37352f; text-align: start;&quot;&gt;
&lt;h3 id=&quot;341bd214-dd7e-8026-aa02-e9f60e4296b3&quot; data-ke-size=&quot;size23&quot;&gt;  한눈에 비교하기&lt;/h3&gt;
&lt;/div&gt;
&lt;div style=&quot;color: #37352f; text-align: start;&quot;&gt;
&lt;table id=&quot;341bd214-dd7e-80f3-b8df-f4d05ce25a84&quot; style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr id=&quot;341bd214-dd7e-808b-a967-c8f4d4550fac&quot;&gt;
&lt;td id=&quot;\gOz&quot; style=&quot;text-align: left;&quot;&gt;&lt;b&gt;구분&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;]|aI&quot; style=&quot;text-align: left;&quot;&gt;&lt;b&gt;Unordered (LIFO)&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;BmYx&quot; style=&quot;text-align: left;&quot;&gt;&lt;b&gt;Address-Ordered&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;341bd214-dd7e-8079-9033-c09fe82e7a62&quot;&gt;
&lt;td id=&quot;\gOz&quot; style=&quot;text-align: left;&quot;&gt;&lt;b&gt;삽입 속도&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;]|aI&quot; style=&quot;text-align: left;&quot;&gt;&lt;b&gt;매우 빠름 (O(1))&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;BmYx&quot; style=&quot;text-align: left;&quot;&gt;상대적으로 느림 (O(n))&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;341bd214-dd7e-8044-8fae-e3156af705f7&quot;&gt;
&lt;td id=&quot;\gOz&quot; style=&quot;text-align: left;&quot;&gt;&lt;b&gt;단편화 방지&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;]|aI&quot; style=&quot;text-align: left;&quot;&gt;보통 수준&lt;/td&gt;
&lt;td id=&quot;BmYx&quot; style=&quot;text-align: left;&quot;&gt;&lt;b&gt;우수함&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;341bd214-dd7e-80d1-aa63-d18995a702d6&quot;&gt;
&lt;td id=&quot;\gOz&quot; style=&quot;text-align: left;&quot;&gt;&lt;b&gt;병합 효율&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;]|aI&quot; style=&quot;text-align: left;&quot;&gt;보통&lt;/td&gt;
&lt;td id=&quot;BmYx&quot; style=&quot;text-align: left;&quot;&gt;매우 높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr id=&quot;341bd214-dd7e-8053-9856-e523f9ae4c44&quot;&gt;
&lt;td id=&quot;\gOz&quot; style=&quot;text-align: left;&quot;&gt;&lt;b&gt;구현 난이도&lt;/b&gt;&lt;/td&gt;
&lt;td id=&quot;]|aI&quot; style=&quot;text-align: left;&quot;&gt;쉬움&lt;/td&gt;
&lt;td id=&quot;BmYx&quot; style=&quot;text-align: left;&quot;&gt;리스트 순회 로직 필요&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h1 id=&quot;341bd214-dd7e-803f-a15a-f2ed5f4e356c&quot; style=&quot;color: #37352f; text-align: start;&quot;&gt;Implicit VS Explicit 비교&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;explicit1.png&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;721&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuLyWU/dJMcahRBQCr/gk7v3DSFTes4xMJkj3ty71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuLyWU/dJMcahRBQCr/gk7v3DSFTes4xMJkj3ty71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuLyWU/dJMcahRBQCr/gk7v3DSFTes4xMJkj3ty71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuLyWU%2FdJMcahRBQCr%2Fgk7v3DSFTes4xMJkj3ty71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;759&quot; height=&quot;721&quot; data-filename=&quot;explicit1.png&quot; data-origin-width=&quot;759&quot; data-origin-height=&quot;721&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래밍 언어/C언어</category>
      <author>forrest7</author>
      <guid isPermaLink="true">https://forrest7.tistory.com/52</guid>
      <comments>https://forrest7.tistory.com/52#entry52comment</comments>
      <pubDate>Thu, 16 Apr 2026 19:42:22 +0900</pubDate>
    </item>
    <item>
      <title>7주차 키워드 정리</title>
      <link>https://forrest7.tistory.com/51</link>
      <description>&lt;h1&gt; ️ 운영체제 및 메모리 관리 핵심 정리&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 시스템 콜 (System Call)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개념:&lt;/b&gt; 사용자 프로세스가 운영체제(OS) 커널이 제공하는 서비스를 이용하기 위해 커널 함수를 호출하는 인터페이스입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;필요성:&lt;/b&gt; 응용 프로그램은 하드웨어(CPU, 메모리, 디스크 등)에 직접 접근할 수 없습니다. 보안과 안정성을 위해 OS가 자원을 관리하며, 응용 프로그램은 &amp;lsquo;요청&amp;rsquo;을 통해서만 자원을 사용할 수 있습니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;작동 원리:&lt;/b&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;사용자 모드(User Mode)에서 실행 중인 프로그램이 시스템 콜을 호출합니다.&lt;/li&gt;
&lt;li&gt;트랩(Trap)이 발생해 커널 모드(Kernel Mode)로 전환됩니다.&lt;/li&gt;
&lt;li&gt;커널이 요청을 처리한 뒤 사용자 모드로 복귀합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;주요 예시:&lt;/b&gt; fork()(프로세스 생성), read()/write()(파일 I/O), exit()(종료).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 데이터 세그먼트 (Data Segment)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개념:&lt;/b&gt; 프로세스의 가상 메모리 공간 중 전역 변수와 정적 변수(static)가 저장되는 영역입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;메모리 구조 내 위치:&lt;/b&gt; 보통 코드(Text) 세그먼트 위에 있고, 힙(Heap) 세그먼트 아래에 위치합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;세부 분류:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Data 세그먼트 (Initialized):&lt;/b&gt; 초기화된 전역 변수 및 정적 변수가 저장됩니다. (예: int a = 10;)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;BSS 세그먼트 (Uninitialized):&lt;/b&gt; 초기화되지 않은 전역 변수 및 정적 변수가 저장됩니다. 프로그램 시작 시 0으로 초기화됩니다. (예: int b;)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징:&lt;/b&gt; 프로그램 시작 시 할당되며 종료 시 해제됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 메모리 단편화 (Memory Fragmentation)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;개념:&lt;/b&gt; 메모리가 할당&amp;middot;해제되는 과정에서 총 메모리 공간은 충분하지만, 실제로는 할당할 수 없는 작은 조각들이 생기는 현상입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;① 내부 단편화 (Internal Fragmentation)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;상황:&lt;/b&gt; 할당된 메모리 블록이 요청한 크기보다 클 때 발생합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;결과:&lt;/b&gt; 할당된 블록 내부에 남는 공간이 생겨 낭비됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;② 외부 단편화 (External Fragmentation)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;상황:&lt;/b&gt; 메모리 사이사이에 남은 작은 공간들의 합은 충분하지만, 연속된 공간이 아니라서 큰 프로세스를 할당하지 못하는 상태입니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;해결책:&lt;/b&gt; 페이징(Paging), 압축(Compaction), 세그멘테이션(Segmentation).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. sbrk와 mmap (힙 확장 방식)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 할당자(malloc 등)가 커널로부터 더 많은 메모리를 확보하기 위해 사용하는 시스템 콜입니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;① sbrk (Set Program Break)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;방식:&lt;/b&gt; 데이터 세그먼트의 끝을 나타내는 &amp;lsquo;program break&amp;rsquo; 주소를 위로 올리거나 아래로 내려 힙 공간을 확장&amp;middot;축소합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징:&lt;/b&gt; 메모리가 연속적으로 할당되며, 주로 작은 크기의 메모리 할당에 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;② mmap (Memory Map)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;방식:&lt;/b&gt; 특정 파일이나 익명 메모리 공간(Anonymous Memory)을 프로세스의 가상 메모리 주소 공간에 직접 매핑합니다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;힙 영역이 아닌 별도의 메모리 매핑 영역에 할당됩니다.&lt;/li&gt;
&lt;li&gt;주로 큰 크기의 메모리 할당(보통 128KB 이상)에 사용됩니다.&lt;/li&gt;
&lt;li&gt;메모리를 해제하면 즉시 커널에 반환할 수 있어 단편화 방지에 유리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  요약 비교표&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분 sbrk mmap&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;주요 용도&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;작은 메모리 할당 (연속적)&lt;/td&gt;
&lt;td&gt;큰 메모리 할당 (비연속적/독립적)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;작동 방식&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;heap의 끝 포인터를 이동&lt;/td&gt;
&lt;td&gt;가상 메모리에 새 매핑 영역 생성&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;장점&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;오버헤드가 적음&lt;/td&gt;
&lt;td&gt;메모리 반환이 유연함, 공유 메모리 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>운영체제</category>
      <author>forrest7</author>
      <guid isPermaLink="true">https://forrest7.tistory.com/51</guid>
      <comments>https://forrest7.tistory.com/51#entry51comment</comments>
      <pubDate>Thu, 16 Apr 2026 19:32:44 +0900</pubDate>
    </item>
    <item>
      <title>동적 메모리 할당 basic 영상 요약</title>
      <link>https://forrest7.tistory.com/50</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=1eRDwxtLrxI&amp;amp;list=PLtv4PQFH2yMas_SCMTEaE4eUIWWWiwISj&amp;amp;index=22&quot;&gt;유튜브 영상 링크&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;  동적 메모리 할당 (Dynamic Memory Allocation) 총정리&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 개요 및 기본 개념&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.1. 동적 메모리 할당이란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램 실행 중(Runtime) 가상 메모리를 할당받는 방식입니다. 컴파일 타임에 크기를 알 수 없는 가변적인 데이터 구조를 다룰 때 필수적입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;메모리 영역 (Heap):&lt;/b&gt; 동적 할당은 &lt;b&gt;힙(Heap)&lt;/b&gt; 영역에서 이루어집니다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가상 주소 공간 내에 존재하며, &lt;b&gt;스택(Stack)과 반대 방향&lt;/b&gt;으로 성장합니다.&lt;/li&gt;
&lt;li&gt;시스템 포인터(BRK)에 의해 경계가 정해지며, 매우 큰 공간을 가질 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;힙 내의 블록:&lt;/b&gt; 할당자는 힙을 가변 크기의 블록으로 관리하며, 각 블록은 &lt;b&gt;할당(Allocated)&lt;/b&gt; 또는 &lt;b&gt;자유(Free)&lt;/b&gt; 상태 중 하나입니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.2. 할당자의 분류&lt;/h3&gt;
&lt;p&gt;구분 특징 대표 언어&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;명시적 할당자&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;개발자가 직접 malloc으로 할당하고 free로 해제&lt;/td&gt;
&lt;td&gt;C, C++&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;암시적 할당자&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;가비지 컬렉터(GC)가 미사용 메모리를 자동 해제&lt;/td&gt;
&lt;td&gt;Java, Python&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.3. C 언어 주요 함수&lt;/h3&gt;
&lt;p&gt;함수 역할 비고&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;malloc(size)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;요청 크기 이상의 블록 포인터 반환&lt;/td&gt;
&lt;td&gt;16-바이트 정렬 보장, 실패 시 NULL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;free(ptr)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;할당된 메모리 블록 해제&lt;/td&gt;
&lt;td&gt;malloc/realloc으로 할당된 주소여야 함&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;realloc(ptr, size)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;이미 할당된 영역의 크기 변경&lt;/td&gt;
&lt;td&gt;기존 데이터 보존 시도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;calloc(n, size)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;메모리 할당 및 &lt;b&gt;0으로 초기화&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;요소 개수와 크기를 인자로 받음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;sbrk(incr)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;BRK 포인터&lt;/b&gt;를 이동시켜 힙 크기 조절&lt;/td&gt;
&lt;td&gt;시스템 내부에서 주로 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.4. 설계 가상 및 예시&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;주소 지정:&lt;/b&gt; 단어(Word) 단위 주소 지정 가능.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정렬(Alignment):&lt;/b&gt; 2단어(Double Word) 단위 정렬 (예시에서는 2-바이트 경계).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시각화 규칙:&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;  &lt;b&gt;녹색:&lt;/b&gt; 할당된 블록 (Allocated)&lt;/li&gt;
&lt;li&gt;⬜ &lt;b&gt;무색:&lt;/b&gt; 자유 블록 (Free)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;공간 낭비 예시:&lt;/b&gt; 정렬 경계 요구사항 때문에 할당 요청 사이에 사용하지 못하는 틈새 공간이 발생할 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 제약 조건 및 성능 목표&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1. 할당자의 제약 조건&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;할당자는 프로그램의 요청에 &lt;b&gt;즉각 응답&lt;/b&gt;해야 하며, 메모리를 임의로 옮길 수 없습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;요청 제어 불가:&lt;/b&gt; 프로그램이 어떤 순서로 할당/해제를 요청할지 알 수 없음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;즉각 응답:&lt;/b&gt; 요청을 재정렬하거나 기다릴 수 없음.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;정렬 준수:&lt;/b&gt; 아키텍처별 정렬 요구사항을 반드시 만족해야 함.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;이동 불가(No Moving):&lt;/b&gt; 할당된 블록을 다른 위치로 옮길 수 없음 (free 시 위치를 알 수 없게 되기 때문).&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.2. 성능 목표 (Trade-off 관계)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;처리량 (Throughput):&lt;/b&gt; 단위 시간당 완료된 요청 수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$$ 10,000\ operations / 10\ sec = 1,000\ ops/sec $$&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;최대 메모리 활용률 (Utilization):&lt;/b&gt; 힙을 얼마나 알뜰하게 사용하는가?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;낭비 요인:&lt;/b&gt; 패딩(Padding), 관리용 오버헤드(Header), 단편화.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;$$ \frac{\max(\text{Payload 합계})}{\text{Current Heap Size}} $$&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. 메모리 단편화 (Fragmentation)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.1. 내부 단편화 (Internal Fragmentation)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;원인:&lt;/b&gt; 요청한 크기보다 더 큰 블록이 할당될 때 발생 (정렬 패딩, 탐색 정책의 한계).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징:&lt;/b&gt; 할당된 블록 &lt;b&gt;내부&lt;/b&gt;에 존재하므로 측정이 명확함.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3.2. 외부 단편화 (External Fragmentation)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;원인:&lt;/b&gt; 자유 공간의 총합은 충분하지만, &lt;b&gt;연속적이지 않고 조각나 있어&lt;/b&gt; 할당 요청을 수용하지 못하는 상태.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;특징:&lt;/b&gt; 미래의 요청 패턴에 따라 달라지므로 예측이 어려움.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 할당자 구현 시 고려 사항&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.1. 정보 저장 (Header)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;free(ptr) 시 크기를 알기 위해 블록 시작점에 길이 필드(Length Field)를 저장합니다.&lt;/li&gt;
&lt;li&gt;이 필드에는 (페이로드 + 헤더) 크기가 포함되며, 하위 비트(LSB)를 사용하여 할당 여부를 표시합니다 (0: Free, 1: Allocated).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.2. 자유 블록 관리 (Free List)&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;암시적 리스트 (Implicit List):&lt;/b&gt; 모든 블록(할당/자유)을 헤더 정보를 따라 순차 탐색. 구현이 간단하나 탐색이 느림(O(N)).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;명시적 리스트 (Explicit List):&lt;/b&gt; 자유 블록들만 포인터로 연결. 할당된 블록을 건너뛰어 탐색이 빠름.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;분리 자유 리스트 (Segregated List):&lt;/b&gt; 크기별로 리스트를 따로 관리하여 속도 향상.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;균형 트리 (Balanced Tree):&lt;/b&gt; 크기순으로 정렬하여 최적의 핏(Best-fit)을 빠르게 탐색.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.3. 블록 분할 (Splitting)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자유 블록이 요청보다 클 경우, 필요한 만큼만 할당하고 남은 공간을 &lt;b&gt;새로운 자유 블록&lt;/b&gt;으로 쪼개어 단편화를 방지합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4.4. 블록 병합 (Coalescing)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;해제된 블록 주위에 다른 자유 블록이 있다면 하나로 합칩니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;경계 태그 (Boundary Tags):&lt;/b&gt; 각 블록의 끝에 푸터(Footer)를 두어 이전 블록의 정보를 즉시 확인합니다 (O(1)병합 가능).&lt;/li&gt;
&lt;li&gt;&lt;b&gt;4가지 경우:&lt;/b&gt; (앞/뒤 상태에 따라) ①둘 다 할당됨 ②뒤만 자유 ③앞만 자유 ④둘 다 자유.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시점:&lt;/b&gt; free 시 즉시 수행하거나(Immediate), 나중에 필요할 때 한꺼번에 수행(Deferred).&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. 할당 정책 요약&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;배치 정책 (Placement):&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;First Fit:&lt;/b&gt; 첫 번째로 맞는 블록 선택.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Next Fit:&lt;/b&gt; 이전 탐색 종료 지점부터 시작.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Best Fit:&lt;/b&gt; 크기가 가장 딱 맞는 블록 선택 (메모리 효율 최상, 탐색 속도 최저).&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;암시적 리스트의 한계:&lt;/b&gt; 구현은 쉬우나 할당 속도가 전체 블록 수에 비례하므로 실제 시스템에서는 다른 구조와 병행하여 사용됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;</description>
      <category>프로그래밍 언어/C언어</category>
      <author>forrest7</author>
      <guid isPermaLink="true">https://forrest7.tistory.com/50</guid>
      <comments>https://forrest7.tistory.com/50#entry50comment</comments>
      <pubDate>Thu, 16 Apr 2026 17:59:18 +0900</pubDate>
    </item>
    <item>
      <title>CSAPP 9.9장 모르는 부분 정리</title>
      <link>https://forrest7.tistory.com/49</link>
      <description>&lt;h1&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;  1. 힙 확장과 sbrk 동작 구조&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;444&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wzqRz/dJMcajaJpW3/DYmOO521xx9FIJOXrAgVrk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wzqRz/dJMcajaJpW3/DYmOO521xx9FIJOXrAgVrk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wzqRz/dJMcajaJpW3/DYmOO521xx9FIJOXrAgVrk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwzqRz%2FdJMcajaJpW3%2FDYmOO521xx9FIJOXrAgVrk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;390&quot; height=&quot;444&quot; data-origin-width=&quot;390&quot; data-origin-height=&quot;444&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;핵심 개념&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;sbrk(incr) = 힙의 끝(brk)을 늘림&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;반환값 = &lt;b&gt;이전 brk (새 메모리 시작 주소)&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;핵심 포인트&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;allocator는 &amp;ldquo;새 공간 시작 주소&amp;rdquo;가 필요&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;그래서 &lt;b&gt;old brk 반환&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;  2. 메모리 정렬과 패딩&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EMJQ8/dJMcagykehc/2n36SOVoN94xSnD4lblWf1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EMJQ8/dJMcagykehc/2n36SOVoN94xSnD4lblWf1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EMJQ8/dJMcagykehc/2n36SOVoN94xSnD4lblWf1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEMJQ8%2FdJMcagykehc%2F2n36SOVoN94xSnD4lblWf1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;518&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AwJHR/dJMcajaJpW5/HEoOmaqFpydiycu2xa4IAk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AwJHR/dJMcajaJpW5/HEoOmaqFpydiycu2xa4IAk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AwJHR/dJMcajaJpW5/HEoOmaqFpydiycu2xa4IAk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAwJHR%2FdJMcajaJpW5%2FHEoOmaqFpydiycu2xa4IAk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1280&quot; height=&quot;494&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;핵심&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;  &lt;b&gt;정렬(alignment)&lt;/b&gt; 때문에 필요&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;요청: 13 bytes &amp;rarr; 실제: 16 bytes&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;남는 공간 = padding&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;효과&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;주소 계산 단순화&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;성능 향상&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;  3. 힙 구조 (Prologue / Epilogue)&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bALg5E/dJMcajaJpW4/nqAC67MunFoCqkIk7c0Vj0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bALg5E/dJMcajaJpW4/nqAC67MunFoCqkIk7c0Vj0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bALg5E/dJMcajaJpW4/nqAC67MunFoCqkIk7c0Vj0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbALg5E%2FdJMcajaJpW4%2FnqAC67MunFoCqkIk7c0Vj0%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;768&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;구조&lt;/span&gt;&lt;/h2&gt;
&lt;pre class=&quot;markdown&quot;&gt;&lt;code&gt;[padding][prologue][block...][epilogue]
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;핵심&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;epilogue = 힙 끝 표시&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;coalesce 오류 방지&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;  4. 가상 메모리&lt;/span&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;정의&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;  &lt;b&gt;프로세스마다 독립된 주소공간처럼 보이게 하는 기술&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;핵심&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;실제: 물리 메모리 분산&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;보이는 것: 연속 공간&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;  5. 비확장성 구조 (Implicit Free List)&lt;/span&gt;&lt;/h1&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;389&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPJpOA/dJMcajaJpW0/Ze6RLUf3kKn4fk85aqqbYk/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPJpOA/dJMcajaJpW0/Ze6RLUf3kKn4fk85aqqbYk/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPJpOA/dJMcajaJpW0/Ze6RLUf3kKn4fk85aqqbYk/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPJpOA%2FdJMcajaJpW0%2FZe6RLUf3kKn4fk85aqqbYk%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;968&quot; height=&quot;389&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;389&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;문제&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;모든 블록 순회&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;O(n)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;결론&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;  &lt;b&gt;힙 커질수록 성능 붕괴&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;  6. 고급 할당 전략&lt;/span&gt;&lt;/h1&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;  Segregated Free List&lt;/span&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;크기별 리스트 분리&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;탐색 속도 &amp;uarr;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;  Buddy System&lt;/span&gt;&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;864&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blcaSw/dJMcagykeha/nRUscTswfwJwyoBdXcVC0K/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blcaSw/dJMcagykeha/nRUscTswfwJwyoBdXcVC0K/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blcaSw/dJMcagykeha/nRUscTswfwJwyoBdXcVC0K/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblcaSw%2FdJMcagykeha%2FnRUscTswfwJwyoBdXcVC0K%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1260&quot; height=&quot;864&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;864&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;2의 거듭제곱 기반&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;merge 빠름&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;  7. extern&lt;/span&gt;&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;핵심&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;  다른 파일 변수 참조&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;cpp&quot;&gt;&lt;code&gt;extern int count;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;메모리 생성 X&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;참조만 O&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;  전체 흐름&lt;/span&gt;&lt;/h1&gt;
&lt;pre class=&quot;fortran&quot;&gt;&lt;code&gt;가상메모리
   &amp;darr;
힙
   &amp;darr;
sbrk 확장
   &amp;darr;
정렬 + 패딩
   &amp;darr;
prologue / epilogue
   &amp;darr;
implicit list (느림)
   &amp;darr;
segregated / buddy (개선)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;prologue와 epliogue 왜 필요할까????&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로그래밍 언어/C언어</category>
      <author>forrest7</author>
      <guid isPermaLink="true">https://forrest7.tistory.com/49</guid>
      <comments>https://forrest7.tistory.com/49#entry49comment</comments>
      <pubDate>Fri, 10 Apr 2026 23:19:58 +0900</pubDate>
    </item>
    <item>
      <title>SQL 처리기 구현</title>
      <link>https://forrest7.tistory.com/48</link>
      <description>&lt;div style=&quot;max-width: 860px; margin: 0 auto; padding: 40px 20px; font-family: 'Pretendard', 'Noto Sans KR', sans-serif; line-height: 1.8; color: #1f2937; background: #ffffff;&quot;&gt;
  &lt;header style=&quot;margin-bottom: 48px;&quot;&gt;
    &lt;p style=&quot;display: inline-block; margin: 0 0 16px; padding: 6px 12px; border-radius: 999px; background: #eef6ff; color: #2563eb; font-size: 14px; font-weight: 700;&quot;&gt;
      Week 6 Project
    &lt;/p&gt;
    &lt;h1 style=&quot;margin: 0 0 18px; font-size: 40px; line-height: 1.3; color: #111827;&quot;&gt;
      C로 구현한 파일 기반 SQL 처리기 프로젝트
    &lt;/h1&gt;
    &lt;p style=&quot;margin: 0; font-size: 18px; color: #4b5563;&quot;&gt;
      입력된 SQL을 파싱하고 실행해 실제 파일에 반영하는 작은 SQL Processor를 직접 구현했다.
    &lt;/p&gt;
  &lt;/header&gt;

  &lt;section style=&quot;margin-bottom: 40px; padding: 28px; border-radius: 20px; background: linear-gradient(135deg, #f8fbff 0%, #f9fafb 100%); border: 1px solid #e5e7eb;&quot;&gt;
    &lt;h2 style=&quot;margin: 0 0 16px; font-size: 26px; color: #111827;&quot;&gt;프로젝트 한 줄 소개&lt;/h2&gt;
    &lt;p style=&quot;margin: 0 0 14px;&quot;&gt;
      이번 프로젝트에서는 C 언어로 &lt;strong&gt;파일 기반 SQL 처리기(SQL Processor)&lt;/strong&gt;를 구현했다.
      목표는 단순히 SQL 문법을 읽는 데서 끝나는 것이 아니라, &lt;strong&gt;입력된 SQL을 파싱하고 실행해 실제 CSV 파일에 반영하는 전체 흐름&lt;/strong&gt;을 만드는 것이었다.
    &lt;/p&gt;
    &lt;p style=&quot;margin: 0;&quot;&gt;
      특히 이번 과제는 학습보다는 구현이 우선이었기 때문에, AI를 적극적으로 활용해 빠르게 기능을 완성하되,
      핵심 로직은 직접 이해하고 설명할 수 있는 수준까지 정리하는 데 집중했다.
    &lt;/p&gt;
  &lt;/section&gt;

  &lt;section style=&quot;margin-bottom: 44px;&quot;&gt;
    &lt;h2 style=&quot;margin: 0 0 18px; font-size: 28px; color: #111827;&quot;&gt;1. 프로젝트 목표&lt;/h2&gt;
    &lt;p style=&quot;margin: 0 0 16px;&quot;&gt;
      이번 과제의 핵심은 아래 흐름을 하나의 프로그램으로 완성하는 것이었다.
    &lt;/p&gt;
    &lt;div style=&quot;padding: 18px 20px; border-radius: 16px; background: #111827; color: #f9fafb; font-size: 17px; font-weight: 600; text-align: center;&quot;&gt;
      입력(SQL) → 파싱 → 실행 → 저장
    &lt;/div&gt;
    &lt;ul style=&quot;margin: 20px 0 0; padding-left: 22px;&quot;&gt;
      &lt;li&gt;CLI(Command Line Interface)를 통한 SQL 입력 처리&lt;/li&gt;
      &lt;li&gt;&lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;SELECT&lt;/code&gt; SQL 파싱&lt;/li&gt;
      &lt;li&gt;파싱 결과를 기반으로 한 실행 로직&lt;/li&gt;
      &lt;li&gt;파일 기반 데이터 저장소 설계&lt;/li&gt;
      &lt;li&gt;schema와 table이 이미 존재한다고 가정한 구조 처리&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/section&gt;

  &lt;section style=&quot;margin-bottom: 44px;&quot;&gt;
    &lt;h2 style=&quot;margin: 0 0 18px; font-size: 28px; color: #111827;&quot;&gt;2. 요구사항 기준으로 정리한 구현 내용&lt;/h2&gt;

    &lt;div style=&quot;margin-bottom: 22px; padding: 24px; border-left: 5px solid #2563eb; background: #f9fafb; border-radius: 14px;&quot;&gt;
      &lt;h3 style=&quot;margin: 0 0 12px; font-size: 22px; color: #111827;&quot;&gt;2-1. CLI 기반 SQL 입력 처리&lt;/h3&gt;
      &lt;p style=&quot;margin: 0 0 12px;&quot;&gt;
        텍스트 파일로 작성된 SQL문을 Command Line에서 전달할 수 있도록 구현했다.
        SQL 파일 경로를 넘겨 실행할 수 있고, SQL 문자열 자체를 직접 인자로 입력하는 방식도 함께 지원했다.
      &lt;/p&gt;
      &lt;pre style=&quot;margin: 0; padding: 18px; overflow-x: auto; border-radius: 12px; background: #0f172a; color: #e5e7eb;&quot;&gt;&lt;code&gt;sqlparser.exe .\examples\select_all_users.sql
sqlparser.exe &quot;SELECT name, age FROM student;&quot;&lt;/code&gt;&lt;/pre&gt;
      &lt;p style=&quot;margin: 12px 0 0;&quot;&gt;
        과제에서 요구한 “텍스트 파일 기반 SQL 전달” 조건을 충족하면서, 실제 사용 편의성을 위해 직접 입력 방식도 확장했다.
      &lt;/p&gt;
    &lt;/div&gt;

    &lt;div style=&quot;margin-bottom: 22px; padding: 24px; border-left: 5px solid #10b981; background: #f9fafb; border-radius: 14px;&quot;&gt;
      &lt;h3 style=&quot;margin: 0 0 12px; font-size: 22px; color: #111827;&quot;&gt;2-2. SQL 파싱 구현&lt;/h3&gt;
      &lt;p style=&quot;margin: 0 0 12px;&quot;&gt;
        입력된 SQL 문장을 구조화하기 위해 Lexer와 Parser를 분리해 구현했다.
        먼저 Lexer가 SQL을 토큰 단위로 분리하고, 이후 Parser가 이를 읽어 문장의 의미를 해석한다.
      &lt;/p&gt;
      &lt;ul style=&quot;margin: 0; padding-left: 22px;&quot;&gt;
        &lt;li&gt;&lt;code&gt;INSERT&lt;/code&gt;&lt;/li&gt;
        &lt;li&gt;&lt;code&gt;SELECT&lt;/code&gt;&lt;/li&gt;
      &lt;/ul&gt;
      &lt;p style=&quot;margin: 12px 0 0;&quot;&gt;
        파싱 결과는 AST(Abstract Syntax Tree) 구조체에 담아 실행 단계에서 활용할 수 있도록 구성했다.
      &lt;/p&gt;
    &lt;/div&gt;

    &lt;div style=&quot;margin-bottom: 22px; padding: 24px; border-left: 5px solid #f59e0b; background: #f9fafb; border-radius: 14px;&quot;&gt;
      &lt;h3 style=&quot;margin: 0 0 12px; font-size: 22px; color: #111827;&quot;&gt;2-3. Execution 구현&lt;/h3&gt;
      &lt;p style=&quot;margin: 0 0 12px;&quot;&gt;
        파싱된 결과를 실제 동작으로 연결하는 실행 모듈도 구현했다. 이 부분이 SQL 처리기의 핵심 역할을 담당한다.
      &lt;/p&gt;
      &lt;ul style=&quot;margin: 0; padding-left: 22px;&quot;&gt;
        &lt;li&gt;&lt;strong&gt;INSERT&lt;/strong&gt;: 파싱된 컬럼/값 정보를 바탕으로 파일에 데이터 추가&lt;/li&gt;
        &lt;li&gt;&lt;strong&gt;SELECT&lt;/strong&gt;: 파일에서 데이터를 읽고 요청한 컬럼을 출력&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/div&gt;

    &lt;div style=&quot;padding: 24px; border-left: 5px solid #ef4444; background: #f9fafb; border-radius: 14px;&quot;&gt;
      &lt;h3 style=&quot;margin: 0 0 12px; font-size: 22px; color: #111827;&quot;&gt;2-4. File 기반 DB 설계&lt;/h3&gt;
      &lt;p style=&quot;margin: 0 0 12px;&quot;&gt;
        데이터 저장 포맷은 자유 설계가 가능했기 때문에, 구현과 디버깅이 쉬운 &lt;strong&gt;CSV 형식&lt;/strong&gt;을 선택했다.
      &lt;/p&gt;
      &lt;ul style=&quot;margin: 0 0 12px; padding-left: 22px;&quot;&gt;
        &lt;li&gt;&lt;code&gt;schema/&amp;lt;table&amp;gt;.meta&lt;/code&gt; : 테이블 구조 정보&lt;/li&gt;
        &lt;li&gt;&lt;code&gt;data/&amp;lt;table&amp;gt;.csv&lt;/code&gt; : 실제 데이터&lt;/li&gt;
      &lt;/ul&gt;
      &lt;pre style=&quot;margin: 0; padding: 18px; overflow-x: auto; border-radius: 12px; background: #0f172a; color: #e5e7eb;&quot;&gt;&lt;code&gt;table=student
columns=id,department,student_number,name,age&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;section style=&quot;margin-bottom: 44px;&quot;&gt;
    &lt;h2 style=&quot;margin: 0 0 18px; font-size: 28px; color: #111827;&quot;&gt;3. INSERT와 SELECT는 어떻게 동작하게 만들었나&lt;/h2&gt;

    &lt;div style=&quot;display: grid; gap: 18px;&quot;&gt;
      &lt;div style=&quot;padding: 24px; border-radius: 16px; background: #f8fafc; border: 1px solid #e5e7eb;&quot;&gt;
        &lt;h3 style=&quot;margin: 0 0 12px; font-size: 22px;&quot;&gt;INSERT 처리&lt;/h3&gt;
        &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;
          &lt;code&gt;INSERT&lt;/code&gt; 실행 시에는 먼저 schema를 읽어 컬럼 구성을 확인한 뒤,
          입력된 값을 올바른 순서에 맞춰 CSV의 새 행으로 추가하도록 구현했다.
        &lt;/p&gt;
        &lt;ul style=&quot;margin: 0; padding-left: 22px;&quot;&gt;
          &lt;li&gt;입력 컬럼 수와 값 수 일치 여부 확인&lt;/li&gt;
          &lt;li&gt;존재하지 않는 컬럼 사용 방지&lt;/li&gt;
          &lt;li&gt;부분 컬럼 INSERT 지원&lt;/li&gt;
          &lt;li&gt;비어 있는 컬럼은 빈 문자열로 채우기&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/div&gt;

      &lt;div style=&quot;padding: 24px; border-radius: 16px; background: #f8fafc; border: 1px solid #e5e7eb;&quot;&gt;
        &lt;h3 style=&quot;margin: 0 0 12px; font-size: 22px;&quot;&gt;SELECT 처리&lt;/h3&gt;
        &lt;p style=&quot;margin: 0 0 10px;&quot;&gt;
          &lt;code&gt;SELECT&lt;/code&gt; 실행 시에는 CSV 파일을 읽어 헤더를 기준으로 컬럼 위치를 찾고,
          사용자가 요청한 컬럼만 골라 출력하도록 만들었다.
        &lt;/p&gt;
        &lt;ul style=&quot;margin: 0; padding-left: 22px;&quot;&gt;
          &lt;li&gt;&lt;code&gt;SELECT * FROM table;&lt;/code&gt; 지원&lt;/li&gt;
          &lt;li&gt;&lt;code&gt;SELECT col1, col2 FROM table;&lt;/code&gt; 지원&lt;/li&gt;
          &lt;li&gt;컬럼 헤더와 함께 결과 출력&lt;/li&gt;
        &lt;/ul&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;section style=&quot;margin-bottom: 44px;&quot;&gt;
    &lt;h2 style=&quot;margin: 0 0 18px; font-size: 28px; color: #111827;&quot;&gt;4. 내부 구조 설계&lt;/h2&gt;
    &lt;p style=&quot;margin: 0 0 18px;&quot;&gt;
      프로젝트는 Top-down으로 이해하고 확장하기 쉽도록 기능을 모듈 단위로 분리했다.
    &lt;/p&gt;

    &lt;div style=&quot;display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 14px;&quot;&gt;
      &lt;div style=&quot;padding: 18px; border-radius: 14px; background: #f9fafb; border: 1px solid #e5e7eb;&quot;&gt;&lt;strong&gt;main&lt;/strong&gt;&lt;br&gt;입력 처리와 전체 실행 흐름 연결&lt;/div&gt;
      &lt;div style=&quot;padding: 18px; border-radius: 14px; background: #f9fafb; border: 1px solid #e5e7eb;&quot;&gt;&lt;strong&gt;lexer&lt;/strong&gt;&lt;br&gt;SQL 문자열 토큰화&lt;/div&gt;
      &lt;div style=&quot;padding: 18px; border-radius: 14px; background: #f9fafb; border: 1px solid #e5e7eb;&quot;&gt;&lt;strong&gt;parser&lt;/strong&gt;&lt;br&gt;SQL 문장 구조 해석&lt;/div&gt;
      &lt;div style=&quot;padding: 18px; border-radius: 14px; background: #f9fafb; border: 1px solid #e5e7eb;&quot;&gt;&lt;strong&gt;ast&lt;/strong&gt;&lt;br&gt;파싱 결과 저장&lt;/div&gt;
      &lt;div style=&quot;padding: 18px; border-radius: 14px; background: #f9fafb; border: 1px solid #e5e7eb;&quot;&gt;&lt;strong&gt;executor&lt;/strong&gt;&lt;br&gt;INSERT / SELECT 실행&lt;/div&gt;
      &lt;div style=&quot;padding: 18px; border-radius: 14px; background: #f9fafb; border: 1px solid #e5e7eb;&quot;&gt;&lt;strong&gt;schema&lt;/strong&gt;&lt;br&gt;테이블 구조 검증&lt;/div&gt;
      &lt;div style=&quot;padding: 18px; border-radius: 14px; background: #f9fafb; border: 1px solid #e5e7eb;&quot;&gt;&lt;strong&gt;storage&lt;/strong&gt;&lt;br&gt;CSV 읽기/쓰기&lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;section style=&quot;margin-bottom: 44px;&quot;&gt;
    &lt;h2 style=&quot;margin: 0 0 18px; font-size: 28px; color: #111827;&quot;&gt;5. 추가 구현 요소&lt;/h2&gt;
    &lt;p style=&quot;margin: 0 0 14px;&quot;&gt;
      기본 요구사항을 충족하는 데서 끝나지 않고, 차별화 요소도 일부 반영했다.
    &lt;/p&gt;
    &lt;ul style=&quot;margin: 0; padding-left: 22px;&quot;&gt;
      &lt;li&gt;SQL 파일 입력뿐 아니라 SQL 문자열 직접 실행 지원&lt;/li&gt;
      &lt;li&gt;간단한 interactive CLI 모드 지원&lt;/li&gt;
      &lt;li&gt;부분 컬럼 INSERT 지원&lt;/li&gt;
      &lt;li&gt;CSV escape 처리로 쉼표와 따옴표 포함 값 저장 가능&lt;/li&gt;
      &lt;li&gt;한글 식별자와 별칭 기반 테이블 처리 확장&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/section&gt;

  &lt;section style=&quot;margin-bottom: 44px; padding: 26px; border-radius: 18px; background: #fff7ed; border: 1px solid #fed7aa;&quot;&gt;
    &lt;h2 style=&quot;margin: 0 0 16px; font-size: 28px; color: #9a3412;&quot;&gt;6. 이번 프로젝트에서 중요했던 점&lt;/h2&gt;
    &lt;p style=&quot;margin: 0 0 12px;&quot;&gt;
      이번 과제는 단순히 결과물을 제출하는 것이 아니라, &lt;strong&gt;AI가 만든 코드까지 포함해 결국 내 코드처럼 이해하고 설명할 수 있어야 한다&lt;/strong&gt;는 점이 중요했다.
    &lt;/p&gt;
    &lt;p style=&quot;margin: 0;&quot;&gt;
      그래서 구현 과정에서는 AI를 활용해 빠르게 초안을 만들고 구조를 확장했지만,
      최종적으로는 입력된 SQL이 어떤 단계로 처리되는지, 왜 Parser와 Executor를 분리했는지,
      왜 CSV를 선택했는지까지 직접 설명할 수 있도록 정리했다.
    &lt;/p&gt;
  &lt;/section&gt;

  &lt;section style=&quot;padding: 30px; border-radius: 20px; background: #111827; color: #f9fafb;&quot;&gt;
    &lt;h2 style=&quot;margin: 0 0 16px; font-size: 28px; color: #ffffff;&quot;&gt;마무리&lt;/h2&gt;
    &lt;p style=&quot;margin: 0 0 14px; color: #e5e7eb;&quot;&gt;
      이번 SQL 처리기 프로젝트에서는 요구사항에 맞춰 &lt;strong&gt;CLI 입력, SQL 파싱, 실행 로직, 파일 기반 저장 구조&lt;/strong&gt;를 모두 직접 연결했다.
      CREATE TABLE 같은 고급 기능은 제외했지만, 대신 최소 요구사항인 INSERT와 SELECT를 끝까지 동작하도록 완성하는 데 집중했다.
    &lt;/p&gt;
    &lt;p style=&quot;margin: 0; color: #e5e7eb;&quot;&gt;
      작은 범위의 SQL 엔진이지만, 입력된 SQL이 실제 데이터 파일에 반영되는 흐름을 직접 구현해보면서
      DB 처리기의 핵심 구조를 훨씬 선명하게 이해할 수 있었다.
      구현 우선의 과제였던 만큼, AI를 활용해 빠르게 만들고 동시에 핵심 로직은 스스로 설명할 수 있게 정리한 점이 이번 프로젝트의 가장 큰 의미였다.
    &lt;/p&gt;
  &lt;/section&gt;
&lt;/div&gt;</description>
      <category>데이터베이스</category>
      <author>forrest7</author>
      <guid isPermaLink="true">https://forrest7.tistory.com/48</guid>
      <comments>https://forrest7.tistory.com/48#entry48comment</comments>
      <pubDate>Thu, 9 Apr 2026 17:55:01 +0900</pubDate>
    </item>
    <item>
      <title>pintos를 위한 c언어 강의</title>
      <link>https://forrest7.tistory.com/47</link>
      <description>&lt;h2&gt;[강의 요약] C언어의 심장: 포인터와 메모리 관리 완벽 정리&lt;/h2&gt;
&lt;p&gt;안녕하세요! 오늘은 프로그래밍의 &amp;#39;근본&amp;#39;이라 불리는 C언어, 그중에서도 많은 학습자가 어려워하지만 반드시 넘어야 할 산인 &lt;strong&gt;메모리와 포인터&lt;/strong&gt;에 대해 정리해 보겠습니다. 파이썬처럼 친절한 언어와 C언어는 무엇이 다른지, 왜 우리가 직접 메모리를 만져야 하는지 핵심만 짚어드릴게요.&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;1. C언어는 왜 &amp;#39;불친절&amp;#39;할까? (vs Python)&lt;/h3&gt;
&lt;p&gt;파이썬이 모든 것을 알아서 해주는 &amp;#39;자동 자가용&amp;#39;이라면, C언어는 운전자가 엔진 노즐 하나하나를 조절해야 하는 &amp;#39;수동 레이싱카&amp;#39;와 같습니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;하드웨어 제어:&lt;/strong&gt; CPU와 메모리를 직접 컨트롤하기 때문에 성능이 강력합니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;명시적 타입:&lt;/strong&gt; 모든 데이터의 크기를 프로그래머가 직접 결정해야 합니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;불친절한 에러:&lt;/strong&gt; 잘못된 메모리에 접근하면 친절한 설명 대신 &lt;code&gt;Segmentation Fault&lt;/code&gt;와 함께 프로그램이 종료됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 변수를 바라보는 새로운 시각: 주소, 값, 그리고 크기&lt;/h3&gt;
&lt;p&gt;C언어에서 변수는 단순히 값을 담는 그릇이 아니라, &lt;strong&gt;메모리 상의 특정 위치를 가리키는 별명(Symbol)&lt;/strong&gt;입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;주소(&amp;amp;a):&lt;/strong&gt; 메모리 어디에 있는가?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;값(a):&lt;/strong&gt; 그 위치에 무엇이 들어있는가?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;크기(sizeof):&lt;/strong&gt; 그 위치부터 몇 바이트를 사용하는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;strong&gt;  중요 팁:&lt;/strong&gt; C언어에서 데이터 타입(int, long 등)의 크기는 시스템마다 다를 수 있습니다. 따라서 이식성 있는 코드를 위해 &lt;code&gt;stdint.h&lt;/code&gt;의 고정 너비 타입(&lt;code&gt;int32_t&lt;/code&gt;, &lt;code&gt;int64_t&lt;/code&gt;)을 사용하는 습관이 좋습니다.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;hr&gt;
&lt;h3&gt;3. 통곡의 벽, &amp;#39;포인터(Pointer)&amp;#39; 제대로 이해하기&lt;/h3&gt;
&lt;p&gt;포인터는 어렵지 않습니다. &lt;strong&gt;&amp;quot;주소를 저장하는 변수&amp;quot;&lt;/strong&gt;일 뿐입니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;역참조(&lt;code&gt;*&lt;/code&gt;):&lt;/strong&gt; 포인터가 가리키는 주소로 &amp;#39;직접 찾아가서&amp;#39; 값을 읽거나 쓰는 행위입니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;포인터 타입의 비밀:&lt;/strong&gt; &lt;code&gt;int*&lt;/code&gt;와 &lt;code&gt;char*&lt;/code&gt;는 주소 값 자체의 크기(64비트 기준 8바이트)는 같지만, &lt;strong&gt;찾아갔을 때 몇 바이트를 읽어야 할지&lt;/strong&gt;를 결정합니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;포인터 연산:&lt;/strong&gt; &lt;code&gt;p + 1&lt;/code&gt;은 주소 값에 1을 더하는 게 아니라, &lt;strong&gt;가리키는 타입의 크기만큼&lt;/strong&gt; 건너뛰는 것을 의미합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;4. 메모리 관리의 핵심: 힙(Heap)과 동적 할당&lt;/h3&gt;
&lt;p&gt;함수가 종료되면 사라지는 지역 변수(Stack)와 달리, 프로그램 실행 중에 원하는 만큼 메모리를 쓰고 싶을 때 &lt;strong&gt;힙(Heap)&lt;/strong&gt; 영역을 사용합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;malloc&lt;/code&gt;:&lt;/strong&gt; 메모리 빌려오기. (반환 타입이 &lt;code&gt;void*&lt;/code&gt;이므로 적절한 형변환이 필요합니다.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;free&lt;/code&gt;:&lt;/strong&gt; 빌린 메모리 반납하기. &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;메모리 누수(Memory Leak):&lt;/strong&gt; 빌려놓고 반납(&lt;code&gt;free&lt;/code&gt;)하지 않으면 시스템의 메모리가 고갈됩니다. &lt;strong&gt;&amp;quot;malloc과 free는 항상 짝꿍&amp;quot;&lt;/strong&gt;임을 잊지 마세요!&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;5. 구조체(Struct)와 메모리 정렬의 마법&lt;/h3&gt;
&lt;p&gt;서로 다른 타입을 묶는 구조체에는 숨겨진 원리가 있습니다. 바로 &lt;strong&gt;패딩(Padding)&lt;/strong&gt;입니다.&lt;/p&gt;
&lt;p&gt;CPU는 메모리 접근 효율을 위해 데이터를 특정 단위로 정렬합니다. 이 과정에서 빈 공간(Padding)이 생겨, 실제 구조체 크기가 멤버들의 합보다 커질 수 있습니다. &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;최적화 팁:&lt;/strong&gt; 크기가 큰 타입부터 작은 타입 순서로 멤버를 선언하면 패딩을 줄여 메모리를 아낄 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h3&gt;✅ 오늘 강의의 핵심 &amp;#39;코딩 습관&amp;#39; 5가지&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;sizeof 생활화:&lt;/strong&gt; 타입 크기를 짐작하지 말고 항상 &lt;code&gt;sizeof()&lt;/code&gt;로 확인하세요.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;포인터 초기화:&lt;/strong&gt; 선언과 동시에 &lt;code&gt;NULL&lt;/code&gt;이나 유효한 주소로 초기화하세요.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;중괄호(&lt;code&gt;{}&lt;/code&gt;) 생략 금지:&lt;/strong&gt; if/for문 뒤에 코드가 한 줄이라도 중괄호를 쓰는 것이 안전합니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;우선순위는 괄호로:&lt;/strong&gt; 연산자 우선순위가 헷갈릴 땐 무조건 &lt;code&gt;()&lt;/code&gt;를 쓰세요.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;문자열 끝은 &lt;code&gt;\0&lt;/code&gt;:&lt;/strong&gt; C언어 문자열은 마지막 널 문자를 위한 1바이트가 더 필요함을 명심하세요.&lt;/li&gt;
&lt;/ol&gt;</description>
      <category>프로그래밍 언어/C언어</category>
      <author>forrest7</author>
      <guid isPermaLink="true">https://forrest7.tistory.com/47</guid>
      <comments>https://forrest7.tistory.com/47#entry47comment</comments>
      <pubDate>Wed, 8 Apr 2026 03:05:43 +0900</pubDate>
    </item>
    <item>
      <title>AI를 이용한 효율적인 학습</title>
      <link>https://forrest7.tistory.com/46</link>
      <description>&lt;h2&gt;[에세이] AI 시대, 정답보다 &amp;#39;고민의 시간&amp;#39;이 더 가치 있는 이유&lt;/h2&gt;
&lt;p&gt;AI에게 물어보면 10초 만에 코드가 나오고 답이 나오는 시대입니다. 상황이 이렇다 보니, 가끔 이런 회의감이 들곤 합니다. &lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: 'Noto Serif KR';&quot;&gt;&lt;p&gt;&lt;strong&gt;&amp;quot;어차피 AI가 다 해주는데, 굳이 내가 머리 싸매며 고통받을 필요가 있을까?&amp;quot;&lt;/strong&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;결론부터 말씀드리면, 그 &lt;strong&gt;&amp;#39;고통스러운 과정&amp;#39;은 단순히 답을 찾는 시간이 아니라 당신의 뇌를 업데이트하는 필수적인 과정&lt;/strong&gt;입니다. 왜 우리가 여전히 스스로 고민해야 하는지 그 이유를 정리해 보았습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;1. &amp;#39;도구&amp;#39;를 다루는 &amp;#39;근육&amp;#39;은 고통 속에서 자랍니다&lt;/h3&gt;
&lt;p&gt;AI를 사용하는 것은 마치 고성능 엑셀 프로그램을 쓰는 것과 같습니다. 하지만 수의 개념과 연산 원리를 모르는 상태에서 엑셀만 쓰면, 수치가 조금만 틀려도 왜 틀렸는지 알 수 없고 응용도 불가능합니다.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;직접 고민하는 과정:&lt;/strong&gt; 뇌의 뉴런이 연결되며 &amp;#39;문제 해결 근육&amp;#39;을 만드는 과정입니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI의 정답:&lt;/strong&gt; 결과물(Output)만 얻는 과정입니다. 내 안의 근육은 생기지 않습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;결국 기초 체력이 없으면 AI라는 강력한 도구도 제대로 다룰 수 없게 됩니다.&lt;/p&gt;
&lt;h3&gt;2. AI의 &amp;#39;그럴듯한 거짓말&amp;#39;을 가려내는 안목&lt;/h3&gt;
&lt;p&gt;AI는 완벽하지 않습니다. 때로는 &amp;#39;환각(Hallucination)&amp;#39; 현상으로 틀린 답을 아주 당당하게 제시하곤 하죠. 스스로 깊게 고민해 본 사람은 AI가 준 답이 &lt;strong&gt;&amp;#39;왜 맞는지&amp;#39; 혹은 &amp;#39;어디가 틀렸는지&amp;#39;&lt;/strong&gt;를 파악할 수 있는 눈을 갖게 됩니다. &lt;/p&gt;
&lt;p&gt;직접 바닥까지 내려가 삽질(?)해 본 데이터가 머릿속에 쌓여 있어야만, 비로소 AI를 도구로서 부릴 수 있는 &amp;#39;진정한 주인&amp;#39;이 됩니다.&lt;/p&gt;
&lt;h3&gt;3. &amp;#39;학습의 구덩이(The Learning Pit)&amp;#39;가 주는 선물&lt;/h3&gt;
&lt;p&gt;교육학에는 &lt;strong&gt;&amp;#39;학습의 구덩이&amp;#39;&lt;/strong&gt;라는 개념이 있습니다. 새로운 개념을 배울 때 우리는 반드시 혼란과 고통의 구덩이에 빠집니다. 여기서 빠져나오기 위해 애쓰는 과정에서 비로소 진정한 학습과 깊은 이해가 일어납니다. &lt;/p&gt;
&lt;p&gt;AI로 곧장 점프하는 것은 이 구덩이를 건너뛰는 것입니다. 당장은 편하겠지만, 장기적으로는 지적 성장을 방해하는 독이 될 수 있습니다.&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;  AI 시대, 지혜롭게 &amp;#39;삽질&amp;#39;하는 법&lt;/h3&gt;
&lt;p&gt;무조건 고통받는 것만이 답은 아닙니다. 효율적인 성장을 위해 다음의 &lt;strong&gt;&amp;#39;의도적인 고군분투&amp;#39;&lt;/strong&gt; 전략을 추천합니다.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;타임박스(Time-boxing) 설정:&lt;/strong&gt; 문제를 마주하면 최소 30분은 AI 없이 스스로 고민해 보세요. 이때 당신의 뇌가 가장 활발하게 움직입니다.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;답이 아닌 &amp;#39;힌트&amp;#39; 요청하기:&lt;/strong&gt; &amp;quot;정답을 알려줘&amp;quot; 대신 &amp;quot;내가 여기까지 생각했는데, 다음 단계로 가기 위한 실마리만 줘&amp;quot;라고 질문해 보세요.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;사후 복기:&lt;/strong&gt; AI의 답을 확인했다면, &amp;quot;왜 나는 이 생각을 못 했을까?&amp;quot;를 다시 반추하며 그 로직을 내 것으로 흡수해야 합니다.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h3&gt;마치며&lt;/h3&gt;
&lt;p&gt;AI는 우리의 &lt;strong&gt;&amp;#39;가속기&amp;#39;&lt;/strong&gt;가 되어야지, &lt;strong&gt;&amp;#39;엔진&amp;#39;&lt;/strong&gt; 자체를 대체하게 두어서는 안 됩니다. &lt;/p&gt;
&lt;p&gt;지금 문제를 붙잡고 씨름하며 느끼는 그 막막함과 고통은, 당신의 능력이 확장되고 있다는 아주 건강한 신호입니다. 정답을 빨리 찾는 것보다, &amp;#39;정답에 이르는 사고의 경로&amp;#39;를 내 것으로 만드는 데 집중해 보세요. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;결국 마지막에 웃는 사람은 AI를 잘 쓰는 사람이 아니라, AI 없이도 문제를 해결할 줄 아는 능력을 갖춘 채 AI를 도구로 부리는 사람일 테니까요.&lt;/strong&gt;&lt;/p&gt;</description>
      <category>AI</category>
      <author>forrest7</author>
      <guid isPermaLink="true">https://forrest7.tistory.com/46</guid>
      <comments>https://forrest7.tistory.com/46#entry46comment</comments>
      <pubDate>Wed, 8 Apr 2026 03:03:13 +0900</pubDate>
    </item>
    <item>
      <title>4/6 커피챗</title>
      <link>https://forrest7.tistory.com/45</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;이동석코치님과 커피챗을 진행했다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;같은 동기 한명과 진행했고, 요약해보자면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. c언어는 portability가 약하고, 요즘은 rust를 많이 사용한다고한다. 다만 미국 이야기이고 한국은 아직이라고한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. c언어는 매크로를 많이 사용하여 오픈소스 읽기가 힘들고, 여러가지 규칙이 있어서 이것을 먼저 아는 것이 이해하는데 도움이 된다고한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. c언어의 성능이 느린부분을 어셈블리어로 교체하는 작업을 하는데, 함수마다 성능을 측정하는 것을 프로파일링이라고한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; 프로파일링툴이 많으며 이것으로 성능을 측정하여 느리부분을 어셈블리어로 교체하여 성능을 개선한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. 좋은 코드란 확장성과 다른사람이 읽기 쉬운 코드이다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Jungle/Everyday</category>
      <author>forrest7</author>
      <guid isPermaLink="true">https://forrest7.tistory.com/45</guid>
      <comments>https://forrest7.tistory.com/45#entry45comment</comments>
      <pubDate>Mon, 6 Apr 2026 17:30:59 +0900</pubDate>
    </item>
    <item>
      <title>[WIL] 6주</title>
      <link>https://forrest7.tistory.com/44</link>
      <description>&lt;table style=&quot;border-collapse: collapse; width: 100%; border: 1px solid #000000; height: 244px;&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;thead&gt;
&lt;tr style=&quot;border-bottom: 2px solid #000000; background-color: #f8f8f8; height: 24px;&quot;&gt;
&lt;th style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 24px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;카테고리&lt;/span&gt;&lt;/b&gt;&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 24px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;주간 실행 목표 (Action Item)&lt;/span&gt;&lt;/b&gt;&lt;/th&gt;
&lt;th style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 24px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;결과&lt;/span&gt;&lt;/b&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;01. 문제해결&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;매일 자료구조 c언어 구현 문제풀이로 논리적 사고 훈련&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;⭐ &lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333; text-align: center;&quot;&gt;⭐&lt;/span&gt; &lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333; text-align: center;&quot;&gt;⭐&lt;/span&gt; &lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;02. 설계&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;수요코딩시 아키텍쳐를 먼저 생각해보기&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333; text-align: center;&quot;&gt;⭐&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;03. 구현&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; height: 22px;&quot;&gt;&lt;b&gt;&lt;span&gt;자료구조 구현시 엣지 케이스 생각하며 구현하기&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333; text-align: center;&quot;&gt;⭐&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;04. 품질&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; height: 22px;&quot;&gt;&lt;b&gt;&lt;span&gt;자료구조 검증 테스트 케이스 추가 해보기&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333; text-align: center;&quot;&gt;⭐&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;05. 유지보수&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;변수 명명에 의미를 담아 가독성 높은 코드 작성하기&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333; text-align: center;&quot;&gt;⭐&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;06. 협업&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;작업 현황을 팀원들에게 즉시 공유하여 투명한 소통 유지&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333; text-align: center;&quot;&gt;⭐&lt;/span&gt; &lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333; text-align: center;&quot;&gt;⭐&lt;/span&gt; &lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333; text-align: center;&quot;&gt;⭐&lt;/span&gt; &lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333; text-align: center;&quot;&gt;⭐&lt;/span&gt; &lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333; text-align: center;&quot;&gt;⭐&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;07. 태도&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;과제 부여 시 의도와 상위 카테고리를 먼저 분석하는 습관&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333; text-align: center;&quot;&gt;⭐&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;08. 비즈니스 이해&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;사용성을 생각하며 코드 생산&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333; text-align: center;&quot;&gt;⭐&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;09. AI &amp;amp; 생산성&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; height: 22px;&quot;&gt;&lt;b&gt;&lt;span&gt;하네스 사용해서 바이브 코딩 진행해보기&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333; text-align: center;&quot;&gt;⭐&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 22px;&quot;&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;10. 학습 민첩성&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; height: 22px;&quot;&gt;&lt;b&gt;&lt;span&gt;SQL이 뭔지 이해하고 &lt;span&gt;SQL&lt;/span&gt;&lt;span style=&quot;background-color: oklch(1 0 0); color: oklch(0.145 0 0); text-align: start;&quot;&gt; 문장을 읽고, 파싱하고, 실행하는 처리기를 만들기&lt;/span&gt;&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;td style=&quot;border: 1px solid #000000; padding: 10px; text-align: center; height: 22px;&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333; text-align: center;&quot;&gt;⭐&lt;/span&gt; &lt;span style=&quot;font-family: 'Noto Sans Light'; color: #333333; text-align: center;&quot;&gt;⭐&lt;/span&gt;&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;font-family: 'Noto Sans KR', sans-serif; line-height: 1.8; color: #333;&quot;&gt;
    &lt;h2 style=&quot;border-bottom: 2px solid #333; padding-bottom: 10px; color: #000;&quot;&gt;  이번 주 학습 및 프로젝트 요약 (4월 2주차)&lt;/h2&gt;
    &lt;p style=&quot;margin-top: 15px; color: #666;&quot;&gt;이번 주 블로그에 기록했던 주요 프로젝트와 학습 내용을 한눈에 볼 수 있도록 정리했습니다.&lt;/p&gt;

    &lt;div style=&quot;margin-top: 30px;&quot;&gt;

        &lt;div style=&quot;margin-bottom: 30px; padding: 20px; border-radius: 8px; background-color: #f4fdf4; border-left: 5px solid #28a745;&quot;&gt;
            &lt;h3 style=&quot;margin-top: 0; color: #1e7e34;&quot;&gt;1. C로 구현한 파일 기반 SQL 처리기&lt;/h3&gt;
            &lt;p&gt;직접 SQL 파서와 실행기를 구현해 보는 6주차 프로젝트를 진행했습니다. &lt;b&gt;Lexer와 Parser&lt;/b&gt;를 통해 SQL을 분석하고, 이를 바탕으로 실제 &lt;b&gt;CSV 파일&lt;/b&gt;에 데이터를 INSERT하거나 SELECT 하는 흐름을 완성했습니다. AI를 전략적으로 활용해 빠르게 기능을 구현하면서도 핵심 로직을 스스로 이해하는 데 집중했습니다.&lt;/p&gt;
            &lt;a href=&quot;https://forrest7.tistory.com/48&quot; target=&quot;_blank&quot; style=&quot;display: inline-block; margin-top: 10px; padding: 5px 15px; background-color: #28a745; color: #fff; text-decoration: none; border-radius: 4px; font-size: 0.9em;&quot;&gt;프로젝트 상세 보기 →&lt;/a&gt;
        &lt;/div&gt;
        
        &lt;div style=&quot;margin-bottom: 30px; padding: 20px; border-radius: 8px; background-color: #f9f9f9; border-left: 5px solid #333;&quot;&gt;
            &lt;h3 style=&quot;margin-top: 0; color: #2c3e50;&quot;&gt;2. Pintos를 위한 C언어 핵심 정리&lt;/h3&gt;
            &lt;p&gt;Pintos 과제 수행 전 필수적인 C언어의 메모리 관리와 포인터 개념을 정리했습니다. 파이썬과 대비되는 C언어의 특징, 주소와 값의 차이, &lt;b&gt;malloc/free&lt;/b&gt; 활용법, 그리고 &lt;b&gt;구조체 패딩(Padding)&lt;/b&gt; 최적화 등 실무적인 팁을 다루었습니다.&lt;/p&gt;
            &lt;a href=&quot;https://forrest7.tistory.com/47&quot; target=&quot;_blank&quot; style=&quot;display: inline-block; margin-top: 10px; padding: 5px 15px; background-color: #333; color: #fff; text-decoration: none; border-radius: 4px; font-size: 0.9em;&quot;&gt;C언어 정리 확인하기 →&lt;/a&gt;
        &lt;/div&gt;

        &lt;div style=&quot;margin-bottom: 30px; padding: 20px; border-radius: 8px; background-color: #f1f8ff; border-left: 5px solid #007bff;&quot;&gt;
            &lt;h3 style=&quot;margin-top: 0; color: #0056b3;&quot;&gt;3. AI 시대, '고민의 시간'이 주는 가치&lt;/h3&gt;
            &lt;p&gt;AI가 정답을 알려주는 시대에 왜 직접 고민하는 과정이 필요한지 정리한 에세이입니다. 문제 해결 근육을 키우는 '학습의 구덩이' 개념과 더불어, AI를 단순 정답기가 아닌 지적 &lt;b&gt;가속기&lt;/b&gt;로 활용하는 전략(Time-boxing 등)을 공유했습니다.&lt;/p&gt;
            &lt;a href=&quot;https://forrest7.tistory.com/46&quot; target=&quot;_blank&quot; style=&quot;display: inline-block; margin-top: 10px; padding: 5px 15px; background-color: #007bff; color: #fff; text-decoration: none; border-radius: 4px; font-size: 0.9em;&quot;&gt;에세이 읽어보기 →&lt;/a&gt;
        &lt;/div&gt;

        &lt;div style=&quot;margin-bottom: 30px; padding: 20px; border-radius: 8px; background-color: #fffaf0; border-left: 5px solid #fd7e14;&quot;&gt;
            &lt;h3 style=&quot;margin-top: 0; color: #856404;&quot;&gt;4. 이동석 코치님과의 커피챗 (4/6)&lt;/h3&gt;
            &lt;p&gt;현직 코치님과의 대화를 통해 Rust의 동향, C언어 오픈소스 분석 팁, 그리고 성능 최적화를 위한 &lt;b&gt;프로파일링(Profiling)&lt;/b&gt;의 중요성을 배웠습니다. '좋은 코드란 무엇인가'에 대한 근본적인 고민을 할 수 있었던 유익한 시간이었습니다.&lt;/p&gt;
            &lt;a href=&quot;https://forrest7.tistory.com/45&quot; target=&quot;_blank&quot; style=&quot;display: inline-block; margin-top: 10px; padding: 5px 15px; background-color: #fd7e14; color: #fff; text-decoration: none; border-radius: 4px; font-size: 0.9em;&quot;&gt;커피챗 요약 보기 →&lt;/a&gt;
        &lt;/div&gt;

    &lt;/div&gt;

    &lt;p style=&quot;margin-top: 20px; font-style: italic; color: #888;&quot;&gt;#정글 #Jungle #SQL처리기 #C언어 #AI학습 #커피챗 #개발자성장기&lt;/p&gt;
&lt;/div&gt;</description>
      <category>Jungle/WIL(Weekly I Learned)</category>
      <category>Jungle</category>
      <category>Wil</category>
      <author>forrest7</author>
      <guid isPermaLink="true">https://forrest7.tistory.com/44</guid>
      <comments>https://forrest7.tistory.com/44#entry44comment</comments>
      <pubDate>Mon, 6 Apr 2026 14:08:48 +0900</pubDate>
    </item>
  </channel>
</rss>