<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>leeyk_2121_ar.log</title>
        <link>https://velog.io/</link>
        <description>AR개발자지망생</description>
        <lastBuildDate>Tue, 12 Nov 2024 08:15:21 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>leeyk_2121_ar.log</title>
            <url>https://images.velog.io/images/leeyk_2121_ar/profile/4eef7bd6-74cb-4fe0-8a39-b77a5f92ef9d/1.PNG</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. leeyk_2121_ar.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/leeyk_2121_ar" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[Unity AR 기초]]></title>
            <link>https://velog.io/@leeyk_2121_ar/Unity-AR-%EA%B8%B0%EC%B4%88</link>
            <guid>https://velog.io/@leeyk_2121_ar/Unity-AR-%EA%B8%B0%EC%B4%88</guid>
            <pubDate>Tue, 12 Nov 2024 08:15:21 GMT</pubDate>
            <description><![CDATA[<h3 id="arcore-vs-arkit">ARCore vs ARKit</h3>
<p>ARCore(Google) android 전용
ARkit(Apple) IOS 전용
<img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/96a7e6ee-2f9e-4b2e-a6e9-70da7c2aad19/image.png" alt="">
제공 기능은 ARKit가 압도적으로 많다...이때 IOS로 가야하나 싶었다 ㅋㅋ</p>
<h3 id="ar-session">AR Session</h3>
<p>AR Foundation을 사용할 때, <strong>AR경험의 시작과 종료를 관리하는 세션 단위</strong>이다.
AR Session은 AR 카메라 피드와 트래킹 데이터를 포함해 AR 애플리케이션이 실행되는 동안의 모든 AR 기능을 제어하고 유지하는 기능을 한다.
이때 기기의 카메라와 센서를 사용하여 주변 환경의 평면이나 객체를 인식하고, 위치 및 회전 데이터를 제공하여 AR 콘텐츠가 정확하게 고정될 수 있도록 한다.</p>
<h3 id="ar-default-plane">AR Default Plane</h3>
<p>AR 세션 중에 사용자가 보게 되는 가상의 평면을 의미한다.
AR 애플리케이션은 일반적으로 실제 환경에서 평평한 표면을 인식하고 이 위에 3D 객체를 배치한다.
카메라를 통해 실시간으로 표면을 감지하고 AR시스템이 이를 통해 가상 평면으로 표시한다.
인식된 평면 위에 3D 개체를 배치할 수 있으며, 이를 통해 객체가 실제 공간에 고정된 것처럼 보이게 한다.
AR Default Plane을 사용할 때 ARPlaneManager와 ARRaycastManager를 사용해 평면을 인식한다
<img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/0c30c061-9c97-4c91-884b-992e23a44243/image.png" alt=""></p>
<h3 id="xr-origin구-arsessionorigin">XR Origin(구 ARSessionOrigin)</h3>
<p>사용자의 기준점(Origin)을 설정하여 가상 객체와의 상호작용을 가능하게 하는 중요한 역할을 한다. 기본적으로 가상 환경에서 <strong>카메라의 위치와 회전</strong>을 설정하고, AR뿐만 아니라 VR 환경에서도 사용된다. 가상 세계의 원점을 설정하여 모든 객체와 카메라가 이 기준 좌표를 따라 위치하도록 한다. 사용자의 실제 움직임이 XR Origin의 카메라 위치와 연동되며, 이를 통해 가상 세계의 시점을 조절한다.
<img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/a42c0bc4-b823-44a7-9e50-a1c6e8220c19/image.png" alt=""></p>
<h3 id="ar-default-point-cloud">AR Default Point Cloud</h3>
<p>AR Foundation에서 제공하는 컴포넌트 중 하나로, AR 세션 중에 기기 카메라가 감지하는 <strong>3D 점들의 집합</strong>을 시각화하는 역할을 한다. 
이 점들은 카메라가 감지한 <strong>주변 환경의 특징</strong>을 나타내며, 평면이나 깊이를 인식하는데 사용됩니다.</p>
<ul>
<li>환경 특징 점 시각화
  AR Default Point Cloud는 실제 환경에서 감지된 여러 점들을 화면에 표시하여, 사용자가 카메라가 인식하고 있는 주변 특징을 확인할 수 있게 한다. 이 특징 점들은 실제 사물이나 표면의 세부적인 위치를 가리킨다.</li>
<li>트래킹 보조
  기기나 공간 내에서 트래킹을 유지하기 위해 수집한 특징 점들을 통해, 카메라 위치를 추적하고 주변 객체를 안정적으로 인식하는 데 도움을 준다.</li>
<li>3D 객체 배치 보조
  Point Coud 데이터는 평면이나 깊이를 인식하는 데 사용되며, 사용자는 이를 통해 인식된 위치에 객체를 배치하거나 상호작용을 설정할 수 있다.
  <img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/d35e6225-8a9b-4e90-bdf0-1efb9dced53b/image.png" alt=""><h3 id="ar-default-face">AR Default Face</h3>
AR Foundation에서 제공하는 컴포넌트 중 하나로, 얼굴인식 기능을 통해 얼굴의 3D 모델을 추적하고 시각화하는 역할을 한다. 이를 통해 AR 애플리케이션이 사용자의 얼굴을 감지하고, 가상 콘텐츠를 얼굴에 오버레이하거나, 얼굴 움직임에 맞추어 특정 효과를 적용할 수 있다.</li>
<li>얼굴 인식
  기기의 카메라를 통해 사용자의 얼굴을 감지하여 얼굴의 위치, 회전, 크기 등을 추적할 수 있다.</li>
<li>3D 얼굴 메시 생성
  얼굴의 특징 점을 기반으로 3D 메시를 생성하여, 얼굴 표정이나 움직임에 맞춰 실시간으로 변형이 가능한 얼굴 모델을 제공한다. 이를 통해 안경, 모자, 페이스 페인팅 같은 다양한 가상 아이템을 얼굴에 붙일 수 있다.</li>
<li>얼굴 특징 점 추적
  눈, 입, 코 등 얼굴의 주요 특징 점을 실시간으로 추적하여, 각 점의 위치나 움직임을 분석한다. 이를 통해 얼굴 표정에 따라 반응하는 애니메이션이나 필터를 만들 수 있다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[인공지능 강의 1]]></title>
            <link>https://velog.io/@leeyk_2121_ar/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-%EA%B0%95%EC%9D%98-1</link>
            <guid>https://velog.io/@leeyk_2121_ar/%EC%9D%B8%EA%B3%B5%EC%A7%80%EB%8A%A5-%EA%B0%95%EC%9D%98-1</guid>
            <pubDate>Wed, 06 Sep 2023 07:46:07 GMT</pubDate>
            <description><![CDATA[<h2 id="인공지능">인공지능</h2>
<h3 id="추론추리">추론/추리</h3>
<p>경험하지 않은 상황을 한다. 거의 미래 기술 급으로 상용화가 되려면 30년은 더 걸리다고 예상된다.</p>
<h3 id="인식판단">인식/판단</h3>
<p>decision making으로 과거 학습을 기준으로 결과값을 도출해낸다. 현재 상용화가 되고 있는 영역으로 볼 수 있다.
이 부분에서도 크게 두 가지로 나뉠 수 있다. </p>
<ul>
<li>supervised
data바탕으로 truth를 학습하여 최종판단을 기계가 해준다. <ul>
<li>머신러닝 : 데이터를 이용</li>
<li>패턴인식 : 확률로 푼다.</li>
</ul>
</li>
<li>unsupervised
data만을 가지고 사용을 하여 최종판단을 사람이 하고 이를 시각화 해준다. <h2 id="지능의-바닥">지능의 바닥</h2>
<h3 id="지능이란">지능이란?</h3>
사전적 의미에 따라서 새로운 사물 현상에 부딪쳐 그 의미를 이해하고 처리 방법을 알아내는 지적 활동의 능력을 의미한다. 
즉 계산이나 문서 작성 따위의 지적 작업에서, 성취 정도에 따라 정하여지는 적응 능력이라고 볼 수 있다.<h3 id="지능이-높다">지능이 높다?</h3>
</li>
<li>그렇다면 지능이 낮은 것은?</li>
<li>지능이 높고 낮은 것은 무엇으로 판단할까?<h3 id="지능의-원천">지능의 원천</h3>
</li>
<li><strong>기억</strong>
  자기가 이전에 경험했던 것이다.
  유사한 기억들이 뭉쳐져서 지능이 된다. 이러한 지능을 기억이 판단한다.
  생존의 활동이 지능이 되기도 한다. 
  이러한 기억은 크게 선천적 기억과 후천적 기억으로 나뉜다. 
  선천적 기억은 번식활동이라고 볼 수 있으며, 후천적 기억으로는 뜨거운 물체를 피하고 보는 것으로도 볼 수 있다.
  기억에서 지능까지갈려면 학습을 해야한다.</li>
<li><strong>추억과 학습의 차이</strong>
  간단하게 볼 수 있다. 이전의 기억이 나의 생존에 도움이 되면 학습이고 아니면 추억으로 변하게 된다.<h3 id="지능의-차원">지능의 차원</h3>
</li>
<li>존재의 차원 - 데카르트 좌표계
  물리계, 형이하학에서의 경험을 하는 부분의 차원이다. 모든 기억은 존재의 차원에서 일어난다고 볼 수 있다. 실제 머신러닝의 지능이 존재의 차원에 머물러 있다.</li>
<li>지능의 차원 - 자아의식+시간
  궁극적인 AI의 목표의 차원이다. 지능의 차원은 &#39;나&#39;라는 자아의식을 갖는 것을 깨닷게 되는 순간이라고 볼 수 있다. 미운 4살이라는 것이 왜 존재하는가? 3살 까지의 어린아이는 그저 어른들의 말을 따르는 자아 없는 존재라고 볼 수 있으나, 4살이 되는 순간 &#39;나&#39;를 깨닫고는 자기의견을 표현하기 시작한다. 이를 통해 궁극적인 AI의 모습은 자기자신을 알아차리느 것이 궁극적인 목표로 볼 수 있다.<h2 id="기억과-학습">기억과 학습</h2>
<h3 id="동전의-앞면--1--뒷면--0">동전의 앞면 : 1 , 뒷면 : 0</h3>
</li>
<li>한가지 재질로 만든 동전</li>
<li>던졌을 때 나오는면 ? 
  나의 대답 : 모르겠다. 앞면이 나올 수도 뒷면이 나올수도 있다.</li>
<li>어떻게 알았지?
  나의 대답 : 확률과 통계수업을 배웠다. 이러한 확률은 1/2라는 사실을 배웠다</li>
</ul>
<p>교수님의 대답 : 너의 모른다라는 대답은 학습을 통해 도출된 결과이다.</p>
<ul>
<li>같은 두께의 앞면은 알루미늄, 뒷면은 납을 붙여서 만든 동전</li>
<li>던졌을 때 나오는 면? 
  나의 대답 : 알루미늄인 앞면이 나올 것이다.</li>
<li>어떻게 알았지?
  나의 대답 : 밀도차이 떄문이다. </li>
</ul>
<p>교수님의 대답 : 알루미늄과 납의 비중을 논리적으로 추론해야한다. </p>
<h3 id="인과의-학습">인과의 학습</h3>
<p>이러한 질문은 우리의 경험에 기반하여 도출된 결과 값이다.
두 번째 질문에서 부터에서는 결과를 논리적으로 추론한다.</p>
<h2 id="학습과-추리">학습과 추리</h2>
<h3 id="경험">경험</h3>
<ul>
<li>같은 두께의 앞면은 알루미늄, 뒷면은 납을 붙여서 만든 동전</li>
<li>100번 던져 봄 -&gt; 모든 결과를 기억한다.(데이터 100개가 생긴다)</li>
</ul>
<h3 id="학습">학습</h3>
<ul>
<li>단일 재질 동전과 다르다-&gt; <strong>왜 그렇지?</strong>
여기서 확인할 수 있는 것은 &quot;왜 그렇지&quot;의 영역이 추론/추리의 영역이고 그 전이 머신러닝의 학습 단계로 볼 수 있다.</li>
<li>아하! 밀도 차이<h3 id="추리">추리</h3>
</li>
<li>학습의 적용</li>
<li>같은 두꼐의 앞면은 구리, 뒷면은 납을 붙여서 만든 동전</li>
<li>던졌을 때 나오는 면 예측하기? ---&gt; 필연적인가? -&gt; 추리<h3 id="지능">지능</h3>
</li>
<li>종합 추리 능력 -&gt; 우수하면?</li>
<li>추리 능력의 치우침 -&gt; 소질?</li>
<li>) 생존에 필요한 모든 활동이 지능이라고 볼 수 있다.<h2 id="사람의-정보-처리">사람의 정보 처리</h2>
</li>
<li>무엇을 보고 있나?
수지의 건축학 개론의 연출된 사진을 보고 있습니다.</li>
<li>다음의 관점에서 답한다면?<ul>
<li>감각 Sensation : 시각으로 사진을 본다.<ul>
<li>지각 perception : 얼굴의 윤곽선</li>
</ul>
</li>
<li>인식 Congnition : 여자 얼굴에 머리카락이 길다.</li>
<li>재인 Recognition : 누군지 알아보는 수준으로 수지임을 알게된다.(머신러닝)</li>
<li>추론 Inference : 사진이 연출된 사진이라는 것을 느끼면 추론</li>
<li>감정 Emotion : 이사진을 보고 아름답다고 느끼는 것을 말하는 것이 인공지능의 영역<h2 id="생각">생각</h2>
&lt;사람&gt;
생각의 출발 : 감각 -&gt; 경험
생각의 대상 : 정보(객체: Object)  -&gt; 감각을 느끼기 위해서는 객체가 필요하다.
생각의 수단 : 언어</li>
</ul>
</li>
<li>정보의 표시 방법 -&gt; 말</li>
<li>말의 표시 -&gt; 소리, 문자, 기호<ul>
<li>기호는 일반적으로 추상적이며, 그 자체로는 특별한 의미를 가지지 않을 수 있습니다.</li>
</ul>
</li>
<li>속성의 부여 -&gt; 부호<ul>
<li>기호에 속성이 생겨 부호가 탄생한다. 즉 기호에 특별한 의미를 넣는거다.</li>
</ul>
</li>
<li>의미 생성 -&gt; 부호의 규칙적 결험<ul>
<li>부호 하나만으로 구체적으로 표현을 못한다.</li>
<li>어떤 규칙을 가지고 부호가 결합되야 문장이 되어 의미가 생기고 그 의미가 모여 지능이 된다.
컴퓨터 프로그래밍에서 변수를 생각해보겠습니다. 변수는 이름(기호)과 값을 가지고 있습니다. 변수의 이름은 기호이며, 이 이름에 속성을 부여함으로써 변수의 데이터 유형, 값의 범위, 메모리 위치 등에 대한 정보를 포함시킬 수 있습니다.</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[메모리]]></title>
            <link>https://velog.io/@leeyk_2121_ar/%EB%A9%94%EB%AA%A8%EB%A6%AC</link>
            <guid>https://velog.io/@leeyk_2121_ar/%EB%A9%94%EB%AA%A8%EB%A6%AC</guid>
            <pubDate>Mon, 21 Aug 2023 12:06:16 GMT</pubDate>
            <description><![CDATA[<h3 id="memory">Memory</h3>
<p>프로그래밍을 할때 중요한 컴퓨터의 하드웨어 요소
CPU : 실제 계산하는 영역으로 연산을 한다. 
Memory : 데이터를 저장하는 공간
메모리는 메모리 셀 단위로 이루어져 있다.
<img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/18d364ae-db02-4e05-95ae-85d470c63943/image.png" alt="">
메모리 셀은 1byte 크기를 가지고 있다.
메모리 셀들은 각각 주소가 존재한다. 
<img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/659bbf01-e4c9-4363-81d4-59d4469a55e5/image.png" alt="">
보통 16진수로 주소를 표현한다.
<img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/29f38ed5-ec83-42e8-a644-52bf730d842e/image.png" alt="">
0x000006에 7을 저장한다. 이 과정 속에서 메모리라는 것은 os에서 실행하고 있는 모든 프로그램들이 공유해서 쓰고 있는 공간이다. 그래서 마음대로 주소를 통해서 원하는 공간을 접근할 수 있으면 문제가 생길 수 있다. (ex 중요 파일 삭제 등) 
calc라는 변수 이름은 0x000006을 의미한다. 직접적으로 모든 메모리 공간을 위험하므로 사용한 공간에 대한 이름을 정한 것이 바로 변수 이다. 
<img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/75ba6391-c8e8-4805-9034-567e05719992/image.png" alt=""></p>
<p>출처: <a href="https://www.youtube.com/watch?v=ZOVG7_41kJE&amp;t=3716s">https://www.youtube.com/watch?v=ZOVG7_41kJE&amp;t=3716s</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[자바스크립트 1]]></title>
            <link>https://velog.io/@leeyk_2121_ar/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-1</link>
            <guid>https://velog.io/@leeyk_2121_ar/%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-1</guid>
            <pubDate>Tue, 15 Aug 2023 12:20:35 GMT</pubDate>
            <description><![CDATA[<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/70a4961e-ebcf-4d82-9da9-bf191f85126c/image.png" alt=""></p>
<p>consol.log는 출력을 의미한다. ;는 반드시 써야하는 거는 아니지만 그냥 사용하자.</p>
<h3 id="주석-사용하기">주석 사용하기</h3>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/ea380b94-a789-4e73-8803-18476d8f079c/image.png" alt="">
<img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/452574ae-c9f1-4d1d-b4b1-ed2664d7fab3/image.png" alt=""></p>
<h3 id="변수-선언하기">변수 선언하기</h3>
<pre><code>/**
 * Variable (변수) 선언하기
 * 
 * 1) var - 더이상 쓰지 않는다. let이 var의 개선된 변수이다.
 * 2) let - 선언을 한다음에 값을 바꿀 수 있다.
 * 3) const -  변경하게 되면 에러가 뜨게 된다. 즉 바꿀 수 없다.
 */
var name = &#39;코드팩토리&#39;; //따옴표를 사용하면 글자를 표현하게 된다. 
//따옴표를 쓰지 않았기에 변수이름이라는 것을 알 수 있다.
console.log(name);

var age = 32; // &#39;&#39;를 쓰게 되면 글자가 되고 안쓰면 숫자가 된다.
console.log(age);

let ive = &#39;아이브&#39;;
console.log(ive);

ive = &#39;안유진&#39;;
console.log(ive);

const newJeans = &#39;뉴진스&#39;;
console.log(newJeans);

// newJeans = &#39;코드팩토리&#39;;
/**
 * 선언과 할당
 * 
 * 1) 변수를 선언하는 것. 
 * 2) 할당은 변수에 값을 넣어주는 과정이다.
 */
var name = &#39;코드팩토리&#39;; // 1),2)를 한번에 할 수 있다.
console.log(name);

let friend;
console.log(friend); // undefined이 된다

const friend2; //값이 초기화된 상태로 선언되어야 한다. 즉 문제가 된다.
/**
 * var과 let은 할당이 안이루어져도 된다 하지만 
 * const는 할당이 무조건 이루어 져야 한다.
 */</code></pre><p> <img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/0767aa7e-d21b-4dd7-9090-f546df388248/image.png" alt=""></p>
<h3 id="변수-이름-정하기">변수 이름 정하기</h3>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/f89c0cf1-8199-4a44-8e7e-13c83f283bb5/image.png" alt=""></p>
<h3 id="데이터-타입-배우기">데이터 타입 배우기</h3>
<pre><code>/**
 * Data Types
 * 
 * 여섯개의 Primitive Type과
 * 한 개의 오브젝트 타입이 있다.
 * 
 * Primitive Types
 * 다른 타입들이 구성될 수 있는 가장 작은 단위, 수학으로 보면 1,2,3, 이다.
 * 1) Number (숫자)
 * 2) String (문자열)
 * 3) Boolean (불리안) -&gt;참/거짓
 * 4) undefined(언디파인드)
 * 5) null (널)
 * 6) Symbol (심볼) -&gt; 최근에 생김
 * 
 * 7) Object (객체)
 *    Function
 *    Array
 *    Object 
 */
//Number tpye
const age = 32;
const tempatre = -21;
const pi  = 3.14;
//타입 확인하기 typeof 변수 
console.log(typeof age);
console.log(typeof tempatre);
console.log(typeof pi);
console.log(&#39;-----------&#39;);

const infinity = Infinity;
const nInfinity = -Infinity;

console.log(typeof infinity);
console.log(typeof nInfinity);
console.log(&#39;-----------&#39;);

/**
 * String 타입
 * 큰 따옴표 안에 작은 따음표 넣으면 작은 따음표 나오고
 * 작은 따옴표 안에 큰 따옴표를 넣으면 큰 따옴표가 나온다.
 */
const codeFactory = &#39;&quot;코&quot;드팩토리&#39;;
console.log(codeFactory);
console.log(typeof codeFactory);

const ive = &quot;&#39;아이브&#39; 안유진&quot;;
console.log(ive);

/**
 * Template Literal(``)
 * `` 저 사이에서는 아무렇게 입력해도 된다.
 * Escaping Charater
 * 1) newline -&gt; \n
 * 2) tab -&gt; \t
 * 3) 백슬래쉬를 스트링으로 표현하고 싶다면 두번 입력하면된다.
 */
const iveYuJi = &#39;아이브\n안유진&#39;;
console.log(iveYuJi);
const iveWonYoung = &#39;아이브\t장원영&#39;;
console.log(iveWonYoung);
const backSlash =&#39;아이브\\코드코드&#39;;
console.log(backSlash);
const smallQutoation = &#39;아이브\&#39;코드팩토리&#39;;
console.log(smallQutoation);

const iveWonYoung2 = `아이브 &#39;&quot;////
장원영`;
console.log(iveWonYoung2);
console.log(typeof iveWonYoung2);

const groupName = &#39;아이브&#39;;
console.log(groupName+&#39; 안유진&#39;);
console.log(`${groupName} 안유진`);
console.log(&#39;-----------&#39;);

/**
 * Boolean 타입
 */
const isTrue = true;
const isFalse = false; 
console.log(typeof isTrue);
console.log(typeof isFalse);
console.log(&#39;-----------&#39;);
/**
 * Undefined
 * 
 * 사용작 직접 값을 초기화하지 않았을때
 * 지정되는 값이다.
 * 
 * 직접 undefined로 값을 초기화하는 건 지양해야한다.
 */
let noInit;
console.log(noInit);
console.log(typeof noInit);
console.log(&#39;-----------&#39;);
/** 
 * null 타입
 * 
 * undefined와 마찬가지로 값이 없다는 뜻이다.
 * JS에서 개발자가 명시적으로 없는 값으로 치기화할때
 * 사용된다.
*/
let init = null;
console.log(init);
console.log(typeof init); // 일종의 버그다..
console.log(&#39;-----------&#39;);

/**
 * Symbol 타입
 * 
 * 유일무이한 값을 생성할 떄 사용한다.
 * 다른 프리미티브 값들고 다르게 symbol 함수를
 * 호출해서 사용한다.
 */
const test1 =&#39;1&#39;;
const test2 =&#39;2&#39;;
console.log(test1 == test2);
const test3 =&#39;1&#39;;
const test4 =&#39;1&#39;;
console.log(test3 == test4);

const symbol1 = Symbol(&#39;1&#39;);
const symbol2 = Symbol(&#39;1&#39;);
console.log(symbol1 == symbol2); 
// 어떤 값을 안에 넣더라도 값은 보존되지만 유일무이한 값으로 인식된다.
console.log(&#39;-----------&#39;);
/**
 * Object 타입
 * 
 * Map
 * 키:벨류의 쌍으로 이루어져 있다.
 * key : value
 * 키값을 기준으로 벨류를 찾는다.
 */
const dictionary = {
    red : &#39;빨간색&#39;,
    orange : &#39;주황색&#39;,
    yellow : &#39;노란색&#39;
};
console.log(dictionary);
console.log(dictionary[&#39;red&#39;]);
console.log(dictionary[&#39;yellow&#39;]);
console.log(&#39;-----------&#39;);

/**
 * Array 타입
 * 
 * 값을 리스트로 나열 할 수 있는 타입니다.
 */
const numberArray=[
    &#39;안&#39;,
    &#39;녕&#39;,
    &#39;하&#39;,
    &#39;세&#39;,
    &#39;요&#39;
];
console.log(numberArray);
console.log(numberArray[0]);
console.log(numberArray[4]);

numberArray[0]=&#39;코드팩토리&#39;;
console.log(numberArray);
console.log(typeof numberArray);
console.log(&#39;-----------&#39;);
/**
 * static typing -&gt; 변수를 선언할 떄 어떤 타입의 변수를 선언할지 명시한다.
 *                  C언어
 * dynamic typing -&gt; 변수의 타입을 명시적으로 선언하지 않고 값에 의해 타입을 &quot;추론&quot;한다.
 * Js -&gt; dynamic typing
 */</code></pre><p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/bb6b947e-63df-43b6-8cae-2d8ce4217f10/image.png" alt="">
<img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/0738b93d-2c82-4003-a615-1c1fbbb636bf/image.png" alt=""></p>
<h3 id="hoisting-간단히-알아보기">Hoisting 간단히 알아보기</h3>
<pre><code>/**
 * Hoisting
 */
console.log(&#39;Hello&#39;);
console.log(&#39;World&#39;);
console.log(&#39;----------&#39;);
// console.log(name); // undefined가 됐다.
// var name =&#39;코드 팩토리&#39;;
// console.log(name);
var name;
console.log(name);
name = &#39;코드팩토리&#39;;
console.log(name);
// 위와 같이 주석 처리 된 것과 같은 출력을 보인다.
/**
 * Hoisting은 무엇인가?
 * 
 * 모든 변수 선언문이 코드의 최상단으로 이동되는 것처럼 느껴지는 현상을 이야기한다.
 * let과 const도 Hoisting이 된다.
 */
console.log(yuJin);
let yuJin = &#39;안유진&#39;;
// 실제 존재는 되어 있지만 할당 전에는 접근 할 수 없다.
// 이러한 호스팅 현상을 var 키워드는 막아 주지 못하지만
// let과 const는 호스팅 현상을 막아준다.</code></pre>]]></description>
        </item>
        <item>
            <title><![CDATA[분할정복]]></title>
            <link>https://velog.io/@leeyk_2121_ar/%EB%B6%84%ED%95%A0%EC%A0%95%EB%B3%B5</link>
            <guid>https://velog.io/@leeyk_2121_ar/%EB%B6%84%ED%95%A0%EC%A0%95%EB%B3%B5</guid>
            <pubDate>Tue, 08 Aug 2023 11:27:04 GMT</pubDate>
            <description><![CDATA[<h2 id="분할정복이란">분할정복이란?</h2>
<h3 id="1-divide">1. Divide</h3>
<p>기존 문제를 작은 부분 문제들로 나눔
풀어야할 문제가 Base Case인지 Recursive Case인지 구분한다.
<strong>Base Case</strong>
: 문제가 작아 나눌 필요 없이 바로 답을 도출하는 경우
<strong>Recursive Case</strong>
: 문제가 커서 쪼개야할 경우</p>
<h3 id="2-conquer">2. Conquer</h3>
<p>각 부분 문제를 해결(정복)
이 과정에서 또 다시
Divide -&gt; Conquer-&gt; Combine 과정으로 재귀 현상이 일어날 수 있다.</p>
<h3 id="3-combine">3. Combine</h3>
<p>부분 문제들의 솔루션을 통해 기존 문제를 해결</p>
<h3 id="예제">예제</h3>
<p>1<del>8까지의 합을 구하기
1</del>4, 5<del>8 까지 문제로 쪼개서 각자 더한 후 다시 합친다.
1</del>4 까지 구하는 경우
1<del>2, 3</del>4로 나누어서 문제 풀기
1<del>2의 경우 1,2로 나누기 -&gt; Base Case로 바뀐다.
3
3</del>4의 경우 3,4로 나누기 -&gt; Base Case로 바뀐다.
7
1<del>2(3), 3</del>4(7) 로 나왔다.
1<del>4(10) 로 나왔다.
5</del>8 까지 구하는 경우
위와 같은 과정을 거치면 26이 나온다.
26+10=36</p>
<p>출처 :<a href="https://www.youtube.com/watch?v=qDEKiNzAH1U">https://www.youtube.com/watch?v=qDEKiNzAH1U</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[c++ 문자열->정수형]]></title>
            <link>https://velog.io/@leeyk_2121_ar/c-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%A0%95%EC%88%98%ED%98%95</link>
            <guid>https://velog.io/@leeyk_2121_ar/c-%EB%AC%B8%EC%9E%90%EC%97%B4-%EC%A0%95%EC%88%98%ED%98%95</guid>
            <pubDate>Sun, 16 Jul 2023 12:37:11 GMT</pubDate>
            <description><![CDATA[<p>*문자열 -&gt; 정수</p>
<p> -stoi(string s) : string -&gt; int</p>
<p> -stol(string s) : string -&gt; long</p>
<p> -stoll(string s) : string -&gt; long long</p>
<p> -stof(string s) : string -&gt; float</p>
<p> -stod(string s) : string -&gt; double</p>
<p> -stold(string s) : string -&gt; long double</p>
<p> -stoul(string s) : string -&gt; unsigned long</p>
<p> -stoull(string s) : string -&gt; unsigned long long</p>
<p>*정수 -&gt; 문자열</p>
<p> -to_string(int a) : int-&gt;string</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[메모리 초과]]></title>
            <link>https://velog.io/@leeyk_2121_ar/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%B4%88%EA%B3%BC</link>
            <guid>https://velog.io/@leeyk_2121_ar/%EB%A9%94%EB%AA%A8%EB%A6%AC-%EC%B4%88%EA%B3%BC</guid>
            <pubDate>Sun, 16 Jul 2023 10:13:14 GMT</pubDate>
            <description><![CDATA[<ol>
<li>정렬 문제에서 처음 사용 했을 때는 vector를 사용해서 sort를 이용함
근데 메모리 초과당함
vector<int> 에서 int는 4byte 
1000만 * 4바이트
4000만 바이트
4만 킬로
40 메가
문제의 메모리 제한은 8MB 이므로 당연히 초과 당한다.</li>
<li>그래서 이중 for문을 통해서 오름차순 정리했는데 outofbounds 당함</li>
<li>ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
요놈 이용해서 속도 높힘</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[OS 9장]]></title>
            <link>https://velog.io/@leeyk_2121_ar/OS-9%EC%9E%A5</link>
            <guid>https://velog.io/@leeyk_2121_ar/OS-9%EC%9E%A5</guid>
            <pubDate>Sun, 16 Jul 2023 09:42:50 GMT</pubDate>
            <description><![CDATA[<h2 id="단일-프로세서의-스케줄링">단일 프로세서의 스케줄링</h2>
<p>우리는 스케줄링을 한다. 하루 계획, 일주일 계획, 한달 계획 등등 여러 계획을 세운다. </p>
<p>컴퓨터 시스템에는 프로세스 스케줄링을 위해서 3가지 방법이 구현되어 있다. </p>
<ul>
<li>long term scheduling<ul>
<li>컴퓨터 시스템에 들어오는 프로세스들을 선택하고 새로운 프로세스를 생성하는 스케줄링</li>
</ul>
</li>
<li>medium term scheduling<ul>
<li>부분적으로 또는 메인 메모리에 전체적으로 들어와있는 프로세스의 갯수를 결정하는 스케줄링</li>
</ul>
</li>
<li>short term scheduling<ul>
<li>레디 상태에 있는 프로세스 중에서 스레드 중에서 어느 것을 cpu 에 할당할지 결정한다</li>
</ul>
</li>
<li>I/O scheduling<ul>
<li>여러가지 입출력 장치에 대기하고 프로세스들 중에 어느 것을 선택해서 입출력 장치를 사용하게 해줄것인지 결정해준다.</li>
</ul>
</li>
</ul>
<p>이것들은 각각 목적에 맞게 응답시간, throughput, 프로세스의 효율성에 목적에 두고 그것을 최적화하기 위해 노력한다. </p>
<p>스케줄링 방법을 프로세스 상태 트랜지션이랑 연관지어 본다면</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/e7eada6d-89c6-4e67-89c0-ef4c58e99c4c/image.png" alt=""></p>
<p>시스템에 들어오는 프로세스 중에서 어떤 것을 준비상태로 만들어 주는지가 롱텀</p>
<p>서스팬드 된것중에서 레디상태로 결정하는게 미드텀</p>
<p>레디 상태에 있는 프로세스중에서 레디 상태로 하는 것이 숏텀 스케줄링</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/4cefa842-6f9e-41b4-bb5b-a33efa47fa04/image.png" alt=""></p>
<p>미드텀은 스와핑과 관련된 기능이다. </p>
<h2 id="long-term-scheduler">Long-Term Scheduler</h2>
<p>시스템에 들어오는 프로세스를 결정</p>
<p>프로그램이 실행되면 어느 것을 시스템에 넣을지 결정</p>
<p>멀티 프로그래밍의 정도를 결정</p>
<p>판매장에 가면 매장 입구에 사람을 들어갈지 말지 결정하는 역할</p>
<p>이 스케줄러에 의해 시스템 안이 얼마나 붐빌지를 결정하게 되고 너무 많이 붐비면 서비스에 만족하지 못해서 서비스 만족도를 결정한다. </p>
<p>프로세스를 생성할때 생각해야 할것이 운영체제가 언제 추가적인 프로세스를 생성할 것인가와</p>
<p>어느 것을 프로세스를 먼저 생성하게 해줄것인가 이다</p>
<p>이때 어느 것을 프로세스를 먼저 생성하게 해주는 방법은 가장 먼저 온 것을 가장 먼저 서비스,와 우선순위 , 기대 수행 시간, IO 요구사항 등이 있다. </p>
<h2 id="medium-term-scheduler">Medium-Term Scheduler</h2>
<p>스와핑 기능의 일부이다</p>
<p>Swapping -in decision을 미드텀 스케줄러가 한다. </p>
<p>멀티 프로그래밍의 정도를 결정하게 된다.</p>
<h2 id="short-term-scheduler">Short-Term Scheduler</h2>
<p>디스패처라고 부른다</p>
<p>가장 빈번히 자주 실행되는 스케줄러이다.</p>
<p>어느 프로세스를 어느 cpu에 할당할 것인지 결정해주는 함수</p>
<p>이것은 클럭 인터럽트 입출력 인터럽트 운영체제 콜(커널 서비스시작) 시그널(세마포어)에 쓰인다. </p>
<h2 id="short-term-스케줄러의-목적">Short-Term 스케줄러의 목적</h2>
<p>여러가지가 있다</p>
<ol>
<li>사용자의 경험을 좋게 하기 위해<ol>
<li>사용자 단말</li>
<li>사용자는 즉각 대답을 얻기를 원한다. 즉 사용자의 응답성에 목적을 둔다.</li>
</ol>
</li>
<li>시스템의 성능을 좋게 하기 위해<ol>
<li>서버</li>
<li>시스템의 성능이 제일 관권이다. 동시접속사수 → 시작되면 접속이 끊기지않고 유지되도록 하는 목적</li>
</ol>
</li>
</ol>
<h2 id="스케줄링의-다양한-목적">스케줄링의 다양한 목적</h2>
<p>목적에 따라 스케줄링이 다르다</p>
<p>크게 response time 이나 throughput을 중시하는 Performance-related가 있다.</p>
<ul>
<li>quantitative</li>
<li>easily measured</li>
</ul>
<p>그것과 더불어서 predictability(예측가능성)를 중시하는 Non-performance-related(실시간 처리)가 있다.</p>
<ul>
<li>quantitative</li>
<li>hard to measured</li>
</ul>
<h2 id="user-oriented-performance-related성능평가-도구">User oriented, Performance Related(성능평가 도구)</h2>
<p>Turnaround time </p>
<p>시스템에 들어가서 프로세스가 끝날때까지 간격을 가지고 </p>
<p>Response time</p>
<p>요청이 대답 오는데 까지 걸리는 시간</p>
<p>Deadlines</p>
<p>어떤 프로세스가 끝날때까지 걸리는 시간이 중요한 경우에 쓰이는 도구</p>
<h2 id="user-oriented-other">User oriented, other</h2>
<p>Predictability</p>
<p>예측 가능한 성능, 제한된 시간내에 어떤 job이 반드시 수행되는 시간을 미리 알 수 있는 도구</p>
<p>실시간 처리에서 설명할때 쓰인다.</p>
<h2 id="system-oriented-performance-related">System oriented, Performance Related</h2>
<p>Throughput</p>
<p>시간 당 끝낼 수 있는 프로세스의 개수로, 시간 당 시스템을 통과하는 프로세스의 개수</p>
<p>Processor utilization</p>
<p>우리가 윈도우즈에서 볼 수 있는 현재 사용하고 있는 cpu 의 퍼센트</p>
<h2 id="system-oriented-other">System oriented, other</h2>
<p>Fairness</p>
<p>공평한지, </p>
<p>Enforcing priorities</p>
<p>우선순위를 줄 수 있는지</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/33e072fe-ccb7-4b94-8245-84f6ba34a3d6/image.png" alt=""></p>
<h2 id="selection-function">Selection Function</h2>
<p>장기 스케줄러, 중기 스케줄러는 단기 스케줄러에 비해서 상대적으로 덜 빈번히 수행되어 성능에 미치는 영향은 적다. 단기가 영향을 크게 미친다.</p>
<p>스케줄러는 선택기능인데 여러개의 레디 상태 프로세스 중에서 어느 것을 선택할것인지가 단기 스케줄러의 역할이다.</p>
<p>이러한 스케줄러들은 priority, resource requirement, or 어떤 식으로 프로세스를 사용하는지 성격에 의해서 그것에 기반해서 선택할 수 있다.</p>
<p>실행성격을 구분해서 선택을 한다면 중요한 물리량들은 </p>
<p>w = 시스템 안에서 얼마나 기다렸는지</p>
<p>e = 시스템 안에서 얼마나 수행 했는지</p>
<p>s = 실행시간이 얼머나 되는지</p>
<p>스케줄링을 측정하기 위한 기본적 물리량</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/741937bf-f7ba-4d95-9647-3274c6f9aebd/image.png" alt=""></p>
<h2 id="decision-mode">Decision Mode</h2>
<p>스케줄링을 할때 언제 스케줄러가 실행되는지에 대한 결정 모드</p>
<p>Non preemptive :cpu를 뺏지 못하게</p>
<p>preemptive :  cpu를 뺏을 수 있게</p>
<h2 id="non-preemptive-vs-preemptive">Non preemptive vs preemptive</h2>
<p>cpu의 경우 한번 프로세스가 시작이 되면 running 상태로 있고, 끝나거나 블록이 될때까지 지속적으로 되는 상태를 Non preemptive 이라 한다.</p>
<p>프로세스가 실행되는 중에서 다른 프로세스에 의해 인터럽트가 되는 경우가 preemptive 라고 한다. 이러한 트랜지션을 preemption이라고 하는데, 이것은 새로운 프로세스가 도착하거나 인터럽트가 발생하거나 주기적으로 preemption을 허용하는 경우 발생할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/3c050d88-4485-4c91-bc14-4be01147965d/image.png" alt=""></p>
<h2 id="first-come-first-servedfcfs">First-Come-First-served(FCFS)</h2>
<p>가장 간단한 스케줄링 방법</p>
<p>일상 속에서 볼 수 있다</p>
<p>가장 먼저 온 것을 먼저 처리한다</p>
<p>현재 실행하고 있는 프로세스가 실행을 끝냈을때 , 가장 오래 기다린 놈을 다음으로 실행시킨다. </p>
<p>가장 긴 프로세스가 유리한 스케줄러이다. </p>
<p>cpu가 더 많이 실행되는 프로세스들이 선호되는 스케줄링 방법이다. </p>
<p>Non preemptive 방법이다.</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/1cc9256a-4da3-4a72-a337-efdac3b9edd8/image.png" alt=""></p>
<h2 id="round-robin">Round Robin</h2>
<p>가장 많이 쓰이고 있다.</p>
<p>이것은 preemption을 하는데 clock 인터럽트에 의해서 발생한다.</p>
<p>Time Slicing 이라고 하고 각각의 프로세스들은 제한된 시간만을 서비스를 받는다</p>
<p>이러한 제한된 시간을 time quantum 혹은 slice 라고도 불린다.</p>
<p>여러개의 프로세스가 컴퓨터 시스템을 나눴을때, time sharing 시스템에서 널리 쓰인다. </p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/c29c40d9-fab7-46ab-8f4e-844f93709d63/image.png" alt=""></p>
<p>커서 위치에서 b가 들어온다.  한 퀀텀만큼, 한 스라이스 만큼 b가 동작한다. 그 이후로도 똑같이 수행</p>
<p>골고루 time slice 해서 수행하는 것이 라운드 로빈이다.</p>
<p>라운드 로빈을 수행할때 사용자의 경험을 좋게 하기 위해서는 time quantum의 크기를 사용자의 인터렉션이 끝나는 시간보다 약간 더 크게 해준다. </p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/07c95a9a-3df3-409a-a9d7-555338094ea9/image.png" alt=""></p>
<p>그와는 대조적으로 time quantum을 사용자 인터렉션보다 적게 한다면 불편을 야기한다. </p>
<h2 id="shortest-process-nextspn">Shortest Process Next(SPN)</h2>
<p>이것은 가장 짧게 처리해야할 것으로 보이는 프로세스를 선택하는 스케줄링이다.</p>
<p>마트로 비유를 하자면 10개, 1개, 2개를 구매하는 사람들의 순서를 정할때 1,2,10으로 하면 서비스 질이 올라간다고 보는 것이다. 즉 가장 짧은 프로세스 먼저 처리하는 스케줄링이다.</p>
<p>Non preemptive 방법이기 때문에 한번 실행이되면 끝날때까지 cpu를 차지한다. </p>
<p>그래서 short 프로세스들이 줄의 맨앞으로 점프하는 방법인데 실행시간이 긴 프로세스들으 starvation이 발생할 수 있다. </p>
<p>expected 시간을 어떻게 계산할 것인지 문제가 발생할 수 있다.</p>
<p>프로그램의 경우 실행 시간에도 쓰레드에 흘러가는 프로그램 카운터가 달라질 수 있기 때문에 현실적으로 정확하게 구하기 어렵다.</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/d6aa4c25-a187-432d-a48e-3ee53bef4845/image.png" alt=""></p>
<p>B가 돌아가는 동안 CDE가 도착, E가 먼저 수행</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/ddecb6c5-216e-4b9d-9bf3-0a7cdde23377/image.png" alt=""></p>
<h2 id="vrr">VRR</h2>
<p>IO가 빈번한 잡의 경우 따로 큐를 만들어서 처리해주는 방법이 가상 라운드 로빈 방법이다.</p>
<p>별도의 큐를 만들어서 소규모의 서비스를 받는 큐를 따로 만든다. 레디 큐에서 기다리게 하고 io바운디드 잡은 다른 큐에서 기다리도록 한다. </p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/d43edc30-4e8a-4087-895b-870f3ed08a2d/image.png" alt=""></p>
<h2 id="shortest-remaining-timesrt">Shortest Remaining Time(SRT)</h2>
<p>이것은 SPN의 Preemptive 버전이다</p>
<p>Shortest expected Remaining Time을 갖는 프로세스를 선택하도록 한다</p>
<p>긴 프로세스들이 starvation이 발생할 수 있다.</p>
<p>서비스를 하는 중간에도 서비스 타임이 조금 남은 것이 언제든지 끼어들 수 있기 때문에 response time이 좋은 성능을 갖게 된다.</p>
<p>그리고 superior turnaround를 갖게 된다.</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/c2097f0a-0b89-47cf-b5ab-f2585443f9ef/image.png" alt=""></p>
<p>B는 6유닛 만큼 실행 c가 도착했을 때 c가 남은 시간이 더 짧아서 c가 먼저 수행된다. </p>
<h2 id="highest-response-ratio-next-hrrn">Highest Response Ratio Next HRRN</h2>
<p>Ration를 가장 크게 하는 프로세스를 선택하는 방법</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/9130a666-40df-4521-90df-7d4f5696cf92/image.png" alt=""></p>
<p>오래기다린 것을 먼저 선택하도록한 방법</p>
<p>Shorter job을 선호하지만 aging한 starvation을 방지하는 방법이다.</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/9cd21036-a18e-4d29-99bf-6a8dc1a775d1/image.png" alt=""></p>
<h2 id="feedback-scheduling">Feedback Scheduling</h2>
<p>레디 큐에 프로세스가 들어와서 실행되다가 프로세스를 충분히 사용하면, 타이머 인터럽트가 올때까지 실행이 됐다면 그 다음 레디큐로 내려가서 cpu를 충분히 쓴 job들은 밑으로 내려가서 큐에 쌓이게 되고 cpu를 적게쓴 i/o job 들은 점점 위로 올라가서 싸이게 되어 프로세스의 동작을 반영해서 큐를 관리하는 방법이다</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/41406bc3-d2b2-43bb-ba56-ce8de577518e/image.png" alt=""></p>
<h2 id="performance-comparison">Performance Comparison</h2>
<p>스케줄링 방법의 성능을 비교하기 위해서 큐잉 이론이 반영이 된다. </p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/4413c8cf-1853-470d-8e56-3efb3b85f20e/image.png" alt=""></p>
<h2 id="fair-share-scheduling">Fair-share scheduling</h2>
<p>프로세스 집합(process sets)에 대해서 스케줄링 하는 방법이 있다.</p>
<p>그중에 특히 공정성(Fairness)을 강조해서 스케줄링 하는 방법이다.</p>
<h2 id="traditional-unix-scheduling">Traditional Unix scheduling</h2>
<p>피드백 스케줄링, 라운드 로빈 스케줄링을 유닉스에서 쓰인다. </p>
<p>SVR3와 4.3 BSD 유닉스에서 자주 쓰인다. </p>
<p>좋은 response time과 low-priority background jobs이 기아상태가 안일어나게 해준다.</p>
<h2 id="band">Band</h2>
<p>프로세스들은 우선순위에 의해서 여러개의 bands로 나뉘게 된다.</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/511c383e-c3da-4dc9-84a1-78cd280f35cd/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[OS 8장]]></title>
            <link>https://velog.io/@leeyk_2121_ar/OS-8%EC%9E%A5</link>
            <guid>https://velog.io/@leeyk_2121_ar/OS-8%EC%9E%A5</guid>
            <pubDate>Sun, 16 Jul 2023 09:37:13 GMT</pubDate>
            <description><![CDATA[<h2 id="chapter-8-virtual-memory">Chapter 8 Virtual Memory</h2>
<p>가상 메모리 : </p>
<p>사람의 욕심은 끝이 없기 때문에 점점 더 큰 메모리를 원한다. </p>
<p>메모리 관리 요구사항</p>
<ul>
<li>Relocation</li>
<li>Logical organization</li>
<li>Physical organization</li>
<li>Protection</li>
<li>sharing</li>
<li><strong>Bigger memory (virtually infinite)</strong></li>
</ul>
<h2 id="hardware-and-control-structures">Hardware and Control Structures</h2>
<p>우리가 메모리 관리에서 중요한 두가지 특징</p>
<ol>
<li>모든 메모리의 참조<ol>
<li>프로그래머가 생각하는 모든 메모리 참조는 논리 주소인데 논리 주소를 물리 주소로 바꾸어주는 것이 필요하다.</li>
</ol>
</li>
<li>프로세스를 연속적이지 않은 메모리 덩어리로 나누어 메모리에 넣고 실행시키는 것이 필요하다.<ol>
<li>이러한 사항에서 반드시 수행 중에 메인 메모리에 모든 프로그램이 들어갈 수는 없다. </li>
</ol>
</li>
</ol>
<p>만약 두 개의 특성이 만족 된다면 페이지나 세그먼트가 모두 메인 메모리에 들어갈 필요가 없다. </p>
<p>필요할 때 가져오고, 필요 없으면 세컨더리 저장소에 집어 넣으면 되는데 이를 os가 해결하고자 한다.</p>
<h2 id="가상기억장치-정리하기">가상기억장치 정리하기</h2>
<p><strong>Virtual memory</strong> </p>
<p>메모리를 할당하는 방법으로 세컨더리 저장소를 프라이머리 메모리와 같이 프로그램에서 접근할 수 있도록 해주는 기억장치 이다. </p>
<p>만약에 발생한 주소가 메인 메모리에 없는 기억 장소를 가리킨다면 그것을 자동으로 os에 의해서 메인 메모리에 가져오게 하는 방법이다. </p>
<p>모든 주소는 앞에서 본 것처럼 물리적 주소로 실행 시간에 번역되서 메인 메모리에 없으면 세컨더리 저장소에서 그것을 번역해서 가져오도록 확장한 것이다. </p>
<p>이러한 가상 저장소의 크기는 범위가 없는데, 컴퓨터 시스템 안에 번역하는 테이블 크기와, 세컨더리 저장소의 크기에 한정이 된다. </p>
<p>세컨더리 저장소가 메인 메모리보다 더 크기 때문에 사용자가 보기에 크기의 제한이 없는 메모리를 만들게 된것이다. </p>
<p>단점은 세컨더리 저장소에 접근하기 때문에 속도가 느려진다. </p>
<p><strong>Virtual address</strong></p>
<p>논리적 주소를 의미한다.</p>
<p><strong>Virtual address space</strong></p>
<p>개발자가 보는 프로세스의 주소 공간인데 그 주소공간은 결국 무한정으로 커지게 된다.</p>
<p><strong>Address space</strong></p>
<p>한 프로세스가 쓸 수 있는 주소공간. </p>
<p><strong>Real address</strong></p>
<p>메인 메모리에서 저장소 위치의 주소를 뜻한다.</p>
<h2 id="execution-of-a-process">Execution of a Process</h2>
<p>한 프로세스가 실행되기 위해서 운영체제는 메인 메모리로 프로그램의 조각을 가져오게 되고 실행하게 된다.</p>
<p>메인 메모리 안에 들어있는 프로세스의 조각을 <strong>Resident set</strong>이라고 부른다.</p>
<p>만약에 프로그램이 실행되다가 메인 메모리에 없는 것이 발견되면 인터럽트가 발생되고 운영체제는 그 프로세스를 블록상태로 만든다. </p>
<h2 id="think-execution-of-a-process">Think Execution of a Process</h2>
<p>메인 메모리에 없는 프로그램의 덩어리를 가져오기 위해 논리 주소에 접근이 되면  운영체제는 디스크 i/o를 발생시킨다.</p>
<p>다른 프로세스는 블록이 되고 딴 프로세스가 디스패치되어 cpu를 차지하여 실행한다.</p>
<p>디스크 i/o가 완료되면 인터럽트 시키고, 운영체제는 해당 되는 메모리 블록을 메인 메모리에 집어 넣었다는 사실을 프로세스 컨트롤 블록에 페이지 매이핑 테이블에 집어 넣고 그 프로세스를 준비 상태로 만들어 준다. </p>
<h2 id="implications">Implications</h2>
<p>더 많은 프로세스가 메인 메모리에 들어 올 수 있다.</p>
<ul>
<li>각 프로세스의 조각들이 부분적인 로딩이 가능하다.</li>
<li>메인 메모리에 들어와 있는 프로세스의 개수는 많아지고 준비 상태의 프로세스 개수가 증가한다.</li>
</ul>
<p>프로세스는 모든 메인 메모리 보다 더 커진다.</p>
<h1 id="real-and-virtual-memory">Real and Virtual Memory</h1>
<p>Real memory</p>
<p>메인메모리, RAM</p>
<p>virtual memory</p>
<p>디스크에 있는 메모리</p>
<p>메인 메모리의 크기에 의해서 한정되는 프로그래머의 어려움을 해결한다.</p>
<h2 id="thrashing">Thrashing</h2>
<p>virtual memory에도 단점은 있다.</p>
<p>보조 기억장치를 사용해서 swapping process가 발생하게 되고 i.o 인터럽트가 발생하게 되고 os의 수행 속도가 느려진다. 전체 cpu 시간 중에 io인터럽트 처리 시간이 증가하면서 사용자가 쓸 수 있는 시간이 줄어든다. 이를 쓰레싱이라고 한다.</p>
<p>즉 프로세스의 처리시간보다 페이지 교체에 소요되는 시간이 더 많아 지는 현상</p>
<h2 id="principle-of-locality"><strong>Principle of Locality</strong></h2>
<p>지역성이 중요하다</p>
<p>프로그램과 데이터는 특정 부분에 접근하다. </p>
<p>커다란 행렬을 가지고 연산을 하게 되는데 연산을 한다는 것은 행렬에 집중적으로 계산이 집중된다. <strong>짧은 구간 동안에 연산들이 집중적으로 접근이 된다</strong>. 그 계산이 한번 시작되면 계산이 집중된다는 추측이 가능하다. 그렇게 된다면 지역성 만큼의 크기가 실제 메모리에 존재한다면 쓰레싱을 피할 수 있다. 반대로 그것보다 적은 메모리를 사용한다면 쓰레싱이 발생한다.</p>
<h2 id="paging-behavior">Paging Behavior</h2>
<p>우리가 프로그램을 수행시키면서 페이징이 어떻게 발생하는지 살펴보자</p>
<p>페이지 번호, 수행시간</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/b0071bf8-36a7-4d8e-aab9-0431c963bb3f/image.png" alt=""></p>
<p>특정 시간에 메모리가 집중되는 것을 확인 할 수 있다.</p>
<h2 id="support-needed-for-virtual-memory">Support Needed for virtual memory</h2>
<p>지역성을 잘 활용하면 큰 용량의 메모리를 저렴한 비용으로 만들 수 있다.</p>
<p>지역성을 활용한다면 → 하드웨어는 반드시 페이징과 세그멘테이션을 지원해야한다.</p>
<p>운영체제는 반드시 테이블을 채워주고 보조기억장치를 할당해주고 인터럽트를 처리해서 메인메모리에 가져와주고 메인메모리에서 업데이트된 메모리 내용을 보조기억장치로 보내준다. </p>
<h2 id="paging">Paging</h2>
<p>가상 메모리를 제공하기 위해 각 프로세스가 페이지 테이블을 가지게 된다.</p>
<p>각각의 페이지 테이블 엔트리는 메인메모리에서 상응하는 페이지의 프레임 숫자를 가진다.</p>
<p>페이지 테이블의 엔트리가 여러개 존재한다.</p>
<p>페이지 테이블의 엔트리는 물리 페이지 프레임의 주소를 저장하는 역할을 수행</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/411d863f-fa53-45b1-b953-ebfe5a610048/image.png" alt=""></p>
<p>커다란 프로그래밍 가능한 메모리를 만들기 위해 페이징을 이용</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/e50472cc-675d-40c0-b75f-033a40fb6144/image.png" alt=""></p>
<p>프로그램을 페이징으로 나누고 그것과 같은 크기인 페이징 프레임 단위로 메인 메모리를 나누어서 그들 사이에 매핑을 해서 실행시간에 가상 주소를 실제 주소로 변환시켜주는 방법</p>
<p>페이지 테이블을 사용해서 페이지 매핑 테이블을 각 프로세스마다 가지고 있어서 논리 주소를 물리 주소로 변환시켜준다. </p>
<p>페이징에서 주소 변환는 virtual address , 그니깐 논리 주소가 주어진다면 그것의 페이지넘버를 잘라서 그 부분을 프리픽스로 해서 페이지 테이블 포인터라는 페이지 테이블의 첫 부분을 가리키는 레지스터의 값과 더해서 그것을 인덱스로 엔트리를 찾는다 일종의 배열인 것이다. 여기서 프레임 넘버를 꺼내서 그것과 이 뒤에 offset을 붙혀서 실제주소를 만들고 그 주소를 내보내서 메모리에 접근하게 된다. </p>
<p>os가 하는 일은 페이징 테이블을 채워준다.</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/73ea3e2f-50f7-47b3-9451-09b715e79c35/image.png" alt=""></p>
<p>페이지 매핑 테이블을 만들면 모든 전체 주소 공간에 대해서 테이블을 가지고 있어야 해서 엔트리가 많아진다. </p>
<p>페이지가 1kbyte라면 1GBytes로 나누면 1Mbyte의 엔트리 갯수가 필요하다. 프로그램이 커지면 커질 수록 큰 페이지 테이블이 필요해지기 때문에 계층으로 나누어서 적어도 두 개의 레벨로 나누어 문제를 해결한다. </p>
<p>필요한 부분에 대해서 만 매핑 테이블을 만든다. 프로세스당 페이지 테이블을 만드는데 필요한 메모리 공간을 줄이게 된다. </p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/5950ebaa-66f6-44d2-b165-403dbeee2ebe/image.png" alt=""></p>
<h2 id="inverted-page-table">Inverted Page Table</h2>
<p>역 변환 페이지 테이블</p>
<p>테이블이 프로세스 당 하나 씩 생긴다.  전체 메모리를 가지고 테이블을 만들고 그것을 프로세스에게 나누어주자고 생각하게 되었는데 이를 역변환 페이지 테이블이라고 한다.</p>
<p>페이지 번호 부분을 하드웨어 해싱을 사용해서 특정 엔트리를 가리키게 한다. 그 엔트리가 역변환 페이지 테이블이 된다.</p>
<p>하나의 실제 메모리에 연결된 것이다. 주소 변환을 위해 각 프로세스 당 역변환 페이지 테이블의 엔트리만 가지고 있으면 거꾸로 주소를 변역할 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/c5ba64ca-ae2b-4748-9497-1907ae6a1140/image.png" alt=""></p>
<p>전체 메모리에 대해서 해쉬 테이블 가지고 있다가 프레임 넘버를 찾도록 한 것이다. </p>
<h2 id="inverted-page-table-1">Inverted Page Table</h2>
<p>각 엔트리에 대해서 페이지 넘버에 대해서 프로세스 id와 컨드롤  bit, chain pointer로 구성되어 있다.</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/d14b939b-2beb-4e3c-94c0-fcc45b0c2cdc/image.png" alt=""></p>
<p>어느 방식을 사용하더라도 페이지 테이블을 가져야 하는데 페이지 테이블 자체가 메모리에 저장되면 한번 메모리 접근을 위해 테이블이 하나이면 두번 메모리 접근해야 하고 이계층이면 3번 메모리에 접근해야한다. 메모리 접근 속도는 느리기 때문에 한번 메모리 접근할때마다 10이라는 시간이 든다면 주소 변환이라면 시간이 점차 늘어난다. 그래서 이 주소 번역에 대한 캐쉬를 만들게 되었다 이를 TLB 라고 한다.</p>
<p>가상 메모리는 한번 메모리에 접근하기 위해 두번의 메모리 접근을 한다. 첫번째는 페이지 테이블 엔트리를 가져오기 위해서 두번째는 실제 데이터를 가져오기 위해서</p>
<p>이를 극복하고자 TLB를 만들었다. 일종의 빠른 속도 캐쉬이다.</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/3b200bf6-a866-42f0-8822-447c93ad2104/image.png" alt=""></p>
<p>페이지 번호를 가지고 TLB라 하는 컨텐츠 어드레스 메모리를 검색을 한다. 동시에 검색을 하는데 엔트리를 찾게 되는데 이를 가지고 프레임 넘버를 집어넣어 offset에 붙혀서 실제 주소를 찾느다.  만약 메인 메모리에 없으면 보조기억 장치에 찾아간다. </p>
<h2 id="tlb의-operation"><strong>TLB의 Operation</strong></h2>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/0916fce5-f3e8-450a-b885-2baf7d0a4cec/image.png" alt=""></p>
<h2 id="associative-mapping">Associative Mapping</h2>
<p>TLB를 만들기 위해서 Associative 메모리를 사용한다.</p>
<p>지금 사용하는 대부분의 프로세스는 TLB를 가지고 있는데 그것을 Associative 메모리를 가지고 구현했고 이는 하나의 칩 안에 있다.</p>
<h2 id="page-size">Page Size</h2>
<p>작은 사이즈로 페이지를 만드면, internal frgmentation 이 작을 것이다.</p>
<ul>
<li>하나의 프로세스를 위해서 많은 페이지가 필요로 하다</li>
<li>페이지를 여러개 사용하면 페이지 테이블의 크기가 커진다. → 메모리 효율 감소</li>
<li>멀티 프로그램이 많이 일어나는 환경일 경우 테이블의 어떤 부분은 가상 메모리에 들어가게 된다.</li>
<li>대부분의 보조기억 장치는 블록 장치로 읽어내는데 커다란 사이즈의 메모리 테이블을 읽는 것이 효율적이다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/9c473e7d-5bfe-4a12-ab30-1bea9eeb4761/image.png" alt=""></p>
<h2 id="page-size-1">Page size</h2>
<p>페이지 사이즈라는 것은 결국에 물리적 메모리가 얼마나 되는지 많이 사용하는 프로그램의 크기는 얼마나 되는지에 많이 영향을 받는다. </p>
<p>그런데 메인 메모리는 점점 커지고 우리가 사용하고 있는 휴대폰의 경우 메모리 크기가 점점 커졌다. 앱의 크기가 점점 커지고 있다. 컴퓨터의 역사에 있어서도 어플리케이션의 크기가 커져왔다. 디스크에서 한번에 읽어내는 크기가 4k가 되어서 페이징을 해서 디스크로부터 메인메모리로 가져올때 한번 읽어낼 수 있는 블록의 크기만큼 가져오는 것이 효율적이다. </p>
<h2 id="segmentation">Segmentation</h2>
<p>페이징은 외부 조각화 없이 메모리를 사용할 수 있지만 프로그램을 구성하는 각 세그먼트들 단위로 관리가 되지 않아서 Sharing과  protect이 이루어지지 않고 있다.</p>
<p>세그멘테이션은 프로그램이 컴파일 되서 만들어진 덩어리인 세그먼트 단위로 메모리를 관리한다. 각 메모리 덩어리들 별로 메모리를 증가시킨다던지 컴파일 한다던지 공유나 보호하는 것에 있어서 아주 효율적이다. </p>
<p>프로그래머가 보는 입장에서 공유과 보호를 할 수 있다.</p>
<h2 id="segment-organization">Segment organization</h2>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/ced4d444-154d-4ebb-8a66-93252e85ea41/image.png" alt=""></p>
<p>세그먼트 테이블 엔트리는 세그멘트의 시작 주소와 길이 값을 갖는다</p>
<p>만약 세그먼트가 이미 메인 메모리 안에 있다면 bit는 결정하는데 있어서 필요해진다.</p>
<p>실제로는 세그멘테이션과 페이징을 결합해서 사용한다.</p>
<p>먼저 세그먼트를 만들고 프로그램이 있으면 텍스트 데이타 bss 스택 이들을  프로그램 이미지가 되는데 이때 text를 다 페이지 단위로 나눈다.  세그멘테이션은 프로그래머한테 보여주는 단위, 페이징은 프로그래머한테 보이지는 않지만 메모리 관리의 좋은 점 외부 조각화가 일어나지 않는다. </p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/607783ee-3d8b-42b6-9415-bcbe37d4caa4/image.png" alt=""></p>
<p>세그멘테이션은 보호와 공유를 논리적 단위로 해줄수 있게 해준다.</p>
<p>세그멘테이션 엔트리는 base 주소와 길이가 들어있다.</p>
<p>이 단위로 공유 했을 때 몇개가 사용되고 있는지 참조 값을 가지고 있다.</p>
<h2 id="operating-system-software">Operating System Software</h2>
<p>우리가 운영체제 소프트웨어는 다음과 같은 구분점에 의해서 구분된다</p>
<p>가상 메모리를 사용하고 있는지 아닌지</p>
<p>있다면 세그멘테이션, 페이징, 세그멘테이션/페이징을 쓰는지</p>
<p>기본 메모리 관리 메카니즘을 위해 어떠한 정책으로 메모리 관리를 하는지 가있다,</p>
<h2 id="policies-for-virtual-memory">Policies for Virtual Memory</h2>
<p>앞에서 제공하는 기본 메카니즘을 가지고 어떻게 하면 페이지 폴트를 적게 만들 수 있을까?</p>
<p>페이지 폴트를 줄이기 위해서 여러 정책들이 만들어 졌다.</p>
<p>Fetch Policy : 어떻게 페이지를 가져올것인가</p>
<ul>
<li>필요할때마다 가져온다.(Demand Paging)</li>
<li>미리 가져온다. (Prepaging)</li>
</ul>
<p>Placement Policy : 가져온 페이지를 메인 메모리 안에 어디에 둘 것인가.</p>
<p>Replacement Policy: 메인 메모리가 부족할때 기존에 있는 프로그램의 페이지를 내보내고 그 빈곳에다가 새로운 페이지를 넣을 때 기존의 페이지 중에서 어떤 것을 내보낼 것인가. </p>
<ul>
<li>Optimal : 미래를 내다 본다면 최적 필요없는 페이지 내보내기</li>
<li>Least recently used(LRU) : 최근에 덜 사용된 것 → 자주 사용됨</li>
<li>First-in-first-out(FIFo) : 처음 들어온 것이 처음으로 제거한다.</li>
<li>Clock  : LRU를 간편화 한것</li>
</ul>
<p>희생되는 페이지를 버퍼로 관리한다.</p>
<p>프로세스 별로 필요한 페이지 프레임의 갯수를 관리를 한다면 그것이 지역성을 수용할 만큼 유지가 된다면 페이지 폴트 수를 줄일 수 있다.</p>
<p>Resident set Management</p>
<ul>
<li>Resident set size<ul>
<li>Fixed</li>
<li>Variable</li>
</ul>
</li>
<li>Replacement Scope : 레지던트 셋을 제거할 때<ul>
<li>Global</li>
<li>Local</li>
</ul>
</li>
</ul>
<p>Cleaning Policy : 데이터가 수정된 페이지를 언제 적을지에 따라서 </p>
<ul>
<li>Demand : 필요할 때</li>
<li>Precleaning : 미리</li>
</ul>
<p>Load Control</p>
<p>Degree of multiprogramming</p>
<h2 id="fetch-policy">Fetch Policy</h2>
<p>페이지를 보조기억장치에서 메인메모리로 가져오는 방법</p>
<ol>
<li>필요할때 가져오는 방법 : Demand Paging</li>
<li>페이지를 가져올때 다른 것을 곁들여서 가져오는 방법 : Prepaging</li>
</ol>
<h2 id="demand-paging">Demand Paging</h2>
<p>하나의 참조가 어떤 페이지에 대해서 시작이 됐을때 참조가 됐을데 메인메모리로 그 페이지를 가져온다. 초반에는 페이지 폴트가 많이 생길 수 있으나 초반이후에는 페이지 폴트가 급격히 떨어진다. </p>
<h2 id="prepaging">Prepaging</h2>
<p>초반에 많은 페이지 폴트가 생기는 Demand paging의 단점을 줄이기 위해 생겨난 기술이다.</p>
<p>페이지 폴트가 발생한 페이지 말고도 다른 페이지를 가져온다.</p>
<p>이 함께 가져오는 operation은 보조기억장치에서 인접된 블록을 읽는 것이 빠르기 때문에 좀더 효율적이다</p>
<p>다만 가져온 페이지가 안쓰일때 비효율적으로 변한다.</p>
<h2 id="placement-policy">Placement Policy</h2>
<p>가져온 페이지를 어디에 놓는지에 대한정책</p>
<p>가져온 프로세스를 실제 메모리에 어디에 놓을 것인가에 대해서는 세그멘테이션에 있어서 아주 중요한 디자인 요소이다.</p>
<p>페이징과 연결된 페이징의 경우에는 별로 중요하지 않는다.</p>
<p>병렬처리기 중에서 NUMA 시스템에서는 아주 중요한 역할을 한다. </p>
<p>페이지를 어디에 놓느냐에 따라서 메모리 접근 속도가 다르기 때문이다. </p>
<h2 id="replacement-policy">Replacement Policy</h2>
<p>새로운 페이지가 메모리에 들어와야할때 기존의 메모리를 모두 쓰고 있을때 어느 한 페이지의 프레임을 비워서 새로 가져온 페이지를 집어넣어야 하는데 어떤 것을 선택할까?</p>
<p>희생이 된 페이지가 다시 금방 읽어 들어와야 한다면 무의미한 일이 되므로 미래에 사용되지 않을 페이지를 내보내는 것이 목적이다.</p>
<h2 id="frame-locking">Frame Locking</h2>
<p>어떤 페이지의 경우 예외적으로 디스크로 내보내면 안되는 페이지의 경우 locking을 건다. </p>
<p>커널 에서 사용되는 커널의 제어 구조체와 같은 경우 보조기억장치로 가면 안된다.</p>
<p>I/O 버퍼 그리고 time-critical areas는 메인 메모리 프로엠 안에 있어야 한다.</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/0c9dda84-78b9-49bc-86d8-440b4ab837ec/image.png" alt=""></p>
<h2 id="optimal-policy">Optimal Policy</h2>
<p>가장 먼 미래에 사용될 페이지를 선택하는 것이다. </p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/f272d5a4-6b93-46f5-a6ca-e3615793bf7a/image.png" alt=""></p>
<p>2번이 들어왔으면 2번이 프레임을 차지 3번이들어오면 또 차지 2번이 들어오면 그대로 1번이 또 차지</p>
<p>5가 새로 들어왔는데 어느 것을 내보낼까? 미래를 봤을때 2번과 3번이 사용되므로 1번을 내보내고 5번으로 채워넣는다.</p>
<p>그다음에 2가 오는데 그대로 사용되고 4가 오면 5와 3이 사용되므로 2를 대체한다. </p>
<p>2대신에 4를 넣는다. 5와3은 그대로 2가 오면 없으므로 뭔가 하나를 빼야하는데 2와5가 사용되므로 4를 제거해서 2를 넣는다. </p>
<p>전체 페이지 교체는 3번이 일어난다.</p>
<p>미래를 알수 없는데 어떻게 하냐? → 만약 미래를 알 수 있다면 그것이 최적이므로 다른 방법과 이방법을 이용해서 다른 알고리즘의 성능을 파악한다.</p>
<h2 id="least-recently-used-lru">Least Recently Used (LRU)</h2>
<p>가장 최근에 사용되지 않은 페이지를 제거</p>
<p>지역성에 의하면, 미래에도 사용되지 않을 가능성이 높다</p>
<p>문제는 시간 정보가 있어야 한다. 이 시간 정보는 마지막 참조가 될때마다 업데이트가 되어 저장되어야 한다. 각 페이지마다 이렇게 시간정보를 넣는 것은 세그멘테이션 테이블이 차지 하는 양이 많은데 이보다 더 늘어나게 된다. 이는 감당하기가 어렵다 . 따라서 사용하기도 어려운데 지역성에 따르면 가장 좋은 거고 이론적으로 의미가 있다. 실제로 사용되지는 않는다. </p>
<p>동영상 비디오 캐시를 다룰 때 사용</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/df41fe20-db0c-43c4-aaeb-000ab120a1e3/image.png" alt=""></p>
<p>2,3,1 이 채워졌다. 5가 들어오면 가장 오래된 것이 교체 되는데 3이 가장 오래되서 교체가 된다. 4가 오면 2 5 1 중에 가장 오래전에 사용된 1이 교체 된다. 3이오면 5 4 2 중에 가장 오래된 2가 대처된다. 2가 오면 3 5 4 중에 4가 제거된다.</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/3b8b685c-ef0f-43d6-97fa-1637e358b662/image.png" alt=""></p>
<p><strong>First-in-First-out (FIFO)</strong></p>
<p>LRU는 시간정보를 페이지 테이블 엔트리마다 유지해야해서 사용할 수 없다.</p>
<p>이 방법은 라운드 로빈 스타일로 페이지를 제거한다.</p>
<p>가장 먼저 들어온 것을 제거한다. </p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/594d52fd-52db-45b7-a7ef-6b30f6ea72e3/image.png" alt=""></p>
<p><strong>Clock Policy</strong></p>
<p>각 페이지 프레임에 대해서 시간 정보 전체를 넣는 대신에 몇개의 추가적인 bit를 이용해서 그를 대처한다. </p>
<p>use bit을 1로 set → 해당 페이지가 사용되고 있다.</p>
<p>페이지 프레임들을 circular buffer 처럼 이용하면서 교체가 필요할때 use bit이 1로 되어 있는 것을 0으로 바꾸어주고 제거한 후 새로 넣어준다.</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/a8ce1d02-17c9-4207-a718-143ceb7cade9/image.png" alt=""></p>
<p>페이지 프레임의 갯수가 늘어나면 차이가 줄어든다. 프레임 갯수가 줄어들면 차이는 커진다</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/805e0579-f783-4555-bde4-d82f6434765b/image.png" alt=""></p>
<h2 id="page-buffering"><strong>Page Buffering</strong></h2>
<p>페이징의 수행능력을 좋게 만들기 위해서 교체를 할때, 페이지들을 모아서 버퍼로 관리하는 방법이다.</p>
<p>교체를 할 페이지들을 실제로 디스크에 쓰는 일은 시간이 많이 들어서, 시스템에서 버퍼로 관리해서 두 개의 리스트를 가지고 관리를 하게 된다.</p>
<p><strong>Free Page list : 쓸(write) 필요가 없는 페이지의 리스트</strong></p>
<p><strong>Modified Page list : 수정된 페이지들 가지고 있다가 디스크나 ssd에 써주게 된다.</strong></p>
<p>페이지 버퍼링은 결국 캐시로 동작한다. 페이지 버퍼 안에서의 교체를 어떻게 하냐에 따라 성능에 영향을 미친다.</p>
<h2 id="resident-set-management">Resident Set Management</h2>
<p><strong>Resident set</strong>은 컴퓨터 시스템에서 현재 실행 중인 프로세스가 물리적인 메모리(RAM)에 올라와 있는 부분을 의미</p>
<p><strong>Working set</strong>은 특정 시간 동안 프로세스가 실제로 사용한 메모리의 집합을 나타냅니다.</p>
<p>OS는 프로세스에 필요한 프레임의 갯수를 결정한다.</p>
<p>적게 만들수록 많은 프로세스가 메모리 안에 들어올 수 있. 그렇지만 각 프로세스보다 적게 할당하면 페이지 폴트를 많이 유발한다. </p>
<p>페이지를 몇 개 할당할지 결정을 직접적으로 하는 것이 좋은 해결책이다.</p>
<p>필요한 페이지 프레임 갯수보다 더 많이 할당하는 것은 좋은 결정은 아니다. </p>
<h2 id="resident-set-size">Resident set Size</h2>
<p>프로세스 마다 할당할 프레임 페이지의 갯수를 결정하는 것은</p>
<p>Fixed-allocation : 고정된 갯수의 프레임 페이지를 나누어 주고 페이지 폴트가 발생했을 때, 자기 자신이 같고 있는 페이지 중에 교체할 페이지를 선택해야한다.</p>
<p>variable-allocation : 프로세스가 시작된 이후에도 할당된 프레임 페이지 갯수를 바꾸어 줄 수 있다.</p>
<h2 id="replacement-scope">Replacement scope</h2>
<p>이러한 Resident set을 유지하는데 있는 방법에 있어서 페이지 교체를 할때 대상이 되는 것을 global 하게 할것인가? 프로세스 안에 한정되게 할것인가 두가지 방법이 있다.</p>
<p>Local : 프로세스의 Resident 페이지 안에서 선택</p>
<p>Global : 메인 메모리 전체에서 희생 페이지를 선택</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/9926b83f-e847-4725-8866-36f08b6775ed/image.png" alt=""></p>
<h2 id="fixed-allocation-local-scope">Fixed Allocation, Local Scope</h2>
<p>통계에 의해서 프로세스 별로 필요한 메모리의 사이즈, 페이지 프레임의 갯수를 알아내고 그것 만큼 할당</p>
<p>그것 보다 적게 할당하면 페이지 폴트가 발생, 많게 할당되면 프로세스의 idle time 발생→비효율적</p>
<h2 id="variable-allocation-global-scope">Variable Allocation, Global Scope</h2>
<p>가장 구현하기 쉽다</p>
<p>OS는 프리 프레임의 리스트를 유지한다. </p>
<p>페이지 폴트 발생시 프리 프레임은 프로세스의 working set에 맞춰서 resident set을 더한다. </p>
<p>만약에 프레임이 더이상 사용불가능하다면 교체가 되고 교체시간을 줄이기 위해 페이지 버퍼링을 이용</p>
<h2 id="variable-allocation-local-scope">Variable Allocation, Local Scope</h2>
<p>새로운 프로세스가 메인 메모리 안에 들어오게 되면, 페이지 프레임을 할당해주고, 페이지 폴트가 발생하면 교체할 페이지를 선정해서 배치를 해주고 전체 성능을 확인하면서 프로세스에게 페이지를 할당해주거나 회수하거나 하는 방법이다.</p>
<p>할당하는 프레임 페이지의 개수를 정하는게 중요하다. 이것은 미래에 얼마나 프레임 페이지를 사용하는지 추측하는 문제이다. </p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/e5ac5cd6-b1f7-4b43-8f3f-cd26d2521226/image.png" alt=""></p>
<p>할당되는 프레임 페이지의 개수가 커지면 변화없이 유지되는 개수가 많아 진다.</p>
<h2 id="page-fault-frequencypff">Page Fault Frequency(PFF)</h2>
<p>이 방법은 use bit을 사용해서 이것이 1이라는 것은 clock 정책처럼 이 페이지가 사용되는 것을 알려준다.</p>
<p>페이지 폴트가 발생할때 os는 use bit을 사용해서 일정시간동안 덜 사용된 페이지를 선택해서 교체를 한다.</p>
<p>이 방법은 트랜지션이 일어나는 동안에 working set이 바뀌고 있는 동안에는 일어나지 않는다.</p>
<p>이 방법이 transient 기간(시스템이 변화하거나 조정되는 동안의 일시적인 시간 간격을 의미)동안에 새로운 locality가 변하는 동안에 잘 동작하지 않는것을 해결하기 위해 VSWS가 제안됐다.</p>
<h2 id="variable-interval-sampled-working-setvsws">Variable-interval sampled Working Set(VSWS)</h2>
<p>Working set의 크기를 추측하기 위해서 이 세가지 변수를 사용한다. </p>
<p><strong>The minimum duration</strong></p>
<p><strong>The maximum duration</strong></p>
<p><strong>The number of page faults</strong></p>
<h2 id="cleaning-policy">Cleaning Policy</h2>
<p>Modified 페이지는 보조기억장치에 반드시 적혀야 되는데 적혀질때,  교체가 일어날때에만 적는 것인 Demand Cleaning이 있다. </p>
<p>그것과 상관 없이 하드디스크나 ssd에 적혀지는데 성능을 얻기 위해서 배치로 적는 방법이 있다(precleaning)</p>
<h2 id="load-control">Load Control</h2>
<p>실행하는 프로세스의 개수를 조절해서 간접적으로 스레싱이 발생하지 않도록 해주다. </p>
<p>실행중인 프로세스의 개수를 멀티프로그래밍 레벨을 일정한 정도를 유지한다. </p>
<p>너무 적은 프로세스가 돈다면 cpu가 낭비</p>
<p>너무 많으면 스레싱 발생</p>
<p>적절할 수의 프로세스 수 유지하기</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/77e60638-af1e-4ad3-81b6-146e443b1481/image.png" alt=""></p>
<h2 id="process-suspension">Process Suspension</h2>
<p>이렇게 부하의 정도를 조절해서 스레싱이 발생하지 않도록 할때 중단하는 프로세스를 없애는 것이 아니라 스와핑 한다. 서스팬드 시킬때 어떠한 프로세스를 서스팬드 시킬지 골라야 한다.</p>
<p>6가지 방법</p>
<ol>
<li>Lowest-priority process</li>
<li>Faulting process</li>
<li>Last process activated</li>
<li>process with the smallest resident set</li>
<li>largest process</li>
<li>process with the largest remaining execution window</li>
</ol>
<h2 id="unix">Unix</h2>
<p>초기에 유닉스 운영체제는 Variable partitioning을 하고 버추얼 머신을 가지지 않은 운영체제였다. 그뒤에 유닉스는 솔라리스 운영체제와 함께 페이징을 사용하는 가상 기억장치를 제공하고 있다. 유닉스의 운영체제에는 페이징 시스템과 커널 메모리 할당을 제공하고 있다. </p>
<p>페이징 시스템은 가상 기억장치를 제공하는 기억장치 관리 방법</p>
<p>커널 메모리 할당은 가상 기억장치가 사용되기 전에 사용되는 메모리 할당이다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[OS 7강]]></title>
            <link>https://velog.io/@leeyk_2121_ar/OS-7%EA%B0%95</link>
            <guid>https://velog.io/@leeyk_2121_ar/OS-7%EA%B0%95</guid>
            <pubDate>Sun, 16 Jul 2023 09:30:14 GMT</pubDate>
            <description><![CDATA[<h2 id="chapter-7-memory-management">Chapter 7 Memory Management</h2>
<p>메모리 관리에 대해 알아보자</p>
<p>컴퓨터 시스템의 필수 구성 요소는 cpu와 메모리 장치이다. 메모리를 할당 받아서 프로세스를 저장해야 프로그램을 수행할 수 있다. </p>
<p>이 장에서는 컴퓨터 시스템에 존재하는 하나의 메모리를 어떻게 나누어주는지 배워볼 수 있다.</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/26aa2142-b35d-491c-ba22-54af522ba5af/image.png" alt=""></p>
<p>페이징, 세그멘테이션을 사용해서 실제 메모리를 나누고 있다.</p>
<p>페이지 라는 것은 고정된 사이즈의 메모리 블록이다. 이것은 세컨더리 메모리에서 한번 읽어낼 때 사용되는 데이터의 사이즈와 같은 크기가 된다. </p>
<p>세그멘테이션이라는 것은 필요한 만큼의 블록을 할당하는 방법이다</p>
<p>먼저 메모리 관리의 요구사항</p>
<ol>
<li>Relocation : 프로세스가 어디에 들어가든지 사용자는 항상 0번지부터 프로그램이 실행되는 것처럼 프로그램 해야한다. </li>
</ol>
<p>단순하게 메모리를 나누어 할당하여 프로세스를 넣어 주면 되지만 자세히 생각해보면 이러한 문제들을 해결해줘야 한다.</p>
<ol>
<li>Protection : 하나의 프로그램이 다른 프로그램의 내용에 접근할 수 없어야 한다.</li>
<li>Sharing : 프로세스가 여러 개 있을 때 자료를 공유할 수 있어야 한다. 대표적으로 스레드가 있다. 텍스트 영역은 read only로  공유하게 된다.</li>
<li>Logical organization : 할당된 메모리가 논리적으로 관리 되어야 한다.</li>
<li>Physical organization : 물리적으로도 관리 되어야 한다.</li>
</ol>
<h2 id="relocation">Relocation</h2>
<ul>
<li>개발자는 이 프로그램이 메인 프로그램의 어디에 들어가는지 알고 프로그램을 하는 것이 아니다. 알고 싶지 않아한다.</li>
<li>실행되는 프로세스는 swap in과 swap out 이 과정을 거치면서 다른 물리적인 메모리에 할당될 수 있다. 이 상황에서도 재배치가 필요하다</li>
</ul>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/20379ee9-fc0f-422d-896e-3cde50004d59/image.png" alt=""></p>
<p>우리가 프로그램에서 재배치하는 과정이 필요한 이유 </p>
<p>100번지로 가라고 지시한다</p>
<p>a라는 배열에 접근하는데 500번지부터 시작한다라고하는 코드가 있을 수 있다.</p>
<p>주소값을 바꿔줄 필요가 있다. 즉 0번지 시작 100번지→ 500번지 이동이 되면 1000번지 시작 →1100번지 1500번지 이렇게 재배치가 된다.</p>
<h2 id="protection">Protection</h2>
<p>프로세스는 메모리에 접근하기 위해 permission을 관리해야한다. </p>
<p>보안이 뚫리는 일을 방지하기 위해 모든 메모리 참조는 실행시간에 확인이 되어야 한다.</p>
<p>소프트웨어만으로 이루어지지 않고 하드웨어로 보호를 한다.</p>
<h2 id="sharing">Sharing</h2>
<p>각 프로세스는 예를 들어 인터넷 웹 서버 같은 경우 프로그램의 많은 부분은 공유될 수 있다.  동일한 복사본의 프로그램을 가지고 사용자의 접속을 받게 되는데 메모리 요구를 많이 줄일 수 있다.</p>
<p>메모리를 공유했을 때 protection에 문제가 생기지 안도록 공유할 수 있도록 메커니즘을 제공한다.</p>
<p>소프트웨어와 하드웨어를 사용해서해결한다.</p>
<h2 id="logical-organization">Logical Organization</h2>
<p>프로그램은 여러가지 모듈로 구성된다. </p>
<p>프로그램은 코드 텍스트 데이타 heap(bss) 스택 세그먼트로 이루어진다. 세그먼트라는 것을 사용해서 할당하는데 이러한 세그먼트 구조를 ,논리적인 구조를 관리할 수 있어야 한다.</p>
<h2 id="physical-organization">Physical Organization</h2>
<p>이러한 메모리는 물리적인 기억장소와 주소값을 갖기 때문에 관리해주어야 한다. </p>
<p>메모리라는 커다란 덩어리를 관리하면서 프로세스에게 나누어주어야 한다. </p>
<p>사용자가 관리하는게 아니라 os에서 전체 메모리 크기와 나누어 주어야하는지에 대한 정보를 관리하고 있다나 그것을 나누어준다.</p>
<ul>
<li>메인메모리가 모자랄때 즉 실행하고자 하는 프로세스가 더 많을 때, cpu의 효율을 높이기 위해 메인 메모리에 더 많은 프로세스를 생성하고자 할때 메인메모리가 부족하면 세컨더리 메모리를 사용해서 프로그램의 일부 모듈을 세컨더리 메모리로 보내어 오버레잉 기능을 사용한다. →버추얼 메모리로 발전</li>
</ul>
<p>그것이 얼마나 여유가 있는지 os가 관리 한다.</p>
<h2 id="memory-partitioning">Memory Partitioning</h2>
<p>이러한 요구사항을 가지고 사람들이 real memory를 나눠주는 방법으로 첫 번째로 생각한 것이 Memory Partitioning이다.</p>
<p>프로세스를 만들기 위해서 메인 메모리를 여러 프로세스에게 잘라서 나누어 주어야 하는데 </p>
<p>메모리를 파티션으로 나누어 주는 것이다.</p>
<p>파티션 나누는 기술</p>
<ol>
<li>Fixed Partitioning<ol>
<li>고정된 크기로 나누는 기술<ul>
<li>비효율</li>
</ul>
</li>
</ol>
</li>
<li>Dynamic Partitioning<ol>
<li>필요한 크기에 맞추어 나누는 방법<ul>
<li>재사용이 어려움</li>
</ul>
</li>
</ol>
</li>
</ol>
<h2 id="fixed-partitioning">Fixed Partitioning</h2>
<ul>
<li>똑같은 사이즈로 나누어 프로세스에게 할당</li>
<li>메모리를 다 할당 했는데 이것들이 입출력을 기다릴때, 일부를 디스크로 내보내고 새로운 프로세스를 생성 시킬 수 있다</li>
</ul>
<p>단점</p>
<ol>
<li><p>고정된 사이즈다 보니 아주 크게 나누어야 할지 아주 작게 나누어야 할지 에 대한 문제가 있다</p>
</li>
<li><p>메인 메모리의 효율성이 비효율적이다.</p>
<p> 실제로 100이 필요한데 1000을 할당하면 900이 남는데 이를 <strong>internal fragmentation</strong>이라고 한다.</p>
</li>
</ol>
<p>같은 사이즈가 아니고 다른 사이즈로 할당하는 방법으로 발전했다. </p>
<h2 id="dynamic-partitioning">Dynamic Partitioning</h2>
<p>작은 작업이 전체 공간을 낭비하는 문제가 생긴다.</p>
<p>고정 분할의 단점을 해결한 것</p>
<p>이 방법이 OS/MVT 라는 컴퓨터에서 사용됨</p>
<p>이름 그대로 동적으로 실행 시간에 필요한 만큼 할당한다. </p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/f6a9bf72-b843-4811-a89f-00c09bfaec5d/image.png" alt=""></p>
<p>이러한 데이터 조각들이 발생한다. 이러한 짜투리 메모리 공간을 <strong>External Fragmentation</strong>이라고 한다.</p>
<p>이 External Fragmentation이 많아지면 우리가 쓸 수 없는 메모리가 많아지기 때문에 shift를 해서 메모리를 유용하게 하는데 이를 <strong>compaction</strong>이라고 한다.</p>
<p>어느 메모리에 나누어 주는 방법(배치 전략)</p>
<p><strong>Best-fit</strong></p>
<ul>
<li>요구되는 메모리 블록에 가장 근접한 메모리를 할당</li>
<li>internal Fragmentation이 최소</li>
</ul>
<p><strong>First-fit</strong></p>
<ul>
<li>빈 공간이 링크드 리스트로 연결되어 있다면 그 중에 첫 번째 만나는 공간을 할당</li>
</ul>
<p><strong>Next-fit</strong></p>
<ul>
<li>자료구조를 쫓아가면 가용할 공간을 찾게 되는데 마지막으로 할당할 다음의 공간에 할당.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/1e460091-7ca4-4baf-8b96-4f347a4da1e4/image.png" alt=""></p>
<h2 id="buddy-system">Buddy System</h2>
<p>앞에 있는 시스템보다 통계적으로 더 잘 동작하는, fragmentation이 더 적게 남는 시스템이 buddy system이다.</p>
<p>고정된 사이즈와 동적 사이즈 파티셔닝을 섞은 것이다. </p>
<p>메모리 블록을 2^k에 해당하는 크기로 잘라서 사용하는 것이다.</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/834b5325-e159-4411-8511-882d7d3761af/image.png" alt=""></p>
<p>이진 트리를 이용해서 관리 할 수 있다. </p>
<p>리눅스에서 버추얼 메모리라는 장치를 구동시키기 전에 커널이 메모리 할당하기 위해서 사용하는 리얼 메모리 관리 방법이다</p>
<h2 id="addresses">Addresses</h2>
<p>리얼 메모리를 여러 방법으로 나누었을 때 Logical address를 Physical address로 바꾸어 주어야 한다.</p>
<p>프로그래밍 할 때 이 프로그램이 피지컬 메모리에 어디에 들어갈지 상관없이 만든다.</p>
<p>org 0 를 시작해서 만드는데 0번지가 아니라 100번지에 들어간다고 하면 피지컬 어드레스에 사상을 시켜줘야 하는 문제가 있다. 이를 해결하는 방법은 상대적으로 주소를 표현하는 방법이 있는데 이를 <strong>Relative addressing</strong>이라고 한다. </p>
<p>프로그램을 하드웨어에서 relocation하기 위해서는</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/d9213acd-9d76-4d3a-b1cd-78484c67a058/image.png" alt=""></p>
<ol>
<li>base register(sharing 해결)와 offset을 이용 <ol>
<li>100번지를 base register에 저장</li>
<li>상대적인 주소가 발생하면 (5번지의 것을 offset) 100번지와 5번지를 adder하여 comparator에 보낸다</li>
<li>bounds register 값을 넘어가면 인터럽트발생(protection 문제 해결)시키고 아니면 data에 넣는다.</li>
</ol>
</li>
</ol>
<h2 id="paging">Paging</h2>
<p>사용자가 편리하게 쓸 수 있는 방법</p>
<p>고정된 사이즈의 크기로 메모리를 나누는데 아주 작게 나누어서 메모리를 할당</p>
<p>하드웨어를 가지고 5가지 문제를 해결할 수 있다.</p>
<h2 id="page-table">Page Table</h2>
<p>메모리가 흩어져서 들어가는 경우 페이지 테이블이라는 것을 사용해서 해결</p>
<p>각 프로세스 마다 운영체제 의해 유지되는 페이지 테이블</p>
<p>물리적인 페이지(프레임)의 위치를 각 프로세스에 대해서 저장한다. </p>
<p>(각 프로세스의 페이지 테이블은 물리적인 페이지 프레임의 위치를 저장한다. )</p>
<p>물리적 주소를 생성하기 위해서(재배치를 위해서) 사용한다. </p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/c892b169-5542-46bd-bd04-fc557906f014/image.png" alt=""></p>
<p>논리 주소 →물리 주소로 사상</p>
<p>1번지 페이지 번호가 주어지면 페이지 테이블을 이용해서 변환 나머지 offset은 그대로 가져다 쓰기 </p>
<p>번역은 하드웨어에서 관리 페이지 테이블은 os에서 관리</p>
<h2 id="segmentation">Segmentation</h2>
<p>프로그램은 세그먼트 단위로 나눌 수 있다. 여러 사이즈의 블록이 된다. </p>
<p>세그먼트 넘버와 offset으로 관리가 된다. </p>
<p>다이나믹 파티셔닝과 비슷하게 사용된다. internal fragmentation을 없앨 수 있따. </p>
<p>페이지 대신에 segmentation 넘버가 인덱스로 사용된다. </p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/1496c120-204c-4819-be43-3dcc5082a8b9/image.png" alt=""></p>
<p>os가 하는 일은 process segment table을 유지 하는 일을 한다. </p>
<h2 id="security-issues">Security issues</h2>
<p>컴퓨터를 사용할 때 , 공인인증서나 인증정보에 있어서 사용할 시 많은 법적인 일을 할 수 있다. 그것이 해커에게 노출이 되면 그 정보를 사용해서 큰일이 일어날 수 있다.</p>
<h2 id="buffer-overflow-attacks">Buffer overflow attacks</h2>
<p>한 세그먼트 내에서 다른 값들을 접근 할 수 있다. 서버에서 돌아가는 공용 프로그램 통신 프로그램에서 한 사용자가 다른 사용자의 세그먼트를 가로챌수 있다.</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/0ba93ae9-96e7-40ff-bae0-83b0b1df90c7/image.png" alt=""></p>
<p>next_tag(str1); → str1 =”start”;</p>
<p>strncmp는 str1과 str2 8비트를 서로 비교</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/5ea1e5a3-2453-4fc1-8a30-ddfde935ce45/image.png" alt=""></p>
<p>한 변수가 다른 변수의 영역을 침범하는 것, 하나의 프로그램의 데이터가 다른 영역의 프로그램을 덮어 쓰는 경우가 버퍼 오버플로우 공격이라고 한다. </p>
<p>메모리를 잘 보호하지 못하면 엉뚱한 일이 발생할 수 있다.</p>
<p>버퍼오버플로우 막기 위한 방법</p>
<ul>
<li>Prevention</li>
<li>Detecting and aborting</li>
<li>compile-time defenses</li>
<li>run-time defenses</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[vector + 구조체 이용]]></title>
            <link>https://velog.io/@leeyk_2121_ar/vector-%EA%B5%AC%EC%A1%B0%EC%B2%B4-%EC%9D%B4%EC%9A%A9</link>
            <guid>https://velog.io/@leeyk_2121_ar/vector-%EA%B5%AC%EC%A1%B0%EC%B2%B4-%EC%9D%B4%EC%9A%A9</guid>
            <pubDate>Sun, 16 Jul 2023 09:25:53 GMT</pubDate>
            <description><![CDATA[<p>struct stu {
    string name;
    int x, y, z;
};
vector<stu> v(n);
for (int i = 0; i &lt; n; i++) {
        cin &gt;&gt; v[i].name &gt;&gt; v[i].x &gt;&gt; v[i].y &gt;&gt; v[i].z;
    } </p>
<p>구조체 선언한 후에 vector&lt;&gt; 괄호 안에 해당 구조체 이름을 넣고 선언하면 사용 가능</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[백준 알고리즘 초급 도장 깨기]]></title>
            <link>https://velog.io/@leeyk_2121_ar/%EB%B0%B1%EC%A4%80-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%B4%88%EA%B8%89-%EB%8F%84%EC%9E%A5-%EA%B9%A8%EA%B8%B0</link>
            <guid>https://velog.io/@leeyk_2121_ar/%EB%B0%B1%EC%A4%80-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EC%B4%88%EA%B8%89-%EB%8F%84%EC%9E%A5-%EA%B9%A8%EA%B8%B0</guid>
            <pubDate>Sat, 15 Jul 2023 12:09:39 GMT</pubDate>
            <description><![CDATA[<p>입출력 - <del>2557</del>, <del>1000</del>, <del>2558</del>, <del>10950</del>, <del>10951</del>, <del>10952</del>, <del>10953</del>, <del>11021</del>, <del>11022</del>,<del>11718</del>, <del>11719</del>, <del>11720</del>, <del>11721</del>, <del>2741</del>, <del>2742</del>, <del>2739</del>, <del>1924</del>, <del>8393</del>, <del>10818</del>, <del>2438</del>, <del>2439</del>, <del>2440</del>, <del>2441</del>, <del>2442</del>, <del>2445</del>, <del>2522</del>, <del>2446</del>, <del>10991</del>, <del>10992</del></p>
<p>DP - <del>1463</del>,<del>11726</del>,<del>11727</del>, <del>9095</del>, <del>10844</del>, <del>11057</del>, <del>2193</del>, 9465, <del>2156</del>, <del>11053</del>, 11055, 11722, 11054, 1912, 2579, 1699, 2133, 9461, 2225, 2011, 11052</p>
<p>정렬 - <del>2751</del>, <del>11650</del>, <del>11651</del>, <del>10814</del>, <del>10825</del>, <del>10989</del>, <del>11652</del>, <del>11004</del></p>
<p>스택 - <del>10828</del>, <del>9012</del>, <del>10799</del></p>
<p>큐 - <del>10845</del></p>
<p>덱 - <del>10866</del></p>
<p>문자열 처리 - <del>10808</del>, <del>10809</del>, <del>10820</del>, <del>2743</del>,<del>11655</del>, <del>10824</del>, <del>11656</del></p>
<p>기타 자료 구조 - 1406, 1158, 1168</p>
<p>기초 수학 - <del>10430</del>, <del>2609</del>, <del>1934</del>, <del>1850</del>, <del>9613</del>, <del>11005</del>, <del>2745</del>, <del>1373</del>, <del>1212</del>, <del>2089</del>, <del>11576</del>, <del>1978</del>, <del>1929</del>, <del>11653</del>, <del>10872</del>, <del>1676</del>, <del>2004</del>, <del>6588</del>  </p>
<p>그래프 - <del>1260</del>, <del>11724</del>, 1707, 10451, 2331, 9466, 2667, 4963, 7576, 2178, 2146, 1991, 11725, 1167, 1967</p>
<p>이분탐색/삼분탐색 - 1654, 2805, 2110, 10815, 10816, 11662</p>
<p>분할정복 - <del>11728</del>,<del>1780</del>, <del>11729</del>, <del>1992</del>, 2447, 2448, 1517, 2261</p>
<p>그리디 - <del>11047</del>, <del>2875</del>, <del>10610</del>, 1783, 1931, 11399, 2873, 1744 </p>
<p>완전탐색 - 1476, 1107, 1451, 9095, 10819, 10971, 1697, 1963, 9019, 1525, 2251, 2186, 3108, 5014, 1759, 2580, 1987, 6603, 1182, 2003, 1806, 1644, 1261, 1208, 7453, 2632, 2143</p>
<p>입출력 -&gt; 그리디 -&gt; 스택,큐,덱 -&gt;기타 자료구조 -&gt;정렬-&gt;그래프-&gt;이분탐색-&gt;분할정복-&gt; 이후에는 내맘</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[운영체제 chapter 3]]></title>
            <link>https://velog.io/@leeyk_2121_ar/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-chapter-3</link>
            <guid>https://velog.io/@leeyk_2121_ar/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-chapter-3</guid>
            <pubDate>Thu, 23 Mar 2023 16:33:11 GMT</pubDate>
            <description><![CDATA[<h2 id="이전-개념-요약">이전 개념 요약</h2>
<ul>
<li>컴퓨터 플랫폼은 하드웨어 리소스 모음으로 구성된다.</li>
<li>컴퓨터 응용 프로그램은 몇가지 작업을 수행하도록 개발되었습니다.</li>
<li>특정 하드웨어 플랫폼에 대해 어플리케이션을 직접 작성하는 것은 비효율적이다.</li>
<li>OS는 응요 프로그램이 사용할 수 있는 편리하고 기능이 풍부하며 안전하고 일관된 인터페이스를 제공하도록 개발되었다.</li>
<li>OS는 응용 프로그램에서 요청하고 액세스할 수 있는 자원들을 추상적으로 표현가능하고 일관성을 제공해준다고 생각할 수 있다.</li>
</ul>
<h2 id="응용프로그램-실행의-os-관리">응용프로그램 실행의 OS 관리</h2>
<ul>
<li>자원들을 다수 응용프로그램에서 사용할 수 있게 됨</li>
<li>프로세서가 여러 응용 프로그램 중에 전환된다. 그래서 프로세싱하는 것처럼 보일 것이다.</li>
<li>프로세서와 I/O 장비는 효율적으로 사용될 수 있다.</li>
</ul>
<h2 id="프로세스-요소">프로세스 요소</h2>
<p>프로세스의 필수 요소는 다음과 같다</p>
<ul>
<li><p>프로그램 코드</p>
<blockquote>
<p>동일한 프로그램을 실행하는 다른 프로세스와 공유할 수 있다.</p>
</blockquote>
</li>
<li><p>해당 코드와 연결된 데이터 집합</p>
<blockquote>
<p>프로세서가 프로그램 코드를 실행하기 시작하면, 우리는 이 실행 엔티티를 프로세스라고 한다.</p>
</blockquote>
</li>
</ul>
<h2 id="프로세스-요소들">프로세스 요소들</h2>
<p>프로그램이 실행되는 동안 이 프로세스는 다음과 같은 여러 요소에 의해 특성화될 수 있다.</p>
<ul>
<li>식별자</li>
<li>상태</li>
<li>우선순위</li>
<li>프로그램 카운터</li>
<li>메모리 포인터</li>
<li>문맥 데이터</li>
<li>입출력 상태 정보</li>
<li>과금 정보</li>
</ul>
<h2 id="process-control-block프로세스-제어-블록">Process Control block(프로세스 제어 블록)</h2>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/8c5c35fa-ebd8-4a4b-984c-021669a0e7b0/image.png" alt=""></p>
<ul>
<li>프로세스 요소들을 가지고 있다.</li>
<li>실행 중인 프로세스를 중단하고 나중에 중단이 발생하지 않은 것처럼 실행을 재개할 수 있다.</li>
<li>운영체제에서 생산 및 관리를 한다.</li>
<li>멀티 프로세스 지원할 수 있는 핵심 툴이다.</li>
</ul>
<h2 id="process-states-프로세스-상태">Process States (프로세스 상태)</h2>
<h3 id="trace-추적">Trace (추적)</h3>
<ul>
<li>프로세스에 대해 실행되는 명령 순서</li>
<li>프로세스를 processor가 수행할때 처리한 명령어들을 순서대로 나열한것</li>
<li>개별 프로세스 행위의 특성은 그 프로세스를 위해 수행되는 일련의 명령어 리스트로 표현될 수 있다.</li>
<li>프로세서의 동작은 다양한 프로세스의 trace가 어떻게 인터리빙되는지 보여줌으로써 특정지어질 수 있다.<h3 id="dispacher">Dispacher</h3>
</li>
<li>스케줄러가 선택한 프로세스를 CPU에게 할당해주는 요소</li>
<li>cpu를 한 프로세스로부터 다른 프로세스로 교체하여 주는 작은 프로그램</li>
</ul>
<h2 id="process-execution">process Execution</h2>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/1efb7143-dec4-4813-8bfa-590731472e8a/image.png" alt="">
디스패처가 A,B,C를 CPU에게 할당해준다.</p>
<h2 id="tow-state-process-model">Tow-State Process Model</h2>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/dbedcdcc-e0c6-46f4-be4f-dbd4889a6920/image.png" alt=""></p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/467b2f45-9500-4da1-be9c-da7a184e23ae/image.png" alt=""></p>
<ul>
<li>Not Running: 실행 대기 중인 상태</li>
<li>RunningL: 현재 실행 중인 상태</li>
</ul>
<h2 id="프로세스의-생성">프로세스의 생성</h2>
<ul>
<li>프로세스 스와핑<blockquote>
<p>OS가 다른 프로세스의 명시적 요청에 따라 새로운 프로세스를 생성하는 경우</p>
</blockquote>
</li>
<li>부모 프로세스<blockquote>
<p>원본 생성 프로세스이다.</p>
</blockquote>
</li>
<li>자식 프로세스<blockquote>
<p>부모 프로세스로부터 파생된 새로운 프로세스이다.</p>
</blockquote>
</li>
</ul>
<p><strong>프로세스 생성 이유</strong>
new batch job(새로운 일괄처리 작업) : 운영체제가 새로운 작업을 처리할 준비가 되면, 다음에 수행할 일련의 작업제어 명령을 읽어 들일 것이다.
Interactive logon(대화형 로그온): 사용자가 터미널에서 시스템에 로그온 한다.
Created by OS to provide a service(서비스를 제공하기 위해 운영체제가 생성) : 사용자가 대기할 필요 없도록, 운영체제는 사용자 프로그램을 대신해 어떤 기능을 수행할 프로세스를 생성할 수 있다.
Spawned by existing process(기존 프로세스에 의해 생성) : 모듈화를 위해서나 병렬성을 활용하기 위해, 사용자 프로그램은 많은 프로세스의 생성을 명령할 수 있다.</p>
<h2 id="프로세스-종료process-termination">프로세스 종료(Process Termination)</h2>
<ul>
<li>프로세스가 완료되었음을 나타내는 수단이 있어야 한다.</li>
<li>배치 작업(일괄적으로 모아서 처리하는 작업)에는 종료를 위한 HALT명령 또는 명시적인 OS 서비스 호출이 포함되어야 한다.</li>
<li>대화형 응용프로그램의 경우 사용자 작업은 프로세스가 완료된 시점을 나타낸다.</li>
</ul>
<h2 id="프로세스-종료-이유">프로세스 종료 이유</h2>
<ul>
<li>정상 완료</li>
<li>시간 한도 초과</li>
<li>메모리 부족</li>
<li>경계범위 위봔</li>
<li>보호 오류</li>
<li>산술 오류</li>
<li>시간 초과</li>
<li>입출력 실패</li>
<li>무효 명령어</li>
<li>특권 명령어</li>
<li>데이터 오용</li>
<li>오퍼레이터나 운영체제 간섭</li>
<li>부모 종료</li>
<li>부모 요청</li>
</ul>
<h2 id="5-상태-프로세스-모델">5-상태 프로세스 모델</h2>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/3dcd9df7-ac1c-4b45-ba33-e2306341f633/image.png" alt=""></p>
<p>생성 (New) : 막 생성 되었지만, 운영체제에 의해 수행 가능한 프로세스 풀(pool) 로의 진입이 아직 허용되지 않은 프로세스</p>
<p>준비 (Ready) : 기회가 주어지면 수핼될 준비가 되어 있는 프로세스</p>
<p>수행(Running) : 현재 수행 중인 프로세스</p>
<p>블록/대기(Blocked) : 입출력 연산 완료 등과 같은 이벤트가 발생할 때까지 수행될 수 없는 프로세스</p>
<p>종료(Exit) : 프로세스 수행이 halt 중지 되거나 어떤 이유로 중단(abort)되었기 때문에 운영체제에 의해 수행간으 프로세스 풀에서 방출된 프로세스</p>
<h2 id="일시-중단된-프로세스">일시 중단된 프로세스</h2>
<ul>
<li>스와핑<blockquote>
<p>메인 메모리에서 디스크로 프로세스의 일부나 전체들을 이동하는 것을 포함한다.
기본 메모리의 프로세스 중 준비상태에 있는 것이 없으면  OS는 차단된 프로세스중 하나를 디스크로 전환하여 일시 중단 대기열로 전환합니다.</p>
</blockquote>
</li>
</ul>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/9cbbe71d-44db-4502-8e64-60c6553242dd/image.png" alt="">
<img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/556a0548-8184-492f-89fe-698f8c19f904/image.png" alt=""></p>
<h2 id="일시-중단된-프로세스의-특징">일시 중단된 프로세스의 특징</h2>
<ul>
<li><p>프로세스를 즉시 실행할 수 없습니다.</p>
</li>
<li><p>사건을 기다리고 있을 수도 있고 그렇지 않을 수도 있다.</p>
</li>
<li><p>어떤 에이전트(프로세스 자체나 부모 프로세스, 혹은 운영체제)가 프로세스의 수행을 막기 위해 그 상태를 보류 상태로 바꾸었다.</p>
</li>
<li><p>에이전트가 제거를 명시적으로 해제 명령을 내릴 때까지 보류 상태에서 벗어날 수 없다.</p>
</li>
</ul>
<h2 id="프로세스-보류에-대한-이유">프로세스 보류에 대한 이유</h2>
<ul>
<li>스와핑</li>
<li>운영체제의 다른 이유</li>
<li>대화식 사용자의 요청</li>
<li>타이밍</li>
<li>부모프로세스 요청</li>
</ul>
<h2 id="운영체제-제어-구조">운영체제 제어 구조</h2>
<p>운영체제가 프로세스와 자원들을 관리하기 위해서는 일들 각각에 대한 현재 상태를 나타내는 정보를 가지고 있어야 한다. 즉 관리하고자 하는 각 개체에 대한 정보를 테이블로 구성해서 유지하는 것이다. </p>
<p>*<em>운영체제가 관리해야할 다른 4가지 테이블 *</em>
메모리 테이블 입출력 테이블 파일 테이블 프로세스 테이블</p>
<h2 id="memory-table">Memory Table</h2>
<p>주기억 장치와 보조기억장치 모두의 자취를 유지하기 위해 사용된다.
프로세스들은 가상메모리나 간단한 스와핑 기법을 사용하여 보조기억장치내에 유지되기도 한다.</p>
<p>반드시 포함되어야 하는 것들</p>
<ul>
<li><p>프로세스에게 할당된 주기억장치</p>
</li>
<li><p>프로세스에게 할당된 보조기억장치</p>
</li>
<li><p>어떤 프로세스가 특정 공유 메모리 영역에 접근이 가능하다는 속성등과 같은, 주기억 장치 또는 가상 메모리 블록들에 대한 보호 속성</p>
</li>
<li><p>가상 메모리를 관리하기 위해 필요한 정보</p>
<h2 id="io-table">I/O Table</h2>
<p>입출력 장치와 컴퓨터 시스템의 채널을 쉽게 관리하기 위해 운영체제에서 사용된다.
언제든지 I/O장치를 사용할 수 있거나 특정 프로세스에 할당할 수 있습니다
I/O 작업이 진행 중인 경우 OS는 다음 사항을 알아야 한다.</p>
<ul>
<li>입출력 작업상태</li>
<li>I/O 전송의 원본 또는 대상으로 사용되는 주 메모리의 위치</li>
</ul>
<h2 id="file-table">File Table</h2>
</li>
<li><p>파일의 존재 여부와 보조기억장치에 저장된 파일의 위치, 현재 상태, 그 밖에 다른 속성들에 대한 정보가 저장된다.
이러한 정보들 대부분은 파일 관리 시스템에 의해 유지되고 사용될 수 있으며, 그러한 경우 운영체제는 파일에 대한 정보를 극히 일부만 유지하거나 전혀 유지하지 않는다.</p>
</li>
</ul>
<h2 id="process-table">Process Table</h2>
<ul>
<li>운영체제는 프로세스를 관리하기위해 프로세스 테이블을 유지한다.</li>
<li>메모리, I/O 및 파일에 대한 직접 또는 간접적인 참조가 있어야 한다.</li>
<li>운영체제에 의해 접근될수 있어야 하므로 메모리 관리에 종속적이다.</li>
</ul>
<h2 id="process-control-structures">Process Control Structures</h2>
<p>운영체제가 임의 프로세스를 관리하고 제어하기 위해 알아야할 사항들</p>
<ol>
<li>프로세스 위치</li>
<li>관리에 필요한 프로세스의 속성</li>
</ol>
<h2 id="process-control-structures-1">Process Control Structures</h2>
<p><strong>Process Location</strong></p>
<ul>
<li>프로세스는 수행될 하나의 프로그램 또는 여러 프로그램 집합을 가지고 있어야 한다.</li>
<li>프로세스는 자신의 프로그램과 데이터를 적재시킬수 있는 충분함 메모리로 구성된다.</li>
<li>프로그램 수행시, 프로시저 호출들의 트랙과 프로시저 간에 전달되는 매개변수 등을 유지하는데 사용되는 스택이 필요하다.</li>
</ul>
<p>프로시저 : 루틴, 서브루틴, 함수와 같은 뜻으로 사용되며 하나의 프로시저는 특정 작업을 수행하기 위한 프로그램의 일부이다. 또는 어떤 행동ㅇ르 수행하기 위한 일련의 작업 순설르 말한다.
<strong>Process Attributes</strong></p>
<ul>
<li>각 프로세스는 프로세스 제어를 위해 OS에 의해 사용되는 수많은 속성과 관련되어 있다.</li>
<li>프로그램, 데이타, 스택 및 속성의 집합을 프로세스 이미지라고 한다</li>
<li>프로세스 이미지 위치는 사용중인 메모리 관리 체계에 따라 달라진다.</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[운영체제-2주차 2(chapter 2)]]></title>
            <link>https://velog.io/@leeyk_2121_ar/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-2%EC%A3%BC%EC%B0%A8-2chapter-2</link>
            <guid>https://velog.io/@leeyk_2121_ar/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-2%EC%A3%BC%EC%B0%A8-2chapter-2</guid>
            <pubDate>Mon, 20 Mar 2023 16:14:11 GMT</pubDate>
            <description><![CDATA[<h2 id="chapter-2-운영체제-개요">CHAPTER 2 운영체제 개요</h2>
<h2 id="21-운영체제의-목적-및-기능">2.1 운영체제의 목적 및 기능</h2>
<p><strong>운영체제의 목적</strong></p>
<ol>
<li>편리성
 컴퓨터를 편리하게 사용</li>
<li>효율성
 컴퓨터 시스템 자우너을 효율적인 방법으로 사용</li>
<li>발전성
 효과적인 개발과 검사 그리고 새로운 시스템 기능 도입을 다른 서비스를 방해하지 않고 수용</li>
</ol>
<p><strong>사용자/컴퓨터 인터페이스로서의 운영체제</strong>
하드웨어와 소프트웨어는 계층적인 방식으로 살펴볼 수 있다.
<img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/9beef596-fbad-40fc-a3ee-090a0d7976ac/image.png" alt="">
복잡한 개발 과정의 처리를 쉽게 하기 위해 다양한 시스템 프로그램들이 제공되는 이를 유틸리티 또는 라이브러리 프로그램이라고 한다. 중요한 시스템 프로그램을 모아놓은 것이 운영체제이다.
즉 사용자가 컴퓨터를 쉽게 사용할 수 있게 하고 컴퓨팅 환경을 제공한다.
운영체제가 제공하는 세비스</p>
<ul>
<li>프로그램 개발 (Program development)</li>
<li>프로그램 실행 (Program execution)</li>
<li>입출력 장치 접근(Access I/O Devices)</li>
<li>파일 접근 제어(Controlled access to files)</li>
<li>시스템 접근(system access) : 불법 사용자로부터 자원 과 데이터를 보호, 자원 경쟁 문제 해결</li>
<li>에러 발견 및 응답(Erro detection and response)</li>
<li>어카운팅(Accouning) : 여러 가지 자원에 대한 사용 통계 수집, 성능 척도드을 모니터링</li>
</ul>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/03724170-e091-4aa6-b6d3-25c5122413e8/image.png" alt=""></p>
<ul>
<li>인스트럭션 셋 구조 (Instruciton set architecture, ISA) : 컴퓨터가 따르고 있는 기계 명령어 집합 규정</li>
<li>응용 실행파일 인터페이스(Application binary interface, ABI) : 두개의 바이너리 프로그램 모듈 사이의 인터페이스를 말한다. 기계수준 , 이진값 수준에서의 인터페이스를 뜻한다.</li>
<li>응용 프로그래밍 인터페이스 (Application programming interface, API)</li>
</ul>
<p><strong>자원 관리자로서의 운영체제</strong>
시스템 자원을 효율적으로 관리하는 자원 관리자
일반적인 컴퓨터 소프트웨어와 동일하게 기능
처리기에 의해 실행되는 프로그램(또는 일련의 프로그램들)
수시로 application(응용)에게 제어를 양도해가며 실행되고, 특정 CPU 기능을 통해 승용으로부터 제어를 넘겨 받는다
<img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/366dc744-ced8-455a-91f4-7534e24669ad/image.png" alt=""></p>
<p>커널(Kernel)
주 메모리에 상주하는 운영체제 핵심으로 자주 사용되는 기능을 포함하며 Nucleus라고도 불린다.</p>
<p><strong>운영체제 발전 용이성</strong>
업그레이드 해야하는 이유</p>
<ol>
<li>하드웨어 업그레이드와 새로운 형태의 하드웨어<ul>
<li>HW 업그레이드에 따른 SW 기능 향상</li>
<li>paging, window</li>
</ul>
</li>
<li>새로운 서비스의 도입<ul>
<li>사용자 또는 시스템 관리자의 요구에 따라 새로운 서비를 제공하기 위해 운영체제가 확장되어야 한다.</li>
</ul>
</li>
<li>버그 수정<ul>
<li>어떤 운영체제도 결함을 가지고 있다.
해결법</li>
</ul>
</li>
<li>구성이 모듈화되어야 한다.</li>
<li>묘듈 간에 명확하게 인터페이스가 정의되어야한다.</li>
<li>문서화가 잘 되어야 한다.</li>
</ol>
<h2 id="22-운영체제의-발전">2.2 운영체제의 발전</h2>
<h3 id="순차처리---단순일괄-처리-시스템---멀티프로그래밍-일괄처리-시스템---시분할-시스템">순차처리 -&gt; 단순일괄 처리 시스템 -&gt; 멀티프로그래밍 일괄처리 시스템 -&gt; 시분할 시스템</h3>
<h3 id="순차처리serial-processing">순차처리(Serial Processing)</h3>
<ul>
<li>초창기 운영체제가 지원되지 않았다.</li>
<li>콘솔을 통해 운영됐다.</li>
<li>초기 시스템 문제점<ul>
<li>스케줄링(Scheduling) : 기계 사용시간을 예약</li>
<li>준비시간(setup time) : 컴파일러, 소스코드 적재, 컴파일된 프로그램 저장, 적재 링크를 포함</li>
</ul>
</li>
</ul>
<p>이와 같이 사용자가 컴퓨털르 순차적으로 접근하기 때문에 순차처리라고 한다.</p>
<h3 id="단순-일괄-처리-시스템simple-batch-system">단순 일괄 처리 시스템(Simple Batch System)</h3>
<p>컴퓨터의 이용률을 향상시키기 위해 개발되었다.
모니터(Monitor)
    - 일련의 이벤트를 제어하는 소프트웨어
    - 일괄처리 작업
    - 작업이 완료되면 제어는 다시 모니터로 넘어가고, 모니터는 즉시 다음 작업을 읽는다.
    - 각 작업의 결과는 출력되어 사용자에게 전달, 신속 수행
    - 작업 준비시간도 줄여준다.</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/8faa2325-573c-4f4e-a7c9-1381d3ce1d28/image.png" alt=""></p>
<p>Job Control Language(JCL)
특수한 형태의 프로그래밍 언어로 모니터에 대한 명령어를 전달하는데 사용된다.
사용할 컴파일러와 데이터가 무엇인지말이다.</p>
<p>근대 운영체제로 발전을 위한 하드웨어 기능
제어를 서로 넘겨가며 수행하는 CPU 역할 이외에도</p>
<ol>
<li>메모리 보호<ul>
<li>모니터를 포함하고 있는 메모리 영역이 변경되지 않도록</li>
</ul>
</li>
<li>타이머<ul>
<li>단일 작업이 시스템을 독점하지 못하도록</li>
</ul>
</li>
<li>특권 명령어(Privileged instruction)<ul>
<li>특정 기계 수준의 명령어는 모니터에 의해서만 수행할 수 있다.</li>
</ul>
</li>
<li>인터럽트<ul>
<li>초기에는 인터럽트 기능 지원 불가했으나 인터럽트로 운영체제와 사용자 프로그램 사이에 융통성 있게 전달됨.</li>
</ul>
</li>
</ol>
<p>메모리 보호와 특권 명령어
메모리 보호
사용자 프로그램은 사용자 모드에서 수행-&gt;특권 명령어는 수행되지 않는다.
모니터는 시스템 모드에서 수행된다. -&gt; 커널 모드에서 수행 특권 명령어가 수행될수 있고 보호 메모리 영역을 자유롭게 접근할 수 있다.</p>
<h3 id="멀티프로그래밍-일괄처리-시스템-multiprogrammed-batch-system">멀티프로그래밍 일괄처리 시스템 (Multiprogrammed Batch System)</h3>
]]></description>
        </item>
        <item>
            <title><![CDATA[운영체제 3주차-chapter 3]]></title>
            <link>https://velog.io/@leeyk_2121_ar/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-3%EC%A3%BC%EC%B0%A8-chapter-3</link>
            <guid>https://velog.io/@leeyk_2121_ar/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-3%EC%A3%BC%EC%B0%A8-chapter-3</guid>
            <pubDate>Mon, 20 Mar 2023 15:37:22 GMT</pubDate>
            <description><![CDATA[<h2 id="31-프로세스란">3.1 프로세스란?</h2>
<h3 id="프로세스-관리--기본-요규-조건">프로세스 관리 : 기본 요규 조건</h3>
<ul>
<li>다중 프로세스의 수행을 인터리빙 방식으로 처리한다. </li>
<li>프로세스에 자원을 할당하고, 각 프로세스의 자원을 다른 프로세스로부터 보호한다.</li>
<li>프로세스간 정보를 공유하고 교환할 수 있게 한다.</li>
<li>프로세스간 동기화를 지원한다.<h3 id="배경지식">배경지식</h3>
들어가기 앞서 개념을 요약해보자</li>
</ul>
<ol>
<li>컴퓨터 플랫폼은 하드웨어 자원들의 집합으로 구성된다.</li>
<li>컴퓨터 어플리케이션들은 어떤 업무를 수행하기 위해 개발된다. </li>
<li>주어진 하드웨어 플랫폼 상에 직접 응용들을 작성하는 것은 비효율적이다.</li>
</ol>
<ul>
<li>공통 루틴(common routines) 개발 유도.</li>
<li>자원 공유(resource sharing)를 위한 소프트웨어 필요</li>
<li>자원 보호(resource protection) 기법 필요</li>
</ul>
<ol start="4">
<li>운영체제는 어플리케이션이 사용할 수 있는 편리하고, 풍부하고, 안전하고, 일관성 있는 인터페이스를 제공</li>
<li>운영체제는 자원들에 대해 균일하고 추상화된 표현(representation)을 제공</li>
</ol>
<ul>
<li>응용은 해당 자원을 요청하고 접근 가능</li>
</ul>
<p>운영체제는 어플리케이션 수행을 관리함에 있어 다음을 지원</p>
<ol>
<li>리소스를 여러 어플리케이션에서 사용할수 있다. </li>
<li>프로세서가 여러 어플리케이션 간에 전환되므로 모든 작업이 진행 중인 것처럼 보인다.</li>
<li>프로세서 및 I/O 장치를 효율적으로 사용할 수 있다.</li>
</ol>
<h3 id="프로세스-및-프로세스-제어-블록">프로세스 및 프로세스 제어 블록</h3>
<p>프로세스의 두 가지 필수 요소
<strong>프로그램 코드</strong>
동일한 프로그램을 수행하는 서로 다른 프로세서들이 고유 할 수 있다.
<strong>해당 코드와 연결된 데이터 집합</strong>
프로세서가 프로그램 코드를 실행하기 시작할때, 우리는 이 실행 엔티티를 프로세스라고 부른다.</p>
<p><strong>프로세스 요소</strong>
프로그램이 실행되는 동안 이 프로세스는 다음과 같은 여러 요소에 의해 식별될 수 있다.</p>
<ol>
<li>식별자(identifier): 각 프로세스에 대한 고유 식별자(숫자, 색인 항복)를 저장</li>
<li>상태(state): 생성, 준비, 실행 중단 등의 상태를 표시</li>
<li>우선순위(priority)</li>
<li>프로그램 카운터(program counter) : 프로그램에서 다음에 수행될 명령어의 주소</li>
<li>메모리 포인터(memory pointers): 공유되는 메모리 블록에 대한 포인터</li>
<li>문맥 데이터(context data): 프로세스 수행 중, 처리기 레지스터에 존재하는 데이터</li>
<li>입출력 상태 정보 (I/O status information)</li>
<li>어카운팅 정보(accounting informantion,과금정보)</li>
</ol>
<p><strong>프로세스 컨드롤 블럭(process control block)</strong></p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/3aedd203-ebdc-408b-9620-23df6af8f9eb/image.png" alt=""></p>
<p>위 요소들은 프로세스 컨드롤 블럭이라는 자료구조에 저장된다.
주요 역할</p>
<ol>
<li>실행 중인 프로세스를 중단하고 나중에 중단이 발생하지 않은 것처럼 실행을 재개할 수 있다.</li>
<li>운영체제에서 생성 및 관리 된다.</li>
<li>여러 프로세서를 지원할 수 있는 핵심 도구이다(멀티 프로세싱)</li>
</ol>
<h2 id="32-프로세스-상태process-states">3.2 프로세스 상태(process states)</h2>
<p>개별 프로세스 행위의 특성은 그 프로세서를 위해 수행되는 일련의 명령어 리스트로 표현
<img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/7f4e44d0-8271-47ad-86be-5eb12938363e/image.png" alt=""></p>
<p><strong>1. trace(궤적)</strong></p>
<ul>
<li>프로세스를 프로세서가 수행할때 처리한 명령어들을 순서대로 나열한 것이다.</li>
<li>예를 들면 각 프로세스마다 적혀진 숫자는 실행했던 명령어 주소들을 나열한 것이다.즉 프로세스가 실행된 궤적을 나타낸다.</li>
<li>멀티 프로그래밍에서 여러 프로세스가 수행되는 과정을 trace를 따라서 살펴보면 다음과 같다. 
<img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/e402cc19-25fd-4515-b74b-8c2249d4da87/image.png" alt="">
멀티프로그래밍을 위한 TimeOut 혹은 I/O Interrupt 마다 프로세스들이 교환되어서 공평하게 여러 작업들이 cpu를 사용하게 된다.즉 독점을 방지한다. </li>
</ul>
<ol>
<li>프로세스 A의 처음 여섯 명령어가 수행되어 Time-Out이 되면 프로세스 B로 제어를 넘기기 위해 디스패처 내의 코드가 수행된다</li>
<li>프로세스 B는 네 개의 명렁을 수행한 후, 입출력을 요청하고 대기한다.</li>
<li>프로세서 B의 수행이 중지되고 디스패처를 통해 프로세스 c로 제어가 이동된다.</li>
<li>C가 시간 만료된 후, 처리기는 다시 프로세스 A로 이동한다.</li>
<li>프로세스 A가 시간 만료 될때, 프로세스 B는 여전히 입출력 연산이 완료되기를 기다리고 있으므로 디스패처는 프로세스 C로 다시 이동한다.</li>
</ol>
<p><strong>2. Dispatcher(디스패처)</strong></p>
<ul>
<li>프로세스를 한 프로세스에서 다른 프로세스로 전환하는 작은 프로그램</li>
</ul>
<h3 id="2-상태two-state-프로세스-모델">2-상태(Two-State) 프로세스 모델</h3>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/00625b31-7346-4178-bc22-084405fd028e/image.png" alt="">
프로세스는 두 상태중 하나이다.</p>
<ol>
<li>Runnig(수행)</li>
<li>Not-Runing(비수행)
운영체제는 새로운 프로세스를 생성할때, 그 프로세스에 대한 프로세스 제어 블록을 생성하고 그 프로세서를 시스템 내에 비수행 상태로 초기화 시킨다. 이제 프로세스는 존재하게 되며 운영체제 에게 알려져 자신이 수행될 기회를 기다린다. </li>
</ol>
<p><strong>큐잉 다이어그램(Queuing Diagram)</strong>
Queue는 수행되지 않는 프로세스가 기다리는 장소로 단일 큐 항목은 특정 프로세서의 프로세스 제어 블록(PCB)를 가리키는 포인터이다. 수행 중인 프로세스가 인터럽트되면 디스패처가 다음에 수행할 프로세스를 큐에서 선택해서 수행을 이어간다.</p>
<h3 id="프로세스의-생성과-종료">프로세스의 생성과 종료</h3>
<p><strong>프로세스 생성(Process creation)</strong></p>
<p>일반적으로 네가지 사건이 발생했을때 프로세스가 생성된다.</p>
<ol>
<li>new batch job(새로운 일괄처리 작업)
운영체제가 새로운 작업을 처리할 준비가 되면, 다음에 수행할 일련의 작업제어 명령을 읽어 들인다.</li>
<li>Interactive Logon(대화영 로그온)
사용자가 터미널에서 시스템에 로그온 한다.</li>
<li>Created by OS to provide a service(서비스를 제공하기 위해 운영체제가 생성)
사용자가 대기 할 필요 없도록, 운영체제는 사용자 프로그램을 대신해 어떤 기능을 수행할 프로세스를 생성할 수있다.</li>
<li>Spawned by existing process(기존 프로세스에 의해 생성)
모듈화를 위해서 병렬성을 활용하기 위해, 사용자 프로그램은 많은 프로세스의 생성을 명령할 수 있다.</li>
</ol>
<p>Process Spawning
운영체제가 어떤 프로세스의 명시적인(explicit)요청에 의해 새로운 프로세스를 생성한다.</p>
<p>하나의 프로세스가 다른 프로세스를 생성할떄 전자를 Parent process 후자를 child process라고 한다. 서로 통신하면서 협력할 필요가 있다. </p>
]]></description>
        </item>
        <item>
            <title><![CDATA[운영체제 2주차-1]]></title>
            <link>https://velog.io/@leeyk_2121_ar/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-2%EC%A3%BC%EC%B0%A8-1</link>
            <guid>https://velog.io/@leeyk_2121_ar/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-2%EC%A3%BC%EC%B0%A8-1</guid>
            <pubDate>Tue, 14 Mar 2023 12:29:58 GMT</pubDate>
            <description><![CDATA[<h2 id="캐시-메모리">캐시 메모리</h2>
<p>캐시 메모리의 존재를 운영체제가 알수 없을지라도, 다른 메모리 관리 하드웨어와 상호작용을 한다. </p>
<h3 id="동기motivation">동기(Motivation)</h3>
<p>프로세서는 명령어 사이클을 도는 동안 반드시 한번은 메모리에 접근한다.</p>
<p>처리기의 명령어 수행 속도는 명령어 사이클 시간에 의해 제약을 받는다. 
이를 해결하기 위해서는 처리기와 메모리 간에 캐시와 같이 용량은 적으나 빠른 메모리를 제공하여 지역성의 원리를 이용해야한다</p>
<h3 id="캐시의-원리">캐시의 원리</h3>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/69ec1bf0-f07b-44e8-880e-6a77e1a04a3a/image.png" alt="">
캐시 메모리의 목적</p>
<ol>
<li>자주 액세스하는 데이터와 명령어를 저장하여 CPU에서 빠르게 검색할 수 있도록 하는 것-&gt;지리적으로 서로 가깝고 자주 사용되는 데이터와 명령어를 메모리에 저장합니다.</li>
<li>비용이 저렴한 대용량의 메모리를 제공</li>
</ol>
<p>위 두가지는 그림(a)와 같다. 주기억 장치가 소용량이지만 속도가 빠른 캐시와 함께 사용된다.
그림(b)는 다단계 캐시 사용을 기술하고 있다. 
L2캐시는 L1캐시보다 느리고 일반적으로 더 크고, L3 캐시는 L2 캐시보다 느리고 더 크다. </p>
<p><strong>캐시 읽기 연산 다이어그램</strong>
<img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/cf33ea8d-753d-4b59-b4b9-11b2a5f385fc/image.png" alt=""></p>
<h3 id="캐시-설계cache-design">캐시 설계(Cache Design)</h3>
<p>6가지로 크게 나뉜다. 
<strong>1. 캐시 크기(Cache size)</strong>
적은 용랴의 캐시가 성능에 큰 영향을 미칠 수 있다.
<strong>2. 블록 크기(Block size)</strong>
캐시와 주기억 장치간에 교환되는 데이터 단위를 블록의 크기 라고 한다.
블록 크기가 커지면 유용한 데이터가 캐시로 이동된다. 하지만 너무 커지면 캐시 적중류이 낮아진다.-&gt; 캐시로 새로 불려 들여온 데이터의 사용확률&lt;데이터의 재사용 확률
<strong>3. 사상 함수(Mapping function)</strong>
새로운 데이터 블록이 캐시로 읽혀질떄, 사상함수는 그 블록이 캐시의 어느 위치에 저장될지를 결정한다.
제약조건</p>
<ol>
<li>하나의 블록을 읽어 들일 떄, 다른 블록이 교체되어야 할 수도 있다. </li>
</ol>
<p>-&gt; 근 미래에 다시 필요한 블록이 교체되는 확률을 최소화
2. 사상함수가 유연할수록, 지정된 블록이 캐시내에 있는지 판단하기 위한 캐시 탐색 회로가 더 복잡해진다. 
<strong>4. 교체 알고리즘(Replacement Algorithm)</strong>
모든 캐시 슬롯이 채워져 있어 새로운 블록을 적재할 슬롯이 없을떄, 사상 함수의 제약조건을 만족하는 범위 내에서 교체할 블록을 선정
LRU(Least-Recently-Used)알고리즘을 이용해 가장 오랫동안 참조되지 않은 블록을 찾아낸다.
<strong>5. 쓰기 정책(Write Policy)</strong>
쓰기 정책은 메모리 쓰기 연산을 언제 수행할지 결정한다. 
블록이 갱실될떄마다 쓰기가 발생할수 있다.
블록이 교체 될떄만 쓰기 정책이 이루어질 수 있는데 
이떄 메모리 쓰기 연산을 최소화 해야하고, 주기억 장치의 자료가 아닌 이미 쓸모없어진 자료를 저장하고 있어 멀티프로세서 연산이나 입출력 모듈에 의한 직접 메모리 접근이 방해발들 수 있다.</p>
<p><strong>6. 캐시 단계 수(number of cache levels)</strong>
다단계 캐시 구조를 뜻한다 위에 거 참조하셈</p>
<h2 id="직접-메모리-접근">직접 메모리 접근</h2>
<p>(번역 왜이래에ㅔㅔ에에)
프로그램 수행 중 I/O 연산 명령어와 만나면 처리기는 며려어를 수행하기 위해 해당 I/O 모듈에 명령을 내린다.
<strong>I/O 연산을 위해 사용 가능한 기법</strong>
프로그램된 입출력(Programmed I/O)
인터럽트 구동 입출력(Interrupt-driven I/O)
직접 메모리 접근(DMA)</p>
<p><strong>프로그램된 입출력(Programmed I/O)</strong>
I/O 모듈이 요청된 행위를 수행하고나서 I/O 상태 레지스터 내의 관련 비트를 설정할 뿐 , 프로세서에 대해 인터럽트를 포함한 더 이상의 어떤 처리도 행하지 않는다.
-&gt; 프로세서는 명령이 완료되었다고 판단할 떄까지 I/O 모듈의 상태를 주기적으로 점검한다. 
프로그래밍된 I/O로 인해 전체 시스템의 성능 수준이 크게 저하된다.</p>
<p><strong>인터럽트 구동 입출력(Interrupt-Driven I/O)</strong>
위 프로그램된 입출력의 문제인 성능 수준으로 인해 생긴 대안이다.
1.프로세서가 모듈에게 I/O 명령을 보낸 후 자신은 계속 다른 작업을 수행한다.
2.I/O 모듈이 프로세서와 데이터를 교환할 준비가 되면 프로세서를 중단하여 서비스를 요청한다.
3. 프로세서는 데이터 전송을 실행한 다음 이전 처리를 다시 시작한다.
프로그래밍 된 I/O보다 효율적이지만 메모리와 I/O 모듈 간에 데이터를 전송하려면 프로세서의 적극적인 개입이 필요하다.</p>
<p>I/O 형태는 두가지 문제를 가진다.</p>
<ol>
<li>I/O 전송률은 프로세서가 장치를 점검하고 서비스하는 속도에 제한을 받는다.</li>
<li>프로세서가 I/O 전송을 할 떄마다 많은 명령어들이 수행되어야 한다. </li>
</ol>
<p><strong>DMA(Direct Memory Access)</strong></p>
<ul>
<li>시스템 버스에서 별도의 모듈에 의해 수행되거나 I/O 모듈에 통합된다.
보통 대량의 데이터가 이동될때 사용된다.
프로세서가 한 블록의 데이터를 읽거나 쓰려 할떄, 다음과 같은 정보를 보내 DMA 모듈에 입출력을 명령한다.
. 읽기 요청인지 쓰기 요청인지 여부
. 관련 I/O 장치의 주소
. 읽거나 쓸 메모리 내의 시작 위치
. 읽거나 쓸 워드의 개수
즉 입출력 장치가 많이 느리니 CPU 방해말고 바로 버스 통해서 메모리랑 연결하는 기능이다. 그래서 인터럽트 구동 또는 프로그래밍된 I/O보다 효율성이 좋다.</li>
</ul>
<h2 id="멀티프로세서와-멀터코어-구조">멀티프로세서와 멀터코어 구조</h2>
<p>찹 하나에 프로세서(Core)를 여러개 달아(병렬성구조) 성능을 향상 시키는데 그 방법으로는 
대칭형 프로세서(Symmetric Multiprocessors,SMP)
멀티코어 컴퓨터, 클러스트 등 이 있다.</p>
<h3 id="대칭형-프로세서symmetric-multiprocessorssmp">대칭형 프로세서(Symmetric Multiprocessors,SMP)</h3>
<p>컴퓨터 하드웨어 구조나, 그 구조를 활용하는 운영체제의 행동양식이다.
특징</p>
<ol>
<li>두 개 이상의 유사한 수행 능력을 갖는 프로세서로 구성</li>
<li>이들 프로세서는 버스나 다른 내부 연결 방식에 의해 상효 연결된, 주기억장치와 I/O 장치를 고유한다. 따라서 각 프로세서들이 메모리에 접근하는 시간은 거의 동일하다.</li>
<li>동일한 장치에 이르는 경로들을 제공하는 채널이 동일하거나 달라도 모든 프로세서는 I/O 장치 접근을 공유하다.</li>
<li>모든 처리기는 동일한 기능을 수행할 수 있다. </li>
<li>시스템은 프로세서들과 작업, 태스크 , 파일 그리고 데이터 요소 수준에서 프로그램들 간의 상호작용을 제공하는 하나의 통합된 운영체제에 의해 제어된다.
장점
Performace(성능): 작업의 일부가 병렬로 처리될 수 있다면, 여러 개의 처리기로 구성된 시스템은 동일한 타입의 단일 처리기로 구성된 시스템에 비해 많은 성능 향상이 가능하다. 
Availability(가용성): 하나가 고장나더라도 시스템은 다소 성능이 떨어진 상태에서 지속적으로 수행할 수 있다.
Incremental Growth(점진적 확장): 사용자느 성능 향상을 위해 필요할 떄마다 처리기를 추가로 설치 할 수 있다.
Scaling(크기조정): 벤더들은 시스템을 구성하는 처리기의 숭 ㅔ따라 가겨과 성능이 다른 다양한 제품을 공급할 수 있다. </li>
</ol>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/d4b92ff9-3b2f-418e-9d8b-377f51ed5d5a/image.png" alt=""></p>
<h3 id="멀티코어-컴퓨터multicore-computer">멀티코어 컴퓨터(Multicore Computer)</h3>
<p>chip multiprocessor라고 알려져있다.
다이라 불리는 하나의 실리콘 조각에 두개 이상의 프로세서(core)가 결합되어 있고 각 코어는 독립된 프로세스의 모든 구성요소로 구성된다. 또한 멀티코어 칩에는 L2캐시와 경우에 따라 L3 캐시도 포함된다.
<img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/c7577482-1dfa-4901-b57b-e47edf8542fd/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[운영체제 1주차-2]]></title>
            <link>https://velog.io/@leeyk_2121_ar/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-1%EC%A3%BC%EC%B0%A8-2</link>
            <guid>https://velog.io/@leeyk_2121_ar/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-1%EC%A3%BC%EC%B0%A8-2</guid>
            <pubDate>Sat, 11 Mar 2023 09:06:18 GMT</pubDate>
            <description><![CDATA[<h3 id="interrupts">Interrupts</h3>
<p>인터럽트는 프로세서의 정상적인 순차적 실행흐름을 중단시킨다. 컴퓨터에서 인터럽트는 외부 또는 내부적인 이벤트로 인해 CPU의 실행 흐름을 일시적으로 중단하고, 다른 작업을 수행하는 기능을 한다.</p>
<p>인터럽트는 CPU가 실행 중인 프로긂을 일시적으로 중단하고, 인터럽트 서비스 루틴이라는 특수한 프로그램을 실행하여 해당 이벤트를 처리한다. 예를 들어, 외부에서 들어오는 인터럽트는 키보드 입력, 마우스 클릭, 네트워크 패킷 수신 등의이벤트로 인해 발생할 수도 있다. 내부적으로 발생하는 인터럽트는 잘못된 메모리 참조,디비전 오류 등의 이벤트로 인해 발생할 수 있다.</p>
<p>인터럽트는 PCU의 정상적인 실행흐름을 방해하고, 중요한 작업을 수행할 수 있도록 하느 중요한 기능으로 인터럽트 발생시 CPU는 현재 실행중인 작업을 저장하고 인터럽트 처리를 위한 작업을 수행한다. 인터럽트 서비스 루틴이 완료된면, CPU는 이전의 작업을 다시 재개하고 실행을 계속한다.</p>
<h3 id="인터럽트의-분류">인터럽트의 분류</h3>
<p>크게 하드웨어 인터럽트와 소프트웨어 인터럽트로 분류된다.</p>
<p><strong>1. 하드웨어 인터럽트</strong>
하드웨어 인터럽트는 외부에서 발생하는 이벤트로 인해 발생한다. 주로 입출력 장치나 타이머 등의 하드웨어가 발생시키며, CPU에게 해당 이벤트가 발생했음을 알리는 신호를 보낸다. 대표적인 하드웨어 인터럽트로는 입출력 인터럽트, 타이머 인터럽트, 예외 인터럽트가 있다.</p>
<p><strong>Timer 인터럽트</strong>
하드웨어 인터럽트의 한 종류로, 시스템 내부의 타이머가 만료되어 발생하는 인터럽트 이다.</p>
<p>타이머 인터럽트는 운영체제가 프로그램을 실행하는 동안 일정한 시간 간격으로 발생하며, 이를 이용해 운영체제는 다양한 작업을 수행한다. 예를 들어, 운영체제는 타이머 인터럽트를 이용해 스케줄링, 프로세스 전환, 입출력 처리 등을 수행한다.</p>
<p>타이머 인터럽트가 발생하면 CPU는 현재 실행중인 작업을 중단하고, 타이머 인터럽트를 처리하는 루틴을 실행한다. 이 루틴은 운영체제 내부에서 구현되며 , 필요한 작업을 수행한 후 , 이전의 작업을 다시 재개하고 실행을 계속한다. </p>
<p>타이머 인터럽트는 일반적으로 운영체제가 타이머를 설정하고, 인터럽트를 처리하기 위한루틴을 등록하는 방식으로 구현된다. 이 떄, 타이머 인터럽트의 주기는 운영체제가 지정하는 값에 따라 결정되며, 주기가 짧을 수록 더 자주 발생한다.</p>
<p><strong>I/O 인터럽트</strong>
하드웨어 인터럽트의 한 종류로, 입추력 장치에서 데이터 전송이 완료되거나 오류가 발생했을때 발생하는 인터럽트이다.
입출력 인터럽트는 운영체제가 입출력 작업을 수행하는 동안 발생하며, 이를 이용해 운영체제는 입출력 작업을 비동기적으로 처리할 수 있다. 예를 들어, 운영체제는 파일을 읽거나 쓸 때, 데이터 전송이 완료될때까지 기다리지 않고 다른 작업을 수행할 수 있다.
입출력 인터럽트가 발생하면 CPU는 현재 실행중인 작업을 중단하고, 해당 인터럽트를 처리하는 루틴을 실행한다. 이 루틴은 입출력 작업이 완료될때까지 대기하거나 , 오류 발생시 조치를 취한다. 처리가 완료되면 CPU는 이전의 작업을 다시 재개하고 실행을 계속한다.</p>
<p><strong>하드웨어 장애 인터럽트(Hardware Failure Interrupt)</strong>
하드웨어 장치에서 오류가 발생하며 처리할 수 없는 상황이 되었을 때 발생하는 인터럽트이다.</p>
<p>하드웨어 장애 인터럽트는 주로 시스템 또는 하드웨어에서 발생하는 묹로 인해 발생된다. 이러한 문제는 예측할 수 없고, 시스템이 정상적으로 작동하지 않는 상황을 초래할 수 있다.</p>
<p>하드웨어 장애 인터럽트 발생시, 시스템은 해당 장치를 사용할 수 없게 된다. 이떄 운영체제는 장애를 처리하고, 문제를 해결하기 위해 적절한 조치를 취해야한다. 예를 들어, 장애가 발생한 하드웨어를 교체하거나, 장애가 있는 부분을 수정할 수 있다.</p>
<p>하드웨어장애 인터럽트는 예측할 수 없는 상황으로 인핸 발생하기 때문에, 운영체제에서는 이를 처리하기 위한 루틴을 사전에 구현하고, 대처바안을 마련해야 한다. 이를 통해 시스템이 장애 발생시에도 안정적으로 작동할 수 있도록 할 수 있다.</p>
<p><strong>2. 소프트웨어 인터럽트</strong>
소프트웨어 인터럽트는 프로그램 내부에서 명령어에 의해 발생하는 이벤트로 인해 발생한다. 소프트웨어 인터럽트는 시스템 콜(System Call)이나 예외 상황 등에서 발생 할 수 있다. 예를 들어 시스템 콜은 운영체제의 기능을 호출하는데 , 이떄 CPU는 해당 기능을 실행하기 위해 소프트웨어 인터럽트를 발생시킨다.</p>
<p><strong>프로그램 인터럽트</strong>
소프트웨어 인터럽트의 한 종류로, CPU가 현재 실행 중인 프로그램 내부에서 명령어에 의해 발생하는 인터럽트이다. </p>
<p>주로 시스템 콜이나 예외상황에서 발생한다. 시스템 콜은 운영체제의 기능을 호출하는데, 이 때 CPU는 해당 기능을 실행하기 위해 인터럽트를 발생시킨다. 예외 상황은 잘못된 명령어 실행, 메모리 오류 등의 상황에서 발생할 수 있다.</p>
<p>프로그램 인터럽트가 발생하면 CPU는 현재 실행 중인 프로그램을 일시적으로 중단하고, 해당 인터럽트를 처리하는 루틴을 실행한다. 인터럽트 루틴이 실행되면서, 시스템콜이나 예외 상황에 대한 처리가 이루어지며, 처리가 완료 되면 cpu는 이전의 작업을 다시 재개하고 실행을 계속한다.</p>
<p>입출력 인터럽트는 대부분 하드웨어에서 자동으로 처리되지만, 운영체제에서는 이를 처리하기 위한 루틴을 제공해야 합니다. 이 때, 운영체제는 입출력 장치와의 통신을 담당하는 드라이버(Driver)를 이용해 입출력 작업을 수행하고, 인터럽트를 처리합니다</p>
<p><strong>3. 외부 인터럽트와 내부 인터럽트</strong>
인터럽트는 발생한 위치에 따라 외부 인터럽트와 내부 인터럽트로 구분된다. 외부 인터럽트는 주로 하드웨어나 다른 장치로부터 발생하는 인터럽트를 의미한다. 내부 인터럽트는 주로 프로그램 내부에서 발생하는 인터럽트르 의미한다. 대표적인 내부 인터럽트로는 예외상황(잘못된 명령어 실행, 메모리 오류 등)이나 피지컬트랩 등이 있다.</p>
<h3 id="인터럽트와-명령어-사이클">인터럽트와 명령어 사이클</h3>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/ab198223-e6d3-493e-822e-9949762b419d/image.png" alt=""></p>
<p>인터럽트를 사용할 경우, 입출력 연산이 진행되는 동안 처리기는 다른 명령어를 수행할 수 있다. </p>
<h3 id="인터럽트-처리-단계">인터럽트 처리 단계</h3>
<p><strong>하드웨어</strong></p>
<ol>
<li>장치 제어기나 다른 시스템 하드웨어가 인터럽트를 발생시킴</li>
<li>처리기가 현재 명령어의 실행을 완료</li>
<li>처리기가 인터럽트 확인 신호를 보냄</li>
<li>처리기가 PSW와 PC를 제어 스택에 저장함</li>
<li>처리기는 인터럽트에 해당하는 새로운 PC값을 적재함<blockquote>
<p>psw란 &quot;Program Status Word&quot;의 약자로 CPU의 상태를 나타내는 레지스터이다.프로세서의 현재 상태를 나타내는 플래그와 함께, 현재 실행 중인 명령어의 실행 결과, 오류 및 예외 처리 상태, 인터럽트 처리 상태 등의 정보를 포함한다.</p>
</blockquote>
</li>
</ol>
<p><strong>소프트웨어</strong>
6. 프로세서의 나머지 상태 정보를 저장
7. 인터럽트 처리
8. 프로세스의 상태 정보를 복구
9. 이전 PSW와 PC를 복구</p>
<h3 id="multiple-interrupts-중첩-인터럽트">Multiple Interrupts (중첩 인터럽트)</h3>
<p>(암만봐도 다중 인터럽트 같은데..왜 중첩이라 번역했을까..)
인터럽트가 처리되는 동안 하나 이상의 인터럽트가 발생하는 것이 Multiple Interrups이다. 
처리방법</p>
<ol>
<li>하나의 인터럽트를 처리하는 동안 다른 인터럽트를 금지시키는 것</li>
<li>인터럽트간의 우선순위를 정하고 높은 우선순위 인터럽트가 낮은 우선순위 이너럽트를 인터럽트할 수 있도록 허용하는 것</li>
</ol>
<h3 id="memory-hierarchy-메모리-계층-구조">Memory Hierarchy (메모리 계층 구조)</h3>
<p><strong>메모리 관련 세가지 주요 특성</strong>
용량, 접근 속도 그리고 비용</p>
<p>접근 시간이 짧을 수록 비트당 비용이 높아짐
용량이 클수록 비트당 비용이 낮아짐
용량이 클수록 접근 시간이 길어짐</p>
<p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/82dbae45-2b55-4a53-b341-5b57291eb811/image.png" alt=""></p>
<p>위와 같은 구조의 경우 아래 쪽으로 내려 갈 수록 다음이 성립한다.
ㄱ. 비트당 비용 감소
ㄴ. 용량 증가
ㄷ. 접근시간 증가
ㄹ. 처리기에 의한 메모리 접근 속도 감소 &lt;일반적으로 항상 성립&gt;</p>
<p><strong>Performace of a simple Tow-Level Memory</strong>
<img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/abe37fea-f7b6-4dcf-9079-7421494ec166/image.png" alt=""></p>
<p><strong>Hit Rtatio</strong></p>
<p>캐시 적중률이라고도 하는 적중률로 요청된 항목이 캐시에서 발견된 횟수의 비율을 결정하여 캐싱 시스템의 성능을 측정하는 데 사용되는 메트릭이다.</p>
<p>캐시 히트 횟수를 총 요청 횟수로 나누어 계산합니다.</p>
<p>적중률이 높으면 캐싱 시스템이 효과적이며 캐시에서 많은 요청을 처리할 수 있어 응답 시간이 빨라지고 백엔드 시스템의 부하가 줄어든다는 것을 의미합니다.</p>
<p>&lt;처리기가 두 단계의 메모리에 접근할 수 있다는 가정&gt;</p>
<p>T1: 단계 1에 접근하는 시간
T2: 단계 2에 접근하는 시간</p>
<p>위 그림과 같이, 단계 1에 접근비율이 높아질수록 평균 총 접근시간은 단계 2보다 단계 1의 접근시간에 훨씬 가까워진다. </p>
<p>Two-level Memory를 사용한 전락이 ㄱ~ㄹ조건이 성립할 떄만 원칙적으로 효과를 발휘</p>
<p><strong>Locality of reference(참조 지역성)</strong>
ㄹ이 항상 성립하는 근거로 참조 지역성의 원리이다.
프로그램이 수행되는 동안,프로세서의 메모리 참조가 인근 지역으로 몰리는 경향이 있다. 하위 단계에 대한 접근 비율이 바로 윗 단계보다 낮아지도 하기 위해 데이터가 구성된다.
위 원리는 레지스터,캐시, 주기억장치와 같은 메모리들은 보통 휘발성 이며 반도체 기술을 이용한 것들이다. 세 단계를 사용한 것은 반도체 메모리를 속도와 가격에 따라 다양한형태로 만들 수 있다는 사실을 기반으로 한것이다. </p>
<p><strong>보조기억장치</strong>
비휘발성 외부 메모리로는 보조기억장치(secondary memory or auxiliary memory)라고도 불린다.
특징
외부에 있고, 비휘발성이며, 프로그램과 데이터 파일을 저장하기 위해 사용된다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[운영체제 1주차-1]]></title>
            <link>https://velog.io/@leeyk_2121_ar/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-1%EC%A3%BC%EC%B0%A8</link>
            <guid>https://velog.io/@leeyk_2121_ar/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-1%EC%A3%BC%EC%B0%A8</guid>
            <pubDate>Sat, 11 Mar 2023 08:27:10 GMT</pubDate>
            <description><![CDATA[<h3 id="operating-system">Operating System</h3>
<ol>
<li>하나 이상의 프로세서의 하드웨어를 활용한다.</li>
<li>시스템 사용자들에게 서비스를 제공</li>
<li>여분의 메모리나 I/O 장치를 관리한다.</li>
</ol>
<h4 id="basic-elements">Basic Elements</h4>
<p>processor, main memory, I/O moudles, System Bus</p>
<h4 id="processor">Processor</h4>
<ol>
<li>컴퓨터의 작동을 제어한다.</li>
<li>데이터 처리 기능을 수행한다.</li>
<li>CPU(중앙 처리 장치,Central Processing Unit)이라고도 한다.</li>
</ol>
<h4 id="main-memory">Main Memory</h4>
<ol>
<li>휘발성이 있다.</li>
<li>컴퓨터가 종료되면 메모리 내용이 사라진다.</li>
<li>Real Memory or Primary memory라고도 한다.</li>
</ol>
<h4 id="io-modules">I/O Modules</h4>
<p>컴퓨터와 외부 환경사이에서 데이터가 다음과 같은 상황에서 움직인다.</p>
<ol>
<li>Storage(스토리지) EX) 하드드라이브,ssd</li>
<li>통신장비(Communications Equipment)</li>
<li>터미널</li>
</ol>
<p>-&gt; 컴퓨터 명령 후 메인메모리로 외부 입력들을 옮겨 오도록 한다.</p>
<h4 id="system-bus">System Bus</h4>
<p>위 세가지 요소를 연결하는 통로이다.</p>
<h2 id="top-level-view">Top-Level View</h2>
<p><strong>PC</strong>: 다음 실행할 명령어의 주소를 가지고 있는 레지스터로, CPU가 현재 어디까지 실행을 완료하였고, 다음으로 실행해야 할 명령어가 무엇인지를 저장한다.
<strong>IR</strong>: 현재 실행 중인 명령어를 저장하는 레지스터로, 메모리에서 읽어온 명령어가 저장되어 있으며,CPU가 이를 시랭하는 동안 분석하고 해독한다.
<strong>MAR</strong>: 메모리에서 데이터를 읽거나 쓸 주소를 저장하는 레지스터로, CPU가 메모리에서 데이터를 읽거나 쓰려명 해당 데이터가 저장된 주로를 알야아하는데 MAR은 이러한 주소를 저장한다.
<strong>MBR</strong>: 메모리에서 읽은 데이터나 쓰려는 데이터를 저장하는 레지스터로, CPU가 데이터를 읽거나 쓸때의 데이터가 MBR에 저장된다.
<strong>I/O AR</strong>: 입출력 장치와 통신하기 위해 사용되는 레지스터로, CPU가 입출력 장치에서 어떤 작업을 요청하기 위해 해당 장치의 주소를 I/O AR에 저장한다.
<strong>I/O BR</strong>: 입출력 장치와 데이터를 주고받기위해 사용되는 레지스터로,CPU와 입출력 장치 간의 데이터를 I/O BR에 저장한다.</p>
<ul>
<li>레지스터 : CPU가 내부에서 매우 빠르게 액세스하며 중간 결과나 작업에 필요한 데이터를 저장하는데 사용된다.</li>
<li>메모리 : 프로그램 및 데이터를 저장하는데 사용된다.</li>
</ul>
<h3 id="레지스터와-메모리의-차이점">레지스터와 메모리의 차이점</h3>
<p> 레지스터는 CPU 내부에 존재하며 매우 빠른 속도로 액세스할 수 있으나 메모리는 CPU와 더 멀리 떨어져 있어 상대적으로 느린 속도로 액세스 된다.  또한 레지스터는 CPU 내부에만 존재하며 상대적으로 작은 용량을 가지고 있으나 메모리는 CPU 외부에 존재하며 대용량 데이터를 저장할 수 있다. 가격 면에서 레지스터가 비싸고 메모리는 저렴하다. 레지스터는 직접 액세스가 가능하며 CPU에서 직접 참조하며 사용되지만 메모리는 주소를 통해서 갑적적으로 액세스한다.</p>
<h4 id="microprocessor">Microprocessor</h4>
<ol>
<li>휴대폰에 쓰이는 부품</li>
<li>단일칩 프로세서이자 가장 빠른 프로세서</li>
<li>멜터프로세서</li>
<li>각 칩(소켓)은 멀티코어를 가지고 있다.</li>
</ol>
<h4 id="graphics-processing-unitgpu">Graphics Processing Unit(GPU)</h4>
<ol>
<li>Single-Instruction-Multiple Data 기술을 사용하여 데이터 어레이에 효율적인 계산을 제공한다.</li>
<li>수치해석을 이용한다.</li>
<li>레이캐스팅에 적용되며 대규모 스프레드시트를 계산한다.</li>
</ol>
<h4 id="digatal-signal-processors-dsps">Digatal Signal Processors (DSPs)</h4>
<ol>
<li>오디오와 비디오 같은 스트리밍 시그널들을 다룬다.</li>
<li>모뎀과 같은 장치에 내장되어 사용된다.</li>
<li>인코딩/디코딩(음성 및 비디오)</li>
<li>보안 및 암호화를 지원</li>
</ol>
<h4 id="system-on-a-chip-soc">System on a chip (SoC)</h4>
<ol>
<li>휴대용 장치의 요구사항을 충족시키기 위해, 마이크로프로세서가 SoC에 정보를 준다.</li>
<li>DSPs,GPUs,코덱,메인메모리 그리고 CPU와 같은 구성요소가 SoC 위에 있다.</li>
</ol>
<h4 id="instruction-execution">Instruction Execution</h4>
<ol>
<li>프로그램은 메모리에 저장된 이련의 명령으로 구성된다.
1단계: 프로세서가 메모리로부터 지시사항을 읽는다.
2단계: 프로세서가 각각의 지시사항을 수행한다.</li>
</ol>
<h4 id="fetch-stage">Fetch Stage</h4>
<p>명령어를 메모리에서 읽어오는 단계로 컴퓨터의 명령어 실행 사이클 중 첫 번째 단계이며, CPU가 다음으로 실행할 명령어의 위치를 결정하고 해당 명령어를 메모리에서 읽어온다.</p>
<ol>
<li>CPU는 Program Counter(PC) 레지스터에서 다음 실행할 명령어의 주소를 가져온다.</li>
<li>CPU는 MAR레지스터에 PC 레지스터에서 가져온 명령어의 주소를 저장한다.</li>
<li>CPU는 메모리에서 해당 주소에 있는 명령어를 MBR 레지스터로 읽어온다.</li>
<li>CPU는 MBR 레지스터에서 읽어온 명령어를 IR 레지스터에 저자안다.</li>
<li>마지막으로, CPU는 다음 실행 사이클을 위해 PC 레지스터를 업데이트한다(증분한다). 일반적으로, PC 레지스터는 현재 실행한 명령어의 크기만큼 증가한다.</li>
</ol>
<p>fetch stage는 CPU의 성능을 결정하는 데 중요한 역할을 합니다. 명령어를 메모리에서 가져오는 데 소요되는 시간이 CPU 성능에 직접적으로 영향을 미치기 때문입니다. 따라서, fetch stage는 최적화가 필요한 중요한 단계입니다.</p>
<h4 id="execute-stage">Execute Stage</h4>
<p>CPU가 명령어를 실행하는 단계를 의미한다. Execute Stage는 CPU의 명령어 실행 사이클 중 두 번째 단계이며, Fetch Stage에서 가져온 명령어를 분석하고 해당 명령어에 따라 작업을 수행한다.</p>
<p>Execute Stage는 명려어의 유형에 따라 다양한 방식으로 동작할 수 있다. 예를 들어 , 산술 연산을 수행하는 경우 ALU를 사용하여 두 개의 데이터를 계산하고 결과를 레지스터에 저장한다. 또는 데이터를 메모리에 저장하거나 메모리에서 읽어올 수도 있다. 조건분기나 루프 처리를 수행하는 경우에는 CPU가 해당 명령어에 따라 PC 값을 변경하여 실행 흐름을 제어한다. </p>
<p>Execute Stage에서 수행되는 작업은 CPU의 구조와 명령어 세트에 따라 다르다. 명령어의 복잡도와 CPU의 성능에 따라 속도는 상이할 수 있으며 실행시간이 가장 긴 단계중 하나로 성능 최적화를 위해서는 Execute Stage를 잘 최적화해야 합니다.</p>
<h4 id="example-of-progame-execution">Example of Progame Execution</h4>
<p><strong>Step 1</strong>
PC 레지스터에 300이라는 숫자가 있는데 이는 메모리 주소를 의미한다. 메모리에 300번 주소에 있는 1940 명령어를 읽어와 IR에 로드한다.
<strong>Step 2</strong>
이때 1940에서 first 4 bits, 즉 1이 partial list of opcodes 0001명령어를 수행하여 940 주소에있는 0003을 AC에 로드한다.(1이 코드 940은 주소)
이후 PC는 증분된다.
<strong>Step 3</strong>
증분된 301이라는 메모리 주소에서 5941 명령어를 읽어와 IR에 로드한다.
<strong>Step 4</strong>
5941에서 5를 이진수로 고치면 partial list of opcodes 0101로 941주소인 메모리에 있는 0002를 AC에 더한다.그래서 0005가 되며 이후 PC는 증분된다.
<strong>Step5</strong>
증분된 302라는 메모리 주소에서 2941 명령어를 읽어와 IR에 로드한다.
<strong>Step6</strong>
2941에서 2를 이진수로 고치면 partial list of opcodes0010으로 941주소인 메모리에 0005가 저장된AC 값을 941에 저장한다.</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[C언어 자료형(data type)]]></title>
            <link>https://velog.io/@leeyk_2121_ar/C%EC%96%B8%EC%96%B4-%EC%9E%90%EB%A3%8C%ED%98%95data-type</link>
            <guid>https://velog.io/@leeyk_2121_ar/C%EC%96%B8%EC%96%B4-%EC%9E%90%EB%A3%8C%ED%98%95data-type</guid>
            <pubDate>Thu, 26 Jan 2023 09:40:34 GMT</pubDate>
            <description><![CDATA[<h3 id="자료형data-type">자료형(Data type)</h3>
<p>일단 c언어에서의 자료형은 다양하다.</p>
<p><strong>Primitive형(원시 자료형)</strong>
char, int, float, double, void</p>
<p><strong>Derivied형(파생자료형)</strong>
Arrary,Pointer,Function</p>
<p><strong>User defined(사용자 정의 자료형)</strong>
enum,Structure, Union</p>
<blockquote>
<p>c언어에서는 따로 문자열을 저장하는 string 자료형이 없고 char 자료형만을 사용하기에 문자열 표현시 char 자료형을 연속적으로 사용해야함.</p>
</blockquote>
<p>연습 코드</p>
<pre><code>#include&lt;stdio.h&gt;
#define MONTHS 12 //상수에 대한 정의 1년12개월

int main(void)
{
    //연봉구하기
    double monthSalary = 1000.5; 
    printf(&quot;$ %.2f \n&quot;,monthSalary*MONTHS); //c언어 상수사용방법


    //char형 배우기
    char x = &#39;A&#39;; //char형은 내부적으로 숫자로 구성되어 있다.
    char x1 = 65; //A에 대한 아스키 코드 값이 65이다.
    printf(&quot;%c \n&quot;,x);
    printf(&quot;%d&quot;,x1);

    //int형 배우기
    int y = 100;
    printf(&quot;10진수 출력: %d\n&quot;,y); 
    printf(&quot;8진수 출력 : %o\n&quot;,y);
    printf(&quot;16진수 출력 : %x \n&quot;,y);
    return 0;
}</code></pre><p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/3fbb66fe-8d5a-43fc-9a6b-e8164774a7bd/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[C언어-변수와 상수]]></title>
            <link>https://velog.io/@leeyk_2121_ar/C%EC%96%B8%EC%96%B4-%EB%B3%80%EC%88%98%EC%99%80-%EC%83%81%EC%88%98</link>
            <guid>https://velog.io/@leeyk_2121_ar/C%EC%96%B8%EC%96%B4-%EB%B3%80%EC%88%98%EC%99%80-%EC%83%81%EC%88%98</guid>
            <pubDate>Thu, 26 Jan 2023 09:25:48 GMT</pubDate>
            <description><![CDATA[<h3 id="변수variables">변수(Variables)</h3>
<p>프로그램이 실행되는 동안에 언제든지 저장된 값이 변경될 수 있는 공간</p>
<h3 id="상수constants">상수(Constants)</h3>
<p>한 번 정해지면 값을 변경할 필요가 없는 데이터</p>
<h3 id="선언">선언</h3>
<p>int a;
a=10;</p>
<p>a라는 이름의 변수는 int 형이다. 이때, int는 정수형이다.
a는 10이라는 상수 값을 갖는다.</p>
<h3 id="sizeof변수">sizeof(변수);</h3>
<p>C언어가 제공하는 함수로 변수의 메모리 크기를 알려주는 함수이다.</p>
<pre><code>#include &lt;stdio.h&gt;
#include &lt;limits.h&gt; // 하나의 라이브러리로 변수들의 한계값을 포함하는 라이브러리이다.

int main(void)
{
int a;
a=10;
printf(&quot;변수 a의 메모리 크기는 %d입니다.\n&quot;, sizeof(a));

int b =10;
float c= 12345645648.123456; //실수표현 4byte에 해당하는 범위밖에 출력을 못한다.
double d= 123456789.123456789; //float의 범위보다 더 큰 범위를 갖는다.
printf(&quot;b=%d\n&quot;,b);
printf(&quot;c=%.2f\n&quot;,c);
printf(&quot;d=%.2f\n&quot;,d);

int e = INT_MAX; //limits.h 라이브러리가 필요하다.
printf(&quot;int 형의 최대값 x는 %d 입니다. \n&quot;, e);
printf(&quot;e+1은 %d이다. \n&quot;,e+1); //오버플로우 발생

//기본연산
int x= 10;
int y= 40;
printf(&quot;x=%d 입니다.\n&quot;,x);
printf(&quot;y=%d 입니다.\n&quot;,y);
printf(&quot;x+y=%d 입니다.\n&quot;,x+y);
printf(&quot;x-y=%d 입니다.\n&quot;,x-y);
printf(&quot;x/y=%d 입니다.\n&quot;,x/y); //몫만 남는다.
printf(&quot;x*y=%d 입니다.\n&quot;,x*y);

return 0;

}
</code></pre><p><img src="https://velog.velcdn.com/images/leeyk_2121_ar/post/ce5c4798-2534-4bf3-b006-e1f454383fba/image.png" alt=""></p>
]]></description>
        </item>
    </channel>
</rss>