<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>sori.log</title>
        <link>https://velog.io/</link>
        <description></description>
        <lastBuildDate>Wed, 14 Feb 2024 06:01:31 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>sori.log</title>
            <url>https://images.velog.io/images/sori_127/profile/b15cfb74-3987-479b-8f38-ad91a2ee6e68/social.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. sori.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/sori_127" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[코딩테스트 (* Programmers)]]></title>
            <link>https://velog.io/@sori_127/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-Programmers</link>
            <guid>https://velog.io/@sori_127/%EC%BD%94%EB%94%A9%ED%85%8C%EC%8A%A4%ED%8A%B8-Programmers</guid>
            <pubDate>Wed, 14 Feb 2024 06:01:31 GMT</pubDate>
            <description><![CDATA[<p>💻 <a href="https://www.mycompiler.io/ko/new/typescript">Code Editor 1</a></p>
<p>💻 <a href="https://www.programiz.com/javascript/online-compiler/">Code Editor 2</a></p>
<h3 id="1-문자열-곱하기">1) 문자열 곱하기</h3>
<ul>
<li><p><strong><a href="https://school.programmers.co.kr/learn/courses/30/lessons/181940">문제</a></strong>
문자열 my_string과 정수 k가 주어질 때, my_string을 k번 반복한 문자열을 return 하는 solution 함수를 작성해 주세요.</p>
</li>
<li><p><strong>입출력 예</strong></p>
<ul>
<li>[my_string | k | result]</li>
<li>&quot;string&quot; | 3 | &quot;stringstringstring&quot;<ul>
<li>&quot;love&quot; | 10 | &quot;lovelovelovelovelovelovelovelovelovelove&quot;</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>코드</strong></p>
</li>
</ul>
<pre><code class="language-js">// case 1
function solution(my_string, k) {
    var answer = &#39;&#39;;

    for(var i=0; i&lt;k; i++) {
        answer += my_string;
    }

    return answer;
}

// case 2
function solution(my_string, k) {
    return my_string.repeat(k)
}

// console.log(solution(&#39;love&#39;, 3));</code></pre>
<br />

<h3 id="2-n보다-커질-때까지-더하기">2) n보다 커질 때까지 더하기</h3>
<ul>
<li><p><strong><a href="https://school.programmers.co.kr/learn/courses/30/lessons/181884">문제</a></strong>
정수 배열 numbers와 정수 n이 매개변수로 주어집니다. 
numbers의 원소를 앞에서부터 하나씩 더하다가 그 합이 n보다 커지는 순간 이때까지 더했던 원소들의 합을 return 하는 solution 함수를 작성해 주세요.
<em>제한사항)
1 ≤ numbers의 길이 ≤ 100
1 ≤ numbers의 원소 ≤ 100
0 ≤ n &lt; numbers의 모든 원소의 합</em></p>
</li>
<li><p><strong>입출력 예</strong></p>
<ul>
<li>[numbers | k | result]</li>
<li>[34, 5, 71, 29, 100, 34] | 123 | 139<ul>
<li>[58, 44, 27, 10, 100] | 139 | 239</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>코드</strong></p>
</li>
</ul>
<pre><code class="language-js">// case 1
function solution(numbers, n) {
    var answer = 0;

    for(var i=0; i&lt;numbers.length; i++) {
        answer += numbers[i];

        if(answer &gt; n) return answer;
    }
}

// case 2
function solution(numbers, n) {
    var answer = 0;

    let i = 0;
    while(answer &lt;= n) {
        answer += numbers[i++]
    }

    return answer;
}

// console.log(solution([58, 44, 27, 10, 100], 139))</code></pre>
<br />

<h3 id="3-특수문자-출력하기">3) 특수문자 출력하기</h3>
<ul>
<li><strong><a href="https://school.programmers.co.kr/learn/courses/30/lessons/181948">문제</a></strong>
다음과 같이 출력하도록 코드를 작성해 주세요.</li>
<li><strong>출력 예시</strong>
!@#$%^&amp;*(&#39;&quot;&lt;&gt;?:;</li>
<li><strong>코드</strong></li>
</ul>
<pre><code class="language-js">const readline = require(&#39;readline&#39;);
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.on(&#39;close&#39;, function () {
  console.log(`!@#$%^&amp;*(\\&#39;&quot;&lt;&gt;?:;`);
});</code></pre>
]]></description>
        </item>
        <item>
            <title><![CDATA[머신러닝, 딥러닝 그리고 인공지능]]></title>
            <link>https://velog.io/@sori_127/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-VS-%EB%94%A5%EB%9F%AC%EB%8B%9D</link>
            <guid>https://velog.io/@sori_127/%EB%A8%B8%EC%8B%A0%EB%9F%AC%EB%8B%9D-VS-%EB%94%A5%EB%9F%AC%EB%8B%9D</guid>
            <pubDate>Fri, 19 Jan 2024 06:49:48 GMT</pubDate>
            <description><![CDATA[<h1 id="머신러닝">머신러닝</h1>
<hr>
<blockquote>
<p>규칙을 일일이 프로그래밍하지 않아도 자동으로 데이터에서 규칙을 학습하는 알고리즘을 연구하는 분야</p>
</blockquote>
<p>일반적인 프로그래밍은 특정한 프로그램을 만들어 데이터를 처리하고 내보내 결과를 만들어 낸다.</p>
<p>ex) 기존의 이미지 처리
: 물체의 이미지 정보를 읽어 사람이 직접 함수를 거는 것</p>
<p>이와 반대로 머신러닝은 전통적인 프로그래밍으로는 접근하기 어려운 여러 다양한 유형의 데이터들(ex. 글, 이미지, 동영상 등의 비정형데이터)을 이용하여 기계에 학습시켜 특정한 결과물(규칙, 아이디어 등)을 만들어낸다.</p>
<p>ex) 이미지 처리 with 머신러닝
: 사람이 하던 함수 설정을 컴퓨터가 학습(training)을 통해 러닝 함수 f(x)를 찾아가고 새로운 데이터를 러닝 함수 f(x)에 입력하면 예측(predict)을 통해 output을 도출하는 것</p>
<h3 id="기계-학습을-위한-방법">기계 학습을 위한 방법</h3>
<p><img src="https://velog.velcdn.com/images/sori_127/post/1bdd0bad-c205-45c3-97ca-02ca3c2a93eb/image.png" alt=""></p>
<ul>
<li><strong>지도 학습</strong> <em>(Supervised Learning)</em></li>
<li><strong>비지도 학습</strong> <em>(Unsupervised Learning)</em></li>
<li><strong>강화 학습</strong> <em>(Reinforcement Learning)</em></li>
</ul>
<br />

<h1 id="딥러닝">딥러닝</h1>
<hr>
<blockquote>
<p>머신러닝 알고리즘 중에 인공 신경망(artificial neural network)을 기반으로 한 방법들을 통칭</p>
</blockquote>
<p>머신러닝 기법 중 하나로 말 그대로 기계를 &quot;심화학습&quot;시키는 것을 의미하며,</p>
<p>머신러닝 모델은 학습을 통해 점차적으로 향상되지만, 이러한 AI 알고리즘이 부정확한 예측을 반환하면 엔지니어가 개입하여 조정해야한다. 
그러나 딥러닝 모델을 사용하면 알고리즘이 머신러닝으로 쌓아올린 자체 신경망을 통해 예측의 정확성 여부를 스스로 판단할 수 있습니다.</p>
<p>인간의 신경망 원리를 모방한 인공신경망을 통해 사람의 도움없이 기계가 스스로 학습하고 판단을 내린다는 것이 가장 큰 특징이다.</p>
<h2 id="딥러닝-모델-종류">딥러닝 모델 종류</h2>
<blockquote>
<p><em>인간의 논리 구조인 인공 신경망에 얼마나 근접한 알고리즘 구조를 갖췄는가 ?</em></p>
</blockquote>
<ul>
<li><p><strong>CNN</strong></p>
<ul>
<li><p>Convolutional Neural Network, 합성곱 신경망</p>
</li>
<li><p>인간의 시신경 구조(퍼셉트론)를 모방한 기술</p>
</li>
<li><p>노드 간 연결 갯수가 기하급수적으로 증가하여 크기가 작은 필터를 사용함</p>
</li>
<li><p>이로 인해 가중치의 개수를 줄여주며 국부 영역에 대한 특징에 집중할 수 있는 특성이 있음</p>
</li>
<li><p>위의 특징으로 학습이 가능해 비전 분야에서 성능이 우수함</p>
</li>
<li><p>이미지를 인식하기 위해 패턴을 찾는데 특히 유용함</p>
</li>
<li><p>데이터를 직접 학습하고 패턴을 사용해 이미지를 분류함</p>
</li>
<li><p>자율주행자동차, 얼굴인식과 같은 객체인식에 사용되고 있음</p>
</li>
<li><p><strong>사람이 여러 데이터를 보고 기억한 후에 무엇인지 맞추는 것과 유사함</strong></p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p><strong>RNN</strong></p>
<ul>
<li>Recurrent Neural Network, 순환 신경망</li>
<li>순차적 정보가 담긴 데이터에서 규칙적인 패턴을 인식하고 추상화된 정보를 추출함</li>
<li>텍스트, 음성, 음악, 영상 등 순차적 데이터를 다루는데 적합함</li>
<li><strong>마치 우리가 적성검사의 추론 영역을 푸는 것과 유사함</strong></li>
</ul>
</li>
<li><p><strong>GAN</strong></p>
<ul>
<li>Generative Adversarial Network, 생성 대립 신경망</li>
<li>비지도 학습 방법으로 학습된 패턴을 이용해 이미지나 음성을 생성함</li>
<li>이미지 및 음성 복원에 주로 적용됨</li>
<li><strong>누군가를 성대 묘사, 얼굴 묘사하는 것과 유사함</strong></li>
</ul>
</li>
<li><p><strong>RL</strong></p>
<ul>
<li>Reinforcement Learning, 강화학습</li>
<li>구글의 딥마인드에서 개발한 것으로 관계형 추론을 지원함</li>
<li>지금까지 딥러닝은 분류, 이미지 인식, 음성 인식, 번역, 이미지 생성에만 국한된 한계가 있었음</li>
<li>RL은 딥러닝 기술을 인간의 사고에 근사한 논리적 추론이 가능한 분야까지 확대시킴</li>
<li><strong>정해진 규칙이 없는 관계를 추론 하는 것과 유사함</strong></li>
</ul>
</li>
</ul>
<br />

<h1 id="딥러닝과-머신러닝의-차이">딥러닝과 머신러닝의 차이</h1>
<hr>
<p><img src="https://velog.velcdn.com/images/sori_127/post/4d11655b-27ef-4e7e-b0f1-0f297f13ebe5/image.png" alt=""></p>
<h3 id="머신러닝-1">머신러닝</h3>
<p>: 사람이 동물의 특징을 분류하여 어떤 동물인지 알 수 있도록 학습시켜야 함</p>
<h3 id="딥러닝-1">딥러닝</h3>
<p>: 단순 사진만을 보고 기계가 인공신경망을 통해 스스로 학습하여 어떤 동물인지 분류하게 됨</p>
<blockquote>
<p><strong>딥러닝이 필요한 이유</strong></p>
</blockquote>
<ul>
<li>데이터에 너무나 많은 기능이 있을 경우</li>
<li>데이터가 방대할 경우</li>
<li>높은 수준의 정확도가 필요한 경우</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[빅 데이터]]></title>
            <link>https://velog.io/@sori_127/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0</link>
            <guid>https://velog.io/@sori_127/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0</guid>
            <pubDate>Fri, 19 Jan 2024 06:49:25 GMT</pubDate>
            <description><![CDATA[<h1 id="빅-데이터란">빅 데이터란,</h1>
<hr>
<blockquote>
<p>대용량 데이터를 활용, 분석하여 가치있는 정보를 추출하고
생성된 지식을 바탕으로 능동적으로 대응하거나 변화를 예측하기 위한 정보화 기술이다.</p>
</blockquote>
<br />

<h1 id="빅-데이터의-5v">빅 데이터의 5V</h1>
<hr>
<ul>
<li><strong>Volume</strong> <em>(용량)</em><ul>
<li>기업이 관리하고 분석하는 빅 데이터 크기와 양</li>
</ul>
</li>
<li><strong>Velocity</strong> <em>(속도)</em><ul>
<li>회사가 데이터를 수신, 저장 및 관리하는 속도
ex) 특정 기간 내에 수신된 특정 소셜 미디어 게시물 또는 검색 쿼리 수</li>
</ul>
</li>
<li><strong>Variety</strong> <em>(다양성)</em><ul>
<li>비정형 데이터, 반정형 데이터 및 원시 데이터를 포함하는 다양한 데이터 유형
ex) 스마트폰, 사내 장치, SNS 채팅 프로그램, 주식 시세 데이터 및 금융 거래 데이터</li>
</ul>
</li>
<li><strong>Veracity</strong> <em>(진실성)</em><ul>
<li>경영진들의 신뢰도에 영향을 미치는 데이터 및 정보 자신의 진실 또는 정확성</li>
</ul>
</li>
<li><strong>Value</strong> <em>(가치)</em><ul>
<li>비즈니스 관점에서 가장 중요한 &#39;V&#39;인 빅 데이터의 가치는 일반적으로 보다 효과적인 운영, 더 강력한 고객 관계 및 기타 명확하고 수량화 가능한 비즈니스 이점으로 이어지는 통찰력 발견 및 패턴 인식에서 나옴</li>
</ul>
</li>
</ul>
<br />

<h1 id="빅데이터-기술">빅데이터 기술</h1>
<p><em>Hadoop &amp; NoSQL</em></p>
<hr>
<p><img src="https://velog.velcdn.com/images/sori_127/post/675c7f7d-addc-4d5f-a146-dbea49e8379e/image.png" alt=""></p>
<p>웹 서버에서 생성된 데이터는 RDB나 NoSQL에 텍스트 데이터 형태로 저장되고,
그 후 모든 데이터가 Hadoop에 모여서 대규모 데이터처리가 실행된다.</p>
<h2 id="hadoop">Hadoop</h2>
<blockquote>
<p>다수의 컴퓨터로 대량의 데이터를 처리하기 위한 시스템</p>
</blockquote>
<p>방대한 데이터를 저장할 스토리지와 이를 순차적으로 처리할 수 있는 구조가 필요해 !
→ 이를 가능하게 해주는 툴이 <strong>Hadoop</strong>이고, 구글에서 개발된 분산 처리 프레임워크인 ‘<strong>MapReduce</strong>’를 기반으로 제작됨</p>
<h2 id="nosql">NoSQL</h2>
<blockquote>
<p>NoSQL은 기존의 RDB의 정형화된 데이터 형태에서 벗어난 데이터베이스의 총칭을 의미한다.
대표적인 3가지는 Key-Value, Document, wide-column 이다.</p>
</blockquote>
<ul>
<li><strong>Key-value</strong>: 문자 그대로 키값 밸류값이 한쌍으로 저장되어지는 데이터 베이스</li>
<li><strong>Document</strong>: Json과 같은 복잡한 데이터 구조를 저장</li>
<li><strong>Wide-column</strong>: 여러 키를 사용하여 확장성에 장점이 있는 데이터베이스</li>
</ul>
<br />

<h1 id="etl-파이프라인">ETL 파이프라인</h1>
<hr>
<p>ETL은 Extraction Transform Loading의 약자로,
데이터를 추출하고 가공한 뒤 적재하는 일련의 과정을 의미한다.</p>
<p>하기 그림은 추출한 데이터를 데이터 웨어하우스에 저장하기까지의 과정이다.</p>
<p><img src="https://velog.velcdn.com/images/sori_127/post/6634994a-89b6-4681-b451-678a5c4698bd/image.png" alt=""></p>
<p><strong>데이터 레이크</strong> <em>(Data Lake)</em>
: 다양한 형태와 경로에서 생성된 데이터를 한 곳에 <strong>가공 없이</strong> 그대로 저장하는 것
ex) 아마존 - S3</p>
<p><strong>데이터 가져오기</strong> <em>(Data Ingestion)</em>
: 데이터를 활용할 수 있는 형태로 저장하는 과정 (=전처리 과정)</p>
<p><strong>데이터 웨어하우스</strong> <em>(Data Warehouse)</em>
: &#39;데이터 가져오기&#39;가 완료된 데이터를 저장하는 장소
ex) 아마존 - Redshift / 구글 - BigQuery / IBM - Db2</p>
<p><strong>데이터 마트</strong> <em>(Data Mart)</em>
: &#39;데이터 웨어하우스&#39;의 하위 영역
데이터를 실제로 사용하는 부서의 레벨이나 관련 주제 위주로 접근할 수 있도록 가공한 시스템</p>
<p><strong>커넥터</strong> <em>(Connector)</em>
: &#39;데이터 웨어하우스&#39;의 데이터가 각 사용처로 흘러들어가 다양한 용도로 사용될 수 있도록 DB와 각종 어플리케이션을 연결하는 과정
ex) 실시간으로 품절된 상품을 고객이 구매하지 못하도록 표시하는 데에 사용</p>
<p><strong>BI</strong> <em>(Business Intelligence)</em>
: 데이터를 정리하고 분석해, 비스니스 의사결정을 돕는 시각화 기술</p>
<br />

<h1 id="빅-데이터-실행">빅 데이터 실행</h1>
<hr>
<p><img src="https://velog.velcdn.com/images/sori_127/post/496b1443-6b05-4309-9d38-60f3997199b2/image.png" alt=""></p>
<p>Data에서 Insight를 도출하여 Value를 창출해내는 일련의 과정을 의미한다.</p>
<p>즉, <strong>데이터에서 사업적 가치를 창출</strong>하는 것을 말한다.
ex) 아마존 - 고객의 구매정보를 이용한 고객 추천 서비스 제작 -&gt; 매출 40% 향상</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[운영체제] 가상메모리]]></title>
            <link>https://velog.io/@sori_127/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EA%B0%80%EC%83%81%EB%A9%94%EB%AA%A8%EB%A6%AC</link>
            <guid>https://velog.io/@sori_127/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EA%B0%80%EC%83%81%EB%A9%94%EB%AA%A8%EB%A6%AC</guid>
            <pubDate>Thu, 07 Dec 2023 00:40:50 GMT</pubDate>
            <description><![CDATA[<h1 id="가상-메모리">가상 메모리</h1>
<h2 id="연속-메모리-할당">연속 메모리 할당</h2>
<p>메모리 공간에 프로세스를 연속적으로 할당하는 방식을 <strong>연속 메모리 할당</strong> 이라고 한다.</p>
<p>프로세스들을 실행하다보면 메모리 공간이 가득 차게 되는데 그러면 새로운 프로세스를 할당할 수 없게 된다.
이 때, 오랫동안 사용하지 않은 프로세스를 보조기억장치 일부 영역으로 임시로 쫒아내고
그렇게 마련된 빈 공간에 새 프로세스를 적재하곤 하는데 이릘 <strong>스와핑</strong><em>(swapping)</em> 이라고 한다.</p>
<ul>
<li><p><strong>스왑 영역</strong> <em>(swap space)</em>
쫒겨난 프로세스를 임시로 보관하는 보조기억장치의 일부 영역</p>
</li>
<li><p><strong>스왑 아웃</strong> <em>(swap out)</em>
현재 실행되지 않는 프로세스를 메모리에서 스왑 영역으로 옮기는 것</p>
</li>
<li><p><strong>스왑 인</strong> <em>(swap in)</em>
스왑 영역에 있던 프로세스를 다시 메모리로 옮겨오는 것
기존의 물리 주소와는 다른 곳에 적재될 수 있다</p>
</li>
</ul>
<p>이를 통해 프로세스들이 요구하는 메모리 공간 크기가 실제 메모리 크기보다 큰 경우에도
문제 없이 프로세스를 동시에 실행할 수 있다.</p>
<br />

<p>메모리 내 빈 공간이 여러 개 있을 때 프로세스를 할당하는 방식은 여러 가지가 있지만
그 중 대표적인 세 가지를 알아보도록 하겠다.</p>
<ul>
<li><p><strong>최초 적합</strong> <em>(front fit)</em>
운영체제가 메모리 내 빈 공간을 순서대로 검색하다가 적재할 수 있는 공간을 발견하면 그 공간에 배치
검색을 최소화하여 빠른 할당 가능</p>
</li>
<li><p><strong>최적 적합</strong> <em>(best fit)</em>
운영체제가 메모리 내 빈 공간을 모두 검색해본 후, 프로세스가 적재될 수 있는 공간 중 가장 작은 공간에 배치
잉여 공간의 최소화 가능</p>
</li>
<li><p><strong>최악 접합</strong> <em>(worst fit)</em>
운영체제가 메모리 내 빈 공간을 모두 검색해본 후, 프로세스가 적재될 수 있는 공간 중 가장 큰 공간에 배치</p>
</li>
</ul>
<p>연속 메모리 할당은 단순하고 간편하지만 <strong>외부 단편화</strong> <em>(external fragmentaion)</em> 문제를 내포하고 있다.
이것은 프로세스를 할당하기 어려울 만큼 작은 공간들로 인해 메모리가 낭비되는 현상이다.
이러한 잉여 공간들이 쌓이면 낭비되는 공간이 상당히 많기 때문에 반드시 해결해야 하는 문제다.</p>
<p>외부 단편화 문제를 해결하기 위해 메모리를 <strong>압축</strong> <em>(compaction)</em> 할 수 있는데,
잉여 공간을 한 데 모으는 동안의 오버헤드가 크기 때문에 단점이 많다.</p>
<p>이 문제를 해결하는 다른 방법으로는 <strong>페이징 기법</strong>이 있다.</p>
<blockquote>
<p><strong>더 알아보기</strong>
<a href="https://www.youtube.com/watch?v=bNFLpMUYqSE">[컴퓨터 공학 기초 강의] 37강. 연속 메모리 할당</a></p>
</blockquote>
<br />

<h2 id="페이징을-통한-가상-메모리-관리">페이징을 통한 가상 메모리 관리</h2>
<p>프로세스의 일부만 메모리에 적재하여 실제 물리 메모리보다 더 큰 프로세스를 실행할 수 있는 기법을
<strong>가상 메모리</strong><em>(virtual memory)</em> 라고 하며, 크게 페이징, 세그멘테이션의 두 가지 기법이 있다.</p>
<p>현재 대부분의 운영체제는 페이징 기법을 통해 가상 메모리를 구현한다.</p>
<p><strong>페이징</strong><em>(paging)</em> 은 메모리와 프로세스를 일정한 단위로 자르고
프로세스를 메모리에 불연속적인 조각 단위로 할당하는 기법이다.</p>
<ul>
<li><p><strong>페이지</strong> <em>(page)</em>
프로세스의 논리 주소 공간을 일정한 크기 단위로 자른 것</p>
</li>
<li><p><strong>프레임</strong> <em>(frame)</em>
메모리의 물리 주소 공간을 일정한 크기 단위로 자른 것</p>
</li>
</ul>
<p>페이지와 프레임은 동일한 크기로 설정되며, 이 크기 단위로 메모리 할당이 이루어진다.</p>
<pre><code>프로세스 크기가 페이지 단위의 배수로 나누어 떨어지지 않기에 마지막 페이지에는 잉여 공간이 생길 수 있는데
이를 내부 단편화(internal fragmentation) 라고 하지만, 외부 단편화보다는 훨씬 적은 양이다.</code></pre><br />

<p>페이지 또한 스왑 인/아웃 될 수 있는데, 이 때는 프로세스 단위가 아닌 페이지 단위로 이동한다.
프로세스 단위의 이동과 구분하여 <strong>페이지 아웃</strong> <em>(page out)</em>, <strong>페이지 인</strong> <em>(page in)</em> 이라고도 한다.</p>
<p>페이지를 사용하면 외부 단편화 문제를 해결할 수 있을 뿐만 아니라, 물리 메모리보다 큰 프로세스도 실행할 수 있다.</p>
<p>페이지는 메모리에 불연속적으로 적재되기 때문에 그대로 사용하기 어려운데
논리 주소의 연속성을 유지한 채 불연속적인 페이지와 맵핑하기 위해 <strong>페이지 테이블</strong><em>(page table)</em> 을 이용한다.</p>
<p>페이지 테이블은 페이지 번호와 프레임 번호를 맵핑해둠으로써
CPU가 페이지 번호만 보고 해당 페이지가 적재된 프레임을 찾을 수 있게 해준다.
이를 통해 CPU는 프로세스들이 메모리에 분산되어 있더라도 논리 주소를 통해 순차적으로 실행한다.</p>
<p>각각의 프로세스는 고유의 페이지 테이블을 메모리에 가지고 있으며
PCB의 <strong>페이지 테이블 베이스 레지스터(PTBR)</strong> <em>(page table base register)</em> 에 그 시작 주소가 담긴다.</p>
<p>페이지 테이블은 메모리에 저장되기 때문에, 이를 통해 페이지에 접근하면
메모리 접근을 두 번 해야 한다는 문제가 있어 참조 지역성에 근거한 일종의 캐시 메모리를 두는데
일반적으로 MMU 내에 존재하며 <strong>TLB</strong> <em>(translation lookaside buffer)</em> 라고 부른다.
캐시 메모리와 마찬가지로 참조하고자 하는 페이지 존재 유무를 <strong>TLB 히트/미스</strong> <em>(TLB hit/miss)</em> 라고 하며
TLB 미스 시 페이지 테이블을 참조하기 위해 메모리에 접근한다.</p>
<p>특정 주소에 접근하기 위해서는 두 가지 정보가 필요한데,
이에 따라 페이징 시스템의 논리 주소는 두 부분으로 이루어져 있다.</p>
<ul>
<li><strong>페이지 번호</strong> <em>(page number)</em>
접근하고자 하는 페이지가 무엇인지 나타내는 N 비트</li>
<li><strong>변위</strong> <em>(offset)</em>
접근하고자 하는 주소가 페이지 내 어디에 저장되어 있느닞 나타내는, N 비트를 제외한 나머지 비트</li>
</ul>
<p>&lt;페이지 번호, 변위&gt;로 구성된 논리 주소는 페이지 테이블을 거쳐 &lt;프레임 번호, 변위&gt;로 구성된 물리 주소로 변환된다.</p>
<p>페이지 테이블의 각각의 행들은 <strong>페이지 테이블 엔트리</strong><em>(page table entry)</em> 라고 하는데
페이지 번호, 프레임 번호 외에도 유효 비트, 보호 비트, 참조 비트, 수정 비트 등의 정보가 포함되어 있다.</p>
<ul>
<li><p><strong>유효 비트</strong> <em>(valid bit)</em>
현재 해당 페이지에 접근 가능한지 여부
아직 적재되지 않았거나 스왑 아웃되었을 경우 0이 되며, 접근 시도 시 페이지 폴트 page fault 예외 발생</p>
</li>
<li><p><strong>보호 비트</strong> <em>(protection bit)</em>
읽고 쓰기가 가능한 페이지인지 여부
쓰기가 가능하면 1, 읽기 전용일 경우 0의 값
읽기/쓰기/실행하기의 3개 비트로 보다 상세한 권한을 설정하도록 구현할 수도 있다</p>
</li>
<li><p><strong>참조 비트</strong> <em>(reference bit)</em>
CPU가 접근한 적 있는지 여부</p>
</li>
<li><p><strong>수정 비트</strong> <em>(modified bit)</em>
해당 페이지에 데이터를 쓴 적 있는지 수정 여부
더티 비트 dirty bit 라고도 한다
메모리에서 사라질 때 보조기억장치에 쓰기 작업을 해야 하는지 결정</p>
</li>
</ul>
<p>프로세스의 모든 테이블 페이지 엔트리를 메모리에 유지하는 것은 비효율적이기 때문에
계층적 페이징 hierarchical paging 을 통해 여러 단계의 페이지를 두기도 한다.</p>
<blockquote>
<p>더 알아보기
<a href="https://www.youtube.com/watch?v=8ufliWkgqMo&amp;feature=youtu.be">[컴퓨터 공학 기초 강의] 38강. 페이징을 통한 가상 메모리 관리</a></p>
</blockquote>
<br />

<h2 id="페이지-교체와-프레임-할당">페이지 교체와 프레임 할당</h2>
<p>프로세스를 메모리에 적재할 때 모든 페이지를 적재하지 않고 필요한 페이지만 적재하는 기법을
<strong>요구 페이징</strong><em>(demand paging)</em> 이라고 한다.</p>
<p>그 중에서도 처음엔 아무 페이지도 적재하지 않은 채 실행부터 하고서
페이지 폴트가 발생할 때마다 하나씩 적재하는 방식을 <strong>순수 요구 페이징</strong><em>(pure demand paging)</em> 이라고 한다.</p>
<p>요구 페이징 시스템이 안정적으로 작동하려면 페이지 교체와 프레임 할당이 잘 이루어져야 한다.</p>
<p>요구 페이징 기법으로 페이지를 적재하다보면 메모리가 가득 차게 되어 스왑 아웃을 해야 하는데
어떤 페이지를 스왑 아웃 할 것인지 결정하는 방법을 <strong>페이지 교체 알고리즘</strong> 이라고 한다.
페이지 교체 알고리즘은 페이지 폴트를 적게 일으킬수록 좋은 알고리즘이다.</p>
<p>페이지 교체 알고리즘의 성능 측정 지표가 되는 페이지 폴트 횟수는
<strong>페이지 참조열</strong><em>(page reference string)</em> 을 통해 알 수 있다.
CPU가 참조하는 페이지 중 연속된 페이지를 생략한 페이지열을 페이지 참조열이라고 한다.</p>
<p>대표적인 페이지 교체 알고리즘으로는 다음과 같은 것들이 있다.</p>
<ul>
<li><p><strong>FIFO 페이지 교체 알고리즘</strong> <em>(First-In First-Out page replacement algorithm)</em>
가장 단순한 방법으로, 메모리에 가장 먼저 올라온 페이지부터 교체 대상으로 삼는 방식
초기에 적재된 페이지는 초반에만 실행되고 말 수도 있지만,
프로그램 실행 내내 사용할 내용을 포함할 경우 비효율적일 수 있다</p>
</li>
<li><p><strong>2차 기회 페이지 교체 알고리즘</strong> <em>(Second Chance page replacement algorithm)</em>
FIFO 페이지 교체 알고리즘을 보완하여 두 번째 기회를 주는 방식
교체 대상 페이지가 참조된 적 없는 페이지일 경우 그냥 교체하지만
참조된 적 있는 경우 참조 비트를 0으로 만든 후 현재 시각을 적재 시각으로 설정하여
오래되었지만 자주 쓰이는 페이지가 쫒겨나지 않도록 한다</p>
</li>
<li><p><strong>최적 페이지 교체 알고리즘</strong> <em>(Optimal page replacement algorithm)</em>
CPU에 의해 참조되는 횟수를 고려하는 방식
자주 사용될 페이지는 남기고 앞으로 오랫동안 사용하지 않을 페이지는 교체할 수 있도록 한다
&quot;앞으로 오랫동안 사용하지 않을 페이지&quot;를 예측하기 어려워 실제적으로 사용되기 보다는 이론 상의 성능 지표</p>
</li>
<li><p><strong>LRU 페이지 교체 알고리즘</strong> <em>(Least Recently Used page replacement algorithm)</em>
최근에 사용되지 않은 페이지는 앞으로도 사용되지 않을 것이라고 예측하는 방식
마지막 사용 시각을 토대로 사용한지 가장 오래된 페이지를 교체</p>
</li>
</ul>
<br />

<p>비효율적인 페이지 교체 알고리즘을 사용할 때뿐만 아니라
프로세스가 사용할 수 있는 프레임 수가 적은 경우에도 페이지 폴트가 자주 발생한다.
이게 과해지면 프로세스 실행 시간보다 페이징에 더 많은 시간을 소요하여 성능 저하가 발생하는데
이러한 문제를 <strong>스레싱</strong><em>(thrashing)</em> 이라고 한다.</p>
<p>메모리에서 동시 실행되는 프로세스가 늘어 <strong>멀티프로그래밍의 정도</strong><em>(degree of multiprogrammming)</em> 가 높아지면
어느 정도까지는 CPU 이용률이 높아지며 성능이 좋아지다가 어느 순간 스레싱이 발생하여 성능이 저하된다.
그 근본적인 원인 각 프로세스가 필요로 하는 최소한의 프레임 수가 보장되지 않았기 때문이다.</p>
<ul>
<li><p><strong>정적 할당 방식</strong>
프로세스의 실행 과정은 고려하지 않고 단순히 프로세스 크기와 물리 메모리의 크기만 고려한 프레임 할당 방식</p>
<ul>
<li><strong>균등 할당</strong> <em>(equal allocation)</em>
프로세스 개수에 따라 정확히 1/N 하여 할당하는 방식</li>
<li><strong>비례 할당</strong> <em>(proportional allocation)</em>
프로세스 크기에 따라 비례하게 할당하는 방식</li>
</ul>
</li>
<li><p><strong>동적 할당 방식</strong>
프로세스의 실행을 보고 할당할 프레임 수를 결정하는 방식</p>
<ul>
<li><strong>작업 집합 모델</strong> <em>(working set model)</em> 을 이용하는 방식
프로세스가 일정 기간 동안 참조한 페이지 집합을 기억하여 작업 집합 working set 을 만들고
이 작업 집합의 크기에 따라 프레임을 할당하는 방식</li>
<li><strong>페이지 폴트 빈도</strong> <em>(page fault frequency)</em> 를 이용하는 방식
페이지 폴트율이 높으면 프레임 수가 적다고 판단하여 늘리고
페이지 폴트율이 낮으면 프레임 수가 많다고 판단하여 줄이는 방식</li>
</ul>
</li>
</ul>
<blockquote>
<p>더 알아보기
<a href="https://www.youtube.com/watch?v=nF26uioM6zU">[컴퓨터 공학 기초 강의] 39강. 페이지 교체와 프레임 할당</a>
<a href="https://www.youtube.com/watch?v=i4rpeyqAODo">[컴퓨터 공학 기초 강의] 40강. 페이징의 이점과 계층적 페이징</a></p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[[운영체제] CPU 스케줄링]]></title>
            <link>https://velog.io/@sori_127/CPU-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81</link>
            <guid>https://velog.io/@sori_127/CPU-%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81</guid>
            <pubDate>Tue, 21 Nov 2023 01:57:11 GMT</pubDate>
            <description><![CDATA[<h1 id="cpu-스케줄링-개요">CPU 스케줄링 개요</h1>
<hr>
<p>CPU 스케줄러는 프로세스가 생성된 후 종료될 때까지 모든 상태 변화를 조정하는 일을 하며,
<strong>CPU 스케줄링</strong><em>(CPU scheduling)</em> 은 CPU 스케줄러가 하는 모든 작업을 가리킨다.</p>
<p>운영체제는 프로세스들에게 공정하고 합리적으로 CPU 자원을 배분하기 위해
<strong>CPU 스케줄링</strong>_(CPU scheduling)_을 수행한다.</p>
<h3 id="입출력-집중-프로세스-vs-cpu-집중-프로세스">입출력 집중 프로세스 vs CPU 집중 프로세스</h3>
<ul>
<li><p><strong>입출력 집중 프로세스</strong> <em>(I/O bound process)</em></p>
<ul>
<li>입출력 작업이 많은 프로세스</li>
<li>대표적으로 비디오 재생이나 디스크 백업 작업 등을 담당하는 프로세스</li>
</ul>
</li>
<li><p><strong>CPU 집중 프로세스</strong> <em>(CPU bound process)</em></p>
<ul>
<li>CPU 작업이 많은 프로세스</li>
<li>대표적으로 복잡한 수학연산, 컴파일, 그래픽 처리 작업 등을 담당하는 프로세스</li>
</ul>
<p>✔️  <strong>입출력 집중 프로세스와 CPU 집중 프로세스가 동시에 CPU 자원을 요구할 경우 ?</strong></p>
<p>입출력 집중 프로세스를 먼저 실행하여 입출력 장치를 끊임없이 작동시키고
해당 프로세스가 입출력 작업을 하며 대기 상태로 존재하는 동안
CPU 집중 프로세스에 CPU를 집중적으로 할당하는 것이 효율적이다.</p>
<pre><code>→ 일반적으로 입출력 집중 프로세스의 우선순위가 더 높다.</code></pre></li>
</ul>
<br >

<h3 id="스케줄러의-종류">스케줄러의 종류</h3>
<ul>
<li><p><strong>장기 스케줄러</strong><em>(Long-term scheduler)</em> : 어떤 프로세스를 준비 큐에 넣을 것인지 결정</p>
</li>
<li><p><strong>중기 스케줄러</strong><em>(Medium-term scheduler, Swapper)</em> : 메모리에 적재된 프로세스 수 관리하여 과부하 예방</p>
</li>
<li><p><strong>단기 스케줄러</strong><em>(Short-term scheduler, CPU scheduler)</em> : 메모리 내의 준비 상태에 있는 작업 중 실행할 프로세스를 선택하여 CPU를 할당, 타임 슬라이스 등을 지정하는 가장 핵심적인 역할을 기능을 담당</p>
</li>
</ul>
<br />

<h3 id="스케줄링의-목적">스케줄링의 목적</h3>
<ul>
<li><p><strong>공평성</strong> : 모든 프로세스가 자원을 공평하게 배정받아야 하며, 자원 배정 과정에서 특정 프로세스가 배제되면 안된다.</p>
</li>
<li><p><strong>효율성</strong> : 시스템 자원이 유휴 시간 없이 사용되도록 스케줄링을 하고, 유휴 자원을 사용하려는 프로세스에는 우선권을 주어야 한다.</p>
</li>
<li><p><strong>안정성</strong> : 우선순위를 사용하여 중요 프로세스가 먼저 작동하도록 배정함으로써 시스템 자원을 점유하거나 파괴하려는 프로세스로부터 자원을 보호해야 한다.</p>
</li>
<li><p><strong>확장성</strong> : 프로세스가 증가해도 시스템이 안정적으로 작동하도록 해야 한다. 또한 시스템 자원이 늘어나는 경우 이 혜택이 시스템에 반영되게 해야 한다.</p>
</li>
<li><p><strong>반응 시간 보장</strong> : 응답이 없는 경우 사용자는 시스템이 멈춘 것으로 가정하기 때문에 시스템은 적절한 시간 안에 프로세스의 요구에 반응해야 한다.</p>
</li>
<li><p><strong>무한 연기 방지</strong> : 특정 프로세스의 작업이 무한히 연기되어서는 안된다.</p>
</li>
</ul>
<br />

<h3 id="스케줄링-알고리즘-선택-기준">스케줄링 알고리즘 선택 기준</h3>
<ul>
<li><p><strong>CPU 사용률</strong> : 전체 시스템의 동작 시간 중 CPU가 사용된 시간을 측정하는 방법</p>
</li>
<li><p><strong>처리량</strong> : 단위 시간당 작업을 마친 프로세스의 수</p>
</li>
<li><p><strong>대기 시간</strong> : 작업을 요청한 프로세스가 작업을 시작하기 전까지 대기하는 시간</p>
</li>
<li><p><strong>응답 시간</strong> : 프로세스 시작 후 첫번째 출력 또는 반응이 나올 때까지 걸리는 시간</p>
</li>
<li><p><strong>반환 시간</strong> : 프로세스가 생성된 후 종료되어 사용하던 자원을 모두 반환하는 데까지 걸리는 시간</p>
</li>
</ul>
<br />

<h1 id="선점형-스케줄링--비선점형-스케줄링">선점형 스케줄링 &amp; 비선점형 스케줄링</h1>
<hr>
<h3 id="선점형-스케줄링">선점형 스케줄링</h3>
<p><strong>프로세스가 CPU를 할당받아 실행 중이더라도
운영체제가 CPU를 강제로 빼앗아 다른 프로세스에게 할당할 수 있는 스케줄링 방식</strong></p>
<p>타이머 인터럽트에 따라 CPU 자원을 뻇어 다음 프로세스에게 전달하는 것도 여기에 포함되며
대부분의 운영체제에서 차용하고 있는 방식이다.</p>
<ul>
<li><p><strong>장점</strong></p>
<ul>
<li>프로세스들에게 골고루 자원을 배분할 수 있음</li>
<li>프로세스가 CPU를 독점할 수 없어 대화형이나 시분할 시스템에 적합</li>
</ul>
</li>
<li><p><strong>단점</strong></p>
<pre><code>- 문맥 교환 과정에서 오버헤드 발생</code></pre></li>
</ul>
<pre><code>ex) 라운드 로빈(RR), 최소 잔류 시간 우선 스케줄링(SRT), 다단계 큐 ..</code></pre><br />

<h3 id="비선점형-스케줄링">비선점형 스케줄링</h3>
<p><strong>하나의 프로세스가 CPU를 점유하면 다른 프로세스가 이를 빼앗을 수 없는 스케줄링 방식</strong></p>
<ul>
<li><p><strong>장점</strong></p>
<ul>
<li>CPU 스케줄러의 작업량이 적고 문맥 교환의 오버헤드가 적음</li>
</ul>
</li>
<li><p><strong>단점</strong></p>
<ul>
<li>프로세스가 자원을 골고루 사용 불가</li>
<li>기다리는 프로세스가 많아 처리율이 떨어짐</li>
</ul>
</li>
</ul>
<pre><code>ex) 선입 선처리 스케줄링(FCFS), 최단 작업 우선 스케줄링(SJF), 우선순위 스케줄링, HRN ..</code></pre><br />

<h3 id="선점형-스케줄링-vs-비선점형-스케줄링">선점형 스케줄링 vs 비선점형 스케줄링</h3>
<p><img src="https://velog.velcdn.com/images/sori_127/post/8c220124-e027-4f85-b20e-d03b2eb27021/image.png" alt=""></p>
<br />

<h1 id="스케줄링-알고리즘">스케줄링 알고리즘</h1>
<hr>
<h3 id="선입-선처리-알고리즘-first-come-first-serve-fcfs">선입 선처리 알고리즘 <em>(First Come First Serve, FCFS)</em></h3>
<p>준비 큐에 도착한 순서대로 CPU를 할당하는 비선점형 방식</p>
<ul>
<li>모든 프로세스의 우선순위가 동일</li>
<li>현재 작업 중인 프로세스가 입출력 작업을 요청하는 경우 CPU가 작업하지 않고 쉬는 시간이 증가</li>
</ul>
<blockquote>
<p>💡 <strong>콘보이 효과</strong>
처리시간이 긴 프로세스가 CPU를 차지하면 다른 프로세스들은 하염없이 기다리게 된다.</p>
</blockquote>
<br />

<h3 id="최단-작업-우선-스케줄링-shortest-job-first-sjf">최단 작업 우선 스케줄링 <em>(Shortest Job First, SJF)</em></h3>
<p>준비 큐에 있는 프로세스 중에서 실행 시간이 가장 짧은 작업부터 CPU를 할당하는 비선점형 방식</p>
<ul>
<li>시간이 오래 걸리는 작업이 앞에 있고 간단한 작업이 뒤에 있으면 그 순서를 바꾸어 실행해서 
FCFS의 콘보이 효과를 완화할 수 있음</li>
<li>운영체제가 프로세스의 종료 시간을 정확하게 예측하기 어려움</li>
</ul>
<br />

<h3 id="최소-잔류-시간-우선-스케줄링-shortest-remaining-time-srt">최소 잔류 시간 우선 스케줄링 <em>(Shortest Remaining Time, SRT)</em></h3>
<p>CPU를 할당받을 프로세스를 선택할 때 남아있는 작업 시간이 가장 짧은 프로세스부터 우선적으로 선택하는 선점형 방식</p>
<ul>
<li>평균 대기 시간과 평균 응답 시간을 최소화할 수 있어, 시스템의 처리량을 높이고 사용자의 만족도를 향상시킬 수 있음</li>
<li>실행 시간이 긴 프로세스는 우선순위에서 계속해서 밀려 무한 대기하는 기아 현상이 발생할 수 있음</li>
</ul>
<p>→ <strong>SJF(최단 작업 우선 스케줄링) + RR(라운드 로빈 스케줄링)</strong></p>
<br />

<h3 id="우선순위-스케줄링-priority">우선순위 스케줄링 <em>(Priority)</em></h3>
<p>프로세스들에게 우선순위를 부여하고, 우선순위가 높은 프로세스부터 실행하는 선점/비선점 방식</p>
<ul>
<li>우선순위가 같은 프로세스들은 FCFS 방식 적용</li>
<li>우선순위가 낮은 프로세스의 실행이 계속 연기되어 기아 현상 발생 가능</li>
</ul>
<blockquote>
<p>💡 <strong>기아 현상 <em>(starvation)</em></strong>
실행시간이 짧은 프로세스가 계속 들어오면 실행시간이 긴 프로세스는 계속 뒤로 밀려 
실행 시간이 긴 프로세스의 작업이 무한 연기되는 현상</p>
</blockquote>
<blockquote>
<p>💡 <strong>에이징 <em>(aging)</em></strong>
어떤 자원을 오래 대기할수록 해당 프로세스의 우선순위를 높여주는 방법</p>
</blockquote>
<br />

<h3 id="라운드-로빈-스케줄링-round-robin-rr">라운드 로빈 스케줄링 <em>(Round Robin, RR)</em></h3>
<p>여러 프로세스들을 할당된 시간 (타임 슬라이스) 만큼 돌아가면서 실행하는 선점형 방식</p>
<ul>
<li>선점형 알고리즘 중 가장 단순하고 대표적인 방식</li>
<li>작업을 완료하지 못할 경우 준비 큐의 맨 뒤로 가서 자기 차례를 기다림</li>
<li>타임슬라이스가 큰 경우 작업이 끝난 뒤 다음 작업이 시작되는 것처럼 보임</li>
<li>타임 슬라이스가 작은 경우 문맥 교환이 빈번하게 일어나 오버헤드 발생</li>
</ul>
<br />

<h3 id="다단계-큐-스케줄링-multilevel-queue-scheduling">다단계 큐 스케줄링 <em>(Multilevel Queue Scheduling)</em></h3>
<p>우선순위에 따라 준비 큐를 여러개 사용하는 비선점형 방식</p>
<ul>
<li>프로세스는 운영체제로부터 부여받은 우선순위에 따라 해당 우선순위의 큐에 삽입되어 실행</li>
<li>우선 순위가 낮은 프로세스의 작업이 연기되는 문제가 발생</li>
</ul>
<br />

<h3 id="다단계-피드백-큐-스케줄링-multilevel-feedback-queue-scheduling">다단계 피드백 큐 스케줄링 <em>(Multilevel Feedback Queue Scheduling)</em></h3>
<p>변동 우선순위 알고리즘의 전형적인 예로 CPU를 사용하고 난 프로세스가 원래의 큐로 되돌아가지 않고 우선순위가 하나 낮은 큐의 끝으로 들어가는 방식</p>
<ul>
<li>오늘 날의 운영체제가 CPU 스케줄링을 위해 일반적으로 사용하는 방식</li>
<li>다단계 큐에서 우선순위가 낮은 프로세스의 실행이 연기되는 문제를 완화</li>
<li>우선순위에 따라 타임 슬라이스의 크기가 다른데, 낮을수록 점점 커지고 마지막 큐는 무한대의 타임 슬라이스를 가짐 (* FCFS 방식)</li>
</ul>
<br />
]]></description>
        </item>
        <item>
            <title><![CDATA[[운영체제] 스레드]]></title>
            <link>https://velog.io/@sori_127/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%93%B0%EB%A0%88%EB%93%9C</link>
            <guid>https://velog.io/@sori_127/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%93%B0%EB%A0%88%EB%93%9C</guid>
            <pubDate>Mon, 13 Nov 2023 02:31:56 GMT</pubDate>
            <description><![CDATA[<h1 id="스레드-thread">스레드 (Thread)</h1>
<hr>
<p>전통적인 관점에서 보면 하나의 프로세스는 한 번에 하나의 일만을 처리하였으나
<strong>스레드</strong><em>(thread)</em> 라는 개념이 도입되면서 한 번에 여러 일을 처리할 수 있게 되었다.</p>
<ul>
<li>프로세스를 구성하는 실행 단위</li>
<li>프로세스 내에서 각기 다른 스레드 ID, 프로그램 카운터 값, 레지스터 값, 스택으로 구성</li>
<li>힙, 데이터, 코드 영역 등 다른 프로세스 자원은 공유</li>
</ul>
<p>한 번에 하나의 일만 처리하는 프로세스는 <strong>단일 스레드 프로세스</strong>라고 칭한다.</p>
<h3 id="멀티-프로세스-multi-process">멀티 프로세스 (multi-process)</h3>
<ul>
<li>여러 프로세스를 동시에 실행하는 것</li>
<li>기본적으로 프로세스끼리 자원을 공유하지 않는다</li>
<li>하나에 문제가 생겨도 서로에게 영향력이 적다</li>
<li>IPC, 공유 메모리 등으로 통신은 가능하지만 오버헤드 존재</li>
</ul>
<blockquote>
<p>독립적인 메모리 공간으로 컨텍스트 스위칭이 발생한다.
프로세스간의 통신을 위해서는 IPC가 필요하다.</p>
<p>-&gt; 이 두 가지 문제점을 한 번에 해결할 수 있는게 <strong>스레드</strong>_(thread)_이다.</p>
</blockquote>
<h3 id="멀티-스레드-multi-thread">멀티 스레드 (multi-thread)</h3>
<p>스레드는 프로세스가 할당 받은 자원을 이용하는 실행의 단위로서,
스레드가 여러 개 있으면 파일을 다운받으며 동시에 웹 서핑을 할 수 있게 해준다.</p>
<p>스레드끼리 <strong>프로세스의 자원을 공유</strong>하면서 프로세스 실행 흐름의 일부가 되기에 동시 작업이 가능한 것이다.</p>
<ul>
<li>프로세스 내에 여러 스레드를 동시에 실행하는 것</li>
<li>같은 프로세스 내의 스레드 끼리 프로세스 자원을 공유한다 (코드, 데이터, 힙, 스택 영역)</li>
<li>여러 프로세스를 병행 실행하는 것보다 메모리를 더 효율적으로 사용 가능</li>
<li>협력과 통신에 유리<br>

</li>
</ul>
<h3 id="multi-processing-vs-multi-threading">Multi Processing VS Multi Threading</h3>
<p>→ <strong>멀티 프로세스</strong> : 크롬 창 내의 여러 탭이나 여러 창을 동시에 실행하는 것
→ <strong>멀티 스레드</strong> : 크롬 창 내의 단일 탭에서 네트워크 처리, I/O 및 기타 작업을 동시에 수행하는 것</p>
<p><img src="https://velog.velcdn.com/images/sori_127/post/8892b91f-042c-4f94-b148-50ae64fb82a2/image.png" alt=""></p>
<br />
]]></description>
        </item>
        <item>
            <title><![CDATA[[운영체제] 프로세스]]></title>
            <link>https://velog.io/@sori_127/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4</link>
            <guid>https://velog.io/@sori_127/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4</guid>
            <pubDate>Mon, 13 Nov 2023 02:31:41 GMT</pubDate>
            <description><![CDATA[<h1 id="프로세스-개요">프로세스 개요</h1>
<hr>
<h3 id="프로세스란-">프로세스란 ?</h3>
<blockquote>
<p>실행 중인 프로그램을 <strong>프로세스</strong><em>(process)</em> 라고 한다.</p>
</blockquote>
<p>컴퓨터가 부팅되는 순간부터 수많은 프로세스들이 실행되는데,
유닉스 체계의 운영체제에서는 <code>ps</code> 명령어를 통해 실행 중인 프로세스를 확인할 수 있다.</p>
<p>(<code>ps</code> 명령어는 현재 터미널에서 실행 중인 프로세스만 확인할 수 있으며,
시스템 내 전체 프로세스를 확인하려면 <code>-ef</code> 와 같은 옵션을 설정해야 한다.)</p>
<p>아래는 <code>ps -ef</code> 명령어의 출력 예시이다.</p>
<p><img src="https://velog.velcdn.com/images/sori_127/post/a407d904-fec5-44e0-93ff-c86c342969aa/image.png" alt=""></p>
<p>여기엔 직접 실행한 프로세스 외에도 운영체제에 의해 실행되는 다양한 프로세스가 존재한다.</p>
<ul>
<li><p><strong>포그라운드 프로세스</strong> <em>(foreground process)</em>
사용자가 볼 수 있는 공간에서 실행되는 프로세스</p>
</li>
<li><p><strong>백그라운드 프로세스</strong> <em>(background process)</em>
보이지 않는 공간에서 실행되는 프로세스
그 중에서도 사용자와 상호작용하지 않고 정해진 작업을 수행하는 것을 <strong>데몬</strong><em>(deamon)</em> 이라 한다.</p>
<br />

</li>
</ul>
<p>💡 <strong>프로그램과 프로세스의 차이</strong></p>
<p><img src="blob:https://velog.io/2c808213-f656-4352-9d70-d6261305ab09" alt=""></p>
<h1 id="프로세스-제어-블록-pcb">프로세스 제어 블록 (PCB)</h1>
<hr>
<p>여러 개의 프로세스가 한정된 시간동안 CPU를 돌아가며 사용하기 위해 <strong>타이머 인터럽트</strong>가 사용되는데,
타이머 인터럽트가 발생하면 프로세스가 자신의 차례를 양보하고 다음 차례를 기다린다.
그리고 이러한 작업을 하기 위해 운영체제는 프로세스와 관련된 정보를 저장하는 자료구조인
<strong>프로세스 제어 블록</strong>_ (PCB - process control block)_ 을 이용한다.</p>
<p>PCB에는 각각의 프로세스를 식별하기 위해 필요한 정보가 포함되어 있으며, 커널 영역에 존재한다.
PCB에 담기는 정보는 운영체제마다 상이하지만 대표적으로 아래와 같은 것들이 있다.</p>
<ul>
<li><p><strong>프로세스 ID</strong> <em>(PID)</em>
  프로세스를 식별하기 위해 부여하는 고유한 번호
  같은 프로그램도 두번 실행하면 PID가 다른 두 개의 프로세스 생성</p>
</li>
<li><p><strong>레지스터 값</strong>
  자신의 실행 차례가 돌아오면 복원할 레지스터 값들을 백업한 것</p>
</li>
<li><p><strong>프로세스 상태</strong>
  프로세스가 CPU를 이용하고 있는지, 기다리고 있는지, 입출력장치를 사용하려 하는지 등의 정보</p>
</li>
<li><p><strong>CPU 스케줄링 정보</strong>
  프로세스가 언제, 어떠한 순서로 CPU를 할당받을지에 대한 정보</p>
</li>
<li><p><strong>메모리 관리 정보</strong>
  프로세스가 어느 주소에 저장되어 있는지에 대한 정보</p>
<pre><code> 베이스 레지스터 한계 레지스터 값과 페이지 테이블 정보</code></pre></li>
<li><p><strong>사용한 파일과 입출력장치 목록</strong>
  어떤 입출력장치가 이 프로세스에 할당되었는지, 어떤 파일을 열었는지 등의 정보</p>
<br />


</li>
</ul>
<h1 id="문맥-교환-context-switch">문맥 교환 (Context Switch)</h1>
<hr>
<p><strong>Context ?</strong>
기존에 실행되던 프로세스에서 다른 프로세스에게 CPU 자원을 양보하는 상황에서
이전 프로세스가 사용하던 레지스터 값, 메모리 정보 등 중간 정보를 백업해야 하는데
이처럼 <em>프로세스 수행을 재개하기 위해 기억해야 할 중간 정보</em> 를 <strong>문맥</strong><em>(context)</em> 이라고 한다.</p>
<p>문맥은 CPU 사용 시간이 다 되거나 인터럽트가 발생하면 해당 프로세스의 PCB에 백업되며,
프로세스 수행이 재개될 때 PCB에 기록되어 있는 context를 복구한다.</p>
<p><strong>Context Switch ?</strong>
이전 프로세스의 context를 해당 프로세스의 PCB에 백업하고
다음 프로세스의 context를 해당 프로세스의 PCB로부터 복구하여
새로운 프로세스를 실행하는 과정을 <strong>문맥 교환</strong><em>(context switch)</em> 이라고 한다.</p>
<p><img src="https://velog.velcdn.com/images/sori_127/post/de6e7f42-ca9b-4eb7-821a-c10f3f7c7979/image.png" alt=""></p>
<br />

<h1 id="프로세스의-메모리-구조">프로세스의 메모리 구조</h1>
<hr>
<p>하나의 프로세스는 사용자 영역에 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장된다.</p>
<ul>
<li><p><strong>정적 할당 영역</strong>
프로그램이 실행되는 동안 크기가 변하지 않는 영역</p>
<ul>
<li><p><strong>코드 영역</strong> <em>(code segment)</em></p>
<ul>
<li>텍스트 영역(text segment) 이라고도 불린다.</li>
<li>기계어로 이루어진 명령어가 저장되는 읽기 전용 공간
ex) 실행할 프로그램의 코드</li>
</ul>
</li>
<li><p><strong>데이터 영역</strong> <em>(data segment)</em></p>
<ul>
<li>전역 변수와 같이 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간
ex) 전역 변수, 정적 변수</li>
</ul>
</li>
</ul>
</li>
<li><p><strong>동적 할당 영역</strong>
프로그램이 실행되는 동안 크기가 변할 수 있는 영역</p>
<ul>
<li><p><strong>힙 영역</strong> <em>(heap segment)</em></p>
<ul>
<li>프로그래머가 직접 공간을 할당, 반환하는 메모리 공간</li>
<li>프로그래밍 과정에서 힙 영역에 메모리 공간을 할당했다면 언젠가는 반환해야함</li>
<li>반환하지 않는다면 메모리 낭비가 생기는데 이를 메모리 누수(memory leck)이라고 함</li>
<li>일반적으로 메모리의 낮은 주소에서 높은 주소로 데이터가 쌓임
ex) 사용자의 동적 할당</li>
</ul>
</li>
<li><p><strong>스택 영역</strong> <em>(stack segment)</em></p>
<ul>
<li>데이터를 일시적으로 저장하는 공간<ul>
<li>함수의 실행이 끝나면 사라지는 매개 변수, 지역 변수 등이 저장됨</li>
<li>PUSH로 데이터를 저장하고 POP으로 데이터를 인출함</li>
<li>일반적으로 메모리의 높은 주소에서 낮은 주소로 할당됨
ex) 지역 변수, 매개 변수</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<blockquote>
<p><strong>오버 플로우</strong>란 
한정된 메모리 공간이 부족하여 메모리 안에 있는 데이터가 넘쳐 흐르는 현상으로,<br >
힙이 스택을 침범하는 경우를 <strong><code>힙 오버 플로우</code></strong> 라 하고,
스택이 힙을 침범하는 경우를 <strong><code>스택 오버 플로우</code></strong> 라고 한다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/sori_127/post/e1317fd5-988c-43cf-9747-d3133d4e25de/image.png" alt=""></p>
<br />
]]></description>
        </item>
        <item>
            <title><![CDATA[[운영체제] 커널]]></title>
            <link>https://velog.io/@sori_127/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%BB%A4%EB%84%90</link>
            <guid>https://velog.io/@sori_127/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EC%BB%A4%EB%84%90</guid>
            <pubDate>Tue, 07 Nov 2023 06:04:33 GMT</pubDate>
            <description><![CDATA[<h1 id="커널kernal이란-">커널(kernal)이란 ?</h1>
<hr>
<blockquote>
<p>운영체제의 핵심 서비스를 담당하는 부분이다.</p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/sori_127/post/97f9a3c7-55db-41e2-9a93-8a3be59a3b10/image.png" alt=""></p>
<br />

<h1 id="동작-방식">동작 방식</h1>
<hr>
<blockquote>
<p>운영체제는 응용 프로그램이 시스템 자원에 접근하려고 할 때
오직 자신을 통해서만 접근하도록 하여 자원을 보호하는데
이 때 <strong>이중 모드</strong>와 <strong>시스템 호출</strong>이 사용된다.</p>
</blockquote>
<h3 id="이중-모드-dual-mode">이중 모드 (dual mode)</h3>
<p>응용 프로그램이 하드웨어 자원에 직접 접근하지 않고 운영체제를 거치도록 하는 방식</p>
<p>  CPU가 명령어를 실행하는 모드는 두가지로 나뉜다.</p>
<ol>
<li><p><strong>유저 모드</strong> (user mode)</p>
<ul>
<li>커널 영역의 코드 실행 불가</li>
<li>운영체제 서비스를 제공받을 수 없는 모드</li>
<li>일반적인 응용 프로그램의 기본 실행 모드</li>
<li>입출력 명력어를 포함하여 하드웨어 자원에 접근하는 명령어 실행 불가</li>
</ul>
</li>
<li><p><strong>커널 모드</strong> (kernal mode)</p>
<ul>
<li>커널 영역의 코드 실행 가능</li>
<li>운영체제 서비스를 제공받을 수 있는 모드</li>
<li>시스템 자원에 접근 가능</li>
</ul>
<p><img src="https://velog.velcdn.com/images/sori_127/post/0b24af5d-5a1a-4a41-bca6-5666ebf24fad/image.png" alt=""></p>
</li>
</ol>
<br />

<h3 id="시스템-콜-system-call">시스템 콜 (system call)</h3>
<p>이중 모드의 커널 모드로 전환하는 방법</p>
<ul>
<li><p>사용자 모드로 실행 중인 프로그램이 운영체제 서비스를 받기 위해 운영체제에 보내는 요청</p>
</li>
<li><p>시스템 호출 명령어 실행 시 CPU는 기존 작업을 백업하고 커널 내 시스템 호출을 수행하는 코드를 실행한 뒤 기존 작업으로 복귀</p>
</li>
<li><p>소프트웨어 인터럽트로, 처리 순서는 하드웨어 인터럽트와 유사</p>
<pre><code>&gt; 인터럽트란, CPU가 프로그램을 실행하고 있을 때 입출력, 파일 읽기 등의 예외상황이 발생하여 처리가 필요할 경우에 CPU에게 알려 처리할 수 있도록 하는 것을 말한다.</code></pre></li>
</ul>
<p><img src="https://velog.velcdn.com/images/sori_127/post/28406084-5180-4b56-bd4a-194703ccd56b/image.png" alt=""></p>
<br />

<h1 id="운영체제의-핵심-서비스">운영체제의 핵심 서비스</h1>
<hr>
<h3 id="프로세스-관리">프로세스 관리</h3>
<ul>
<li>실행 중인 프로그램 == 프로세스</li>
<li>동시다발적으로 생성/실행/삭제되는 다양한 프로세스를 일목요연하게 관리</li>
</ul>
<p><img src="https://velog.velcdn.com/images/sori_127/post/8d8a4b4e-46d8-4579-9a8c-2c283710c915/image.png" alt=""></p>
<br />

<h3 id="자원-접근-및-할당">자원 접근 및 할당</h3>
<ul>
<li><p>CPU 
: 프로세스들에 공정하게 CPU를 할당하기 위한 스케줄링</p>
</li>
<li><p>메모리 
: 새로운 프로세스가 적재될 때 어느 주소에 적재해야 할지 결정
: 메모리 공간이 꽉 차 있거나 프로세스를 적재하지 못하는 상황 발생시 처리</p>
</li>
<li><p>입출력장치</p>
</li>
</ul>
<br />


<h3 id="파일-시스템-관리">파일 시스템 관리</h3>
<ul>
<li>보조기억장치 속 데이터를 파일과 디렉토리로 관리하는 파일 시스템</li>
</ul>
<br />
]]></description>
        </item>
        <item>
            <title><![CDATA[[운영체제] 기본 개념]]></title>
            <link>https://velog.io/@sori_127/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90</link>
            <guid>https://velog.io/@sori_127/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90</guid>
            <pubDate>Tue, 07 Nov 2023 06:00:12 GMT</pubDate>
            <description><![CDATA[<h1 id="운영체제operating-system-os란-">운영체제(Operating System, OS)란 ?</h1>
<hr>
<blockquote>
<p><strong>컴퓨터 하드웨어 바로 위에 설치되는 소프트웨어 계층</strong>으로서
사용자 및 다른 모든 소프트웨어와 하드웨어의 연결을 담당한다.</p>
</blockquote>
<p>운영체제는 컴퓨터가 부팅될 때 메모리 내 <strong>커널 영역</strong>(kernal space)이라는 공간에 적재되며,
커널 영역을 제외한 공간은 <strong>사용자 영역</strong>(user space)으로, 일반적인 응용 프로그램이 적재된다.</p>
<p>  → 커널 영역에 적재된 운영체제가 사용자 영역에 적재된 프로그램들에 자원을 할당하고 실행을 돕는 것</p>
<p><img src="https://velog.velcdn.com/images/sori_127/post/37f2cb22-86d9-46a8-abdc-ec109490a72f/image.png" alt=""></p>
<br />

<h1 id="운영체제의-목표">운영체제의 목표</h1>
<hr>
<p>운영체제에는 크게 두 가지의 목표가 있다.</p>
<ul>
<li>컴퓨터 하드웨어 ↔ 운영체제</li>
<li>운영체제 ↔ 사용자</li>
</ul>
<p>사용자의 입장 : 컴퓨터 시스템을 편리하게 사용할 수 있는 환경을 제공 (즉, 하드웨어를 직접 다루는 복잡한 부분을 운영체제가 대행해줌)</p>
<p>전공자의 입장 : <strong>컴퓨터 시스템의 자원을 효율적으로 관리</strong>하는 것</p>
<blockquote>
<p>여기서 말하는 자원이란 *<em>프로세스(CPU), 메모리, 기억장치, 입출력 장치 *</em>등을 말한다.</p>
</blockquote>
<p>자원의 효율적 관리란 ?</p>
<ul>
<li>사용자 간의 형평성 있는 자원 분배</li>
<li>주어진 자원으로 최대한의 성능을 내도록</li>
</ul>
<h3 id="운영체제의-목적">운영체제의 목적</h3>
<ul>
<li>자원의 효율적 관리</li>
<li>사용자 및 운영체제 자신의 보호</li>
<li>프로세스, 파일, 메세지 등을 관리</li>
</ul>
<br />

<h1 id="운영체제의-분류">운영체제의 분류</h1>
<hr>
<h3 id="동시-작업-가능-여부">동시 작업 가능 여부</h3>
<ul>
<li><p><strong>단일 작업</strong> 
   한 번에 하나의 작업만 처리 (ex: MS-DOS 프롬프트)</p>
</li>
<li><p><strong>다중 작업</strong>
  동시에 두 개 이상의 작업을 처리 (ex: UNIX, MS Windows 등)</p>
<ul>
<li><p><strong>시분할 시스템</strong>
 : CPU의 작업시간을 여러 프로그램들이 조금씩 나누어 쓰는 시스템</p>
</li>
<li><p><strong>다중 프로그래밍 시스템</strong>
 : 메모리 공간을 분할해 여러 프로그램을 동시에 메모리에 올려놓고 CPU가 항상 작업을 수행할 수 있도록 하는 시스템</p>
</li>
<li><p><strong>다중처리기 시스템</strong>
 : 하나의 컴퓨터 안에 CPU가 여러 개 설치된 시스템</p>
</li>
</ul>
</li>
</ul>
<h3 id="사용자의-수">사용자의 수</h3>
<ul>
<li><p><strong>단일 사용자</strong> (Single User)</p>
<ul>
<li>MS-DOS, MS Windows</li>
<li>단일 작업만 지원해주는 운영체제의 경우 단일 사용자만 지원</li>
</ul>
</li>
<li><p><strong>다중 사용자</strong> (Mulit User)</p>
<ul>
<li>UNIX, NT Server</li>
<li>서버에 계정을 여러 개 만들고 원격으로 여러 명이 동시에 접근할 수 있는 것</li>
</ul>
</li>
</ul>
<h3 id="처리-방식">처리 방식</h3>
<ul>
<li><p><strong>일괄 처리</strong> (Batch Processing)</p>
<ul>
<li>작업 요청의 일정량을 모아서 한꺼번에 처리</li>
<li>작업이 완전히 종료될 때까지 기다림<blockquote>
<p>현대의 운영체제에 적합하지 않음</p>
</blockquote>
</li>
</ul>
</li>
<li><p><strong>시분할</strong> (Time Sharing)</p>
<ul>
<li>여러 작업을 수행할 때 컴퓨터 처리 능력을 일정한 시간 단위로 분할하여 사용</li>
<li>일괄 처리 시스템에 비해 짧은 응답 시간을 가짐</li>
<li>interactive한 방식<blockquote>
<p>현대의 운영체제</p>
</blockquote>
</li>
</ul>
</li>
<li><p><strong>실시간</strong> (Realtime OS)</p>
<ul>
<li>정해진 시간 안에 어떠한 일이 반드시 종료됨이 보장되어야하는 실시간시스템을 위한 OS</li>
<li>ex) 미사일 제어, 반도체 장비, 로봇 제어<blockquote>
<p>시분할과 비슷해보이지만, 프로그램이 동작하기 위해 정확한 시간이 필요로 하는 운영체제</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<br />

<h1 id="몇가지-용어">몇가지 용어</h1>
<hr>
<ul>
<li><p><strong>Multitasking</strong> : 컴퓨터 전반에서 하나의 프로그램이 끝나기 전에 다른 프로그램이 컴퓨터에서 실행 가능한 것</p>
</li>
<li><p><strong>Multiprogramming</strong> : 여러 프로그램이 메모리에 올라가 있음을 강조</p>
</li>
<li><p><strong>Time sharing</strong> : CPU의 시간을 분할하여 나누어 쓴다는 의미 강조</p>
</li>
<li><p><strong>Multiprocess</strong> : 여러 프로그램이 동시에 실행</p>
</li>
<li><p><strong>MultiProcessor</strong> : 하나의 컴퓨터에 CPU가 여러 개 붙어있음을 의미</p>
</li>
</ul>
<br />

<h1 id="운영체제의-예">운영체제의 예</h1>
<hr>
<ul>
<li><strong>유닉스</strong> (UNIX) - 초창기의 목적은 대형 컴퓨터를 위한 운영체제</li>
<li><strong>DOS</strong> - 개인용 컴퓨터를 위한 운영체제 (단일 사용자용 운영체제)</li>
<li><strong>MS Windows</strong> - 다중 작업용 GUI 기반 운영 체제</li>
</ul>
<br />

<h1 id="운영체제의-구조">운영체제의 구조</h1>
<hr>
<p align="center">
  <img src="https://velog.velcdn.com/images/sori_127/post/5693e28b-2a1e-4216-9720-8c76e258a194/image.png" width="100%">
</p>

<br />

<p><strong>CPU가 한개일때 작업이 긴 것이 있으면 나머지 작업은 오래 기다려야 하는데 이를 해결하는 방법 ?</strong></p>
<blockquote>
<p><strong>CPU 스케줄링</strong></p>
</blockquote>
<ul>
<li>어떤 프로그램부터 CPU를 이용하게 할지 결정</li>
<li>얼마나 오랫동안 CPU를 이용하게 할지 결정</li>
</ul>
<p align="center">
  <img src="https://velog.velcdn.com/images/sori_127/post/327fbcf7-971a-4a9a-954f-f8515f15d35f/image.png" width="60%">
</p> 

<br />


<p><strong>프로그램이 많아지만 각 프로그램이 갖는 메모리 공간이 작아져서 프로그램이 원활하게 실행되지 않는 경우 ?</strong></p>
<blockquote>
<p><strong>메모리 관리</strong>의 필요성</p>
</blockquote>
<ul>
<li>실행할 프로그램을 메모리에 적재</li>
<li>더 이상 실행되지 않는 프로그램을 메모리에서 삭제</li>
</ul>
<p align="center">
  <img src="https://velog.velcdn.com/images/sori_127/post/ae0e5d21-28f3-4d00-90f0-1aa9bfec8241/image.png" width="60%">
</p>

<br />

<p><strong>디스크를 읽을 때 헤드의 움직임을 최소화하면서 효율적으로 읽어들이는 방법 ?</strong></p>
<blockquote>
<p><strong>파일 관리</strong>를 효율적으로 하는 방법 </p>
</blockquote>
<ul>
<li>엘리베이터 스케줄링과 유사한 방법
(먼저 버튼을 눌러도 우선 탑승이 가능하지 않은 방식)</li>
</ul>
<p align="center">
  <img src="https://velog.velcdn.com/images/sori_127/post/5baf9634-2fbf-4536-b67c-db850b165797/image.png" width="60%">
</p>

<br />

<p><strong>I/O device를 관리하기 위해 인터럽트를 사용하여 CPU에게 작업 사항이 있음을 알림</strong></p>
<blockquote>
<p><strong>입출력 관리</strong></p>
</blockquote>
<ul>
<li>복수의 프로그램이 동일한 입출력장치 접근 시도 시 동시 접근 방지</li>
</ul>
<p align="center">
  <img src="https://velog.velcdn.com/images/sori_127/post/df17990b-653d-45c4-8590-d8c0f791d254/image.png" width="60%">
</p>




]]></description>
        </item>
    </channel>
</rss>