<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>apple-mint.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Sun, 22 Dec 2024 14:07:55 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>apple-mint.log</title>
            <url>https://velog.velcdn.com/images/apple-mint/profile/8ee17856-88bc-4d88-885e-1620c812b5b7/image.jpg</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. apple-mint.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/apple-mint" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[241222 CS 스터디]]></title>
            <link>https://velog.io/@apple-mint/cs241222</link>
            <guid>https://velog.io/@apple-mint/cs241222</guid>
            <pubDate>Sun, 22 Dec 2024 14:07:55 GMT</pubDate>
            <description><![CDATA[<h2 id="데이터베이스-분할">데이터베이스 분할</h2>
<ul>
<li>안정적이고 확장성 높은 데이터베이스 레코드 관리를 위한 기술</li>
<li>테이블을 물리적으로 분할해 레코드를 저장</li>
<li>테이블 내 수많은 레코드를 효율적으로 저장해야 할 때, 데이터베이스 부하 분산을 고려할 때 유용함</li>
<li>분할되어 저장되는 단위를 파티션이라 하며 데이터베이스 파티셔닝이라고도 함</li>
</ul>
<h3 id="1-수평적-분할">1) 수평적 분할</h3>
<ul>
<li>테이블의 행을 기준으로 테이블을 나누어 저장하는 방식</li>
<li>테이블에 수많은 레코드가 존재하면서 테이블의 레코드 참조 시 모든 레코드를 한번에 불러들일 필요가 없는 경우 사용</li>
</ul>
<p><img src="https://velog.velcdn.com/images/apple-mint/post/a2f46b85-922d-45df-b159-980dfcf7ae54/image.png" alt="수평적 분할"></p>
<h4 id="1-범위-분할">(1) 범위 분할</h4>
<ul>
<li>레코드 데이터가 가질 수 있는 범위를 정의하고 이를 기준으로 테이블을 나누는 방식</li>
</ul>
<h4 id="2-목록-분할">(2) 목록 분할</h4>
<ul>
<li>레코드 데이터가 특정 목록에 포함된 값을 가질 경우 해당 레코드를 별도의 테이블로 나누는 방식</li>
</ul>
<h4 id="3-해시-분할">(3) 해시 분할</h4>
<ul>
<li>특정 열 데이터의 해시값을 기준으로 별도의 테이블로 나누는 방식</li>
</ul>
<h4 id="4-키-분할">(4) 키 분할</h4>
<ul>
<li>키를 기준으로 별도의 테이블로 나누는 방식</li>
<li>분할된 테이블을 조회 시 특정 레코드가 속한 파티션의 식별은 파티셔닝 키를 통해 이루어짐</li>
</ul>
<h4 id="5-합성-분할">(5) 합성 분할</h4>
<ul>
<li>기존에 있는 분할 방식을 결합해 나누는 방식</li>
<li>보통 범위+해시 분할, 범위-목록 분할 방식을 사용함</li>
</ul>
<p><img src="https://velog.velcdn.com/images/apple-mint/post/b2282572-4136-4411-943c-1f2449ce8cfc/image.png" alt="수평적 분할의 종류"></p>
<h4 id="6-샤딩">(6) 샤딩</h4>
<ul>
<li>분할된 테이블을 별개의 데이터베이스 서버에 분산, 저장하는 방식</li>
<li>기본적으로 수평적 분할로 만들어진 파티션들은 하나의 서버 내에 위치함</li>
<li>하나의 서버 내에 있을 경우 부하 분산을 기대하기 어려우므로 샤딩을 사용함</li>
<li>분할되어 저장된 단위를 샤드라고 하며, 샤드를 여러 서버에 분산, 저장하는 수평적 분할 기법이라고 할 수 있음</li>
</ul>
<h3 id="2-수직적-분할">2) 수직적 분할</h3>
<ul>
<li>테이블의 열을 기준으로 테이블을 나누어 저장하는 방식</li>
</ul>
<p><img src="https://velog.velcdn.com/images/apple-mint/post/eed8573c-7cb5-41af-a907-72fdafa60794/image.png" alt="수직적 분할"></p>
<ul>
<li>테이블에 발생하는 트랜잭션 수에 비해 테이블 내 열이 과도하게 많거나,</li>
<li>특정 열에 속하는 레코드 데이터 크기가 다른 열의 레코드에 비해 크거나,</li>
<li>보안 상의 이유로 특정 열을 별개의 테이블로 나눠야 할 때 사용함</li>
</ul>
<h3 id="3-기능적-분할">3) 기능적 분할</h3>
<ul>
<li>테이블의 논리적, 기능적 측면을 기준으로 테이블을 나누어 저장하는 방식</li>
</ul>
<p><img src="https://velog.velcdn.com/images/apple-mint/post/2254a1ea-d6d3-4820-a2e4-9df10b3fc46a/image.png" alt="기능적 분할"></p>
<ul>
<li>하나의 데이터베이스에서 다양한 비즈니스 기능을 처리할 때,</li>
<li>읽기 전용 데이터, 읽기-쓰기 데이터를 분리할 때 사용함</li>
</ul>
<h3 id="참고">참고</h3>
<ul>
<li><a href="https://learn.microsoft.com/ko-kr/azure/architecture/best-practices/data-partitioning">데이터 분할 지침</a></li>
<li><a href="https://yunamom.tistory.com/291">[DB] 데이터베이스 파티셔닝 - 분할 기법</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[241212 CS 스터디]]></title>
            <link>https://velog.io/@apple-mint/cs241212</link>
            <guid>https://velog.io/@apple-mint/cs241212</guid>
            <pubDate>Thu, 12 Dec 2024 13:30:46 GMT</pubDate>
            <description><![CDATA[<h2 id="소켓-프로그래밍">소켓 프로그래밍</h2>
<h3 id="1-소켓네트워크-소켓">(1) 소켓=네트워크 소켓</h3>
<p><img src="https://velog.velcdn.com/images/apple-mint/post/533301ef-1b7b-4e81-91f1-06e2434d7796/image.png" alt="소켓"></p>
<ul>
<li>프로세스가 주고받는 데이터의 종착점</li>
<li>프로세스 간 네트워크 통신의 엔드포인트</li>
<li>프로세스가 소켓을 열고 읽고 쓸 수 있으므로 많은 운영체제에서 파일로 간주됨</li>
<li>소켓 디스크립터로 소켓을 식별하고 이를 통해 소켓 입출력 기능 구현</li>
</ul>
<h3 id="2-소켓-통신">(2) 소켓 통신</h3>
<ul>
<li>HTTP 통신은 기본적으로 요청과 응답으로 이루어짐</li>
<li>클라이언트에 송수신을 시작하며 송수신이 끝나면 연결이 끝나므로 정보 전달이 다수 발생할 경우 연결을 생성하고 해제하는 과정을 반복해야 함</li>
<li>소켓을 활용해 클라이언트, 서버가 특정한 포트를 통해 실시간으로 양방향 통신이 가능하게 함으로써 위와 같은 단점을 보완함</li>
<li>채팅, 온라인 게임과 같이 지속적이고 반복적인 통신을 보다 적은 자원으로 가능하게 만듦</li>
<li>서버에서도 클라이언트 방향으로 먼저 정보를 제공할 수 있어 클라이언트와 무관하게 발생하는 이벤트에 대한 정보를 정확한 시점에 전달하는 것이 가능
<img src="https://velog.velcdn.com/images/apple-mint/post/feafcf71-4783-48d9-84bc-5dd64f80a221/image.png" alt="소켓 통신 흐름"></li>
</ul>
<ol>
<li><code>socket()</code>으로 소켓 생성</li>
<li><code>bind()</code>으로 소켓을 해당하는 IP주소, 포트에 연결</li>
<li><code>listen()</code>으로 클라이언트 요청을 받을 수 있도록 연결 대기</li>
<li><code>connect()</code>로 연결 요청</li>
<li><code>accept()</code>로 연결 수립 시 소켓 객체와 클라이언트 주소 반환</li>
<li><code>send()</code>, <code>recv()</code>로 데이터 송수신</li>
<li><code>close()</code>으로 소켓 종료</li>
</ol>
<p><img src="https://velog.velcdn.com/images/apple-mint/post/d187fc5f-bf12-4b06-9832-2dc4e1cd7a6b/image.png" alt="소켓 통신 1-2단계">
<img src="https://velog.velcdn.com/images/apple-mint/post/74108e51-52ea-4d37-9d5c-22ce151f46fc/image.png" alt="소켓 통신 3-4단계">
<img src="https://velog.velcdn.com/images/apple-mint/post/faa9ee67-ee93-4b0f-aeec-a4b84e7a025b/image.png" alt="소켓 통신 5-6단계"></p>
<h3 id="참고">참고</h3>
<ul>
<li><a href="https://velog.io/@newdana01/%EC%86%8C%EC%BC%93%EC%9D%B4%EB%9E%80-%EC%A2%85%EB%A5%98-%ED%86%B5%EC%8B%A0-%ED%9D%90%EB%A6%84-HTTP%ED%86%B5%EC%8B%A0%EA%B3%BC%EC%9D%98-%EC%B0%A8%EC%9D%B4">소켓이란? 종류, 통신 흐름, HTTP통신과의 차이</a></li>
<li><a href="https://sparcs.org/blog/how-to-use-websocket/">소켓 통신, Socket.IO</a></li>
<li><a href="https://velog.io/@emplam27/CS-%EA%B7%B8%EB%A6%BC%EC%9C%BC%EB%A1%9C-%EC%95%8C%EC%95%84%EB%B3%B4%EB%8A%94-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EC%86%8C%EC%BC%93-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D%EA%B3%BC-Handshaking">[CS] 그림으로 알아보는 네트워크 - 소켓 프로그래밍과 Handshaking</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[241202 CS 스터디]]></title>
            <link>https://velog.io/@apple-mint/cs241202</link>
            <guid>https://velog.io/@apple-mint/cs241202</guid>
            <pubDate>Mon, 02 Dec 2024 13:52:03 GMT</pubDate>
            <description><![CDATA[<h2 id="티밍과-본딩">티밍과 본딩</h2>
<ul>
<li>네트워크 인터페이스(NIC) 단계에서 성능 향상을 위해 사용하는 방식</li>
<li>여러 물리적인 NIC를 하나의 고속 NIC처럼 구성하는 방식</li>
<li>물리적 및 가상 NIC를 결합하거나 집계해 처리량 또는 중복성이 높은 논리 NIC를 제공하는 방법</li>
<li>RAID와 그 구성방식이 유사함</li>
<li>NIC 하나가 고장나도 논리적 NIC로 구성된 다른 NIC가 있으므로 안정적인 송수신이 가능함</li>
<li>대역폭 향상과 장애 허용성을 제공함</li>
</ul>
<h3 id="1-티밍">1) 티밍</h3>
<ul>
<li>윈도우 운영체제에서 주로 사용하는 용어로 윈도우 서버에서의 인터페이스 이중화 기술</li>
<li>주로 하이퍼바이저(가상화 플랫폼) 환경에서 사용</li>
<li>Ethernet + WIFI(무선)과 같이 서로 다른 종류의 네트워크 장비끼리 연결할 수 있음</li>
<li>가상 머신들이 하나의 물리적 NIC 그룹과 연결되어 네트워크 연결을 공유</li>
<li>가상 머신들은 이를 통해 높은 대역폭을 확보하고 가상화 환경 내에서 장애를 처리할 수 있음</li>
</ul>
<h3 id="2-본딩">2) 본딩</h3>
<ul>
<li>리눅스 운영체제에서 주로 사용하는 용어로 리눅스 서버에서의 인터페이스 이중화 기술</li>
<li>주로 서버와 스위치 사이의 연결이나 네트워크 부하 분산 등의 용도로 사용</li>
<li>같은 종류의 네트워크 장비끼리 연결할 수 있음</li>
</ul>
<h3 id="참고">참고</h3>
<ul>
<li><a href="https://feccle.tistory.com/110">티밍(Timing)&quot;과 &quot;본딩(Bonding)&quot;</a></li>
<li><a href="https://fiveflow.tistory.com/entry/%ED%8B%B0%EB%B0%8D-%EB%B3%B8%EB%94%A9">네트워크 인터페이스 카드(NIC)를 하나로 묶다 - 티밍(Teaming) / 본딩(Bonging)</a></li>
<li><a href="https://ja-gamma.tistory.com/entry/%EC%84%9C%EB%B2%84%ED%8B%B0%EB%B0%8Dteaming%EB%B3%B8%EB%94%A9bonding">서버 티밍(teaming) &amp; 본딩 (bonding) - 서버 랜카드 이중화 방식</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[241128 CS 스터디]]></title>
            <link>https://velog.io/@apple-mint/cs241128</link>
            <guid>https://velog.io/@apple-mint/cs241128</guid>
            <pubDate>Thu, 28 Nov 2024 13:40:03 GMT</pubDate>
            <description><![CDATA[<h2 id="정렬-알고리즘">정렬 알고리즘</h2>
<ul>
<li>컴퓨터 과학이나 수학에서 원소들을 번호순이나 사전 순과 같이 순서대로 열거하는 중요한 알고리즘</li>
<li>점근 표기법, 분할 정복 알고리즘, 자료 구조, 최악/평균/최선의 경우 등 다양한 핵심 알고리즘의 개념을 설명하는 데에 적합</li>
<li>개발하면서 생기는 문제를 해결하는 아이디어를 생각하는 데에 유용함</li>
<li>데이터의 정규화나 의미있는 결과물을 생성하는 데에 유용함</li>
</ul>
<table>
<thead>
<tr>
<th align="center">이름</th>
<th align="center">최악의 경우</th>
<th align="center">평균의 경우</th>
<th align="center">최선의 경우</th>
<th align="center">안정성</th>
</tr>
</thead>
<tbody><tr>
<td align="center">삽입정렬</td>
<td align="center">$n^2$</td>
<td align="center">$n^2$</td>
<td align="center">$n$</td>
<td align="center">O</td>
</tr>
<tr>
<td align="center">선택정렬</td>
<td align="center">$n^2$</td>
<td align="center">$n^2$</td>
<td align="center">$n^2$</td>
<td align="center">X</td>
</tr>
<tr>
<td align="center">버블정렬</td>
<td align="center">$n^2$</td>
<td align="center">$n^2$</td>
<td align="center">$n$</td>
<td align="center">O</td>
</tr>
<tr>
<td align="center">퀵정렬</td>
<td align="center">$n^2$</td>
<td align="center">$nlogn$</td>
<td align="center">$nlogn$</td>
<td align="center">X</td>
</tr>
<tr>
<td align="center">병합정렬</td>
<td align="center">$nlogn$</td>
<td align="center">$nlogn$</td>
<td align="center">$nlogn$</td>
<td align="center">O</td>
</tr>
<tr>
<td align="center">힙정렬</td>
<td align="center">$nlogn$</td>
<td align="center">$nlogn$</td>
<td align="center">$nlogn$</td>
<td align="center">X</td>
</tr>
</tbody></table>
<h3 id="1-삽입-정렬">1) 삽입 정렬</h3>
<p><img src="https://velog.velcdn.com/images/apple-mint/post/d8d028f8-30ae-47f5-8a98-a8510c7d8ea3/image.gif" alt="삽입 정렬"></p>
<ul>
<li>배열의 각 요소를 적절한 위치에 삽입하는 정렬방식</li>
<li>최선의 경우 시간복잡도가 $n$으로 작은 데이터셋에 대해 효율적임</li>
</ul>
<h4 id="1-알고리즘-수행-단계">(1) 알고리즘 수행 단계</h4>
<ol>
<li>배열의 첫 번째 요소를 정렬된 부분으로 간주</li>
<li>다음 요소를 정렬된 부분과 비교하여 적절한 위치에 삽입</li>
<li>이 과정을 배열의 마지막 요소까지 반복해 정렬</li>
</ol>
<h4 id="2-구현-코드">(2) 구현 코드</h4>
<pre><code class="language-python">def insertion_sort(arr):
    for i in range(1, len(arr)):
        key = arr[i]
        j = i-1
        while j &gt;= 0 and key &lt; arr[j]:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = key</code></pre>
<h3 id="2-선택-정렬">2) 선택 정렬</h3>
<p><img src="https://velog.velcdn.com/images/apple-mint/post/e67ea69a-7024-4bf6-b754-8b7697a06e4e/image.gif" alt="선택 정렬"></p>
<ul>
<li>배열에서 최솟값을 찾아 첫 번째 요소와 자리를 바꾸는 과정을 반복하는 정렬방식</li>
<li>알고리즘이 단순해 사용할 수 있는 메모리가 제한적인 경우에 효율적임</li>
</ul>
<h4 id="1-알고리즘-수행-단계-1">(1) 알고리즘 수행 단계</h4>
<ol>
<li>배열에서 최솟값을 찾아 배열의 첫 번째 요소와 교환</li>
<li>배열의 두 번째 요소부터 마지막 요소까지 1번을 반복해 정렬</li>
</ol>
<h4 id="2-구현-코드-1">(2) 구현 코드</h4>
<pre><code class="language-python">def selection_sort(arr):
    n = len(arr)
    for i in range(n):
        min_idx = i
        for j in range(i+1, n):
            if arr[j] &lt; arr[min_idx]:
                min_idx = j
        arr[i], arr[min_idx] = arr[min_idx], arr[i]
    return arr</code></pre>
<h3 id="3-버블-정렬">3) 버블 정렬</h3>
<p><img src="https://velog.velcdn.com/images/apple-mint/post/bf942c8e-60ab-4ea6-a263-ca4781f4504a/image.gif" alt="버블 정렬"></p>
<ul>
<li>인접한 두 요소를 비교하며 정렬의 조건에 맞게 자리를 바꾸는 과정을 반복하는 정렬방식</li>
<li>최악의 경우 시간복잡도가 $n^2$으로 느리지만 코드가 단순하기 때문에 자주 사용됨</li>
</ul>
<h4 id="1-알고리즘-수행-단계-2">(1) 알고리즘 수행 단계</h4>
<ol>
<li>배열의 첫 번째 요소부터 인접한 요소를 비교</li>
<li>두 요소를 비교하여 정렬의 조건에 따라 자리를 바꾸거나 바꾸지 않음</li>
<li>배열의 끝까지 이 과정을 반복하고 정렬이 완료되지 않았을 경우 다음 패스를 시작</li>
<li>하나의 패스에서 1~3번을 수행하며 정렬이 완료될 때까지 패스를 반복</li>
</ol>
<h4 id="2-구현-코드-2">(2) 구현 코드</h4>
<pre><code class="language-python">def bubble_sort(arr):
    n = len(arr)
    for i in range(n):
        for j in range(0, n-i-1):
            if arr[j] &gt; arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
    return arr</code></pre>
<h3 id="4-퀵-정렬">4) 퀵 정렬</h3>
<p><img src="https://velog.velcdn.com/images/apple-mint/post/18c2a0dd-5bd7-47d7-87cd-8203ad325a3b/image.gif" alt="퀵 정렬"></p>
<ul>
<li>분할 정복 알고리즘을 사용하는 정렬방식</li>
<li>피벗(pivot)이라는 기준점을 선택하고 정렬의 조건에 따라 피벗 왼쪽, 피벗 오른쪽으로 적절한 값을 분할하여 재귀적으로 정렬</li>
<li>최악의 경우 시간복잡도가 $n^2$이지만 대부분의 컴퓨터 아키텍처에서 효율적으로 작동하도록 설계하므로 해당 경우가 거의 발생하지 않도록 알고리즘 설계가 가능함</li>
<li>매 단계에서 적어도 1개의 원소가 자리를 찾으므로 정렬을 하면 할수록 정렬할 개수가 줄어듦</li>
<li>일반적인 경우 $nlogn$의 시간복잡도를 가진 알고리즘에 비해 훨씬 빠르게 동작함</li>
</ul>
<h4 id="1-알고리즘-수행-단계-3">(1) 알고리즘 수행 단계</h4>
<ol>
<li>배열에서 임의로 기준점이 될 피벗 요소를 선택</li>
<li>오름차순일 경우 피벗보다 작은 요소들은 왼쪽에, 큰 요소들은 오른쪽에 배치하고 내림차순일 경우 반대로 배치</li>
<li>피벗을 기준으로 배열을 두 부분으로 나눔</li>
<li>각 부분을 재귀적으로 정렬</li>
</ol>
<h4 id="2-구현-코드-3">(2) 구현 코드</h4>
<pre><code class="language-python">def quick_sort(arr):
    if len(arr) &lt;= 1:
        return arr
    pivot = arr[len(arr) // 2]
    left = [x for x in arr if x &lt; pivot]
    middle = [x for x in arr if x == pivot]
    right = [x for x in arr if x &gt; pivot]
    return quick_sort(left) + middle + quick_sort(right)</code></pre>
<h3 id="5-병합-정렬">5) 병합 정렬</h3>
<ul>
<li>분할 정복 알고리즘을 사용한 정렬방식</li>
<li>배열을 반으로 나눠 각 부분을 정렬한 다음 그 결과를 병합</li>
</ul>
<h4 id="1-알고리즘-수행-단계-4">(1) 알고리즘 수행 단계</h4>
<ol>
<li>배열을 절반으로 나눔</li>
<li>각 부분을 재귀적으로 정렬</li>
<li>정렬된 두 부분을 병합하는 것을 반복해 정렬</li>
</ol>
<h4 id="2-구현-코드-4">(2) 구현 코드</h4>
<pre><code class="language-python">def merge_sort(arr):
    if len(arr) &gt; 1:
        mid = len(arr)//2
        L = arr[:mid]
        R = arr[mid:]

        merge_sort(L)
        merge_sort(R)

        i = j = k = 0

        while i &lt; len(L) and j &lt; len(R):
            if L[i] &lt; R[j]:
                arr[k] = L[i]
                i += 1
            else:
                arr[k] = R[j]
                j += 1
            k += 1

        while i &lt; len(L):
            arr[k] = L[i]
            i += 1
            k += 1

        while j &lt; len(R):
            arr[k] = R[j]
            j += 1
            k += 1

    return arr</code></pre>
<h3 id="6-힙-정렬">6) 힙 정렬</h3>
<p><img src="https://velog.velcdn.com/images/apple-mint/post/30faf387-82e9-4b15-89ee-24375238e682/image.gif" alt="힙 정렬"></p>
<ul>
<li>힙 데이터를 이용한 정렬방식</li>
<li>오름차순 정렬 시 최대 힙, 내림차순 정렬 시 최소 힙을 구성하여 정렬</li>
</ul>
<h4 id="1-알고리즘-수행-단계-5">(1) 알고리즘 수행 단계</h4>
<ol>
<li>배열을 힙으로 변환</li>
<li>최대 힙의 루트 요소를 제거하고 배열의 마지막 요소와 교환</li>
<li>힙의 크기를 줄이고 힙 속성을 유지</li>
<li>2~3번을 반복하며 정렬</li>
</ol>
<h4 id="2-구현-코드-5">(2) 구현 코드</h4>
<pre><code class="language-python">def heapify(arr, n, i):
    largest = i  # 루트를 최대값으로 가정
    l = 2 * i + 1  # 왼쪽 자식
    r = 2 * i + 2  # 오른쪽 자식

    # 왼쪽 자식이 루트보다 크다면
    if l &lt; n and arr[l] &gt; arr[largest]:
        largest = l

    # 오른쪽 자식이 현재 최대값보다 크다면
    if r &lt; n and arr[r] &gt; arr[largest]:
        largest = r

    # 최대값이 루트가 아니라면
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]  # 교환

        # 교환된 루트에 대해 다시 힙 구성
        heapify(arr, n, largest)

def heap_sort(arr):
    n = len(arr)

    # 초기 최대 힙 구성
    for i in range(n // 2 - 1, -1, -1):
        heapify(arr, n, i)

    # 하나씩 원소를 꺼내어 다시 최대 힙 구성
    for i in range(n-1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]  # 루트와 마지막 요소 교환
        heapify(arr, i, 0)</code></pre>
<h3 id="참고">참고</h3>
<ul>
<li><a href="https://github.com/kangtegong/cs/tree/main/ds/sorting">『이것이 취업을 위한 컴퓨터 과학이다』 (한빛미디어) 깃허브</a></li>
<li><a href="https://ko.wikipedia.org/wiki/%EC%A0%95%EB%A0%AC_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98">정렬 알고리즘 - 위키백과</a></li>
<li><a href="https://wikidocs.net/218658">13장 정렬 알고리즘 - 좌충우돌, 파이썬으로 자료구조 구현하기</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[241125 CS 스터디]]></title>
            <link>https://velog.io/@apple-mint/cs241125</link>
            <guid>https://velog.io/@apple-mint/cs241125</guid>
            <pubDate>Mon, 25 Nov 2024 14:49:22 GMT</pubDate>
            <description><![CDATA[<h2 id="가상-머신과-컨테이너">가상 머신과 컨테이너</h2>
<h3 id="1-가상-머신">1) 가상 머신</h3>
<h4 id="1-정의-및-특징">(1) 정의 및 특징</h4>
<ul>
<li>소프트웨어적으로 만들어 낸 가상의 컴퓨터</li>
<li>기존 운영체제와는 독립된 환경을 구축하고 해당 환경에서 애플리케이션을 작동시킬 수 있음</li>
<li>하드웨어 수준의 자원 격리 및 가상화를 제공함</li>
<li>클라우드 컴퓨팅 및 인공지능과 같이 최근 고도화된 기술 대부분은 가상 머신 개념에 뿌리를 두고 있음</li>
</ul>
<ul>
<li>장점<ul>
<li>리소스 활용도 및 ROI 개선</li>
<li>주어진 워크로드 요구 사항에 빠르게 반응</li>
<li>네트워크 물리적 컴퓨터 간 재배치가 가능하므로 이식성이 뛰어남</li>
<li>쉽게 가상 머신을 복제할 수 있어 유연성이 높음</li>
<li>생성하고 설정하는 것이 쉬우므로 악성 소프트웨어에 민감하게 대처 가능</li>
<li>물리적 서버 수가 줄어들어 지속 가능성이 높음</li>
</ul>
</li>
</ul>
<ul>
<li>단점<ul>
<li>호스트 컴퓨터에서 사용할 수 있는 하드웨어 리소스에 따라 성능이 달라짐</li>
<li>구성 및 관리가 복잡해질 수 있음</li>
<li>하나의 물리적 컴퓨터에 의존하므로 단일 장애 지점 발생 가능성이 있음</li>
</ul>
</li>
</ul>
<h4 id="2-작동-방식">(2) 작동 방식</h4>
<p><img src="https://velog.velcdn.com/images/apple-mint/post/69adc035-c5b8-41a0-ae3d-cc3266fbff2c/image.png" alt="가상 머신 작동 방식"></p>
<ul>
<li>하이퍼바이저라는 소프트웨어를 통해 가상 머신을 만들고 실행함</li>
<li>가상 머신이 실행되는 물리적 머신을 호스트, 호스트에서 실행되는 가상 머신을 게스트라고 함</li>
<li>하이퍼바이저는 컴퓨팅, 메모리, 스토리지와 같은 호스트 머신의 물리적 리소스를 필요에 따라 프로비저닝(가상 머신을 생성하고 설정)하고 게스트 가서 머신에 동적할 수 있는 풀로 추상화하여 전반적인 유연성과 효율성을 높임</li>
</ul>
<h3 id="2-컨테이너">2) 컨테이너</h3>
<h4 id="1-정의-및-특징-1">(1) 정의 및 특징</h4>
<ul>
<li>구동하려는 애플리케이션을 실행할 수 있는 환경까지 감싸서 어디서든 쉽게 실행할 수 있도록 하는 가상화 및 자원 격리 기술</li>
<li>애플리케이션을 실행하는 데에 필요한 모든 구성 요소와 기능을 갖춘 소프트웨어 단위</li>
<li>기본적으로 동일한 운영체제(커널)을 공유함</li>
<li>주어진 특정 프로세스를 실행하는 데에 필요한 자원만을 격리</li>
</ul>
<ul>
<li>장점<ul>
<li>하나의 OS 위에서 동작하므로 OS를 매번 설치할 필요가 없음</li>
<li>하나의 컨테이너가 매우 작으므로 가상 머신에 비해 가벼움</li>
<li>컨테이너를 모든 종속성을 수반하므로 다음 컴퓨팅 환경에서 이식 가능함</li>
<li>플랫폼 전반에 걸친 배포 이식성, 일관성, 작은 크기의 조합으로 마이크로서비스 아키텍처를 활성화할 수 있음</li>
<li>시스템 리소스에 대한 의존도가 낮아 빠르게 관리하고 배포할 수 있음</li>
</ul>
</li>
</ul>
<ul>
<li>단점<ul>
<li>특정 프로그램의 문제로 OS 문제가 유발될 경우 다른 프로그램까지 시스템이 중단될 가능성이 있음</li>
<li>다른 OS와의 호환성 문제가 발생할 수 있음</li>
<li>컨테이너 간 리소스 공유로 보안 취약점 발생 가능</li>
</ul>
</li>
</ul>
<h4 id="2-작동-방식-1">(2) 작동 방식</h4>
<p><img src="https://velog.velcdn.com/images/apple-mint/post/a9b73b06-12ff-4428-b120-cbc4733e0813/image.png" alt="컨테이너 작동 방식"></p>
<ul>
<li>도커와 같은 컨테이너 런타임이라는 컨테이너를 다루는 도구를 사용</li>
<li>OS 커널을 공유하는 가상화라고 표현할 수 있음</li>
<li>컨테이너 내 모든 요소를 패키징하여 모든 라이브러리와 종속성을 포함한 파일인 컨테이너 이미지를 사용하여 배포</li>
<li>특정 애플리케이션 실행에 필요한 라이브러리를 비롯한 코드, 파일 등이 모두 담겨 있는 통 혹은 특정 애플리케이션 실행에 필요한 모든 것들의 묶음으로 봐도 무방함</li>
<li>보통 수백 개의 컨테이너가 탄력적으로 결합되어 있는데 이를 효율적으로 관리하기 위해 쿠버네티스와 같은 컨테이너 오케스트레이션 플랫폼을 사용함</li>
</ul>
<h3 id="참고">참고</h3>
<ul>
<li><a href="https://cloud.google.com/learn/what-is-a-virtual-machine?hl=ko">가상 머신이란? VM의 용도 및 이점</a></li>
<li><a href="https://www.ibm.com/kr-ko/topics/virtual-machines">가상 머신(VM)이란 무엇인가요?</a></li>
<li><a href="https://www.samsungsds.com/kr/insights/220222_kubernetes1.html">쿠버네티스 알아보기 1편: 쿠버네티스와 컨테이너, 도커에 대한 기본 개념</a></li>
<li><a href="https://www.ibm.com/kr-ko/topics/containers">컨테이너란 무엇인가요?</a></li>
<li><a href="https://www.openmaru.io/%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88-%EA%B8%B0%EC%88%A0-%EC%86%8C%EA%B0%9C/">컨테이너 를 꼭 사용해야 하는 이유는?</a></li>
<li><a href="https://www.redhat.com/ko/topics/containers/containers-vs-vms">컨테이너 vs VM(버추얼 머신, 가상 머신) : 차이점과 비교 분석</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[241121 CS 스터디]]></title>
            <link>https://velog.io/@apple-mint/cs241121</link>
            <guid>https://velog.io/@apple-mint/cs241121</guid>
            <pubDate>Thu, 21 Nov 2024 14:04:10 GMT</pubDate>
            <description><![CDATA[<h2 id="프로세스와-스레드의-차이">프로세스와 스레드의 차이</h2>
<h3 id="1-프로세스">1) 프로세스</h3>
<ul>
<li>운영체제로부터 자원을 할당받은 <strong>작업의 단위</strong></li>
<li>실행 중인 프로그램을 지칭하며, 컴퓨터에서 연속적으로 실행되고 있는 프로그램을 의미함</li>
<li>종종 스케줄링의 대상이 되는 작업(task) 용어와 거의 유사한 의미로 쓰임</li>
<li>아래와 같이 작업 관리자 창을 열어보면 현재 실행 중인 프로그램이 <strong>프로세스</strong>에 뜨는 것을 확인할 수 있음
<img src="https://velog.velcdn.com/images/apple-mint/post/fea1b554-a879-4889-ac5a-0ab27caf09cf/image.png" alt="프로세스 이미지"></li>
<li>하나의 프로세스만을 사용해서 프로그램 실행 시 해당 실행이 다 끝날 때까지 대기해야 함</li>
<li><strong>멀티프로세스</strong>로 하나의 프로그램에 동시에 여러 프로세스를 실행할 수 있으나 CPU, 메모리 자원을 중복해서 사용하는 문제가 있음</li>
</ul>
<h3 id="2-스레드">2) 스레드</h3>
<ul>
<li>위와 같은 프로세스의 문제를 해결하기 위해 스레드 등장</li>
<li>프로세스가 할당받은 자원을 이용하는 <strong>실행 흐름의 단위</strong></li>
<li>일반적으로 하나의 프로그램은 하나의 스레드를 가지고 있으나 둘 이상의 스레드를 동시에 실행할 수도 있음</li>
<li>아래의 이미지처럼 하나의 프로그램을 실행하는 프로세스 안에 둘 이상의 스레드가 진행되는 것을 <strong>멀티스레드</strong>라고 함
<img src="https://velog.velcdn.com/images/apple-mint/post/e64ccfb9-e8a9-44b3-b2bc-d6160d6e0d09/image.png" alt="스레드 이미지"></li>
<li>이러한 스레드의 수가 많을수록 속도가 빨라지므로 성능이 향상됨</li>
</ul>
<h3 id="3-멀티프로세스와-멀티스레드">3) 멀티프로세스와 멀티스레드</h3>
<p><img src="https://velog.velcdn.com/images/apple-mint/post/74a7957a-56ba-4274-a812-cc1aafecc51f/image.png" alt="멀티프로세스와 멀티스레드"></p>
<h4 id="1-멀티프로세스">(1) 멀티프로세스</h4>
<ul>
<li>하나의 부모 프로세스가 여러 개의 자식 프로세스를 생성함으로써 다중 프로세스를 구성하는 구조</li>
</ul>
<ul>
<li>자원을 공유하지 않고 독립적인 메모리 공간을 가짐<ul>
<li>안전성 확보</li>
<li>서버 클러스터와 같은 시스템 규모 확장 가능</li>
<li>자원을 공유하지 않으므로 메모리 사용량이 증가함</li>
</ul>
</li>
</ul>
<ul>
<li>문맥 교환 과정에서 CPU 캐시에 있는 모든 내용을 초기화하고 새로운 프로세스 정보를 CPU 캐시에 적재해야 하므로 성능 저하 및 높은 비용이 발생할 수 있음</li>
</ul>
<h4 id="2-멀티스레드">(2) 멀티스레드</h4>
<ul>
<li><p>하나의 프로세스 안에 여러 개의 스레드가 있는 구조</p>
</li>
<li><p>하나의 프로그램에서 두가지 이상의 동작을 동시에 처리하도록 하는 행위가 가능함</p>
</li>
<li><p>프로세스 내에서 생성되므로 실행 환경 설정이 간단하고 용량이 가벼움</p>
</li>
</ul>
<ul>
<li>하나의 프로세스 내에서 동작하므로 자원 공유가 가능<ul>
<li>효율적인 자원 활용</li>
<li>멀티프로세스에 비해 안정성이 떨어짐</li>
<li>동기화로 인한 성능 저하 발생 가능성이 있음</li>
</ul>
</li>
</ul>
<ul>
<li>문맥 교환 과정에서 스레드 간 공유 자원을 제외한 스레드 정보만을 교체하면 되므로 비교적 성능 저하 우려가 낮고 상대적으로 적은 비용이 발생함</li>
</ul>
<h3 id="참고">참고</h3>
<ul>
<li><a href="https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4#%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8_%EA%B3%BC_%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4">완전히 정복하는 프로세스 vs 스레드 개념</a></li>
<li><a href="https://ko.wikipedia.org/wiki/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4">위키백과 - 프로세스</a></li>
<li><a href="https://ko.wikipedia.org/wiki/%EC%8A%A4%EB%A0%88%EB%93%9C_(%EC%BB%B4%ED%93%A8%ED%8C%85)">위키백과 - 스레드 (컴퓨팅)</a></li>
<li><a href="https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-multi-process-multi-thread#%EB%A9%80%ED%8B%B0_%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%9D%98_%EC%9E%A5%EC%A0%90">멀티 프로세스 vs 멀티 스레드 비교 💯 완전 총정리</a></li>
<li><a href="https://www.geekboots.com/story/multiprocessing-vs-multithreading">multiprocessing-vs-multithreading</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[241118 CS 스터디]]></title>
            <link>https://velog.io/@apple-mint/cs241118</link>
            <guid>https://velog.io/@apple-mint/cs241118</guid>
            <pubDate>Mon, 18 Nov 2024 13:57:22 GMT</pubDate>
            <description><![CDATA[<h2 id="gpu의-용도와-처리-방식">GPU의 용도와 처리 방식</h2>
<h3 id="1-gpu의-정의">1) GPU의 정의</h3>
<ul>
<li>그래픽 처리 장치</li>
<li>대량의 그래픽 연산을 위해 탄생한 장치</li>
<li>GPU가 CPU의 산술 연산을 보조하므로 보조프로세서라고 부르기도 함</li>
</ul>
<h3 id="2-gpu의-용도">2) GPU의 용도</h3>
<ul>
<li>비디오 게임 그래픽 렌더링 등 대량의 그래픽 연산 시 활용</li>
<li>그외에도 딥러닝 연산, 가상화폐 채굴 등 다양한 분야에 대한 연산에서 범용적인 목적으로 활용됨</li>
<li>최근 AI 발전을 위해 고성능 GPU를 보유하고 사용하는 것이 중요</li>
</ul>
<ul>
<li>GPGPU: 범용적인 목적의 GPU 사용 기술</li>
</ul>
<h3 id="3-gpu의-특징">3) GPU의 특징</h3>
<h4 id="1-병렬-처리">(1) 병렬 처리</h4>
<ul>
<li>CPU의 코어보다는 개별 코어의 성능은 떨어지지만 수백 개에서 수천 개의 코어가 포함되어 있음</li>
<li>어떠한 크고 복잡한 문제를 쉽고 간단한 여러 문제로 쪼갠 뒤 이를 처리할 수 있는 수단을 동시에 동원해 빠르게 문제를 해결함</li>
</ul>
<h4 id="2-구성-요소">(2) 구성 요소</h4>
<ul>
<li>GPU 코어: 수백 개에서 수천 개의 개별 GPU 코어로 구성</li>
<li>캐시 메모리: L1 캐시, L2 캐시 메모리 등</li>
<li>RAM: 많게는 수십 기가바이트에 이르는 용량</li>
</ul>
<h4 id="3-작업-방식">(3) 작업 방식</h4>
<ul>
<li>직접 소스 코드를 입력해 수행할 작업을 지정하는 경우가 많음</li>
<li>CUDA를 이용해 일반적인 프로그래밍 언어로 GPU 수행 작업을 작성</li>
</ul>
<ul>
<li>CUDA<ul>
<li>엔비디아에서 개발한 프로그래밍 모델</li>
<li>CPU가 실행할 코드인 호스트 코드, GPU가 실행할 코드인 디바이스 코드로 구성되어 있음</li>
<li>CPU가 호스트 코드를 실행하다가 디바이스 코드가 나오면 해당 코드가 GPU 메모리로 복사되고 GPU는 이 코드를 실행해 결과를 CPU에게 전달</li>
</ul>
</li>
</ul>
<h4 id="4-cpu와의-차이점">(4) CPU와의 차이점</h4>
<table>
<thead>
<tr>
<th align="center">CPU</th>
<th align="center">GPU</th>
</tr>
</thead>
<tbody><tr>
<td align="center">강력한 소수의 코어가 포함</td>
<td align="center">약한 다수의 코어가 포함</td>
</tr>
<tr>
<td align="center">한번에 하나의 작업을 수행<br>=&gt; 직렬 명령 처리</td>
<td align="center">한번에 여러 작업을 수행<br>=&gt; 병렬 명령 처리</td>
</tr>
<tr>
<td align="center">ALU, 제어장치, 레지스터, 캐시의 처리 구조가 복잡</td>
<td align="center">제어장치를 공유하는 수많은 ALU, 캐시로 구성됨</td>
</tr>
<tr>
<td align="center">다양한 환경의 작업을 처리</td>
<td align="center">특화된 연산을 처리</td>
</tr>
<tr>
<td align="center">낮은 대기 시간 강조</td>
<td align="center">높은 처리량 강조</td>
</tr>
</tbody></table>
<h3 id="참고자료">참고자료</h3>
<ul>
<li><a href="https://blog.naver.com/nhncloud_official/223416323941">[클라우드 용어집] GPU란 무엇인가(개념, CPU/GPU 차이, 필요성 등)</a></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[241107 CS 스터디]]></title>
            <link>https://velog.io/@apple-mint/cs241107</link>
            <guid>https://velog.io/@apple-mint/cs241107</guid>
            <pubDate>Thu, 07 Nov 2024 14:15:14 GMT</pubDate>
            <description><![CDATA[<h2 id="5-데이터베이스-설계">5. 데이터베이스 설계</h2>
<h3 id="1-er-다이어그램erd">1) ER 다이어그램(ERD)</h3>
<ul>
<li>엔티티 관계를 표현</li>
<li>데이터베이스에 저장되는 엔티티의 구조를 모델링하는 것이 목적</li>
<li>데이터베이스로 표현할 대상을 시각적으로 설계하는 것을 의미</li>
<li>데이터베이스 확장, 수정 시 어떤 부분이 영향을 받는지 쉽게 파악 가능</li>
<li>유지보수나 개발자 간 원활한 소통에 도움을 줌</li>
<li>효율적인 데이터 관리에 이어 매우 중요한 과정임</li>
<li>표기 방식으로 피터 첸 표기법, IE 표기법 등이 있으며 현재는 IE 표기법을 사용함</li>
</ul>
<h3 id="2-정규화">2) 정규화</h3>
<ul>
<li>잠재적인 문제가 발생하지 않도록 테이블의 필드를 구성하고 필요할 경우 테이블을 나누는 작업</li>
<li>잠재적인 문제가 발생하지 않도록 잘 조직된 테이블이 되기 위해 지켜야 하는 규칙</li>
<li>제1정규형, 제2정규형, 제3정규형, 보이스/코드 정규형, 제4정규형, 제5 정규형이 있음</li>
</ul>
<h4 id="1-제1정규형">(1) 제1정규형</h4>
<ul>
<li>모든 속성이 원자 값을 가진다는 조건을 만족해야 함</li>
<li>필드 데이터가 더이상 쪼개질 수 없는 값을 가져야 함</li>
</ul>
<h4 id="2-제2정규형">(2) 제2정규형</h4>
<ul>
<li>제1정규형을 만족함과 동시에 기본 키가 아닌 모든 필드들이 모든 기본 키에 완전히 종속되어야 한다는 조건을 만족해야 함</li>
<li>보통 기본 키가 2개 이상의 필드로 구성될 때 고려됨</li>
<li>부분 함수 종속성이 없는 상태, 후보 키에 속하지 않는 모든 필드가 기본 키에 완전 함수 종속인 상태여야 함</li>
</ul>
<ul>
<li>부분 함수 종속성<ul>
<li>기본 키가 아닌 필드가 기본 키의 일부에 종속되어 있는 경우</li>
</ul>
</li>
<li>완전 함수 종속성<ul>
<li>기본 키 전체에 완전하게 종속되어 있는 경우</li>
</ul>
</li>
</ul>
<h4 id="3-제3정규형">(3) 제3정규형</h4>
<ul>
<li>제2정규형을 만족함과 동시에 기본 키가 아닌 모든 필드가 기본 키에 이행적 종속성이 없어야 한다는 조건을 만족해야 함</li>
<li>기본 키가 아닌 나머지 모든 필드들이 간접적으로라도 종속되어서는 안되며, 기본 키가 아닌 나머지 모든 필드는 서로를 유추하거나 결정할 수 없어야 한다는 조건을 만족해야 함</li>
</ul>
<h4 id="4-보이스코드-정규형bcnf">(4) 보이스/코드 정규형(BCNF)</h4>
<ul>
<li>제3정규형을 만족하는 동시에 모든 결정자가 후보 키여야 한다는 조건을 만족해야 함</li>
</ul>
<h4 id="5-역정규화">(5) 역정규화</h4>
<ul>
<li>검색의 속도를 높이기 위해 분할되어 있는 테이블을 하나로 합치는 작업</li>
<li>어느 정도의 데이터 중복과 삽입/수정/삭제 연산에서의 번거로움을 감수하고 가급적 하나의 테이블로 데이터를 관리</li>
</ul>
<h2 id="6-nosql">6. NoSQL</h2>
<ul>
<li>Not Only SQL의 약자</li>
<li>레코드를 테이블 형태 이외 다양한 형태로 저장할 수 있음</li>
<li>SQL 이외의 방법으로 저장된 데이터를 다룰 수 있음</li>
<li>높은 부하를 감당하거나 대용량 데이터를 다루는 분산 환경에서 주로 사용</li>
<li>확장성, 유연성, 가용성, 성능이 주요 이점</li>
<li>키-값 데이터베이스, 도큐먼트 데이터베이스, 그래프 데이터베이스, 칼럼 패밀리 데이터베이스가 있음</li>
</ul>
<h3 id="1-키-값-데이터베이스">1) 키-값 데이터베이스</h3>
<ul>
<li>데이터베이스에 레코드를 키(필드)와 값의 쌍으로 저장하는 데이터베이스</li>
<li>가장 간단한 형태의 NoSQL 데이터베이스 유형</li>
<li>값으로 문자열, 리스트, 해시 테이블, 집합 등 다양한 자료구조를 사용할 수 있음</li>
<li>Redis, Memcached 등이 대표적</li>
<li>레코드 구조가 단순해 메모리에 저장해 빠른 데이터베이스 접근 속도를 제공하는 경우 인메모리 데이터베이스라고 함</li>
<li>캐시나 세션 등 비교적 가벼운 정보를 저장하는 경우가 많고 보조 데이터베이스로써 사용되는 경우도 많음</li>
</ul>
<h3 id="2-도큐먼트-데이터베이스">2) 도큐먼트 데이터베이스</h3>
<ul>
<li>정형화되어 있지 않은 NoSQL 레코드의 단위를 통칭하는 도큐먼트 단위로 레코드를 저장하고 관리하는 데이터베이스</li>
<li>JSON, XML과 같은 형식을 도큐먼트로 활용</li>
<li>MongoDB가 대표적</li>
<li>도큐먼트의 키가 필드, 도큐먼트 데이터 하나하나가 행임</li>
<li>도큐먼트가 모여 컬렉션을 이루고 컬렉션이 모여 데이터베이스를 이룸</li>
<li>고정된 스키마가 없기 때문에 유연한 스키마를 가짐</li>
</ul>
<h3 id="3-그래프-데이터베이스">3) 그래프 데이터베이스</h3>
<ul>
<li>그래프의 노드 형태로 데이터를 저장하는 데이터베이스</li>
<li>neo4j가 대표적</li>
<li>방향 그래프를 표현하기 위해 활용</li>
<li>노드 간 연결 관계, 방향을 표현할 수 있어 SNS 친구 관계, 교통망과 같은 데이터 간의 관계성이 중요한 레코드를 저장하기 위해 사용</li>
</ul>
<h3 id="4-칼럼-패밀리-데이터베이스">4) 칼럼 패밀리 데이터베이스</h3>
<ul>
<li>RDBMS처럼 행과 열이 있고, 로우 키를 통해 특정 행을 식별하나 정규화나 조인을 사용하지 않고 스키마가 고정되어 있지 않은 데이터베이스</li>
<li>동적으로 변할 수 있는 열이 있으며, 거기에 행 데이터들이 대응되어 있는 형태</li>
<li>Cassandra, HBase 등이 대표적</li>
<li>관련 있는 열들이 모여 칼럼 패밀리 단위를 형성하고, 칼럼 패밀리는 키스페이스라는 여러 칼럼 패밀리들을 포괄하는 최상위 단위를 형성함</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[241104 CS 스터디]]></title>
            <link>https://velog.io/@apple-mint/cs241104</link>
            <guid>https://velog.io/@apple-mint/cs241104</guid>
            <pubDate>Mon, 04 Nov 2024 11:22:28 GMT</pubDate>
            <description><![CDATA[<h2 id="1-데이터베이스의-큰-그림">1. 데이터베이스의 큰 그림</h2>
<h3 id="1-데이터베이스와-dbms">1) 데이터베이스와 DBMS</h3>
<ul>
<li>데이터베이스: 원하는 기능을 동작시키기 위해 마땅히 저장해야 하는 정보의 집합</li>
<li>데이터베이스 관리 시스템(DBMS): 데이터베이스를 관리하기 위한 프로그램</li>
<li>크게 관계형 데이터베이스 관리 시스템, NoSQL 데이터베이스 관리 시스템이 있음</li>
<li>DBMS 클라이언트는 DBMS에서 쿼리를 보냄</li>
</ul>
<h3 id="2-sql-종류">2) SQL 종류</h3>
<ul>
<li>데이터베이스에 질의하기 위한 구조화된 언어를 말함</li>
</ul>
<h4 id="1-ddl">(1) DDL</h4>
<ul>
<li>CREATE: 데이터베이스, 테이블, 뷰, 인덱스 등의 데이터베이스 객체 생성</li>
<li>ALTER: 데이터베이스 객체 갱신</li>
<li>DROP: 데이터베이스 객체 삭제</li>
<li>TRUNCATE: 테이블 구조를 유지한 채 모든 레코드 삭제</li>
</ul>
<h4 id="2-dml">(2) DML</h4>
<ul>
<li>SELECT: 테이블의 레코드 조회</li>
<li>INSERT: 테이블에 레코드 삽입</li>
<li>UPDATE: 테이블의 레코드 갱신</li>
<li>DELETE: 테이블의 레코드 삭제</li>
</ul>
<h4 id="3-dcl">(3) DCL</h4>
<ul>
<li>COMMIT: 데이터베이스에 작업 반영</li>
<li>ROLLBACK: 작업 이전의 상태로 되돌림</li>
<li>SAVEPOINT: 롤백 기준점 설정</li>
</ul>
<h4 id="4-tcl">(4) TCL</h4>
<ul>
<li>GRANT: 사용자에게 권한 부여</li>
<li>REVOKE: 사용자로부터 권한 회수</li>
</ul>
<h3 id="3-데이터베이스를-이용하는-이유">3) 데이터베이스를 이용하는 이유</h3>
<ul>
<li>데이터 일관성 및 무결성 제공이 가능함</li>
<li>불필요한 중복 저장을 피할 수 있음</li>
<li>데이터 변경시 연관 데이터 변경이 가능함</li>
<li>정교한 검색이 가능함</li>
<li>백업 및 복구가 가능함</li>
</ul>
<h3 id="4-데이터베이스의-저장-단위와-트랜잭션">4) 데이터베이스의 저장 단위와 트랜잭션</h3>
<ul>
<li>엔티티: 독립적으로 존재할 수 있는 객체</li>
<li>속성: 엔티티의 특성</li>
<li>엔티티 집합: 같은 속성을 공유하는 개별 엔티티</li>
<li>릴레이션: 2차원 테이블 형태의 엔티티 집합</li>
<li>컬렉션: NoSQL의 일종인 RDBMS에서 표현하는 엔티티 집합</li>
<li>레코드: 데이터베이스에 기록된 각각의 엔티티</li>
<li>필드: 데이터베이스에 저장된 엔티티 속성</li>
</ul>
<ul>
<li>스키마<ul>
<li>RDBMS와 NoSQL을 구분하는 주요 기준 중 하나</li>
<li>데이터베이스에 저장되는 레코드의 구조와 제약 조건을 정의</li>
<li>RDBMS는 명확하나 NoSQL은 그렇지 않음</li>
</ul>
</li>
</ul>
<ul>
<li>트랜잭션<ul>
<li>데이터베이스와의 논리적 상호작용의 단위</li>
<li>초당 트랜잭션 지표로 데이터베이스의 작업 성능을 나타내기도 함</li>
<li>트랜잭션은 하나 이상의 쿼리를 포함할 수 있음</li>
</ul>
</li>
</ul>
<h3 id="5-acid">5) ACID</h3>
<ul>
<li>원자성: 하나의 트랜잭션 결과가 모두 성공하거나 실패하는 성질</li>
<li>일관성: 트랜잭션 전후로 데이터베이스가 일관된 상태를 유지하는 성질</li>
<li>격리성: 동시에 수행되는 여러 트랜잭션이 서로 간섭하지 않도록 보장하는 성질</li>
<li>지속성: 트랜잭션이 성공적으로 끝난 뒤 그 결과가 영구적으로 반영되는 성질</li>
</ul>
<h2 id="2-rdbms의-기본">2. RDBMS의 기본</h2>
<h3 id="1-필드-유형">1) 필드 유형</h3>
<ul>
<li>각 필드로 사용 가능한 데이터 유형</li>
</ul>
<h4 id="1-숫자형">(1) 숫자형</h4>
<ul>
<li>TINYINT, SMALLIT, MEDIUMINT, INT, BIGINT, FLOAT, DOUBLE, DECIMAL</li>
</ul>
<h4 id="2-문자형">(2) 문자형</h4>
<ul>
<li>CHAR, VARCHAR, BLOB, TEXT</li>
</ul>
<h4 id="3-날짜시간형">(3) 날짜/시간형</h4>
<ul>
<li>DATE, TIME, DATETIME, TIMESTAMP</li>
</ul>
<h4 id="4-기타">(4) 기타</h4>
<ul>
<li>ENUM, GEOMETRY, XML, JSON</li>
</ul>
<h3 id="2-키">2) 키</h3>
<p>테이블 내 특정 레코드를 식별할 수 있는 필드의 집합</p>
<ul>
<li>테이블의 각 레코드를 식별하는 용도로 사용</li>
<li>테이블 간 참조를 위해 사용</li>
<li>테이블 접근 속도를 높이기 위해 사용</li>
</ul>
<h4 id="1-기본-키">(1) 기본 키</h4>
<ul>
<li>한 레코드를 식별하도록 선정되어 테이블당 하나만 존재할 수 있는 키</li>
<li>유일성과 최소성을 모두 만족함</li>
<li>여러 필드로 구성된 기본 키도 존재할 수 있음</li>
<li>중복 값이 없어야 하고 반드시 값이 존재해야 함</li>
<li>레코드를 구분하기 위한 최소한의 정보만으로 이루어져야 함</li>
</ul>
<h4 id="2-외래-키">(2) 외래 키</h4>
<ul>
<li>다른 테이블의 기본 키를 참조하는 필드</li>
<li>테이블 간 참조 관계 형성 시 사용하는 키</li>
</ul>
<h4 id="3-후보-키">(3) 후보 키</h4>
<ul>
<li>테이블의 한 레코드를 식별하기 위한 필드의 최소 집합</li>
<li>유일성과 최소성을 모두 만족하는 키</li>
</ul>
<h4 id="4-복합-키">(4) 복합 키</h4>
<ul>
<li>2개 이상의 필드로 구성된 후보 키</li>
</ul>
<h4 id="5-슈퍼-키">(5) 슈퍼 키</h4>
<ul>
<li>레코드를 식별하기 위한 필드의 집합</li>
<li>유일성만 만족하고 최소성은 만족하지 않음</li>
</ul>
<h4 id="6-대체-키">(6) 대체 키</h4>
<ul>
<li>기본 키가 아닌 후보 키</li>
<li>기본 키 선정 이후 남은 후보 키</li>
</ul>
<h3 id="3-테이블-간-관계">3) 테이블 간 관계</h3>
<ul>
<li>일대일 대응 관계: 하나의 레코드가 다른 테이블의 레코드 하나에만 대응되는 경우</li>
<li>일대다 대응 관계: 하나의 레코드가 다른 테이블의 여러 레코드와 대응될 수 있는 경우</li>
<li>다대다 대응 관계: 한 테이블의 여러 레코드가 다른 테이블의 여러 레코드와 대응되는 경우</li>
</ul>
<h3 id="4-무결성-제약-조건">4) 무결성 제약 조건</h3>
<ul>
<li>데이터베이스에 저장된 데이터의 일관성과 유효성을 유지하기 위해 지켜야 하는 조건</li>
</ul>
<h4 id="1-도메인-제약-조건">(1) 도메인 제약 조건</h4>
<ul>
<li>테이블이 가질 수 있는 필드 타입과 범위에 대한 규칙</li>
<li>각각의 필드 데이터는 원자 값을 가져야 함</li>
<li>지정된 필드 타입을 준수해야 함</li>
<li>값의 범위나 기본값이 지정되었을 경우 이를 따라야 함</li>
</ul>
<h4 id="2-키-제약-조건">(2) 키 제약 조건</h4>
<ul>
<li>레코드를 고유하게 식별할 수 있는 키</li>
<li>지정된 필드에 중복된 값이 존재해서는 안된다는 제약 조건</li>
</ul>
<h4 id="3-엔티티-무결성-제약-조건">(3) 엔티티 무결성 제약 조건</h4>
<ul>
<li>기본 키로 지정한 필드는 고유한 값이어야 하며 NULL이 되어서는 안된다는 규칙</li>
<li>기본 키 제약 조건이라고도 부름</li>
</ul>
<h4 id="4-참조-무결성-제약-조건">(4) 참조 무결성 제약 조건</h4>
<ul>
<li>외래 키를 통해 다른 테이블을 참조할 때 데이터의 일관성을 지키기 위한 제약 조건</li>
<li>외래 키는 참조하는 테이블의 기본 키와 같은 값일 갖거나 NULL값을 가져야 한다는 규칙</li>
<li>외래 키 제약 조건이라고도 부름</li>
</ul>
<h2 id="3-sql">3. SQL</h2>
<h3 id="1-ddl-데이터-정의-언어">1) DDL: 데이터 정의 언어</h3>
<h4 id="1-create">(1) CREATE</h4>
<ul>
<li>데이터베이스, 테이블, 뷰, 인덱스, 그 외 사용자까지 데이터베이스에서 관리할 수 있는 다양한 대상을 정의함</li>
</ul>
<h4 id="2-alter">(2) ALTER</h4>
<ul>
<li>CREATE TABLE문을 통해 생성된 테이블에 새로운 필드 추가/수정/삭제할 수 있고 제약 조건 또한 새롭게 추가/수정/삭제가 가능함</li>
</ul>
<h4 id="3-drop">(3) DROP</h4>
<ul>
<li>테이블이나 데이터베이스를 삭제할 수 있음</li>
</ul>
<h4 id="4-truncate">(4) TRUNCATE</h4>
<ul>
<li>테이블의 구조를 유지한 채로 테이블의 모든 레코드를 삭제</li>
<li>테이블 자체를 삭제하지는 않음</li>
</ul>
<h3 id="2-dml-데이터-조작-언어">2) DML: 데이터 조작 언어</h3>
<ul>
<li>실행 순서: FROM -&gt; WHERE -&gt; GROUP BY -&gt; HAVING -&gt; SELECT -&gt; ORDER BY -&gt; LIMIT</li>
</ul>
<h4 id="1-insert">(1) INSERT</h4>
<ul>
<li>테이블에 새로운 레코드를 삽입하기 위해 사용</li>
<li>레코드 삽입 시 무결성 제약 조건을 어기지 않도록 주의</li>
</ul>
<h4 id="2-updatedelete">(2) UPDATE/DELETE</h4>
<ul>
<li>레코드를 수정/삭제하는 명령어</li>
</ul>
<h4 id="3-select">(3) SELECT</h4>
<ul>
<li>삽입된 레코드를 조회하는 명령</li>
<li>테이블 내 레코드를 정렬하거나 필터링해 조회하는 것도 가능</li>
</ul>
<h4 id="4-group-by">(4) GROUP BY</h4>
<ul>
<li>특정 필드를 기준으로 필드를 그룹화하기 우해 사용됨</li>
</ul>
<h4 id="5-having">(5) HAVING</h4>
<ul>
<li>그룹화된 레코드에 대한 조건식</li>
<li>WHERE은 그룹화되기 전 레코드에 대한 조건식</li>
</ul>
<h4 id="6-order-by">(6) ORDER BY</h4>
<ul>
<li>특정 필드를 기준으로 데이터를 정렬</li>
<li>오름차순, 내림차순 정렬 가능</li>
</ul>
<h4 id="7-limit">(7) LIMIT</h4>
<ul>
<li>조회할 레코드의 수를 제한하기 위해 사용</li>
</ul>
<h3 id="3-tcl-트랙잭션-제어-언어">3) TCL: 트랙잭션 제어 언어</h3>
<h4 id="1-commit">(1) COMMIT</h4>
<ul>
<li>데이터베이스에 작업 반영</li>
</ul>
<h4 id="2-rollback">(2) ROLLBACK</h4>
<ul>
<li>작업 이전의 상태로 되돌림</li>
</ul>
<h4 id="3-savepoint">(3) SAVEPOINT</h4>
<ul>
<li>롤백의 기준점 설정</li>
</ul>
<h3 id="4-dcl-데이터-제어-언어">4) DCL: 데이터 제어 언어</h3>
<h4 id="1-grant">(1) GRANT</h4>
<ul>
<li>사용자에게 권한 부여</li>
</ul>
<h4 id="2-revoke">(2) REVOKE</h4>
<ul>
<li>사용자로부터 권한 회수</li>
</ul>
<h2 id="4-효율적-쿼리">4. 효율적 쿼리</h2>
<h3 id="1-서브-쿼리와-조인">1) 서브 쿼리와 조인</h3>
<h4 id="1-서브-쿼리">(1) 서브 쿼리</h4>
<ul>
<li>내부에 다른 SQL문이 포함된 SQL문</li>
<li>다른 SQL문 안에 있는 SELECT문</li>
</ul>
<h4 id="2-조인">(2) 조인</h4>
<ul>
<li>2개의 테이블을 하나로 합치는 것</li>
<li>INNER JOIN: A와 B의 교집합</li>
<li>LEFT OUTER JOIN: A집합, 해당되지 않는 B집합은 NULL 표시</li>
<li>RIGHT OUTER JOIN: B집합, 해당되지 않은 A집합은 NULL 표시</li>
<li>FULL OUTER JOIN: A와 B의 합집합</li>
</ul>
<h4 id="3-뷰">(3) 뷰</h4>
<ul>
<li>SELECT문의 결과로 만들어진 가상의 테이블</li>
<li>SELECT문의 결과를 뷰로 생성한 뒤 해당 뷰에 다양한 SQL문 실행 가능</li>
<li>테이블에 대한 SQL문을 단순화하기 위해 사용</li>
</ul>
<h4 id="4-인덱스">(4) 인덱스</h4>
<ul>
<li>검색 속도 향상을 목적으로 만드는 하나 이상의 테이블 필드에 대한 자료구조</li>
<li>RDBMS의 성능을 향상시키는 가장 대중적인 방법</li>
<li>수많은 레코드를 조회하는 작업이 많아 대부분 활용됨</li>
<li>SELECT 성능 향상은 가능하나 INSERT, UPDATE, DELETE에 대해서는 성능 향상을 가져오지 않거나 되려 성능을 떨어뜨림</li>
<li>데이터가 충분히 많은 데이블, 조회가 빈번히 이루어지는 테이블 필드에 효과적임</li>
<li>테이블 당 3개 이하의 인덱스가 적정한 인덱스 개수</li>
</ul>
<ul>
<li>클러스터형 인덱스<ul>
<li>테이블당 하나씩 만들 수 있는 인덱스</li>
<li>기본 키</li>
<li>기본 키로 지정된 필드는 기본적으로 클러스터형 인덱스로 간주됨</li>
<li>기본 키로 지정된 필드가 없는 경우 NOT NULL 제약조건, UNIQUE 제약 조건이 있는 필드도 클러스터형 인덱스로 간주</li>
</ul>
</li>
</ul>
<ul>
<li>세컨더리 인덱스<ul>
<li>논클러스터형 인덱스라고도 함</li>
<li>테이블당 여러 개가 존재할 수 있지만 클러스터형 인덱스보다 느림</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[241028 CS 스터디 정리]]></title>
            <link>https://velog.io/@apple-mint/cs241028</link>
            <guid>https://velog.io/@apple-mint/cs241028</guid>
            <pubDate>Mon, 28 Oct 2024 13:44:10 GMT</pubDate>
            <description><![CDATA[<h2 id="3-네트워크-계층---ip">3. 네트워크 계층 - IP</h2>
<h3 id="1-ip의-목적과-특징">1) IP의 목적과 특징</h3>
<h4 id="1-주소-지정">(1) 주소 지정</h4>
<ul>
<li>네트워크 간의 통신 과정에서 호스트를 특정하는 것</li>
<li>IP 주소를 통해 주소 지정이 이루어짐</li>
<li>송신지 IP 주소, 수신지 IP 주소 필드에 송수신지를 식별할 수 있는 IP 주소가 명시됨</li>
</ul>
<ul>
<li>IP 주소<ul>
<li>수신 주소와 발신 주소</li>
<li>총 4바이트(32비트)의 크기로 구성되며 숫자당 8비트로 표현</li>
<li>10진수 4개로 표기되며 점으로 구분된 하나의 10진수는 옥텟이라고 함
ex. 192.168.0.1 중 192, 168, 0, 1이 하나하나가 옥텟</li>
</ul>
</li>
</ul>
<ul>
<li>MAC 주소<ul>
<li>수신인과 발신인의 정보</li>
</ul>
</li>
</ul>
<ul>
<li>라우터<ul>
<li>IP 주소를 기반으로 패킷의 최적 경로를 결정하여 목적지까지 전달하는 네트워크 장비</li>
<li>서로 다른 네트워크에 속한 두 호스트가 네트워크 간 통신을 수행함</li>
<li>IP 패킷을 전달할 최적의 경로를 결정하고 해당 경로로 패킷을 내노는 과정을 라우팅이라고 함</li>
</ul>
</li>
</ul>
<h4 id="2-단편화">(2) 단편화</h4>
<ul>
<li>데이터를 MTU 이하의 여러 IP 패킷으로 올바르게 쪼개어 보내는 것</li>
<li>일반적인 MTU 크기는 1500바이트로 프레임을 통해 주고받을 수 있는 최대 페이로드의 크기</li>
</ul>
<ul>
<li>식별자<ul>
<li>특정 패킷이 어떤 데이터에서 쪼개진 패킷인지 식별하기 위해서 사용되는 필드</li>
<li>같은 정보에서 쪼개진 패킷들은 같은 식별자를 공유하므로 이를 통해 단편화되어 전송되는 패킷을 구분할 수 있음</li>
</ul>
</li>
</ul>
<ul>
<li>플래그<ul>
<li>3비트로 구성된 필드</li>
<li>첫 번째 비트는 항상 0, 나머지 2개의 비트는 DF, MF라고 함</li>
<li>DF: IP 단편화를 수행하지 말라는 의미</li>
<li>MF: 단편화된 패킷이 더 있다는 의미</li>
</ul>
</li>
</ul>
<ul>
<li>단편화 오프셋<ul>
<li>특정 패킷이 초기 데이터에서 얼마나 떨어져 있는지가 명시된 필드</li>
<li>단편화되어 전송된 패킷을 목적지에서 재조합하기 위해 패킷의 올바른 순서를 나타내는 데에 사용</li>
</ul>
</li>
</ul>
<h4 id="3-신뢰할-수-없는-통신">(3) 신뢰할 수 없는 통신</h4>
<ul>
<li>패킷이 수신지까지 제대로 전송되었다고 보장하지 않는 프로토콜</li>
</ul>
<h4 id="4-비연결형-프로토콜">(4) 비연결형 프로토콜</h4>
<ul>
<li>패킷을 주고받기 전 사전 연결 과정을 거치지 않는다는 것을 의미</li>
</ul>
<h3 id="2-ip-주소의-구조">2) IP 주소의 구조</h3>
<ul>
<li>하나의 IP 주소는 0~255 범위의 10진수 4개(32비트)로 표기됨</li>
<li>네트워크 주소, 호스트 주소로 이루어짐</li>
<li>네트워크 주소를 표현하는 크기와 호스트를 표현하는 크기가 유동적일 수 있음</li>
</ul>
<h4 id="1-네트워크-주소">(1) 네트워크 주소</h4>
<ul>
<li>네트워크 ID, 네트워크 식별자 등으로 불림</li>
<li>호스트가 속한 네트워크를 특정하기 위해 사용</li>
</ul>
<h4 id="2-호스트-주소">(2) 호스트 주소</h4>
<ul>
<li>호스트 ID, 호스트 식별자 등으로 불림</li>
<li>네트워크에 속한 호스트를 특정하기 위해 사용됨</li>
</ul>
<h4 id="3-클래스풀-주소-체계">(3) 클래스풀 주소 체계</h4>
<ul>
<li>네트워크의 크기에 따라 유형별로 IP 주소를 분류하는 기준</li>
<li>네트워크 주소, 호스트 주소 크기가 유동적일 수 있다는 특성을 고려해 효율적으로 공간을 사용하기 위해 생겨난 개념</li>
<li>D, E는 멀티클래스를 위한 클래스로 실질적으로 A, B, C 클래스를 사용해 크기별로 IP 주소를 분류</li>
</ul>
<ul>
<li>A 클래스: 0.0.0.0 ~ 127.255.255.255</li>
<li>B 클래스: 128.0.0.0 ~ 191.255.255.255</li>
<li>C 클래스: 192.0.0.0 ~ 233.255.255.255</li>
</ul>
<h4 id="4-클래스리스-주소-체계">(4) 클래스리스 주소 체계</h4>
<ul>
<li><p>클래스 없이 서브넷 마스크로 네트워크와 호스트를 구분하는 방식</p>
</li>
<li><p>서브넷 마스크</p>
<ul>
<li>IP 주소상에서 네트워크 주소는 1, 호스트 주소는 0으로 표기한 비트열</li>
<li>서브넷을 구분하는 비트열</li>
</ul>
</li>
</ul>
<ul>
<li>서브네트워크<ul>
<li>서브넷이라고도 줄여 부르기도 함</li>
<li>IP 주소에서 네트워크 주소로 구분할 수 있는 네트워크의 부분집합</li>
</ul>
</li>
</ul>
<ul>
<li>서브네팅<ul>
<li>서브넷 마스크를 이용해 원하는 크기로 클래스를 더 잘게 쪼개어 사용하는 것</li>
</ul>
</li>
</ul>
<h3 id="3-공인-ip-주소와-사설-ip-주소">3) 공인 IP 주소와 사설 IP 주소</h3>
<h4 id="1-공인-ip-주소">(1) 공인 IP 주소</h4>
<ul>
<li>전 세계에서 고유한 IP 주소</li>
<li>인터넷을 비롯한 네트워크 간 통신에서 사용됨</li>
<li>ISP나 공인 IP 주소 할당 기관을 통해 할당받을 수 있음</li>
</ul>
<h4 id="2-사설-ip-주소">(2) 사설 IP 주소</h4>
<ul>
<li>사설 네트워크에서 사용하기 위한 IP 주소</li>
<li>외부 네트워크에 공개되지 않은 네트워크</li>
<li>일반적으로 라우터를 통해 할당되므로 LAN 대부분은 사설 네트워크에 해당</li>
<li>IP 주소 공간 중 사설 IP 주소로 사용하도록 예약된 IP 주소 공간 존재</li>
</ul>
<h3 id="4-ip-주소의-할당">4) IP 주소의 할당</h3>
<h4 id="1-정적-할당">(1) 정적 할당</h4>
<ul>
<li>직접 수작업으로 IP 주소를 부여하는 방식</li>
<li>이를 통해 할당된 IP 주소를 정적 IP 주소라고 함</li>
<li>정적 IP 주소 부여를 위해 IP 주소, 서브넷 마스크, 게이트웨이 주소, DNS 주소 필요</li>
</ul>
<ul>
<li><p>게이트웨이</p>
<ul>
<li>일반적으로 서로 다른 네트워크를 연결하는 하드웨어적/소프트웨어적 수단</li>
<li>호스트가 속한 네트워크의 외부로 나가기 위한 첫 기본 경로를 기본 게이트웨이라고 함</li>
</ul>
</li>
<li><p>DNS 주소</p>
<ul>
<li>호스트가 IP 주소에 대응되는 기억할 수 있는 문자열인 도메인 네임을 토대로 IP 주소를 알아내기 위해 질의하는 서버의 주소</li>
</ul>
</li>
</ul>
<h4 id="2-동적-할당">(2) 동적 할당</h4>
<ul>
<li>프로토콜을 통해 자동으로 IP 주소를 부여하는 방식</li>
<li>이를 통해 할당된 IP 주소를 동적 IP 주소라고 함</li>
<li>흔히 DHCP 프로토콜을 많이 사용</li>
<li>사용 가능한 기간이 정해져 있으며 할당받을 때마다 다른 주소를 받을 수 있음</li>
<li>임대 기간이 끝나기 전 임대 갱신을 할 수 있으며 자동으로 2번 수행됨</li>
<li>임대 갱신 실패 시 해당 IP 주소는 DHCP 서버로 반납됨</li>
</ul>
<h3 id="5-ip-전송-특징의-보완-icmp">5) IP 전송 특징의 보완: ICMP</h3>
<ul>
<li>신뢰할 수 없는 비연결 통신이라는 특징을 보완하기 위한 프로토콜</li>
<li>IP 패킷의 전송 과정에 대한 피드백 메시지, 즉 ICMP 메시지를 얻기 위해 사용하는 프로토콜</li>
<li>ICMP 메시지를 통해 패킷이 어떻게 상대방에게 전송되었는지 알려줄 수 있음</li>
<li>ICMP 메시지는 전송 과정에서 발생한 오류 보고, 네트워크에 대한 진단 정보로 유형을 나눌 수 있음</li>
</ul>
<h3 id="6-ip-주소와-mac-주소의-대응-arp">6) IP 주소와 MAC 주소의 대응: ARP</h3>
<ul>
<li>IP 주소는 알지만 MAC 주소는 모르는 상황이 발생할 때 사용되는 프로토콜</li>
<li>IP 주소, MAC 주소를 함께 활용하는 통신 과정에서 동일 네트워크 내에 있는 송수신 대상의 IP 주소를 통해 MAC 주소를 알아내는 프로토콜</li>
<li>ARP 요청 메시지와 ARP 응답 메시지를 통해 이루어짐</li>
<li>IP 주소, MAC 주소 쌍을 기억하기 위해 ARP 테이블 정보를 유지함</li>
</ul>
<h2 id="4-전송-계층---tcp와-udp">4. 전송 계층 - TCP와 UDP</h2>
<h3 id="1-tcp의-udp의-목적과-특징">1) TCP의 UDP의 목적과 특징</h3>
<ul>
<li>포트를 통한 프로세스 식별을 목적으로 함</li>
<li>포트 번호를 통해 호스트가 실행하는 프로세스를 식별할 수 있음</li>
</ul>
<h4 id="1-포트-번호">(1) 포트 번호</h4>
<ul>
<li>16비트로 표현 가능하며 $$2^{16}$$, 65536개가 존재</li>
<li>잘 알려진 포트: 0 ~ 1023</li>
<li>등록된 포트: 1024 ~ 49151</li>
<li>동적 포트: 49152 ~ 65535</li>
</ul>
<h4 id="2-tcp">(2) TCP</h4>
<ul>
<li>신뢰할 수 있는 프로토콜이자 연결형 프로토콜</li>
<li>연결 수립 -&gt; 패킷 주고 받을 때 신뢰성 보장을 위해 상태 관리, 흐름 제어, 오류 제어, 혼잡 제어 등의 각종 기능 제공 -&gt; 종료</li>
<li>패킷의 유실 없는 송수신을 위해 선택</li>
<li>UDP 헤더에 있는 것뿐만 아니라 순서 번호 필드, 확인 응답 번호 필드, 일부 제어 비트가 있음</li>
</ul>
<h4 id="3-udp">(3) UDP</h4>
<ul>
<li>신뢰할 수 없는 프로토콜이자 비연결 프로토콜</li>
<li>연결 수립, 종료 단계 거치지 않고 각종 기능 제공하지 않음</li>
<li>빠른 송수신을 위해 선택</li>
<li>UDP 헤더에 송신지 포트, 수신지 포트, 길이 피들, 체크섬 필드가 있음</li>
</ul>
<h3 id="2-tcp의-연결부터-종료까지">2) TCP의 연결부터 종료까지</h3>
<h4 id="1-쓰리-웨이-핸드셰이크">(1) 쓰리 웨이 핸드셰이크</h4>
<ol>
<li>[A-&gt;B] SYN 세그먼트 전송</li>
</ol>
<ul>
<li>호스트 A가 SYN 비트가 1로 설정된 SYN 세그먼트를 호스트 B에게 전송</li>
<li>세그먼트 순서 번호에 호스트 A의 순서 번호가 포함되어 있음</li>
</ul>
<ol start="2">
<li>[A&lt;-B] SYN+ACK 세그먼트 전송</li>
</ol>
<ul>
<li>1에 대한 호스트 B의 응답</li>
<li>호스트 B가 ACK 비트와 SYN 비트가 1로 설정된 SYN+ACK 세그먼트를 호스트 A에게 전송</li>
<li>세그먼트 순서 번호에 호스트 B의 순서 번호, 1번에서 보낸 세그먼트에 대한 확인 응답 번호가 포함되어 있음</li>
</ul>
<ol start="3">
<li>[A-&gt;B] ACK 세그먼트 전송</li>
</ol>
<ul>
<li>호스트 A가 ACK 비트가 1로 설정된 ACK 세그먼트를 호스트 B에게 전송</li>
<li>세그먼트 순서 번호에 호스트 A의 순서 번호, 2번에서 보낸 세그먼트에 대한 확인 응답 번호가 포함되어 있음</li>
</ul>
<ul>
<li>액티브 오픈<ul>
<li>1번과 같이 처음 연결을 시작하는 과정</li>
<li>주로 클라이언트에 의해 수행</li>
</ul>
</li>
</ul>
<ul>
<li>패시브 오픈<ul>
<li>2번과 같이 연결 요청을 수신한 뒤 그에 대한 연결을 수립하는 과정</li>
<li>주로 서버에 의해 수행</li>
</ul>
</li>
</ul>
<h4 id="2-재전송을-통한-오류-제어">(2) 재전송을 통한 오류 제어</h4>
<ul>
<li>송수신 과정에서 잘못 전송된 세그먼트가 있을 경우 이를 재전송해 오류를 제어</li>
<li>중복된 ACK 세그먼트가 도착했을 때 또는 타임아웃이 발생했을 때 잘못 전송된 세그먼트가 있음을 인지함</li>
</ul>
<h4 id="3-흐름-제어">(3) 흐름 제어</h4>
<ul>
<li>수신 호스트가 수신 윈도우 필드를 통해 송신 호스트에게 한번에 받아 처리할 수 있을 만큼 전송하는 것</li>
<li>송신 호스트가 수신 호스트의 처리 속도를 고려해 송수신 속도를 균일하게 맞추는 기능</li>
</ul>
<h4 id="4-혼잡-제어">(4) 혼잡 제어</h4>
<ul>
<li>많은 트래픽으로 인해 패킷의 처리 속도가 느려지거나 유실될 수 있는 상황을 제어</li>
<li>혼잡 없이 전송할 수 있을 정도의 양의 값인 혼잡 윈도우 값을 고려하며 혼잡 윈도우의 값을 넘지 않는 선에서 전송하며 제어</li>
<li>혼잡 윈도우 크기를 연산하는 방법인 혼잡 제어 알고리즘 중 AIMD를 기본적으로 사용함</li>
</ul>
<h4 id="5-tcp의-종료">(5) TCP의 종료</h4>
<ol>
<li>[A-&gt;B] FIN 세그먼트 전송</li>
</ol>
<ul>
<li>호스트 A가 FIN 비트가 1로 설정된 FIN 세그먼트를 호스트 B에게 전송</li>
</ul>
<ol start="2">
<li>[A&lt;-B] ACK 세그먼트 전송</li>
</ol>
<ul>
<li>1에 대한 호스트 B의 응답</li>
<li>호스트 B가 ACK 세그먼트를 호스트 A에게 전송</li>
</ul>
<ol start="3">
<li>[A&lt;-B] FIN 세그먼트 전송</li>
</ol>
<ul>
<li>호스트 B가 FIN 세그먼트를 호스트 B에게 전송</li>
</ul>
<ol start="4">
<li>[A-&gt;B] ACK 세그먼트 전송</li>
</ol>
<ul>
<li>3에 대한 호스트 A의 응답</li>
<li>호스트 A가 ACK 세그먼트를 호스트 B에게 전송</li>
</ul>
<ul>
<li>액티브 클로즈: 먼저 연결을 종료하려는 호스트에 의해 수행되는 동작</li>
<li>패시브 오픈: 연결 종료 요청을 받아들이는 호스트에 의해 수행되는 동작</li>
</ul>
<h3 id="3-tcp의-상태-관리">3) TCP의 상태 관리</h3>
<ul>
<li>TCP는 현재 어떤 통신 과정에 있는지 나타내는 정보인 상태를 유지하고 관리함</li>
<li>스테이트풀 프로토콜이라고도 함</li>
</ul>
<h4 id="1-연결이-수립되지-않을-때-주로-활용되는-상태">(1) 연결이 수립되지 않을 때 주로 활용되는 상태</h4>
<ul>
<li>CLOSED</li>
<li>LISTEN</li>
</ul>
<h4 id="2-연결-수립-과정에서-주로-활용되는-상태">(2) 연결 수립 과정에서 주로 활용되는 상태</h4>
<ul>
<li>SYN-SENT</li>
<li>SYN-RECEIVED</li>
<li>ESTABLISHED</li>
</ul>
<h4 id="3-연결-종료-과정에서-주로-활용되는-상태">(3) 연결 종료 과정에서 주로 활용되는 상태</h4>
<ul>
<li>FIN-WAIT-1</li>
<li>CLOSE-WAIT</li>
<li>FIN-WAIT-2</li>
<li>LAST-ACK</li>
<li>TIME-WAIT</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[241024 CS 스터디 정리]]></title>
            <link>https://velog.io/@apple-mint/cs241024</link>
            <guid>https://velog.io/@apple-mint/cs241024</guid>
            <pubDate>Thu, 24 Oct 2024 14:35:19 GMT</pubDate>
            <description><![CDATA[<h2 id="1-네트워크의-큰-그림">1. 네트워크의 큰 그림</h2>
<h3 id="1-네트워크의-기본-구조">1) 네트워크의 기본 구조</h3>
<ul>
<li>네트워크 기기가 노드이고, 네트워크 기기 간에 정보를 주고받는 유무선의 통신 매체가 간선인 그래프 형태를 띠고 있음</li>
</ul>
<h4 id="1-네트워크-토폴로지">(1) 네트워크 토폴로지</h4>
<ul>
<li>네트워크 상에서 노드와 노드 사이의 연결 구조</li>
<li>망형, 트리형, 링형, 성형, 버스형(선형) 등이 있음</li>
</ul>
<h4 id="2-호스트">(2) 호스트</h4>
<ul>
<li>네트워크의 가장자리에 있으면서 네트워크를 통해 주고받는 정보를 최초로 송신하고 최종 수신하는 노드</li>
<li>주고받는 정보의 방향에 따라 부르는 명칭이 달라짐</li>
</ul>
<ul>
<li>클라이언트: 요청을 보내는 호스트</li>
<li>서버: 응답을 보내는 호스트</li>
</ul>
<h4 id="3-중간-노드">(3) 중간 노드</h4>
<ul>
<li>중간에 위치한 노드는 호스트가 주고받는 정보들을 원하는 수신지까지 안정적으로 전송하는 역할을 함</li>
<li>스위치, 라우터, 공유기 등이 이에 해당</li>
</ul>
<h4 id="4-lan과-wan">(4) LAN과 WAN</h4>
<ul>
<li><p>LAN</p>
<ul>
<li>근거리 네트워크를 의미</li>
<li>가정이나 기업처럼 비교적 가까운 거리를 연결하는 한정된 공간에서의 네트워크</li>
<li>공유기를 기준으로 구축되어 있으며 LAN 간의 통신도 빈번하게 이루어짐</li>
</ul>
</li>
<li><p>WAN</p>
<ul>
<li>원거리 네트워크를 의미</li>
<li>LAN 간 통신이 이루어질 수 있도록 하며 인터넷을 가능하게 만드는 네트워크</li>
<li>일반적으로 ISP라는 인터넷 서비스가 업체가 구축하고 관리함
ex. KT, LG U+, SKT</li>
</ul>
</li>
</ul>
<h3 id="2-두-호스트가-패킷을-주고받는-과정">2) 두 호스트가 패킷을 주고받는 과정</h3>
<h4 id="1-패킷">(1) 패킷</h4>
<ul>
<li>네트워크를 통해 송수신되는 데이터의 단위</li>
<li>페이로드와 헤더로 구성되나 때로 트레일러라는 정보도 포함됨</li>
</ul>
<ul>
<li>페이로드: 패킷에서 송수신하고자 하는 데이터</li>
<li>헤더, 트레일러: 패킷에 추가되는 부가정보</li>
</ul>
<h4 id="2-주소">(2) 주소</h4>
<ul>
<li>패킷의 헤더에 명시되는 정보</li>
<li>주소가 있어야 올바르게 정보를 주고받을 수 있음</li>
<li>대표적으로 IP주소, MAC 주소가 있음</li>
</ul>
<h4 id="3-전송-방식">(3) 전송 방식</h4>
<ul>
<li><p>유니캐스트: 송신지, 수신지가 일대일로 메시지를 주고받는 방식</p>
</li>
<li><p>브로드캐스트: 브로드캐스트 도메인이라는 전송되는 범위 내에서 해당 네트워크 상의 모든 호스트에게 메시지를 전송하는 방식</p>
</li>
<li><p>멀티캐스트: 네트워크 내 동일 그룹에 속한 호스트에게만 전송하는 방식</p>
</li>
<li><p>애니캐스트: 네트워크 내 동일 그룹 중 가장 가까운 호스트에게만 전송하는 방식</p>
</li>
</ul>
<h4 id="4-프로토콜">(4) 프로토콜</h4>
<ul>
<li>네트워크에서 통신을 주고받는 노드 간의 합의된 규칙이나 방법</li>
<li>프로토콜마다 목적과 특징이 다름</li>
</ul>
<ul>
<li>IP: 네트워크 간 주소를 지정한다는 목적을 가짐</li>
<li>ARP: IP주소와 MAC주소를 대응시킨다는 목적을 가짐</li>
<li>HTTPS: HTTP보다 보안 수준이 높음</li>
<li>TCP: UDP에 비해 신뢰성이 높음</li>
</ul>
<h4 id="5-캡슐화와-역캡슐화">(5) 캡슐화와 역캡슐화</h4>
<ul>
<li>캡슐화<ul>
<li>패킷의 송신 과정에서 이루어짐</li>
<li>상위 계층으로부터 내려받은 패킷을 페이로드로 삼아 프로토콜의 목적과 특징에 따라 헤더(및 트레일러)에 추가하는 것</li>
</ul>
</li>
</ul>
<ul>
<li>역캡슐화<ul>
<li>패킷의 수신 과정에서 이루어짐</li>
<li>캡슐화 과정에서 붙인 헤더(및 트레일러)를 각 계층에서 확인한 뒤 제거하는 과정</li>
</ul>
</li>
</ul>
<ul>
<li>각 계층마다 지칭하는 패킷의 이름이 다르므로 유의<ul>
<li>물리 계층: 심볼, 비트</li>
<li>데이터 링크 계층: 프레임</li>
<li>네트워크 계층: 패킷, 데이터그램</li>
<li>전송 계층: TCP 기반일 경우 세그먼트, UCP 기반일 경우 데이터그램</li>
<li>그외 상위 계층: 데이터, 메시지</li>
</ul>
</li>
</ul>
<h3 id="3-네트워크-참조-모델">3) 네트워크 참조 모델</h3>
<ul>
<li>통신이 이루어지는 단계를 계층적으로 표현</li>
<li>패킷을 송신하는 쪽에서는 상위 계층에서 하위 계층으로, 수신하는 쪽에서는 하위 계층에서 상위 계층으로 정보를 보내고 받아들임</li>
</ul>
<h4 id="1-osi-모델">(1) OSI 모델</h4>
<ul>
<li>국제 표준화 기구에서 만든 네트워크 참조 모델</li>
<li>통신 단계를 7개의 계층으로 나눠 OSI 7계층이라고 부름</li>
<li>네트워크의 이론적 기술을 목적으로 사용하는 모델</li>
</ul>
<table>
<thead>
<tr>
<th align="center">계층 이름</th>
<th>특징</th>
</tr>
</thead>
<tbody><tr>
<td align="center">물리</td>
<td>- 최하위 계층<br>- 비트 신호를 주고받는 계층<br>- 유무선 통신 매체를 통해 운반하는 계층</td>
</tr>
<tr>
<td align="center">데이터 링크</td>
<td>- LAN에 속한 호스트끼리 올바르게 정보를 주고받기 위한 계층<br>- MAC 주소를 사용하고 물리 계층 통해 주고받는 정보에 오류가 있는지를 확인함</td>
</tr>
<tr>
<td align="center">네트워크</td>
<td>- 네트워크 간 통신을 가능하게 하는 계층<br>- IP 주소를 사용용해 다른 네트워크 간 통신을 주고받는 계층</td>
</tr>
<tr>
<td align="center">전송</td>
<td>- 패킷 전송 중 생기는 문제에 대비해 신뢰성 있는 전송을 가능하게 하는 계층<br>- 포트를 활용해 특정 응용 프로그램과의 연결 다리 역할 수행<br>- TCP, UDP 프로토콜 사용</td>
</tr>
<tr>
<td align="center">세션</td>
<td>- 응용 프로그램 간 연결 상태를 의미하는 세션을 관리하는 계층</td>
</tr>
<tr>
<td align="center">표현</td>
<td>- 인코딩, 압축, 암호화와 같은 작업을 수행하는 계층</td>
</tr>
<tr>
<td align="center">응용</td>
<td>- 사용자와 가장 밀접하게 닿아 있는 여러 네트워크 서비스를 제공하는 계층<br>- HTTP, HTTPS, DNS 등 프로토콜 사용</td>
</tr>
</tbody></table>
<h4 id="2-tcpip-모델">(2) TCP/IP 모델</h4>
<ul>
<li>구현과 프로토콜에 중점을 둔 네트워크 참조 모델</li>
</ul>
<table>
<thead>
<tr>
<th align="center">계층 이름</th>
<th>특징</th>
</tr>
</thead>
<tbody><tr>
<td align="center">네트워크 액세스</td>
<td>- 링크, 네트워크 인터페이스 계층이라고도 함<br>- OSI 모델 데이터 링크 계층과 유사</td>
</tr>
<tr>
<td align="center">인터넷</td>
<td>- OSI 모델의 네트워크 계층과 유사</td>
</tr>
<tr>
<td align="center">전송</td>
<td>- OSI 모델의 전송 계층과 유사</td>
</tr>
<tr>
<td align="center">응용</td>
<td>- OSI 모델 세션, 표현, 응용 계층과 유사</td>
</tr>
</tbody></table>
<h2 id="2-물리-계층과-데이터-링크-계층">2. 물리 계층과 데이터 링크 계층</h2>
<h3 id="1-이더넷">1) 이더넷</h3>
<ul>
<li>통신 매체를 통해 신호를 송수신하는 방법, 데이터 링크 계층에서 주고받는 데이터 형식 등이 정의된 기술</li>
<li>IEEE 802.3이라는 이름으로 국제 표준화된 기술로 현대 대부분의 LAN은 이더넷을 기반으로 구현되어 있음</li>
<li>이더넷 표준이 달라지면 통신 매체의 종류를 비롯한 신호 송수신 방법, 최대 지원속도가 달라질 수 있음</li>
</ul>
<h3 id="2-이더넷-프레임">2) 이더넷 프레임</h3>
<ul>
<li>이더넷 기반의 네트워크에서 주고받는 프레임</li>
<li>프리앰블, 송수신지 MAC 주소, 타입/길이, 데이터, FCS 정보를 포함함</li>
</ul>
<h4 id="1-프리앰블">(1) 프리앰블</h4>
<ul>
<li>송수신지 동기화를 위해 사용되는 8바이트 크기의 정보</li>
<li>프리앰블의 첫 7바이트는 10101010, 마지막 바이트는 10101011</li>
<li>프리앰블 비트를 통해 현재 이더넷 프레임이 수신되고 있음을 알게 됨</li>
</ul>
<h4 id="2-송수신지-mac-주소">(2) 송수신지 MAC 주소</h4>
<ul>
<li>프레임에서 가장 중요한 정보</li>
<li>송신지와 수신지를 특정할 수 있는 6바이트 길이의 MAC 주소로 명시됨</li>
<li>네트워크를 향하는 통로, 연결 매체와의 연결 지점을 의미하는 네트워크 인터페이스마다 하나씩 부여되는 주소</li>
</ul>
<h4 id="3-타입길이">(3) 타입/길이</h4>
<ul>
<li>프레임의 크기를 나타내며 1536 이상이면 타입을 나타냄</li>
<li>캡슐화된 상위 계층의 정보를 의미</li>
<li>어떤 상위 계층 프로토콜이 캡술화되었는지를 알 수 있음</li>
</ul>
<h4 id="4-데이터">(4) 데이터</h4>
<ul>
<li>페이로드, 즉 상위 계층으로 전달하거나 전달받은 데이터</li>
<li>일반적으로 MTU라고 하는 1500바이트 이하로 데이터 필드에 포함될 수 있는 크기가 제한되어 있음</li>
</ul>
<h4 id="5-fcs">(5) FCS</h4>
<ul>
<li>트레일러로 프레임의 오류 여부를 확인하기 위한 필드</li>
<li>오류 검출용 값인 CRC가 명시됨</li>
<li>전송할 데이터의 CRC값과 전달받은 데이터의 CRC값을 비교해 오류 파악</li>
</ul>
<h3 id="3-유무선-통신-매체">3) 유무선 통신 매체</h3>
<h4 id="1-트위스티드-페어-케이블">(1) 트위스티드 페어 케이블</h4>
<ul>
<li>대표적인 유선 매체</li>
<li>구리선을 통해 전기적으로 신호를 주고받는 통신 매체</li>
<li>카테고리를 통해 그 성능을 파악할 수 있음</li>
</ul>
<ul>
<li>STP: 그물 모양의 철사인 브레이드 실드로 감싸 노이즈를 감소시킨 케이블</li>
<li>FTP: 그물 모양의 포일인 포일 실드로 감싸 노이즈를 감소시킨 케이블</li>
<li>UTP: 아무것도 감싸지 않아 구리선만 있는 케이블</li>
</ul>
<h4 id="2-전파">(2) 전파</h4>
<ul>
<li>대표적인 무선 매체</li>
<li>3kHz~3THz 사이의 진동수를 가지는 전자기파</li>
<li>와이파이를 사용할 때 주로 활용</li>
<li>신호의 간섭을 방지하고자 하위 주파수 대역인 채널로 세분화해 해당 채널 대역에서 무선 통신이 이루어지도록 함</li>
</ul>
<ul>
<li>와이파이<ul>
<li>IEEE 802.11이라는 푲ㄴ을 따르는 대중적인 무선 LAN 기술</li>
<li>2.4GHz, 5GHz 대역폭을 주로 사용</li>
</ul>
</li>
</ul>
<h3 id="4-네트워크-인터페이스">4) 네트워크 인터페이스</h3>
<ul>
<li>네트워크 상에서 노드와 통신 매체가 연결되는 지점</li>
<li>노드와 네트워크 사이의 통로와 같음</li>
<li>네트워크 인터페이스마다 물리적 주소인 MAC 주소가 부여됨</li>
</ul>
<h4 id="1-nic">(1) NIC</h4>
<ul>
<li>네트워크 인터페이스 역할을 담당하는 하드웨어</li>
<li>네트워크 인터페이스 카드, 네트워크 어댑터 등 다양한 명칭으로 불림</li>
<li>원래 확장 카드 형태의 장비였으나 최근 USB 연결, 메인 보드 내장 등 다양한 형태로 변화함</li>
</ul>
<h4 id="2-역할">(2) 역할</h4>
<ul>
<li>통신 매체의 신호를 호스트가 이해하는 프레임으로 변환</li>
<li>호스트가 이해하는 프레임을 통신 매체의 신호로 변환</li>
<li>MAC 주소를 토대로 잘못 전송된 패킷이 있는지 확인</li>
</ul>
<h3 id="5-허브와-스위치">5) 허브와 스위치</h3>
<h4 id="1-허브">(1) 허브</h4>
<ul>
<li>물리 계층의 대표적인 네트워크 장치</li>
<li>여러 대의 호스트를 연결하는 장치</li>
<li>리피터 허브라고도 함</li>
<li>케이블의 커넥터가 꽂히는 부분이 통신 매체를 연결하는 지점인 포트임</li>
</ul>
<ul>
<li>전달받은 신호를 조작이나 판단 없이 모든 포트에 내보냄</li>
<li>송신 또는 수신을 번갈아 가며 수행하는 통신 방식인 반이중 모드로 통신함</li>
</ul>
<h4 id="2-스위치">(2) 스위치</h4>
<ul>
<li>허브의 한계를 보완하게 위한 네트워크 장비</li>
<li>MAC 주소 테이블을 생성하고 참조하는 MAC 주소 학습이 가능하므로 전달받은 신호를 목적지 호스트가 연결된 포트로만 내보냄</li>
<li>VLAN 기능을 통해 하나의 네트워크를 여러 논리적인 네트워크로 나눌 수 있음</li>
<li>동시 송수신이 가능한 상태인 전이중 모드로 통신함</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[241021 CS 스터디 정리]]></title>
            <link>https://velog.io/@apple-mint/cs241021</link>
            <guid>https://velog.io/@apple-mint/cs241021</guid>
            <pubDate>Mon, 21 Oct 2024 14:39:35 GMT</pubDate>
            <description><![CDATA[<h2 id="1-자료구조의-큰-그림">1. 자료구조의 큰 그림</h2>
<h3 id="1-자료구조와-알고리즘">1) 자료구조와 알고리즘</h3>
<ul>
<li>어떤 자료구조를 사용하느냐에 따라 사용 가능한 알고리즘이 달라지는 등 밀접한 관계를 가지고 있음</li>
</ul>
<h4 id="1-자료구조">(1) 자료구조</h4>
<ul>
<li>어떠한 구조로 데이터를 효율적으로 저장하고 관리하기 위한 방법 </li>
<li>핵심적인 자료구조 7가지가 있음</li>
</ul>
<h4 id="2-알고리즘">2) 알고리즘</h4>
<ul>
<li>어떠한 목적을 이루기 위해 필요한 일련의 연산 절차</li>
<li>트리 순회, 깊이 우선 탐색, 너비 우선 탐색, 최단 경로 알고리즘 등</li>
</ul>
<h3 id="2-시간복잡도와-공간복잡도">2) 시간복잡도와 공간복잡도</h3>
<ul>
<li>시간복잡도, 공간복잡도로 성능 차이를 파악할 수 있음</li>
</ul>
<h4 id="1-시간복잡도">(1) 시간복잡도</h4>
<ul>
<li>입력의 크기에 따른 프로그램 실행 시간의 관계</li>
<li>입력이 커질수록 프로그램 실행 시간이 길어지는 경향성을 보임</li>
<li>일관된 성능 판단 척도로서 기능하기 위해 빅 오 표기법을 사용함</li>
</ul>
<ul>
<li>빅 오 표기법<ul>
<li>함수의 점근적 상한을 표기하는 방법</li>
<li>$$O(N)$$과 같이 실행시간의 상한 형태로 표현</li>
<li>입력값 N에 대한 연산 횟수에서 최고차항의 차수만 고려해 표현</li>
<li>가장 대중적으로 사용되고 있는 표기법</li>
</ul>
</li>
</ul>
<ul>
<li>빅 세타 표기법<ul>
<li>입력값 N에 대한 연산의 평균적인 실행 시간을 의미</li>
</ul>
</li>
</ul>
<ul>
<li>빅 오메가 표기법<ul>
<li>함수의 점근적 하한을 표기하는 방법</li>
</ul>
</li>
</ul>
<h4 id="2-공간복잡도">(2) 공간복잡도</h4>
<ul>
<li>입력에 따라 필요한 메모리 자원의 양에 대한 점근적 상한을 표현</li>
<li>시간복잡도와 마찬가지로 빅 오 표기법으로 표현되나 주로 성능 판단의 척도인 시간복잡도를 가리키는 경우가 많음</li>
</ul>
<h2 id="2-배열과-연결-리스트">2. 배열과 연결 리스트</h2>
<h3 id="1-배열">1) 배열</h3>
<ul>
<li>일정한 메모리 공간을 차지하는 여러 요소들이 순차적으로 나열된 자료구조</li>
<li>0부터 시작하는 각 요소를 식별하는 고유한 순서 번호인 인덱스 존재</li>
<li>배열 속에 배열을 포함하며 2차원, 3차원 배열로 확장 가능</li>
</ul>
<ul>
<li>특정 값 접근/수정: $$O(1)$$</li>
<li>특정 요소 추가/삭제/검색 : $$O(N)$$</li>
</ul>
<h3 id="2-연결-리스트">2) 연결 리스트</h3>
<ul>
<li>노드의 모음으로 구성된 자료구조</li>
<li>다음 노드의 위치정보를 가지고 있으므로 메모리 내 불연속적으로 저장할 수 있음</li>
</ul>
<ul>
<li>특정 값 접근/수정: $$O(N)$$</li>
<li>특정 요소 추가/삭제: $$O(1)$$</li>
</ul>
<h4 id="1-노드">(1) 노드</h4>
<ul>
<li>저장하고자 하는 데이터, 다음 노드 위치 정보를 포함하는 구성 단위</li>
<li>헤드: 연결 리스트의 첫 번째 노드</li>
<li>꼬리: 연결 리스트의 마지막 노드</li>
</ul>
<h4 id="2-싱글-연결-리스트">(2) 싱글 연결 리스트</h4>
<ul>
<li>노드 내에 다음 노드의 위치 정보가 저장</li>
<li>다음 노드의 위치만 알 수 있고 이전 노드의 위치를 알 수 없음</li>
<li>한쪽 방향으로 연결되어 있으므로 단방향 탐색만 가능</li>
</ul>
<h4 id="3-이중-연결-리스트">(3) 이중 연결 리스트</h4>
<ul>
<li>싱글 연결 리스트의 단점을 보완하기 위한 연결 리스트</li>
<li>이전 노드의 위치정보도 알고 있어 양방향 탐색 가능</li>
<li>메모리의 저장공간이 더 필요하다는 단점 존재</li>
</ul>
<h4 id="4-환형-연결-리스트">(4) 환형 연결 리스트</h4>
<ul>
<li>꼬리 노드가 헤드 노드를 가리켜 원형으로 구성된 연결 리스트</li>
<li>모든 노드 데이터를 여러 차례 순회해야 할 때 유용함</li>
<li>이중 연결 리스트로도 환형 연결 리스트 구현 가능</li>
</ul>
<h2 id="3-스택과-큐">3. 스택과 큐</h2>
<h3 id="1-스택">1) 스택</h3>
<ul>
<li>한쪽에서만 데이터 삽입 및 삭제가 가능한 자료구조</li>
<li>후입선출: 나중에 삽입된 데이터가 먼저 나오는 구조</li>
<li>함수의 호출 과정, 뒤로 가기 등 다양한 곳에서 활용</li>
</ul>
<h3 id="2-큐">2) 큐</h3>
<ul>
<li>한쪽으로 데이터 삽입, 다른 쪽으로 데이터 삭제가 가능한 자료구조</li>
<li>선입선출: 먼저 삽입된 데이터가 먼저 나오는 구조</li>
<li>임시 저장된 데이터를 순차적으로 처리해야 하는 버퍼로도 활용</li>
</ul>
<h4 id="1-원형-큐">(1) 원형 큐</h4>
<ul>
<li>데이터를 삽입하는 쪽과 삭제하는 쪽을 연결해 원형으로 사용하는 자료구조</li>
</ul>
<h4 id="2-덱">(2) 덱</h4>
<ul>
<li>양쪽으로 데이터 삽입 및 삭제가 가능한 양뱡향 큐</li>
</ul>
<h4 id="3-우선순위-큐">(3) 우선순위 큐</h4>
<ul>
<li>선입선출이 아닌 정해진 우선순위를 기준으로 처리하는 큐</li>
<li>힙을 기반으로 구현 가능함</li>
</ul>
<h2 id="4-해시-테이블">4. 해시 테이블</h2>
<ul>
<li>키와 값의 대응으로 이루어진 표와 같은 형태의 자료구조</li>
<li>페이지 캐시, 아이노드 캐시 등 대응 관계가 필요한 상황에 활용</li>
<li>여러 개 존재하는 버킷들이 배열을 형성</li>
<li>검색 속도가 매우 빠르나 상대적으로 많은 메모리 공간을 차지</li>
</ul>
<ul>
<li>특정 값 접근/검색/삽입/삭제: $$O(1)$$</li>
</ul>
<ul>
<li>키: 해시 테이블에 대한 입력</li>
<li>값: 키를 통해 얻고자 하는 데이터</li>
<li>버킷: 키를 얻고자 하는 데이터가 저장되어 있는 곳</li>
</ul>
<h3 id="1-해시-함수">1) 해시 함수</h3>
<ul>
<li>임의의 길이를 지닌 데이터를 고정된 길이의 데이터로 변환하는 단방향 함수</li>
<li>키를 인자로 활용해 버킷 배열의 인덱스를 반환</li>
<li>키를 해시 함수에 통과시켜 원하는 버킷에 접근함</li>
</ul>
<h3 id="2-해시-알고리즘">2) 해시 알고리즘</h3>
<ul>
<li>해시 함수의 연산 방법</li>
<li>대표적으로 SHA-1, SHA-256, SHA-512, SHA3, HMAC 등이 존재</li>
<li>같은 값이더라도 다른 알고리즘을 사용할 경우 도출되는 해시 값 상이</li>
<li>무작위 값, 단방향 암호, 데이터의 무결성 검증 위해 사용</li>
</ul>
<h3 id="3-해시-충돌">3) 해시 충돌</h3>
<ul>
<li>서로 다른 키에 대해 같은 해시 값이 대응되는 상황</li>
<li>이를 해결하기 위해 체이닝, 개방 주소법, 이중 해싱 등을 사용함</li>
</ul>
<h4 id="1-체이닝">(1) 체이닝</h4>
<ul>
<li>충돌이 발생한 데이터를 연결 리스트로 추가하는 방법</li>
<li>연결 리스트 노드를 추가할수록 속도가 떨어지는 단점 존재</li>
</ul>
<h4 id="2-개방-주소법">(2) 개방 주소법</h4>
<ul>
<li>충돌이 발생했을 때 발생한 버킷의 인덱스가 아닌 다른 인덱스에 데이터를 저장하는 방법</li>
<li>순차적으로 가용 가능한 인덱스를 찾는 선형 조사법의 경우 인덱스 인근에 충돌한 여러 데이터가 몰려 저장되는 군집화 발생 가능성이 있음</li>
</ul>
<h4 id="3-이중-해싱">(3) 이중 해싱</h4>
<ul>
<li>2개의 해시 함수를 사용하는 방법</li>
<li>충돌이 발생했을 때 다른 해시 함수에 대한 해시 값만큼 떨어진 거리에 위치한 인덱스를 찾음</li>
<li>무작위로 인덱스를 생성하는 과정을 통해 군집화 문제를 피할 수 있음</li>
</ul>
<h2 id="5-트리">5. 트리</h2>
<ul>
<li>계층 구조를 표현하기 위한 자료구조</li>
<li>데이터를 저장하는 곳인 노드와 노드를 연결하는 간선으로 이루어져 있음</li>
<li>간선으로 연결된 노드는 상하관계를 형성함</li>
<li>하나의 노드를 데이터를 저장할 공간과 자식 노드의 위치 정보를 저장할 공간들의 모음으로 간주해 구현할 수 있음</li>
</ul>
<h3 id="1-트리-관련-용어">1) 트리 관련 용어</h3>
<h4 id="1-노드-1">(1) 노드</h4>
<ul>
<li>데이터가 저장되어 있는 곳</li>
<li>노드는 하나의 부모 노드와 하나 이상의 자식 노드를 가질 수 있음</li>
</ul>
<ul>
<li>루트 노드: 최상단 노드로 유일하게 부모 노드가 없는 노드</li>
<li>리프 노드: 자식 노드가 없는 최하단 노드</li>
</ul>
<ul>
<li>부모 노드: 상하관계 중 상위에 위치한 노드</li>
<li>자식 노드: 상하관계 중 하위에 위치한 노드</li>
<li>형제 노드: 같은 부모 노드를 공유하는 노드</li>
<li>조상 노드: 부모 노드와 그 부모 노드</li>
<li>자손 노드: 자식 노드와 그 자식 노드</li>
</ul>
<h4 id="2-차수">(2) 차수</h4>
<ul>
<li>각 노드가 가지는 자식 노드의 수</li>
</ul>
<h4 id="3-레벨">(3) 레벨</h4>
<ul>
<li>루트 노드에서 시작해 특정 노드에 이르기까지 거치는 간선의 수</li>
<li>트리의 깊이와 같은 개념</li>
<li>가장 높은 레벨이 트리의 높이가 됨</li>
</ul>
<h4 id="4-서브-트리">(4) 서브 트리</h4>
<ul>
<li>트리 안에 포함되어 있는 트리</li>
<li>서브 트리도 트리이므로 루트 노드를 가질 수 있음</li>
</ul>
<h3 id="2-트리-순회">2) 트리 순회</h3>
<ul>
<li>트리의 모든 노드를 한 번씩 방문하는 것</li>
</ul>
<h4 id="1-전위-순회">(1) 전위 순회</h4>
<ul>
<li>루트 노드부터 시작해 왼쪽 서브트리를 전위 순회하고 이후 오른쪽 서브트리를 전위 순회하는 방법</li>
</ul>
<h4 id="2-중위-순회">(2) 중위 순회</h4>
<ul>
<li>루트 노드를 기준으로 왼쪽 서브트리를 중위 순회하고 루트 노드 방문 후에 오른쪽 서브 트리를 중위 순회하는 방법</li>
</ul>
<h4 id="3-후위-순회">(3) 후위 순회</h4>
<ul>
<li>루트 노드를 기준으로 왼쪽 서브트리를 후위 순회하고 오른쪽 서브 트리를 후위 순휘한 뒤에 마지막으로 루트 노드를 순회하는 방법</li>
</ul>
<h4 id="4-레벨-순회">(4) 레벨 순회</h4>
<ul>
<li>같은 트리에서 가장 낮은 레벨에 있는 노드부터 순서대로 순회하는 방법</li>
</ul>
<h3 id="3-트리의-종류">3) 트리의 종류</h3>
<h4 id="1-이진-트리">(1) 이진 트리</h4>
<ul>
<li>이진 트리<ul>
<li>자식 노드의 개수가 2개 이하인 트리</li>
</ul>
</li>
</ul>
<ul>
<li>편향된 이진 트리<ul>
<li>모든 자식 노드가 한쪽으로 치우친 이진 트리</li>
</ul>
</li>
</ul>
<ul>
<li>정 이진 트리<ul>
<li>자식 노드의 개수가 0개 또는 2개인 이진 트리</li>
</ul>
</li>
</ul>
<ul>
<li>포화 이진 트리<ul>
<li>리프 노드를 제외한 모든 노드들의 자식 노드 개수가 2개고 모든 리프 노드의 레벨이 동일한 이진 트리</li>
</ul>
</li>
</ul>
<ul>
<li>완전 이진 트리<ul>
<li>마지막 레벨을 제외한 모든 레벨의 자식 노드 개수가 2개고 마지막 레벨의 모든 노드들이 왼쪽부터 존재하는 이진 트리</li>
</ul>
</li>
</ul>
<ul>
<li>이진 탐색 트리<ul>
<li>특정 노드의 왼쪽 서브트리: 해당 노드보다 작은 값을 지닌 노드 존재</li>
<li>특정 노드의 오른쪽 서브트리: 해당 노드보다 큰 값을 지닌 노드 존재</li>
<li>탐색 속도: $$O(logN)$$</li>
</ul>
</li>
</ul>
<ul>
<li>힙<ul>
<li>완전 이진 트리의 종류 중 하나</li>
<li>최댓값과 최솟값을 빠르게 찾기 위해 사용</li>
<li>탐색 속도: $$O(logN)$$</li>
</ul>
</li>
</ul>
<ul>
<li>최대 힙: 부모 노드가 자식 노드의 값보다 큰 값인 이진 트리</li>
<li>최소 힙: 부모 노드가 자식 노드의 값보다 작은 값인 이진 트리</li>
</ul>
<h4 id="2-자가-균형-탐색-트리">(2) 자가 균형 탐색 트리</h4>
<ul>
<li>이진 탐색 트리의 탐색 속도를 균일하게 유지하고자 루트 노드 기준 왼쪽 서브트리와 오른쪽 서브트리의 높이 차를 최소로 만들어주는 이진 탐색 트리</li>
<li>AVL 트리, RB 트리가 있음</li>
<li>다진 탐색 트리로 B 트리가 있음</li>
</ul>
<h2 id="6-그래프">6. 그래프</h2>
<ul>
<li>정점이라 하는 데이터를 간선 또는 링크로 연결한 형태의 자료구조</li>
<li>트리는 상하관계를 가지는 그래프의 일종</li>
</ul>
<h3 id="1-그래프의-종류와-구현">1) 그래프의 종류와 구현</h3>
<h4 id="1-연결비연결-그래프">(1) 연결/비연결 그래프</h4>
<ul>
<li>그래프 상에 있는 임의의 두 정점의 경로가 존재/존재하지 않는 그래프</li>
</ul>
<h4 id="2-방향무방향-그래프">(2) 방향/무방향 그래프</h4>
<ul>
<li>그래프 상에 있는 간선에 방향이 있는/없는 그래프</li>
</ul>
<h4 id="3-가중치-그래프">(3) 가중치 그래프</h4>
<ul>
<li>간선에 가중치인 비용이 부여된 그래프</li>
<li>간선에 부여할 수 있는 값이라면 양수, 음수 상관없이 가능</li>
</ul>
<h4 id="4-서브-그래프">(4) 서브 그래프</h4>
<ul>
<li>특정 그래프의 정점과 간선의 일부분으로 이루어진 그래프</li>
<li>트리에서의 서브 트리와 비슷한 개념</li>
</ul>
<h3 id="2-그래프-표현-방식">2) 그래프 표현 방식</h3>
<h4 id="1-인접-행렬-기반-그래프-표현">(1) 인접 행렬 기반 그래프 표현</h4>
<ul>
<li>NxN 크기의 행렬로 그래프를 표현하는 방법</li>
<li>N: 정점의 개수</li>
<li>행/열: 출발/도착 정점
<code>graph = [[0]*N for _ in range(N)]</code></li>
</ul>
<h4 id="2-인접-리스트-기반-그래프-표현">(2) 인접 리스트 기반 그래프 표현</h4>
<ul>
<li>그래프의 특정 정점과 연결된 정점들을 연결 리스트로 표현하는 방법
<code>graph = [[] for _ in range(N)]</code></li>
</ul>
<h3 id="2-깊이-우선-탐색과-너비-우선-탐색">2) 깊이 우선 탐색과 너비 우선 탐색</h3>
<h4 id="1-깊이-우선-탐색">(1) 깊이 우선 탐색</h4>
<ul>
<li>그래프에서 더이상 방문 가능한 정점이 없을 때까지 최대한 깊이 탐색하기를 반복하는 탐색 방법</li>
<li>배열과 스택을 활용해 탐색</li>
</ul>
<h4 id="2-너비-우선-탐색">(2) 너비 우선 탐색</h4>
<ul>
<li>그래프에서 인접한 모든 정점들을 방문하고, 방문한 정점들과 연결된 모든 정점을 방문하는 것을 반복하는 탐색 방법</li>
<li>배열과 큐를 활용해 탐색</li>
</ul>
<h3 id="3-최단-경로-알고리즘">3) 최단 경로 알고리즘</h3>
<ul>
<li>한 정점에서 목적지 정점까지 이르는 가중치의 합이 최소가 되는 경로를 결정하는 알고리즘</li>
<li>지도 서비스의 최단 거리 알림, 네트워크 통신을 할 때 사용</li>
</ul>
<h4 id="1-다익스트라-알고리즘">(1) 다익스트라 알고리즘</h4>
<ol>
<li>최단 거리 테이블에서 시작 정점을 제외한 정점들을 모두 가장 큰 수로 초기화함</li>
<li>시작 정점을 방문</li>
<li>방문한 정점과 인접한 정점들을 탐색</li>
<li>경로 상의 가중치 합과 최단 거리 테이블 상의 값을 비교</li>
<li>최단 거리 테이블을 갱신할 수 있다면 갱신</li>
<li>방문하지 않은 정점 중 최단 거리가 가장 작은 정점 방문</li>
<li>3~6번의 과정을 방문할 수 있는 모든 정점을 방문할 때까지 반복</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[241017 CS 스터디 정리]]></title>
            <link>https://velog.io/@apple-mint/cs241017</link>
            <guid>https://velog.io/@apple-mint/cs241017</guid>
            <pubDate>Thu, 17 Oct 2024 14:21:00 GMT</pubDate>
            <description><![CDATA[<h2 id="4-cpu-스케줄링">4. CPU 스케줄링</h2>
<h3 id="1-우선순위">1) 우선순위</h3>
<ul>
<li>프로세스별 우선순위를 판단해 PCB에 명시</li>
<li>우선순위가 높을수록 CPU의 자원을 더 빨리, 더 많이 할당함</li>
<li>CPU 활용률을 고려해 우선순위를 할당</li>
<li>일반적으로 입출력 집중 프로세스가 CPU 집중 프로세스보다 우선순위가 높음</li>
</ul>
<ul>
<li><p>입출력 집중 프로세스</p>
<ul>
<li>비디오 재생, 디스크 백업 작업을 담당하는 프로세스</li>
<li>입출력을 위한 대기 상태에 더 많이 머묾</li>
</ul>
</li>
<li><p>CPU 집중 프로세스</p>
<ul>
<li>복잡한 수학 연산, 그래픽 처리를 담당하는 프로세스</li>
<li>실행 상태에 더 많이 머묾</li>
</ul>
</li>
</ul>
<h3 id="2-스케줄링-큐">2) 스케줄링 큐</h3>
<ul>
<li>동시다발적으로 자원을 요구하는 여러 프로세스를 효율적으로 관리하기 위해 사용</li>
<li>선입선출 구조를 따르지만 우선순위가 높은 프로세스가 있다면 그것 먼저 실행함</li>
</ul>
<h4 id="1준비-큐">(1)준비 큐</h4>
<ul>
<li>CPU를 이용하고자 하는 준비 상태의 프로세스의 PCB가 삽입됨</li>
<li>실행되는 프로세스가 타이머 입터럽트를 받을 경우 준비 큐로 이동</li>
</ul>
<h4 id="2-대기-큐">(2) 대기 큐</h4>
<ul>
<li>대기 상태에 있는 프로세스의 PCB가 삽입됨</li>
<li>실행 도중 입출력 작업을 수행하는 등 대기 상태로 전환될 경우 대기 큐로 이동</li>
<li>같은 입출력장치를 요구한 프로세스끼리 같은 대기 큐에서 대기함</li>
</ul>
<h3 id="3-선점형-스케줄링과-비선점형-스케줄링">3) 선점형 스케줄링과 비선점형 스케줄링</h3>
<h4 id="1-선점형-스케줄링">(1) 선점형 스케줄링</h4>
<ul>
<li>운영체제가 프로세스로부터 CPU 자원을 강제로 빼앗아 다른 프로세스에 할당할 수 있는 스케줄링
ex. 타이머 인터럽트 기반 스케줄링</li>
<li>한 프로세스의 독점을 막고 여러 프로세스에 골고루 CPU 자원 배분 가능</li>
<li>문맥 교환 과정에서 오버헤드 발생 가능성이 있음</li>
</ul>
<h4 id="2-비선점형-스케줄링">(2) 비선점형 스케줄링</h4>
<ul>
<li>어떤 프로세스가 CPU를 사용하고 있을 때 해당 프로세스가 종료되거나 대기 상태가 될 때까지 다른 프로세스가 끼어들 수 없는 스케줄링</li>
<li>문맥 교환 횟수가 적어 상대적으로 오버헤드 발생 가능성이 낮음</li>
<li>당장 사용해야 하는 프로세스더라도 계속 대기해야 하는 상황 발생</li>
</ul>
<h3 id="4-cpu-스케줄링-알고리즘">4) CPU 스케줄링 알고리즘</h3>
<h4 id="1-선입-선처리-스케줄링">(1) 선입 선처리 스케줄링</h4>
<ul>
<li>준비 큐에 삽입된 순서대로 CPU를 요청한 프로세스부터 CPU를 할당하는 스케줄링 방식</li>
<li>먼저 삽입된 프로세스의 실행 시간이 오래 걸려 나중에 삽입된 프로세스의 실행이 지연되는 호위 효과가 발생할 수 있음</li>
</ul>
<h4 id="2-최단-작업-우선-스케줄링">(2) 최단 작업 우선 스케줄링</h4>
<ul>
<li>준비 큐에 삽입된 프로세스 중 CPU를 이용하는 시간의 길이가 가장 짧은 프로세스부터 먼저 실행하는 스케줄링 방식</li>
<li>기본적으로 비선점형 스케줄링 알고리즘으로 분류되나 선점형으로도 구현 가능</li>
</ul>
<h4 id="3-라운드-로빈-스케줄링">(3) 라운드 로빈 스케줄링</h4>
<ul>
<li>선입 선처리 스케줄링 + 타임 슬라이스</li>
<li>준비 큐에 삽입된 순서대로 CPU를 요청한 프로세스에게 할당하되 프로세스가 CPU를 사용하도록 정해진 시간인 타임 슬라이스만큼만 CPU를 이용하는 스케줄링 방식</li>
<li>선점형 스케줄링 알고리즘</li>
<li>프로세스가 정해진 시간을 모두 사용하고도 완료되지 않을 경우 문맥 교환이 발생해 다시 큐의 맨 뒤에 삽입됨</li>
</ul>
<h4 id="4-최소-잔여-시간-우선-스케줄링">(4) 최소 잔여 시간 우선 스케줄링</h4>
<ul>
<li>최단 작업 우선 스케줄링 + 라운드 로빈 스케줄링</li>
<li>정해진 타임 슬라이스만큼 프로세스가 CPU를 이용하되 남아 있는 작업시간이 가장 적은 프로세스를 다음으로 CPU를 이용할 프로세스로 선택하는 스케줄링 방식</li>
</ul>
<h4 id="5-우선순위-스케줄링">(5) 우선순위 스케줄링</h4>
<ul>
<li>프로세스에 우선순위를 부여하고 가장 높은 우선순위대로 실행하는 스케줄링 방식</li>
<li>우선순위가 낮은 프로세스는 계속 실행이 연기되는 아사 현상이 발생할 수 있음</li>
<li>아사 현상을 방지하고자 오랫동안 대기한 프로세스의 우선순위를 점차 높이는 에이징 기법을 사용함</li>
</ul>
<h4 id="6-다단계-큐-스케줄링">(6) 다단계 큐 스케줄링</h4>
<ul>
<li>우선순위 스케줄링의 발전된 형태</li>
<li>우선순위별로 여러 개의 준비 큐를 사용하는 스케줄링 방식</li>
<li>프로세스들이 큐 사이를 이동할 수 없기에 아사 현상이 발생할 수 있음</li>
</ul>
<h4 id="7-다단계-피드백-큐-스케줄링">(7) 다단계 피드백 큐 스케줄링</h4>
<ul>
<li>다단계 큐 스케줄링의 아사 현상을 보완한 스케줄링 방식</li>
<li>프로세스들이 큐 사이를 이동할 수 있다는 차이가 있음</li>
</ul>
<h3 id="5-리눅스-cpu-스케줄링">5) 리눅스 CPU 스케줄링</h3>
<h4 id="1-스케줄링-정책">(1) 스케줄링 정책</h4>
<ul>
<li>새로운 프로세스를 언제 어떻게 선택하여 실행할지를 결정하기 위한 규칙의 집합</li>
<li>상황에 따라 다양한 스케줄링 알고리즘을 사용하며 크게 5가지가 있음</li>
</ul>
<ul>
<li>실시간성이 강조된 프로세스에 적용<ul>
<li>SCHED_FIFO, SCHED_RR, SCHED_RT</li>
</ul>
</li>
</ul>
<ul>
<li>일반적인 프로세스에 적용<ul>
<li>SCHED_NORMAL: 완전히 공평한 CPU 시간 배분을 지향하는 CFS CPU 스케줄러에 의해 스케줄링이 이루어짐</li>
</ul>
</li>
</ul>
<ul>
<li>리눅스에서는 프로세스의 가중치를 고려한 가상의 실행 시간인 가상 실행 시간 정보를 유지하는데 CFS는 이를 활용해 가장 작은 프로세스부터 스케줄링함</li>
</ul>
<h2 id="5-가상-메모리">5. 가상 메모리</h2>
<ul>
<li>실행하고자 하는 프로그램의 일부만 메모리에 적재해 실제 메모리보다 더 큰 프로세스를 실행할 수 있도록 하는 메모리 관리 기법</li>
</ul>
<h3 id="1-물리-주소와-논리-주소">1) 물리 주소와 논리 주소</h3>
<h4 id="1-물리-주소">(1) 물리 주소</h4>
<ul>
<li>메모리의 하드웨어 상 실제 주소</li>
</ul>
<h4 id="2-논리-주소">(2) 논리 주소</h4>
<ul>
<li>프로세스마다 부여되는 0번지부터 시작하는 주소 체계</li>
<li>CPU와 프로세스가 사용하는 주소 체계</li>
<li>중복되는 논리 주소의 번지 수가 존재할 수 있음</li>
</ul>
<h4 id="3-메모리-관리-장치--mmu">(3) 메모리 관리 장치 = MMU</h4>
<ul>
<li>CPU와 메모리 사이에 존재하는 하드웨어</li>
<li>메모리가 이해하는 물리 주소와 CPU가 이해하는 논리 주소간 변환하는 역할을 함</li>
</ul>
<h3 id="2-스와핑과-연속-메모리-할당">2) 스와핑과 연속 메모리 할당</h3>
<h4 id="1-스와핑">(1) 스와핑</h4>
<ul>
<li>현재 실행되고 있지 않은 프로세스를 보조기억장치의 일부 영역인 스왑 영역으로 쫓아내고 해당 빈 공간에 다른 프로세스를 적재하여 실행하는 메모리 관리 방식</li>
<li>스왑 아웃되었던 프로세스가 스왑 인될 때는 이전과 다른 물리 주소에 적재될 수 있음</li>
</ul>
<ul>
<li>스왑 아웃: 현재 실행되지 않은 프로세스가 메모리에서 스왑 영역으로 옮겨지는 것</li>
<li>스왑 인: 스왑 영역에 있는 프로세스가 다시 메모리로 옮겨오는 것</li>
</ul>
<h4 id="2-연속-메모리-할당">(2) 연속 메모리 할당</h4>
<ul>
<li>프로세스에 연속적인 메모리 공간을 할당하는 방식</li>
<li>프로세스 간 빈 공간이 생겼을 때 해당 공간보다 큰 프로세스를 적재하기 어려운 외부 단편화 문제가 발생할 수 있음</li>
</ul>
<h3 id="3-페이징">3) 페이징</h3>
<ul>
<li><p>프로세스 논리 주소 공간을 페이지라는 일정한 단위로 나누고 물리 주소 공간을 페이지와 동일한 크기의 프레임이라는 일정한 단위로 나눈 뒤 페이지를 프레임에 할당하는 가상 메모리 관리 기법</p>
</li>
<li><p>페이지 하나의 크기보다 작은 크기로 발생하게 되는 메모리 낭비인 내부 단편화 문제가 발생할 수 있음</p>
</li>
</ul>
<h4 id="1-페이지-아웃과-페이지-인">(1) 페이지 아웃과 페이지 인</h4>
<ul>
<li>페이지 단위로 스왑 아웃, 스왑 인을 하는 것을 말함</li>
<li>페이지는 물리 메모리 내 불연속적으로 배치될 수 있으므로 다음으로 실행될 페이지의 위치를 찾기 어려움</li>
</ul>
<h4 id="2-페이지-테이블">(2) 페이지 테이블</h4>
<ul>
<li>프로세스의 페이지와 실제로 적재된 프레임을 짝지어주는 정보</li>
<li>불연속적으로 배치된 페이지가 어떤 프레임에 적재되어 있는지 확인 가능</li>
<li>프로세스마다 각자의 페이지 테이블 정보를 가지고 있음</li>
</ul>
<h4 id="3-페이지-엔트리">(3) 페이지 엔트리</h4>
<ul>
<li>페이지 테이블을 구성하고 있는 각각의 행</li>
<li>페이지 번호, 프레임 번호, 유효 비트, 보호 비트, 참조 비트, 수정 비트를 정보로 가짐</li>
</ul>
<ul>
<li>유효 비트<ul>
<li>해당 페이지에 접근 가능한지 알려주는 정보</li>
<li>페이지가 메모리에 적재되어 있다면 1, 아니라면 0이 됨</li>
<li>유효 비트가 0인 페이지에 접근하려고 하면 페이지 폴트 예외 발생</li>
<li>페이지 폴트 발생 시 해당 페이지를 메모리로 가져와 유효 비트를 1로 바꿔주는 페이지 폴트 처리 루틴이 실행됨</li>
</ul>
</li>
</ul>
<ul>
<li>보호 비트<ul>
<li>페이지 보호 기능을 위해 존재하는 비트</li>
</ul>
</li>
</ul>
<ul>
<li>참조 비트<ul>
<li>CPU가 해당 페이지에 접근한 적이 있는지 여부를 나타내는 비트</li>
</ul>
</li>
</ul>
<ul>
<li>수정 비트 = 더티 비트<ul>
<li>해당 페이지에 데이터를 쓴 적이 있는지의 여부를 알려주는 비트</li>
</ul>
</li>
</ul>
<h4 id="4-페이지-테이블-베이스-레지스터ptbr">(4) 페이지 테이블 베이스 레지스터(PTBR)</h4>
<ul>
<li>특정 프로세스의 페이지 테이블이 적재된 메모리 상의 위치를 가리키는 레지스터</li>
<li>프로세스마다 가지고 있는 정보로 각 PCB에 기록됨</li>
<li>다른 프로세스로의 문맥 교환 발생 시 변경됨</li>
</ul>
<h4 id="5-tlb">(5) TLB</h4>
<ul>
<li>페이지 테이블의 캐시 메모리를 사용해 메모리 접근 시간을 줄이는 방식</li>
<li>참조 지역성의 원리에 근거해 자주 사용할 법한 페이지를 예상해 페이지 테이블의 일부 내용을 저장함</li>
</ul>
<h4 id="6-계층적-페이징">(6) 계층적 페이징</h4>
<ul>
<li>페이지 테이블을 페이징하는 방식</li>
<li>페이지 테이블을 계층적으로 구성해 CPU에 가장 가까운 페이지 테이블만 메모리에 유지함으로써 메모리 용량을 줄일 수 있음</li>
</ul>
<h4 id="7-페이징-주소-체계">(7) 페이징 주소 체계</h4>
<ul>
<li>페이지 번호: 몇 번째 페이지 번호에 접근할지를 나타내는 정보</li>
<li>변위: 접근하려는 주소가 페이지 시작 번지로부터 얼마나 떨어져 있는지를 나타내는 정보</li>
</ul>
<h3 id="4-페이지-교체-알고리즘">4) 페이지 교체 알고리즘</h3>
<ul>
<li>요구 페이징을 통해 페이지를 메모리에 적재하는 과정에서 메모리가 가득차 스왑 아웃해야 할 때 보조기억장치로 내보낼 페이지를 선택하는 방법</li>
</ul>
<h4 id="1-요구-페이징">(1) 요구 페이징</h4>
<ul>
<li>메모리에 필요한 페이지만을 적재하는 기법</li>
<li>CPU가 특정 페이지에 접근하는 명령어를 실행하면 해당 페이지가 메모리에 있는지에 따라 페이지 폴트 처리 루틴을 실행하거나 페이지에 적재된 프레임에 접근함</li>
</ul>
<ul>
<li>순수 요구 페이징<ul>
<li>메모리에 적재하지 않은 채 프로세스를 실행함</li>
<li>초기엔 페이지 폴트가 발생하나 페이지가 메모리에 적재되며 발생 빈도가 떨어짐</li>
</ul>
</li>
</ul>
<h4 id="2-fifo-페이지-교체-알고리즘">(2) FIFO 페이지 교체 알고리즘</h4>
<ul>
<li>메모리에 가장 먼저 적재된 페이지부터 스왑 아웃하는 페이지 교체 알고리즘</li>
<li>초기에 적재되어 참조되고 있는 페이지를 스왑 아웃해 페이지 폴트가 발생할 수 있음</li>
</ul>
<h4 id="3-최적-페이지-교체-알고리즘">(3) 최적 페이지 교체 알고리즘</h4>
<ul>
<li>앞으로의 사용 빈도가 가장 낮은 페이지를 교체하는 알고리즘</li>
<li>앞으로 가장 적게 사용할 페이지를 스왑 아웃해 가장 낮은 페이지 폴트율을 보장하는 알고리즘</li>
<li>미래를 예측하기 어려우므로 실제 구현하기 어려운 알고리즘</li>
</ul>
<h4 id="4-lru-페이지-교체-알고리즘">(4) LRU 페이지 교체 알고리즘</h4>
<ul>
<li>가장 적게 사용한 페이지를 교체하는 알고리즘</li>
<li>보편적으로 사용되는 페이지 교체 알고리즘의 원형</li>
</ul>
<h2 id="6-파일-시스템">6. 파일 시스템</h2>
<ul>
<li>보조기억장치의 정보를 파일 및 디렉터리(폴더) 형태로 저장하고 관리할 수 있도록 하는 운영체제 내부 프로그램</li>
</ul>
<h3 id="1-파일과-디렉터리">1) 파일과 디렉터리</h3>
<h4 id="1-파일">(1) 파일</h4>
<ul>
<li>파일의 이름, 파일을 실행하기 위한 정보, 파일과 관련한 부가 정보인 속성 또는 메타데이터로 구성됨</li>
<li>운영체제에 의해 파일을 다루는 모든 작업이 이루어지므로 시스템 콜을 이용해야 함</li>
<li>시스템 콜을 통해 파일을 할당받고 사용 중인 파일을 구분하기 위해 파일 디스크립터 사용</li>
<li>프로세스가 새로 파일을 열거나 생성할 때 운영체제가 해당 파일에 대한 파일 디스크립터를 프로세스에 할당</li>
</ul>
<ul>
<li>파일 디스크립터<ul>
<li>저수준에서 파일을 식별하는 정보</li>
<li>0 이상의 정수 형태를 띄고 있음</li>
<li>저수준의 파일 식별 및 입출력에 자주 사용</li>
</ul>
</li>
</ul>
<h4 id="2-디렉터리">(2) 디렉터리</h4>
<ul>
<li>여러 파일들을 관리하기 위해 사용</li>
<li>계층적 구조를 띄는 트리 구조 디렉터리로 관리됨</li>
<li>디렉터리에 속한 요소의 관련 정보가 포함된 파일로 간주됨</li>
<li>슬래시(/)를 디렉터리를 구분하는 구분자로 사용</li>
</ul>
<ul>
<li>경로: 디렉터리 정보를 활용해 파일 위치를 특정하는 정보</li>
<li>디렉터리 엔트리: 테이블 형태로 표현된 정보의 행 하나</li>
</ul>
<h3 id="2-파일-할당">2) 파일 할당</h3>
<h4 id="1-블록">(1) 블록</h4>
<ul>
<li>파일과 디렉터리를 읽고 쓰는 단위</li>
<li>하나 이상의 블록을 할당받아 하나의 파일이 보조기억장치에 저장됨</li>
<li>블록 하나 = 4096byte</li>
</ul>
<h4 id="2-연결-할당">(2) 연결 할당</h4>
<ul>
<li>각 블록의 일부에 다음 블록의 주소를 저장하여 각각의 블록이 다른 블록 가리키는 형태로 할당하는 방식</li>
<li>디렉터리 엔트리에 파일 이름, 파일을 이루는 첫 번째 블록 주소, 파일을 이루는 블록 단위 길이 명시</li>
<li>디렉터리 엔트리로 어떤 파일이 어디에 저장되어 있는지를 파악함</li>
</ul>
<h4 id="3-색인-할당">(3) 색인 할당</h4>
<ul>
<li>색인 블록에 파일을 이루는 모든 블록의 주소를 모아 관리하는 방식</li>
<li>디렉터리 엔트리에 파일 이름, 색인 블록 주소 명시</li>
<li>색인 블록만 알면 접근하려는 파일 데이터에 접근 가능</li>
</ul>
<h3 id="3-파일-시스템">3) 파일 시스템</h3>
<h4 id="1-포매팅">(1) 포매팅</h4>
<ul>
<li>파일 시스템을 설정하여 어떤 방식으로 파일을 저장하고 관리할 것인지 결정하고 새로운 데이터를 쓸 준비를 하는 작업</li>
<li>보조기억장치를 포매팅할 때 어떤 파일 시스템을 사용할지 결정할 수 있음</li>
</ul>
<h4 id="2-아이노드-기반-파일-시스템">(2) 아이노드 기반 파일 시스템</h4>
<ul>
<li>색인 블록인 아이노드를 기반으로 파일을 할당하는 방식</li>
<li>파일마다 각각의 아이노드를 가지며 이 아이노드에는 각각의 번호가 부여됨</li>
<li>아이노드에는 파일 이름을 제외한 거의 모든 정보가 담겨 있음</li>
<li>파티션 내 특정 영역에 아이노드가 모여 있음</li>
<li>데이터 영역에 공간이 남아 있더라도 아이노드 영역이 가득 차 더이상 아이노드를 할당할 수 없다면 새로운 파일 생성 불가능</li>
</ul>
<h4 id="3-마운트">(3) 마운트</h4>
<ul>
<li>어떤 저장장치의 파일 시스템에서 다른 저장장치의 파일 시스템으로 접근할 수 있도록 파일 시스템을 편입시키는 작업</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[241014 CS 스터디 정리]]></title>
            <link>https://velog.io/@apple-mint/cs241014</link>
            <guid>https://velog.io/@apple-mint/cs241014</guid>
            <pubDate>Mon, 14 Oct 2024 14:20:50 GMT</pubDate>
            <description><![CDATA[<h2 id="1-운영체제의-큰-그림">1. 운영체제의 큰 그림</h2>
<ul>
<li>커널: 운영체제의 핵심 기능을 담당하는 부분</li>
<li>운영체제는 응용 프로그램 대신 컴퓨터 부품에 접근해 효율적으로 사용되도록 관리하고 이러한 자원들을 다시 응용 프로그램에게 할당함</li>
</ul>
<h3 id="1-운영체제의-역할">1) 운영체제의 역할</h3>
<h4 id="1-자원-할당-및-관리">(1) 자원 할당 및 관리</h4>
<ul>
<li>자원: 프로그램 실행에 필요한 요소
ex. 데이터, 컴퓨터 핵심 부품</li>
</ul>
<ul>
<li>CPU, 메모리, 파일/디렉터리와 같은 자원을 할당하고 관리함</li>
</ul>
<h4 id="2-프로세스-및-스레드-관리">(2) 프로세스 및 스레드 관리</h4>
<ul>
<li>프로세스: 실행 중인 프로그램을 지칭</li>
<li>스레드: 프로세스를 이루는 실행의 단위</li>
</ul>
<p>동시다발적으로 실행되는 프로세스와 스레드를 올바르게 처리할 수 있도록 실행순서를 제어하고 요구자원을 적절하게 배분함</p>
<h3 id="2-시스템-콜과-이중-모드">2) 시스템 콜과 이중 모드</h3>
<ul>
<li>커널 영역: 운영체제가 적재되는 영역</li>
<li>사용자 영역: 사용자 응용 프로그램이 적재되는 영역</li>
<li>시스템 콜: 소프트웨어 인터럽트의 일종으로 응용 프로그램의 자원 접근 및 조작을 대행하는 운영체제 코드를 실행할 수 있는 방법</li>
</ul>
<ul>
<li>커널 모드: 커널 영역에 적재된 코드를 실행할 때의 실행 모드</li>
<li>사용자 모드: 사용자 영역에 적재된 코드를 실행할 때의 실행 모드</li>
<li>이중 모드: 위 2개의 모드로 구분하여 실행하는 것</li>
</ul>
<h2 id="2-프로세스와-스레드">2. 프로세스와 스레드</h2>
<h3 id="1-프로세스를-구성하는-메모리-정보">1) 프로세스를 구성하는 메모리 정보</h3>
<h4 id="1-커널-영역">(1) 커널 영역</h4>
<ul>
<li>프로세스 제어 블록(PCB)<ul>
<li>프로세스를 식별할 수 있는 정보</li>
<li>프로세스 테이블 형태로 관리되며 추가/삭제를 통해 자원 할당/해제함</li>
</ul>
</li>
</ul>
<h4 id="2-사용자-영역">(2) 사용자 영역</h4>
<ul>
<li>정적 할당 영역: 코드 영역, 데이터 영역</li>
<li>동적 할당 영역: 힙 영역, 스택 영역</li>
</ul>
<ul>
<li>코드 영역<ul>
<li>실행 가능한 명령어가 저장되는 공간</li>
</ul>
</li>
</ul>
<ul>
<li>데이터 영역<ul>
<li>프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간</li>
<li>정적 변수, 전역 변수</li>
</ul>
</li>
</ul>
<ul>
<li>힙 영역<ul>
<li>사용자가 직접 할당 가능한 저장공간</li>
<li>메모리 누수 발생 위험이 있음</li>
<li>이를 해결하기 위해 가비지 컬렉션 기능을 제공하기도 함</li>
</ul>
</li>
</ul>
<ul>
<li>스택 영역<ul>
<li>일시적으로 사용할 값들이 저장되는 공간</li>
<li>매개변수, 지역변수, 스택 트레이스 형태의 함수 호출 정보 등</li>
<li>스택 트레이스: 특정 시점에 스택 영역에 저장된 함수 호출 정보</li>
</ul>
</li>
</ul>
<h3 id="2-프로세스">2) 프로세스</h3>
<h4 id="1-프로세스-실행과정">(1) 프로세스 실행과정</h4>
<ul>
<li>프로세스가 실행된다 = 운영체제에 의해 CPU의 자원을 할당받았다</li>
<li>프로세스는 타이머 인터럽트에 의해 정해진 시간만큼 CPU를 사용</li>
<li>프로세스를 다시 수행하기 위해 중간 정보를 백업</li>
<li>백업된 정보를 PCB에 명시하고 다음 프로세스의 중간 정보를 백업</li>
</ul>
<ul>
<li>문맥: 프로세스 수행 재개를 위해 기억해야 할 정보</li>
<li>문맥교환: 기존 프로세스의 문맥을 PCB에 백업하고 PCB에서 문맥을 복구하여 새로운 프로세스를 실행하는 것</li>
</ul>
<h4 id="2-프로세스-상태">(2) 프로세스 상태</h4>
<ul>
<li>생성 상태<ul>
<li>프로세스를 생성 중으로 메모리에 적재되어 PCB를 할당받은 상태</li>
<li>생성 상태를 거쳐 실행할 준비가 완료된 프로세스는 준비 상태가 됨</li>
</ul>
</li>
</ul>
<ul>
<li>준비 상태<ul>
<li>CPU 할당을 받는 것을 기다리고 있는 상태</li>
<li>준비 상태인 프로세스가 CPU 할당받으면 실행 상태가 됨</li>
<li>디스패치: 준비 상태인 프로세스가 실행 상태로 전환되는 것</li>
</ul>
</li>
</ul>
<ul>
<li>실행 상태<ul>
<li>CPU를 할당받아 실행 중인 상태로 일정 시간 동안 CPU 사용 가능한 상태</li>
<li>타이머 인터럽트가 발생하며 할당된 시간을 모두 사용하면 준비 상태로 전환</li>
<li>실행 중 입출력장치를 사용해 입출력장치의 작업이 끝날 때까지 기다려야 하면 대기 상태로 전환</li>
</ul>
</li>
</ul>
<ul>
<li>대기 상태<ul>
<li>프로세스가 입출력 작업을 요청하거나 바로 확보할 수 없는 자원을 요청하는 등 바로 실행히 불가한 조건에 놓이는 경우의 상태</li>
<li>실행 가능한 상태가 되면 준비 상태가 됨</li>
</ul>
</li>
</ul>
<ul>
<li>종료 상태<ul>
<li>프로세스가 종료된 상태</li>
<li>운영체제가 PCB, 프로세스가 사용한 메모리를 정리</li>
</ul>
</li>
</ul>
<h3 id="3-멀티프로세스와-멀티스레드">3) 멀티프로세스와 멀티스레드</h3>
<h4 id="1-멀티프로세스">(1) 멀티프로세스</h4>
<ul>
<li>동시에 여러 프로세스가 실행되는 것</li>
<li>자원 공유X: 독립적으로 실행하며 다른 프로세스에 문제가 발생해도 지장이 없거나 적음</li>
</ul>
<h4 id="2-멀티스레드">(2) 멀티스레드</h4>
<ul>
<li>프로세스를 동시에 실행하는 여러 스레드</li>
<li>자원 공유: 동일한 주소 공간의 코드, 데이터, 힙 영역을 공유하며 협력 및 통신이 가능</li>
</ul>
<h3 id="4-프로세스-간-통신">4) 프로세스 간 통신</h3>
<h4 id="1-공유-메모리">(1) 공유 메모리</h4>
<ul>
<li>공유하는 메모리 영역을 토대로 데이터를 주고받는 통신 방식</li>
<li>자신에게 할당된 메모리 공간처럼 사용하며 통신 속도가 빠름</li>
<li>데이터의 일관성이 훼손되는 레이스 컨디션이 발생할 수 있음</li>
</ul>
<ul>
<li>레이스 컨디션: 프로세스 또는 스레드가 동시에 임계 구역의 코드를 실행하여 문제가 발생하는 상황</li>
<li>임계 구역: 공유 자원에 접근하는 코드 중 동시에 실행했을 때 문제가 발생할 수 있는 코드</li>
</ul>
<h4 id="2-메시지-전달">(2) 메시지 전달</h4>
<ul>
<li>프로세스 간 데이터가 커널을 거쳐 송수신되는 통신 방식</li>
<li>파이프, 시그널, 소켓, 원격 프로시저 호출 등이 있음</li>
</ul>
<ul>
<li>파이프<ul>
<li>단방향 프로세스 간 통신 도구</li>
<li>양방향으로 사용할 경우 읽기용, 쓰기용 2개를 활용</li>
</ul>
</li>
</ul>
<ul>
<li>시그널<ul>
<li>프로세스에게 특정 이벤트가 발생했음을 알리는 비동기적 신호</li>
<li>시그널 발생 시 하던 일을 잠시 중단</li>
<li>시그널 처리를 위해 시그널 핸들러 실행 뒤 실행을 재개</li>
</ul>
</li>
</ul>
<ul>
<li>원격 프로시저 호출(PRC)<ul>
<li>원격 코드를 실행하는 IPC 기술</li>
<li>프로그래밍 언어나 플랫폼과 무관하게 성능 저하를 최소화하고 메시지 송수신이 가능하므로 대규모 트래픽 처리환경, 서버 간 통신 환경에서 주로 사용</li>
</ul>
</li>
</ul>
<h2 id="3-동기화와-교착-상태">3. 동기화와 교착 상태</h2>
<h3 id="1-동기화">1) 동기화</h3>
<ul>
<li>레이스 컨디션을 방지하면서 임계 구역을 관리하기 위해 실행 순서 제어, 상호 배제를 준수하며 실행하는 것</li>
</ul>
<h4 id="1-동기화-조건">(1) 동기화 조건</h4>
<ul>
<li>실행 순서 제어: 프로세스 및 스레드를 올바른 순서로 실행</li>
<li>상호 배제: 동시 접근이 불가한 자원에 하나의 프로세스 및 스레드만 접근</li>
</ul>
<h4 id="2-동기화-기법">(2) 동기화 기법</h4>
<ul>
<li>뮤텍스 락<ul>
<li>동시 접근이 불가한 자원에 동시 접근할 수 없도록 상호 배제를 보장하는 동기화 도구</li>
<li>한번에 하나의 프로세스 및 스레드만 공유 자원을 이용할 수 있도록 하는 데에 적합</li>
</ul>
</li>
</ul>
<ul>
<li>세마포<ul>
<li>하나의 공유 자원을 고려하는 동기화 도구</li>
<li>공유자원이 여러 개 있는 상황에서 동기화 가능</li>
</ul>
</li>
</ul>
<ul>
<li>모니터<ul>
<li>공유 자원과 그 공유 자원을 다루는 함수로 구성된 동기화 도구</li>
<li>상호 배제뿐만 아니라 실행 순서 제어 동기화도 가능</li>
</ul>
</li>
</ul>
<ul>
<li>스레드 안전<ul>
<li>멀티스레드 환경에서 어떤 변수나 함수, 객체에 동시 접근이 이루어져도 실행에 문제가 없는 상태</li>
<li>어떤 함수가 스레드 안전하다면 여러 스레드에 의해 호출되어도 레이스 컨디션이 발생하지 않음</li>
</ul>
</li>
</ul>
<h3 id="2-교착-상태">2) 교착 상태</h3>
<ul>
<li>일어나지 않을 사건을 기다리며 프로세스의 진행이 멈춰 버린 현상</li>
<li>한정된 자원의 무분별한 할당으로 인해 발생하는 문제</li>
</ul>
<h4 id="1-교착-상태-발생-조건">(1) 교착 상태 발생 조건</h4>
<p>다음과 같은 4개의 조건이 모두 만족했을 때 발생 가능성이 생김</p>
<ul>
<li><p>상호 배제: 한 프로세스가 사용하는 자원을 다른 프로세스가 사용할 수 없을 때 발생할 수 있음</p>
</li>
<li><p>점유와 대기: 한 프로세스가 어떤 자원을 할당받은 상태에서 다른 자원을 할당받기를 기다릴 때 발생할 수 있음</p>
</li>
<li><p>비선점: 해당 자원을 이용하는 프로세스의 작업이 끝날 때까지 대기해야 할 때 해당 자원을 강제로 빼앗지 못하는 경우 발생할 수 있음</p>
</li>
<li><p>원형 대기: 프로세스와 프로세스가 요청한 자원의 원의 형태를 이룰 때 발생할 수 있음</p>
</li>
</ul>
<h4 id="2-교착-상태-해결법">(2) 교착 상태 해결법</h4>
<ul>
<li>예방: 교착 상태 발생 조건 중 하나를 만족시키지 못하게 함</li>
<li>회피: 프로세스에 할당할 수 있는 자원이 충분한 상태에서 적은 프로세스에게 자원을 할당</li>
<li>검출 후 회복: 교착 상태 검출 시 자원 선점을 통해 회복시키거나 교착 상태에 놓인 프로세스를 강제 종료함으로써 회복시킴</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[241010 CS 스터디 정리]]></title>
            <link>https://velog.io/@apple-mint/cs241010</link>
            <guid>https://velog.io/@apple-mint/cs241010</guid>
            <pubDate>Thu, 10 Oct 2024 13:17:30 GMT</pubDate>
            <description><![CDATA[<h2 id="1-컴퓨터-구조의-큰-그림">1. 컴퓨터 구조의 큰 그림</h2>
<h3 id="1-컴퓨터가-이해하는-정보">1) 컴퓨터가 이해하는 정보</h3>
<ul>
<li>컴퓨터가 이해할 수 있는 정보는 명령어와 데이터</li>
<li>명령어<ul>
<li>수행할 동작과 수행할 대상으로 이루어짐</li>
<li>데이터를 활용하는 정보</li>
</ul>
</li>
<li>데이터<ul>
<li>숫자, 문자, 이미지, 동영상과 같은 정적인 정보</li>
<li>명령의 대상, 명령어의 재료, 명령어에 종속적인 정보</li>
</ul>
</li>
</ul>
<h3 id="2-컴퓨터의-핵심-부품">2) 컴퓨터의 핵심 부품</h3>
<h4 id="1-cpu">(1) CPU</h4>
<ul>
<li>명령어와 데이터를 읽어 들이고 해석하고 실행하는 부품</li>
<li>인간으로 비유했을 때 두뇌에 해당함</li>
<li>산술논리연산장치, 제어장치, 여러 레지스터들이 존재함</li>
</ul>
<ul>
<li>산술논리연산장치<ul>
<li>연산을 수행할 회로로 구성되어 있는 일종의 계산기</li>
</ul>
</li>
<li>제어장치<ul>
<li>특정 부품에 신호를 보내 동작시키는 전기 신호를 보내는 장치</li>
</ul>
</li>
<li>레지스터<ul>
<li>CPU 내부 작은 임시 저장장치</li>
<li>명령어와 데이터를 처리하는 과정의 중간값 저장</li>
<li>CPU가 처리하는 명령어가 반드시 저장되므로 프로그램이 어떻게 실행되는지 확인 가능</li>
</ul>
</li>
</ul>
<h4 id="2-메모리">(2) 메모리</h4>
<ul>
<li>실행 중인 프로그램을 구성하는 명령어와 데이터를 저장하는 부품</li>
<li>주소<ul>
<li>메모리 속 명령어와 데이터에 쉽게 접근할 수 있도록 주소가 있음</li>
<li>CPU에서 원하는 정보에 접근하기 위해서는 주소가 필요함</li>
</ul>
</li>
<li>휘발성<ul>
<li>컴퓨터에 전원이 연결되어 있는 동안 메모리에 저장된 정보가 남아 있음</li>
<li>전원이 꺼질 경우 컴퓨터 실행 시 저장되었던 정보가 모두 삭제됨</li>
</ul>
</li>
</ul>
<h4 id="3-보조기억장치">(3) 보조기억장치</h4>
<ul>
<li>전원이 꺼져도 정보가 삭제되지 않는 정보를 저장하는 부품</li>
<li>메모리와 달리 비휘발성이며 보괄할 프로그램을 저장함</li>
<li>CPU는 보조기억장치에 저장된 프로그램을 곧장 가져와 실행할 수 없으므로 RAID를 활용함</li>
</ul>
<h4 id="4-입출력장치">(4) 입출력장치</h4>
<ul>
<li>컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환하는 장치</li>
<li>보조기억장치와 입출력장치를 묶어 주변장치라고도 함</li>
</ul>
<h4 id="5-메인보드">(5) 메인보드</h4>
<ul>
<li>위와 같은 부품들을 모두 고정하고 서로 연결하는 기판</li>
<li>버스<ul>
<li>각 부품들이 정보를 주고받는 통로</li>
</ul>
</li>
<li>시스템 버스<ul>
<li>핵심 부품들을 연결하는 버스</li>
</ul>
</li>
</ul>
<h2 id="2-컴퓨터가-이해하는-정보">2. 컴퓨터가 이해하는 정보</h2>
<h3 id="1-표현-단위">1) 표현 단위</h3>
<ul>
<li>비트(bit)<ul>
<li>0과 1을 나타내는 가장 작은 정보의 단위</li>
<li>N비트는 $$2^N$$개의 정보를 표현할 수 있음</li>
</ul>
</li>
</ul>
<table>
<thead>
<tr>
<th>구분</th>
<th>단위</th>
</tr>
</thead>
<tbody><tr>
<td>1byte</td>
<td>8bit</td>
</tr>
<tr>
<td>1kB</td>
<td>1,000byte</td>
</tr>
<tr>
<td>1MB</td>
<td>1,000kB</td>
</tr>
<tr>
<td>1GB</td>
<td>1,000MB</td>
</tr>
</tbody></table>
<ul>
<li>워드(word)<ul>
<li>CPU가 한번에 처리할 수 있는 데이터의 크기</li>
<li>대부분 현대 컴퓨터 워드 크기는 32bit, 64bit임</li>
</ul>
</li>
</ul>
<h3 id="2-숫자-표현">2) 숫자 표현</h3>
<h4 id="1-2진법">(1) 2진법</h4>
<ul>
<li>숫자 1을 넘어가는 시점에 자리올림해 0, 1로 모든 수를 표현</li>
<li>숫자 뒤에 아래첨자로 $$(2)$$를 붙이거나 2진수 앞에 $$0b$$를 붙임<h4 id="2-16진법">(2) 16진법</h4>
</li>
<li>숫자 16을 넘어가는 시점에 자리올림해 모든 수를 표현</li>
<li>2진법으로 표현 시 숫자의 길이가 너무 길어지는 단점을 보완하기 위해 사용</li>
<li>숫자가 두 자리수로 넘어갈 경우 A, B, C, D, E, F를 사용</li>
<li>숫자 뒤에 아래첨자로 $$(16)$$를 붙이거나 16진수 앞에 $$0x$$를 붙임<h4 id="3-부동-소수점">(3) 부동 소수점</h4>
</li>
<li>소수점을 나타내기 위해 사용하는 표현 방식</li>
<li>2진수의 지수와 가수를 IEEE 754 방식을 통해 저장함</li>
<li>10진수 체계의 소수를 2진수 또는 16진수 체계의 소수로 바꾸는 과정에서 그 수가 딱 떨어지지 않을 수 있으므로 일부 소수점을 생략함</li>
<li>따라서 같은 결과가 나옴에도 이를 같은 숫자로 보지 않는 문제가 발생함</li>
</ul>
<h3 id="3-문자-표현">3) 문자 표현</h3>
<h4 id="1-문자-집합">(1) 문자 집합</h4>
<ul>
<li>컴퓨터가 이해할 수 있는 문자들의 집합</li>
<li>아스키, KS X 1001, KS X 1003, 유니코드가 있음</li>
<li>오른쪽으로 갈수록 더 많은 문자를 표현할 수 있음</li>
</ul>
<h4 id="2-문자-인코딩">(2) 문자 인코딩</h4>
<ul>
<li>사람이 이해하는 문자 집합의 문자를 0과 1로 이루어진 문자 코드로 변환하는 과정 </li>
</ul>
<ul>
<li>아스키 인코딩<ul>
<li>하나의 문자를 표현하기 위해 8bit 사용</li>
<li>그 중 1bit는 오류 검출을 위해 사용되는 패리티 비트</li>
<li>7bit로 이루어진 코드를 대응해 인코딩함</li>
</ul>
</li>
</ul>
<ul>
<li>KS X 1001, KS X 1003 인코딩<ul>
<li>아스키로 한글을 표기할 수 없어 만들어진 문자 집합</li>
<li>2byte로 하나의 한글 글자를 표현하며 EUC-KR로 인코딩함</li>
</ul>
</li>
</ul>
<ul>
<li>유니코드 인코딩<ul>
<li>현대 가장 많이 사용되는 표준 문자 집합</li>
<li>UTF-8, UTF-16, UTF-32 등으로 인코딩함</li>
</ul>
</li>
</ul>
<ul>
<li>base64<ul>
<li>문자뿐만 아니라 이진 데이터까지 변환할 수 있는 인코딩 방식</li>
<li>64개의 문자를 사용하므로 6bit씩 끊어서 아스키 문자로 변환함</li>
<li>6bit로 끊어지지 않는다면 해당 자리를 0으로 채우는 패딩이 발생함</li>
</ul>
</li>
</ul>
<h4 id="3-문자-디코딩">(3) 문자 디코딩</h4>
<ul>
<li>0과 1로 이루어진 문자 코드를 사람이 이해하는 문자 집합의 문자로 변환하는 과정</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>