<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>개발 창고</title>
    <link>https://eunbae11.tistory.com/</link>
    <description>프론트엔드 개발자를 꿈꾸는 대학생입니다!</description>
    <language>ko</language>
    <pubDate>Fri, 3 Jul 2026 06:26:28 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Eunbae</managingEditor>
    <image>
      <title>개발 창고</title>
      <url>https://tistory1.daumcdn.net/tistory/5006588/attach/a70f38aae5f3435a878bc5e8ca9a4ee0</url>
      <link>https://eunbae11.tistory.com</link>
    </image>
    <item>
      <title>HTTP와 HTTPS의 차이점</title>
      <link>https://eunbae11.tistory.com/entry/HTTP%EC%99%80-HTTPS%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTTP는 무엇일까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;HTTP&lt;/b&gt;는 Hyper Text Transfer Protocol의 약자로, 인터넷 상에서 데이터(Hyper Text)를 주고 받기 위해서(Transfer) 서버/클라이언트 모델을 따르는 프로토콜입니다. 주로 웹 브라우저와 웹 서버간의 커뮤니케이션을 위해서 디자인 되었으며 ??&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;HTTP는 주로 TCP를 사용하고, 2020년부터 도입된 HTTP/3에서는 UDP를 사용합니다. 또한 기본 포트로 80번을 사용한다는 특징이 있습니다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;서버/클라이언트 모델: 클라이언트가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;요청을 생성&lt;/b&gt;하기 위한 연결을 연다음&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;응답을 받을때 까지 대기&lt;/b&gt;하는 전통적인 방식&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;프로토콜: 컴퓨터 내부 또는 컴퓨터 사이에서 데이터의 교환 방식을 정의하는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;규칙 체계&lt;br /&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTTP의 문제점&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;HTTP 서버는 기본 80번 포트에서 서비스를 대기하고 있으며, 만약 웹 브라우저가 80번 포트를 연결하여 데이터를 요청하면 서버는 요청에 해당하는 데이터(Hyper Text)를 전송하면서 응답하게 됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;이 과정에서 누군가가 네트워크 신호를 가로채는 경우, 데이터는 외부에 그대로 노출되어&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;데이터가 도난당할 수 있다&lt;/b&gt;는 문제점이 존재합니다. 이러한 보안 취약점을 해결하기 위해 HTTPS가 등장하였습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;HTTPS!&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp; &amp;nbsp;HTTPS&lt;/b&gt;는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;HTTP&lt;/b&gt;에서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;S&lt;/b&gt;ecure socket layer, 즉 데이터 전송 과정에서 보안이 추가된 프로토콜입니다. 데이터 전송시 텍스트를 사용하는 대신, SSL이나 TLS 프로토콜을 통해 세션 데이터를 암호화하기 때문에 데이터의 보호를 보장합니다. 그리고 HTTP와는 다르게 기본 포트로 443번을 사용한다는 특징이 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;따라서 HTTPS를 사용하면 클라이언트가&amp;nbsp;&lt;span style=&quot;background-color: #ffffff; color: #1b1b1b;&quot;&gt;금융 활동 이나 온라인 쇼핑을 할 때 민감한 개인 정보를 서버와 안전하게 주고 받을 수 있게 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;SSL? TLS? : SSL(Secure Sockets Layer), TSL(Transport Layer Security)는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;네트워크에 통신 보안을 제공&lt;/b&gt;하기 위해 설계된&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;암호 규약&lt;/b&gt;입니다. 이때 TLS는 SSL이 표준화되면서 바뀐 이름입니다. 따라서 TLS안에 SSL이 있다 할 수 있습니다.&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;그렇다면 HTTPS에서 보안이 어떤 방식으로 동작할까?&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-07-20 오후 3.35.49.png&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;232&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c9ZjZv/btrKXHueVbh/fSWODk2ZANYpgjNz7eXkE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c9ZjZv/btrKXHueVbh/fSWODk2ZANYpgjNz7eXkE0/img.png&quot; data-alt=&quot;브라우저에서 https를 사용하는 사이트일 경우 보안 연결이 사용되었다는 문구를 볼 수 있습니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c9ZjZv/btrKXHueVbh/fSWODk2ZANYpgjNz7eXkE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc9ZjZv%2FbtrKXHueVbh%2FfSWODk2ZANYpgjNz7eXkE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;587&quot; height=&quot;216&quot; data-filename=&quot;스크린샷 2022-07-20 오후 3.35.49.png&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;232&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;브라우저에서 https를 사용하는 사이트일 경우 보안 연결이 사용되었다는 문구를 볼 수 있습니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;HTTPS는 SSL 암호화 통신, 즉 공개키 암호화 방식의 알고리즘을 통해 보안을 구현합니다. 그렇다면 공개키 암호화 방식에 대해서 알아보겠습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;공캐키 암호화 방식&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Public_key_encryption.svg&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;513&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baLubG/btrLadUQak5/HPv0T9zXuDvrvuZHCOX8xk/tfile.svg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baLubG/btrLadUQak5/HPv0T9zXuDvrvuZHCOX8xk/tfile.svg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baLubG/btrLadUQak5/HPv0T9zXuDvrvuZHCOX8xk/tfile.svg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaLubG%2FbtrLadUQak5%2FHPv0T9zXuDvrvuZHCOX8xk%2Ftfile.svg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;525&quot; height=&quot;513&quot; data-filename=&quot;Public_key_encryption.svg&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;513&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp;공개키 암호화 방식은 암호 방식의 한 종류로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;암호화와 복호화에 이용하는 키가 다른 방식을 말합니다. 공개키와 암호키가 존재하며, 위 그림에서 Hello Alice!라는 문구를 공개키로 암호화했다면 오직 암호키로만 이를 복호화할 수 있습니다. 반대로 암호키로 암호화했다면 공개키로만 복호화 할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #202122;&quot;&gt;&amp;nbsp; &amp;nbsp;이 방식을 이용한 클라이언트와 서버간의 흐름을 간단하게 정리해보았습니다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt; 클라이언트는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;공개키&lt;/b&gt;로 HTTP요청을 암호화합니다.&lt;/li&gt;
&lt;li&gt;이 요청을 받은 서버는&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;암호키&lt;/b&gt;로 요청을 복호화해서 해독합니다.&lt;/li&gt;
&lt;li&gt;서버는 요청에 해당하는 데이터를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;암호키&lt;/b&gt;로 암호화하여 클라이언트에 응답합니다.&lt;/li&gt;
&lt;li&gt;클라이언트는 응답을&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;공개키&lt;/b&gt;로 응답을 복호화하여 해독합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;보안 말고 또 다른 차이점?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;구글 등의 검색 엔진에서는 HTTPS를 사용한 사이트에 SEO(Search Engine Optimization) 가산점을 부여합니다. 따라서 동일한 키워드를 검색하더라도 HTTPS가 적용된 안전한 사이트가 더 상위에 노출됩니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;요약&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;HTTPS는 인터넷 상에서 데이터를 주고받기위한 프로토콜인 HTTP에 보안이 추가된 방식입니다. 보안은 공개키 암호화 방식을 사용하는 SSL 암호화 통신을 통해 구현됩니다. 따라서 둘의 차이점은 보안의 적용유무에 있다고 할 수 있습니다.&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;참고문서&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/HTTP&quot;&gt;https://developer.mozilla.org/ko/docs/Web/HTTP&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/HTTP&quot;&gt;https://ko.wikipedia.org/wiki/HTTP&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/HTTPS&quot;&gt;https://ko.wikipedia.org/wiki/HTTPS&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://post.naver.com/viewer/postView.nhn?volumeNo=16561296&amp;amp;memberNo=1834&quot;&gt;https://post.naver.com/viewer/postView.nhn?volumeNo=16561296&amp;amp;memberNo=1834&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://ko.wikipedia.org/wiki/%EA%B3%B5%EA%B0%9C_%ED%82%A4_%EC%95%94%ED%98%B8_%EB%B0%A9%EC%8B%9D&quot;&gt;https://ko.wikipedia.org/wiki/%EA%B3%B5%EA%B0%9C_%ED%82%A4_%EC%95%94%ED%98%B8_%EB%B0%A9%EC%8B%9D&lt;/a&gt;&lt;/p&gt;</description>
      <category>cs지식</category>
      <category>http</category>
      <category>HTTPS</category>
      <author>Eunbae</author>
      <guid isPermaLink="true">https://eunbae11.tistory.com/35</guid>
      <comments>https://eunbae11.tistory.com/entry/HTTP%EC%99%80-HTTPS%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90#entry35comment</comments>
      <pubDate>Thu, 1 Sep 2022 23:41:52 +0900</pubDate>
    </item>
    <item>
      <title>JS 자료구조&amp;amp;알고리즘 (4) - 검색과 정렬</title>
      <link>https://eunbae11.tistory.com/entry/JS-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-4-%EA%B2%80%EC%83%89%EA%B3%BC-%EC%A0%95%EB%A0%AC</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;10장. 검색과 정렬&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;검색 (search)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 검색은 자료 구조 내에 특정 항목을 찾는 일을 말하며, 배열이 정렬됐는지 여부에따라 두 가지 주요 기법이 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;선형 검색&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배열의 각 항목을 한 인덱스씩 순차적으로 접근하면서 동작한다.&lt;/li&gt;
&lt;li&gt;시간 복잡도 : O(n)&lt;/li&gt;
&lt;li&gt;배열의 정렬 여부와는 관계없이 동작하기때문에 좋으므로 정렬되지 않은 배열을 검색하기 좋다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;matlab&quot;&gt;&lt;code&gt;function linearSearch(arr, n) {
    for(var i = 0; i &amp;lt; arr.length; i++){
        if (arr[i] == n) return true;
    }
    return false;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;이진 검색 (탐색)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;중간 값을 확인해서 원하는 값보다 중간 값이 작은지 큰지를 확인하면서 동작한다.&lt;/li&gt;
&lt;li&gt;시간 복잡도: O(logn)&lt;/li&gt;
&lt;li&gt;이진 탐색은 빠르지만 배열이 정렬된 경우에만 사용할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;javascript&quot;&gt;&lt;code&gt;function binarySearch(arr, n) {
    var lowIdx = 0, highIdx = arr.length - 1;

    while (lowIdx &amp;lt;= highIdx) {
        var midIdx = Math.floor((highIdx + lowIdx) / 2);
        if (arr[midIdx] == n) return arr[midIdx];
        else if (n&amp;gt;arr[midIdx]) lowIdx = midIdx;
        else highIdx = midIdx;
    }
    return -1;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정렬 (sort)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;거품 정렬 (bubble sort)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 간단한 알고리즘으로, 전체 배열을 순회하면서 항목이 다른 항목보다 큰 경우 두 항목을 교환한다.&lt;/li&gt;
&lt;li&gt;시간 복잡도: O(n^2) (중첩 루프)&lt;/li&gt;
&lt;li&gt;거품 정렬은 모든 가능한 짝을 비교하기 때문에 최악의 정렬이라 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1657001936586&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function bubbleSort(array) {
  for (var i = 0, arrayLength = array.length; i &amp;lt; arrayLength; i++) {
    for (var j = 0; j &amp;lt;= i; j++) {
      if (array[i] &amp;lt; array[j]) {
        swap(array, i, j);
      }
    }
  }
  return array;
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;책의 예시는 인접 두 항목을 교환하는 코드가 아니어서 &lt;a href=&quot;https://www.zerocho.com/category/Algorithm/post/57f67519799d150015511c38&quot;&gt;제로초님의 블로그&lt;/a&gt;글을 참고하여 공부하였다.&lt;/p&gt;
&lt;pre id=&quot;code_1657001979598&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function bubbleSort(array) {
  for (var i = 0, arrayLength = array.length; i &amp;lt; arrayLength - 1; i++) {
    for (var j = 0; j &amp;lt; arrayLength - 1 - i; j++) {
      if (array[j] &amp;gt; array[j+1]) { // 인접항목 교환
        swap(array, j, j+1);
      }
    }
  }
  return array;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;선택 정렬 (selection sort)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 작은 항목을 찾아서 해당 항목을 배열의 현 위치에 삽입한다.&lt;/li&gt;
&lt;li&gt;시간 복잡도 : O(n^2) (중첩 루프)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1657182694008&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function selectionSort(items) {
  var len = items.length, min;

  for (var i = 0; i &amp;lt; len; i++) {
    min = i;
    for (j = i+1; j &amp;lt; len; j++) { 
      if (items[j] &amp;lt; items[min]) {
        min = j; // 최솟값의 위치를 min값에 할당
      }
    }
    if (i != min) { // 현재 위치가 최솟값의 위치가 아니면 교환
      swap(items, i, min);
    }
  }
  return items;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;삽입 정렬 (insertion sort)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;배열을 순차적으로 검색하면서 정렬되지 않은 항목들을 배열의 왼쪽의 정렬된 부분으로 이동시킨다.&lt;/li&gt;
&lt;li&gt;시간 복잡도 : O(n^2) (중첩 루프)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1657184658041&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function insertionSort(items) {
  var len = items.length, value, i, j;
  
  for (i=0; i &amp;lt; len; i++) {
    value = items[i]; // 현재 값 덮어써질수 있으므로 저장함

    for (j = i-1; j &amp;gt; -1 &amp;amp;&amp;amp; items[j] &amp;gt; value; j--) { // value가 검사값보다 작다면 검사값 위치 +1
      items[j+1] = items[j];
    } // j는 검사값이 크지 않을 때 까지 감소한다.
    items[j+1] = value; // 감소한 j값 +1이 value의 위치(가장 작은값)
    console.log(items);
  }
  return items;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;빠른 정렬 (quick sort)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기준점을 획득한 다음 해당 기준점을 기준으로 왼쪽은 작은 항목, 오른쪽은 큰 항목으로 배열을 나눈다.&lt;/li&gt;
&lt;li&gt;시간복잡도: 평균 - O(nlog_2(n)), 최악 - O(n^2)&lt;/li&gt;
&lt;li&gt;기준점을 항상 잘못 선택하는 경우는 시간 복잡도가 O(n^2)이 될 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1657262758871&quot; class=&quot;swift&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function quickSort(items) {
  return quickSortHelper(items, 0, items.length - 1);
}
function quickSortHelper(items, left, right) {
  var index;
  if (items.length &amp;gt; 1) {
    index = partition(items, left, right);

    if (left &amp;lt; index - 1) { // 기준점 왼쪽 빠른정렬
      quickSortHelper(items, left, index - 1);
    }
    if (index &amp;lt; right) { // 기준점 오른쪽 빠른정렬
      quickSortHelper(items, index, right);
    }
  }
  return items;
}
function partition(array, left, right) { // 기준점 중앙으로
  var pivot = array[Math.floor((right + left) / 2)];
  while (left &amp;lt;= right) {
    while (pivot &amp;gt; array[left]) {
      left++;
    }
    while (pivot &amp;lt; array[right]) {
      right--;
    }
    if (left &amp;lt;= right) {
      var temp = array[left];
      array[left] = array[right];
      array[right] = temp;
      left++;
      right--;
    }
  }
  return left;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;빠른 선택 (quick select)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정렬되지 않은 목록에서 k번째로 작은 항목을 찾는 선택 알고리즘이다.&lt;/li&gt;
&lt;li&gt;빠른 정렬과 같은 접근법을 사용하지만, 기준점의 양쪽 모두를 재귀적으로 수행하는 대신 한쪽만을 재귀적으로 수행한다는 차이점이있다.&lt;/li&gt;
&lt;li&gt;이로인해 복잡도는 O(nlog_2(n))에서 O(n)으로 낮아진다.&lt;/li&gt;
&lt;li&gt;시간복잡도: O(n)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1657263728736&quot; class=&quot;reasonml&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function quickSelectInPlace(A, l, h, k) {
  var p = partition(A, l, h);
  if (p == (k-1)) {
    return A[p]; // 일치하면 값 return
  } else if (p &amp;gt; (k-1)) {
    return quickSelectInPlace(A, l, p-1, k); // pivot 왼쪽배열 재귀
  } else {
    return quickSelectInPlace(A, p+1, h, k); // pivot 오른쪽배열 재귀
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;병합 정렬 (merge sort)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 하위 배열에 하나의 항목이 존재할 때까지 배열을 하위 배열로 나눈 다음, 각 하위 배열을 정렬된 순서로 병합한다.&lt;/li&gt;
&lt;li&gt;시간복잡도: O(nlog_2(n)), 공간복잡도: O(n)&lt;/li&gt;
&lt;li&gt;병합 정렬은 O(n)의 공간을 사용한다는 단점이 있다.&lt;/li&gt;
&lt;li&gt;왼쪽, 오른쪽의 두 배열을 가지고 하나의 결과 배열로 병합한다. (아래의 merge 함수)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1657697984611&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function merge(leftA, rightA) { // 병합 함수
  var results = [], leftIndex = 0, rightIndex = 0;

  while (leftIndex &amp;lt; leftA.length &amp;amp;&amp;amp; rightIndex &amp;lt; rightA.length) {
    if (leftA[leftIndex] &amp;lt; rightA[rightIndex]) {
      results.push(leftA[leftIndex++]);
    } else {
      results.push(rightA[rightIndex++]);
    }
  }
  var leftRemains = leftA.slice(leftIndex),
  rightRemains = rightA.slice(rightIndex);

  return results.concat(leftRemains.concat(rightRemains));
}

function mergeSort(array) {
  if (array.length&amp;lt;2){
    return array;
  }
  var midpoint = Math.floor((array.length)/2),
  leftArray = array.slice(0, midpoint),
  rightArray = array.slice(midpoint);

  return merge(mergeSort(leftArray), mergeSort(rightArray)); // left와 right로 계속 분할
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;계수 정렬 (count sort)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;값을 비교하지 않기 때문에 O(k+n)시간 안에 수행된다.&lt;/li&gt;
&lt;li&gt;숫자에 대해서만 동작하며, 특정 범위가 주어져야 한다.&lt;/li&gt;
&lt;li&gt;배열의 각 항목의 등장 횟수를 세어 해당 등장 횟수를 사용해서 새로운 배열을 생성한다.&lt;/li&gt;
&lt;li&gt;주로 제한된 범위의 정수를 정렬할 때 가장 빠른 정렬 방법이기 때문에 계수 정렬을 사용한다.&lt;/li&gt;
&lt;li&gt;시간복잡도: O(k+n), 공간복잡도: O(k)&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1657264666792&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function countSort(arr) {
  var hash = {}, countArr = [];
  for (var i=0; i&amp;lt;arr.length; i++) {
    if (!hash[arr[i]]) {
      hash[arr[i]] = 1;
    } else {
      hash[arr[i]]++;
    }
  }
  for (var key in hash) { // 항목이 몇개가 되든 해당 항목을 배열에 추가한다
    for (var i=0; i&amp;lt;hash[key]; i++) {
      countArr.push(parseInt(key)); // key 를 hash[key] 값만큼 arr에 push한다.
    }
  }
  return countArr;
}&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;자바스크립트 내장 정렬&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자바스크립트는 배열 객체에 사용 가능한 내장 메소드 sort()가 존재하며, 이는 항목들을 오름차순으로 정리한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1657698302140&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var arr = [12, 3, 4, 2, 1, 34, 23];
arr.sort(); // [1, 12, 2, 23, 3, 34, 4]&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;요약&lt;/h4&gt;
&lt;table style=&quot;border-collapse: collapse; width: 61.9767%; height: 271px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style2&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;알고리즘&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;시간 복잡도&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;공간 복잡도&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;빠른 정렬(quick sort)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;O(nlog_2(n))&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;O(nlog_2(n))&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;병합 정렬(merge sort)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;O(nlog_2(n))&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;O(nlog_2(n))&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;거품 정렬(bubble sort)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;O(n^2)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;O(n^2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;삽입 정렬(insertion sort)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;O(n^2)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;O(n^2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;선택 정렬(select sort)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;O(n^2)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;O(n^2)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;계수 정렬(count sort)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;O(k+n)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;O(k)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>cs지식/자료구조</category>
      <category>이진탐색</category>
      <category>자료구조</category>
      <category>정렬</category>
      <author>Eunbae</author>
      <guid isPermaLink="true">https://eunbae11.tistory.com/33</guid>
      <comments>https://eunbae11.tistory.com/entry/JS-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-4-%EA%B2%80%EC%83%89%EA%B3%BC-%EC%A0%95%EB%A0%AC#entry33comment</comments>
      <pubDate>Wed, 13 Jul 2022 16:40:40 +0900</pubDate>
    </item>
    <item>
      <title>JS 자료구조&amp;amp;알고리즘 (3)</title>
      <link>https://eunbae11.tistory.com/entry/JS-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-3</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;7장. 자바스크립트 메모리 관리&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;메모리 누수&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트는 타언어와는 달리 프로그래머가 직접 메모리를 수동으로 할당하고 해제하지 않고&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;사용하지않는 변수, 즉 메모리를 삭제해주는&lt;/span&gt; 가비지 컬렉터가 있기 때문에 매니지드언어라고 부른다. 하지만 이러한 기능에도 메모리가 올바른 방식으로 해제되지 않아 메모리 누수가 발생할 수 있기 때문에 이를 피하기위한 여러 방법이 존재한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;객체에 대한 참조&lt;/h4&gt;
&lt;pre id=&quot;code_1656855661946&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var foo = {
	bar1: memory(), // 5kb
    bar2: memory(), // 5kb
}

function clickEvent() {
	alert(foo.bar1[0]);
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체에 대한 참조가 있다면 해당 참조는 메모리에 존재하는 것이다. foo객체가 bar1만을 참조하더라도 foo객체 전체를 clickEvent() 함수의 범위에 로딩해야 하기 때문에 실제로는 5KB가 아니라, 10KB의 메모리를 사용한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DOM 메모리 누수&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DOM 항목을 가리키는 변수가 이벤트 콜백 외부에 선언된 경우 해당 DOM 항목을 제거하더라도 해당 항목은 여전히 메모리에 남게된다.&lt;/p&gt;
&lt;pre id=&quot;code_1656855941523&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var one = document.getElementById(&quot;one&quot;);
var two = document.getElementById(&quot;two&quot;);

one.addEventListner('click', function() {
    two.remove();
    console.log(two); // 삭제 후에도 html을 출력한다(참조 유지)
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드에서 웹페이지의 two항목은 사라지지만, 해당 DOM이 HTML에서 사라지더라도 해당 DOM이 이벤트 콜백에서 사용되었다면 참조는 남는다. 이렇게 two 항목이 더 이상 사용중이 아닌경우를 '메모리 누수'라 부르며 미리 누수를 피해야한다. 따라서 아래와 같은 코드를 작성할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1656855996024&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var one = document.getElementById(&quot;one&quot;);

one.addEventListner('click', function() {
    var two = document.getElementById(&quot;two&quot;); // DOM항목을 이벤트 콜백 내부에서 사용한다.
    two.remove();
}
one.removeEventListner('click', function () {
    one.addEventListener('click', callBackExample);
}); // 또는 클릭 핸들러를 사용한 뒤 등록 해지하는 방법도 있다.&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;window 전역 객체&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체가 window 전역 객체에 포함되는 경우 해당 객체는 메모리에 존재하는 것이고, window의 속성으로 선언된 추가적인 객체는 모두 제거할 수 없다. window는 브라우저가 실행하는데 필요한 객체이기 때문이다. 따라서 가능하면 전역변수는 사용하지 않는 것이 좋다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;객체 참조 제한하기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;객체에 대한 모든 참조가 제거되면 해당 객체는 제거되기 때문에 &lt;b&gt;함수&lt;/b&gt;에는 객체의 전체범위가 아닌 &lt;b&gt;필요한 범위, 속성만 전달&lt;/b&gt;해야한다.&lt;/p&gt;
&lt;pre id=&quot;code_1656856625347&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var test = { prop1: 'test' };

function printProp(test) {
    console.log(test.prop1); // x
    console.log(test) // o
}

printProp(test); // x
printProp(test.prop1); // o&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;delete 연산자&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원치 않는 객체 속성을 제거하기 위해 delete 연산자를 사용할 수 있다. 이때 delete 연산자는 객체에서만 동작한다.&lt;/p&gt;
&lt;pre id=&quot;code_1656856461113&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var test = { prop1: 'test' };

console.log(test.prop1); // test

delete test.prop1;

console.log(test.prop1); // undefined&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>cs지식/자료구조</category>
      <category>자료구조</category>
      <author>Eunbae</author>
      <guid isPermaLink="true">https://eunbae11.tistory.com/32</guid>
      <comments>https://eunbae11.tistory.com/entry/JS-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-3#entry32comment</comments>
      <pubDate>Sun, 3 Jul 2022 22:57:57 +0900</pubDate>
    </item>
    <item>
      <title>About Me</title>
      <link>https://eunbae11.tistory.com/pages/About-Me</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;test&lt;/p&gt;</description>
      <author>Eunbae</author>
      <guid isPermaLink="true">https://eunbae11.tistory.com/pages/About-Me</guid>
      <pubDate>Fri, 1 Jul 2022 00:02:05 +0900</pubDate>
    </item>
    <item>
      <title>모던 자바스크립트 Deep Dive - 04. 변수</title>
      <link>https://eunbae11.tistory.com/entry/%EB%AA%A8%EB%8D%98-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-Deep-Dive-04-%EB%B3%80%EC%88%98</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.1 변수란 무엇이고, 왜 필요한가?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트 엔진이 10+20 이라는 식의 의미를 해석하면 + 연산을 수행하기 위해서 10과 20이라는 숫자 값(피연산자)을 기억한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;컴퓨터는 연산(CPU)과 기억(Memory)을 수행하는 부품이 나누어져 있기 때문에 피연산자 값은 메모리주소에 저장되고, CPU는 이 값을 읽어 들여 연산을 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연산 결과로 생성된 숫자 값 30도 메모리 주소에 저장되는데 이 값을 재사용하려면 주소를 통해 메모리 공간에 직접 접근해야하지만, 이는 치명적 오류를 야기하는 매우 위험한 방법이기에 자바스크립트는 &lt;b&gt;개발자의 직접적인 메모리 제어를 허용하지 않는다&lt;/b&gt;. 따라서 30이라는 값은 재사용이 불가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 직접적인 메모리 제어를 허용하더라도 코드가 실행될 때마다 값이 저장될 메모리 주소는 변경되므로, 코드 실행 이전에는 메모리 주소의 값을 알 방법이 없으므로 직접 접근하는 방법은 올바른 방법이 아니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그래밍 언어는 기억하고싶은 값을 메모리에 &lt;b&gt;저장&lt;/b&gt;하고, 저장된 값을 읽어들여 &lt;b&gt;재사용&lt;/b&gt;하기 위해 &quot;변수&quot;라는 메커니즘을 제공한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;변수는 하나의 값을 저장하기 위해 확보한 &lt;b&gt;메모리 공간 자체&lt;/b&gt; 또는 그 메모리 공간을 &lt;b&gt;식별하기 위해 붙인 이름&lt;/b&gt;을 말한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수는 프로그래밍 언어의 컴파일러 또는 인터프리터에 의해 값이 저장된 메모리 공간의 주소로 치환되어 실행된다. 따라서 변수를 통해 직접적인 메모리 제어 없이 안전하게 값에 접근할 수 있다!&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변수에 값을 저장하는 것을 &lt;b&gt;할당(assignment-대입, 저장)이라 하고,&lt;/b&gt; 변수에 저장된 값을 읽어 들이는 것을 &lt;b&gt;참조(reference)&lt;/b&gt;라고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 변수 이름을 이용해서 참조를 요청하면, 자바스크립트 엔진은 변수 이름과 매핑된 메모리 주소를 통해 메모리 공간에 접근해서 저장된 값을 반환한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.2 식별자&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;변수 이름을 식별자(identifier)라고도 하며, 어떤 값을 구별해서 &lt;b&gt;식별할 수 있는 &lt;span style=&quot;color: #ef5369;&quot;&gt;고유한 이름&lt;/span&gt;&lt;/b&gt;을 말한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;식별자는 값이 저장되어 있는 메모리 주소와 매핑관게를 맺으며, 이&lt;b&gt; 매핑 정보도 메모리에 저장&lt;/b&gt;되어야 한다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;  식별자는 값이 아니라 &lt;b&gt;메모리 주소를 기억&lt;/b&gt;하고있으며, 식별자는 메모리 주소에 붙인 이름이라고 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.3 변수 선언&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수 선언은 값을 저장하기 위한 메모리 공간을 확보하고, 변수 이름과 확보된 메모리 공간의 주소를 연결해서 값을 저장하도록 준비하는 것이다. 확보된 메모리 공간은 확보가 해제되기 전까지 누구도 확보된 메모리 공간을 사용할 수 없도록 보호되므로 안전히 공간을 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수를 사용하려면 선언이 반드시 필요하며 var, const, let 키워드를 사용한다. let과 const는 ES6에서 도입된 키워드로, var 키워드의 함수 레벨 스코프 지원 등의 단점을 보완하기 위해 등장한 키워드이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4장에서는 우선 var키워드를 살펴본다. var 키워드의 변수 선언 과정을 살펴보자.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;var score; 의 변수 선언문은 변수 이름을 등록하고, 값을 저장할 메모리 공간을 확보한다. &lt;b&gt;(선언 단계)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;변수는 선언되었지만 아직 값은 할당되지 않았다. 이때 메모리 공간은 비어있지 않고, 확보된 메모리 공간에는 자바스크립트 엔진에 의해 undefined라는 값으로 암묵적으로 할당되어 초기화된다! &lt;b&gt;(초기화 단계)&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일반적으로 &lt;b&gt;초기화&lt;/b&gt;란 변수가 선언된 이후 &lt;b&gt;최초로 값을 할당&lt;/b&gt;하는 것을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 초기화 단계를 거치지 않으면 확보된 메모리 공간에는 이전에 다른 앱이 사용했던 값이 남아있을 수 있는데, 이 값을 쓰레기값(garbage value)라 한다. 이러한 쓰레기 값을 참조하는것을 방지하기 위해 var 키워드는 암묵적으로 초기화를 수행한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.4 변수 선언의 실행 지점과 변수 호이스팅&lt;/h2&gt;
&lt;pre id=&quot;code_1656599202683&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(score); // undefined

var score; // 변수 선언문&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드를 살펴보면 변수 선언문보다 변수를 참조하는 코드가 앞에 있지만, 인터프리터에 의해 한 줄씩 순차적으로 코드가 실행되는 과정에서 참조 에러가 발생하지 않고 undefined가 출력된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 이는 변수 선언이 소스코드가 순차적으로 실행되는 시점(런타임)이 아니라 그 이전단계(소스코드의 평가과정)에서 먼저 실행되기 때문이다! 소스코드의 평과과정에서는 변수, 함수 선언문 등을 소스코드에서 찾아내 먼저 실행하고, 이 과정이 끝나면 모든 선언문을 제외하고 소스코드를 한 줄씩 순차적으로 실행한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;이처럼 변수 선언문이 런타임 이전단계에서 먼저 실행되어 &lt;b&gt;코드의 선두로 끌어올려진 것 처럼 동작하는 자바스크립트 고유의 특징&lt;/b&gt;을 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;변수 호이스팅&lt;/b&gt;&lt;/span&gt;이라 한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;; var, let, const, function, class등의 키워드를 사용해서 선언하는 모든 식별자는 런타임 이전단계에서 실행되기 때문에 모두 호이스팅된다고 할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.5 값의 할당&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변수에 값을 할당할 때는 할당 연산자 &quot;=&quot;를 사용한다. 할당 연산자는 우변의 값을 좌변의 변수에 할당한다.&lt;/p&gt;
&lt;pre id=&quot;code_1656599670745&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var score; // 변수 선언
score = 80; // 값의 할당

var score = 80; // 변수 선언 + 값의 할당&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드와 같이 변수 선언과 값의 할당을 2개의 문으로 나누어 표현할 수도 있고, 하나의 문으로 단축하여 표현할 수도 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두가지 표현 방식은 정확히 동일하게 동작하고, 이는 하나의 문으로 단축 표현해도 자바스크립트 엔진은 변수 선언과 값의 할당을 2개의 문으로 나누어 각각 실행한다는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 때 변수 선언은 &lt;b&gt;런타임 이전에 먼저 실행&lt;/b&gt;되지만, 값의 할당은 소스코드가 순차적으로 실행되는 시점인 &lt;b&gt;런타임에 실행&lt;/b&gt;된다!&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;변수에 값을 할당할 때는 이전 값 undefined(초기화된 값)가 저장되어 있던 메모리 공간을 지우고 할당값을 저장하는 것이 아니라, &lt;b&gt;새로운 메모리 공간을 확보&lt;/b&gt;하고 &lt;b&gt;그곳에 할당 값을 저장&lt;/b&gt;한다는 점을 주의해야 한다.&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4.6 값의 재할당&lt;/h2&gt;
&lt;pre id=&quot;code_1656600089758&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var score = 80;
score = 90; // 값의 재할당&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드와 같이 var 키워드로 선언한 변수는 값을 재할당할 수 있다. 재할당은 현재 변수에 저장된 값을 버리고 새로운 값을 저장하는 것이다. (엄밀이 말하면 변수를 선언 후 초기화하는 과정도 재할당이라 할 수 있다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음 변수에 값을 할당할 때와 마찬가지로 이전 값 80이 저장되어있던 메모리 공간을 지우고 90을 저장하는것이 아니라, 새로운 메모리 공간을 확보하고 그 메모리 공간에 90을 저장한다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;score변수의 이전 값인 undefined와 80은 아무도 사용하지 않는 필요하지 않은 값이므로 이 값들은 가비지 콜렉터에 의해 특정 시점에 메모리에서 자동 해제된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가비지 콜렉터는 어플리케이션이 할당한 메모리 공간을 주기적으로 검사하여 더 이상 사용되지 않는 메모리를 해제하는 기능이다. 자바스크립트는 가비지 콜렉터를 내장하고있는 매니지드 언어로서 &lt;b&gt;메모리 누수를 방지&lt;/b&gt;한다. (언매니지드 언어에는 개발자가 명시적으로 메모리를 할당하고 해제할 수 있는 c언어가 있다.)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;요약&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #666666;&quot;&gt;변수는 하나의 값을 저장하기 위해 확보한&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;메모리 공간 자체&lt;/b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;또는 그 메모리 공간을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;식별하기 위해 붙인 이름&lt;/b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;을 말한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;변수는 식별자라고도 하며, 식별자는 값이 아니라&amp;nbsp;&lt;b&gt;메모리 주소를 기억&lt;/b&gt;하고있고 메모리 주소에 붙인 이름이라고 할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;변수는 선언과정에서 선언단계와 초기화단계를 거친다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;변수 선언문이 런타임 이전단계에서 먼저 실행되어&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;코드의 선두로 끌어올려진 것 처럼 동작하는 자바스크립트 고유의 특징&lt;/b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;변수 호이스팅&lt;/b&gt;&lt;span style=&quot;color: #666666;&quot;&gt;이라 한다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;span&gt;변수 선언은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;런타임 이전에 먼저 실행&lt;/b&gt;&lt;span&gt;되지만, 값의 할당은 소스코드가 순차적으로 실행되는 시점인&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;런타임에 실행&lt;/b&gt;된다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;변수에 값을 (재)할당할 때는 이전 값이 저장되어 있던 메모리 공간을 지우고 할당값을 저장하는 것이 아니라,&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;새로운 메모리 공간을 확보&lt;/b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;하고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;그곳에 할당 값을 저장&lt;/b&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666;&quot;&gt;한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>javascript/모던 자바스크립트 Deep Dive</category>
      <category>deep dive</category>
      <category>자바스크립트</category>
      <author>Eunbae</author>
      <guid isPermaLink="true">https://eunbae11.tistory.com/29</guid>
      <comments>https://eunbae11.tistory.com/entry/%EB%AA%A8%EB%8D%98-%EC%9E%90%EB%B0%94%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8-Deep-Dive-04-%EB%B3%80%EC%88%98#entry29comment</comments>
      <pubDate>Thu, 30 Jun 2022 23:57:17 +0900</pubDate>
    </item>
    <item>
      <title>JS 자료구조&amp;amp;알고리즘 (2)</title>
      <link>https://eunbae11.tistory.com/entry/JS-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-2</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;5장. 자바스크립트 배열&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;배열&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;삽입&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;새로운 항목을 자료 구조 내에 추가하는것. .push(element)메소드를 사용해 배열 삽입을 구현할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1656569709465&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var arr = [1, 2, 3, 4]
arr.push(5); // arr = [1, 2, 3, 4, 5]
arr.push(8); // arr = [1, 2, 3, 4, 5, 8]

// 시간복잡도: O(1)&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;삭제&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.pop()메소드를 사용해 배열 삭제를 구현할 수 있다. 해당 메소드는 제거된 항목을 반환한다.&lt;/p&gt;
&lt;pre id=&quot;code_1656569819489&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var arr = [1, 2, 3, 4]
arr.pop(); // return 4, arr = [1, 2, 3]

// 시간복잡도: O(1)

arr.shift(); // return 1, arr = [2, 3]
// shift()는 첫번째 항목을 제거한 다음 해당 항목을 반환한다.&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;접근&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특정 인덱스의 배열에 접근하는 연산은 인덱스를 이용해서(0부터 시작) &lt;b&gt;메모리의 주소&lt;/b&gt;로부터 &lt;b&gt;직접 값을 얻기 때문&lt;/b&gt;에 시간 복잡도가 O(1)이다.&lt;/p&gt;
&lt;pre id=&quot;code_1656569969677&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var arr = [1, 2, 3, 4]
arr[1] // return 2
arr[3] // return 4&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;반복&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반복은 어떤 자료구조 내에 담긴 항목들을 하나씩 접근하는 과정이며 모두 O(n)의 시간복잡도를 가진다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;for (변수; 조건; 수정)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;for은 변수 i를 초기화하고 코드 실행 전 조건이 거짓인지 확인한다. 만약 거짓이라면 변수를 수정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하며 동작한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt; for&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1656570244254&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;for (var i=0, len=arr.length; i&amp;lt;len; i++) {
	console.log(arr[i])
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;while&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1656570281652&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var counter = 0;
while(counter&amp;lt;arr.length){
	// ~
    counter++
} //while은 counter가 루프의 바깥에서 초기화되어야 한다.&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;무한 루프&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1656570376386&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;while(true){
	if(breakCondition) {
   		break;
	}
}

for(;;) {
	if(breakCondition) {
   		break;
	}
} //조건을 설정하지 않음으로써 무한루프를 구현할 수 있다.&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;for (in)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인덱스를 하나씩 호출하는 배열을 반복 접근하기위한 방법으로, in 앞에 지정된 변수는 배열의 인덱스이다.&lt;/p&gt;
&lt;pre id=&quot;code_1656570650504&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var arr = ['a', 'b', 'c', 'd']

for (var index in arr) {
	console.log(index)
} // 0, 1, 2, 3&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;for (of)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;of 앞에 지정된 변수는 배열의 항목(값)이다.&lt;/p&gt;
&lt;pre id=&quot;code_1656570682555&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var arr = ['a', 'b', 'c', 'd']

for (var element of arr) {
	console.log(element)
} // a, b, c, d&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;forEach()&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;forEach는 반복 중 바깥으로 빠져나오거나 배열 내의 특정 항목을 건너뛸 수 없다. 따라서 반복 접근한다는 의미에 있어 조금 더 명시적이라 할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1656570756655&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var arr = ['a', 'b', 'c', 'd']

arr.forEach( function (element, index) {
	console.log(element, index)
} // a 0, b 1, c 2, d 3&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;도움 함수&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;.slice(begin, end)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기존 배열을 수정하지 않고 해당 배열의 일부를 반환하며, 시작과 끝 인덱스를 매개변수로 받는다.&lt;/p&gt;
&lt;pre id=&quot;code_1656570962553&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var arr = [1, 2, 3, 4];
arr.slice(0, 2) // return [1, 2]
arr.slice(1) // return [2, 3, 4]
arr.slice() // return [1, 2, 3, 4]&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.slice()는 배열 전체의 복사본을 반환하기 때문에 배열을 복사하는데 유용하다. 배열에 신규변수를 할당하면 기존변수를 '참조'하기때문에&amp;nbsp; 신규변수를 변경하면 기존변수에도 변경점이 의도치않게 적용될 수 있다. 새로운 배열을 만드려면 .from()이나 .slice()등을 이용해야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1656571242396&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var arr1 = [1, 2, 3], arr2 = arr1;

arr2[0] = 5;
console.log(arr1) // [5, 2, 3]
console.log(arr2) // [5, 2, 3]
// arr2는 arr1을 참조한다.

var arr3 = [1, 2, 3];
var arr4 = Array.from(arr3);
var arr5 = arr3.slice();
// arr4와 arr5는 새로운 배열로 생성된다.&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;.splice(begin, size, element1, element2, ...)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.splice()는 기존 항목을 제거하거나 신규 항목을 추가함으로써 배열의 내용을 반환하고 변경한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; .splice(시작 인덱스, 제거할 항목의 크기, 추가할 신규항목들...)&lt;/p&gt;
&lt;pre id=&quot;code_1656571578755&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var arr = [1,2,3,4];
arr.splice(); // return [], arr = [1,2,3,4]
arr.splice(1, 2); // return [2, 3], arr = [1, 4]
arr.splice(1, 2, 7, 7, 7) // return [2, 3], arr = [1,7,7,7,4]
arr.splice(1, 2, { 'ss': 1 }) // return [2, 3], arr = [1, { 'ss': 1 }, 4]&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;.concat()&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신규 항목을 배열의 맨 뒤에 추가한 다음 해당 배열을 반환한다.&lt;/p&gt;
&lt;pre id=&quot;code_1656571684184&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var arr = [1,2,3,4];
arr.concat() // return [1,2,3,4], arr = [1,2,3,4]
arr.concat([6, 6, 6]) // return [1,2,3,4,6,6,6], arr = [1,2,3,4]
// concat은 기존 배열은 바꾸지 않음&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;.length 속성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배열의 크기로 반환한다. 배열을 더 작은 크기로 변경하면 배열에서 항목들이 제거된다.&lt;/p&gt;
&lt;pre id=&quot;code_1656571780317&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var arr = [1,2,3,4];
console.log(arr.length) // 4
arr.length = 3; // arr = [1,2,3]&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;전개(spread) 연산자&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;점 3개(...)로 표현하며 인자를 확장하는데 사용한다.&lt;/p&gt;
&lt;pre id=&quot;code_1656571880531&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var arr = [1,2,3,4];
function addFourNums(a, b, c, d) {
	return a+b+c+d;
}
console.log(addFourNums(...arr)); // 10&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Math.max와 Math.min&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 함수 모두 무한개의 매개변수를 받을수 있으며 spread연산자를 사용하면 배열의 최댓값과 최솟값을 찾을 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1656571991758&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var arr = [3, 2, -123, 1234, 12];
Math.max(...arr); // 1234
Math.min(...arr); // -123&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6장. 자바스크립트 객체&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자바스크립트 객체 속성&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트에서는 객체 상수 {} 또는 new Object(); 구문을 통해 객체를 생성할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;속성을 추가하거나 접근하기 위해서는 objcet.propertyName 또는 object['propertyName']을 사용할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1656572362749&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var jsObj = {};
var arr = [1,2,3,4];
jsObj.array = arr;
console.log(jsObj); // {array: [1,2,3,4]}

jsObj['title'] = 'Algorithms';
console.log(jsObj); // {array: [1,2,3,4], title: 'Algorithms'}&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;프로토타입 활용 상속&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트에서는 함수가 클래스의 자바스크립트 Object속성으로 추가되어야 한다.&lt;/p&gt;
&lt;pre id=&quot;code_1656573027168&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function ExampleClass() {
	this.name = &quot;js&quot;;
    this.sayName = function() {
		console.log(this.name);
}

var example1 = new ExampleClass();
example1.sayName(); // &quot;js&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 코드의 class는 생성자에서 sayName함수를 동적으로 추가하는데, 이러한 패턴을 &lt;b&gt;프로토타입 활용 상속&lt;/b&gt;이라고 한다. 이 상속은 자바스크립트에서 유일한 상속 방법이며 클래스에 함수를 추가하기 위해서는 .prototype 속성을 사용한 후 함수의 이름을 지정하기만 하면 된다.&lt;/p&gt;
&lt;pre id=&quot;code_1656572982985&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function ExampleClass() {
	this.arr = [1,2,3];
    this.name = &quot;js&quot;;
}

var example1 = new ExampleClass();

ExampleClass.prototype.sayName = function() {
	console.log(this.name);
}
example1.sayName(); // &quot;js&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 함수를 클래스에 동적으로 추가하는 방식이 자바스크립트가 프로토타입 활용 상속을 구현하는 방식이다.&lt;/p&gt;</description>
      <category>cs지식/자료구조</category>
      <category>자료구조</category>
      <author>Eunbae</author>
      <guid isPermaLink="true">https://eunbae11.tistory.com/28</guid>
      <comments>https://eunbae11.tistory.com/entry/JS-%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-2#entry28comment</comments>
      <pubDate>Thu, 30 Jun 2022 16:14:55 +0900</pubDate>
    </item>
    <item>
      <title>JS 자료구조&amp;amp;알고리즘 (1)</title>
      <link>https://eunbae11.tistory.com/entry/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-in-JS1</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;배세민, ⌜자바스크립트로하는 자료구조와 알고리즘⌟, 에이콘, 2019 &lt;br /&gt;- 요약 및 배운점 정리&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1장. 빅 오 표기법&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;빅오 표기법이란?&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빅오 표기법은 알고리즘의 최악의 경우 복잡도를 측정하는 방법이다. 빅오 표기법에서 n은 &lt;b&gt;입력의 개수&lt;/b&gt;를 나타내며, 알고리즘 구현시 해당 알고리즘이 얼마나 효율적인지를 나타낼 수 있는 방법이기에 중요하다!&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빅오 표기법은 O()로 나타낼 수 있는데 O(1)은 상수시간, 즉 입력 공간에 대해 변하지 않음을 나타내고 O(n)은 선형시간으로 최악의 경우에 n번의 연산을 수행해야하는 알고리즘이 이에 해당한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;빅오 표기법의 규칙&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;알고리즘의 시간 복잡도를 f(n)이라 표현한다. f(n)을 계산함으로써 알고리즘의 효율성을 이해할 수 있지만 계산이 어려울 수 있기 때문에 이에 도움이 되는 기본적인 여러가지 규칙이 존재한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;계수 법칙 - &quot;상수를 제거하라&quot;&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;상수 k &amp;gt; 0인 경우 f(n)이 O(g(n))이면 kf(n)은 O(g(n))이다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;n과 관련되지 않은 계수는 제거하는 규칙으로, 5f(n)과 f(n)은 모두 동일한 O(f(n))이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt; f(n) = 5n, f(n) = n + 1인 경우는 모두 O(n)의 빅오표기법이다.&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;합의 법칙 - &quot;빅오를 더하라&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드에서 f(n)=n과 f(n)=4n이 각각 실행된다면 합의 법칙에 의해 f(n) = 5n이다. 이때 계수법칙에 의해 최종적 결과는 O(n)=n이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;곱의 법칙 - &quot;빅오를 곱하라&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드에서 루프에 의해 5n번 실행되고 내부 루프가 외부 루프에의해 n번 실행된다면 f(n) = 5n x n이다. 이때 계수법칙에 의해 O(n) = n^이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다항 법칙 - &quot;빅오의 k승&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;f(n)이 k차 다항식이면 f(n)은 O(n^k)이다.&lt;/blockquote&gt;
&lt;pre id=&quot;code_1656485252822&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;...
for (var i=0; i&amp;lt;n*n; i++) {
	conut+=1;
}
// count+=1;이 n*n번 실행되기 떄문에 f(n)=n^2이다.&lt;/code&gt;&lt;/pre&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2장. 자바스크립트의 독특한 특징&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자바스크립트 범위&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;범위(scope)는 자바스크립트 변수에 대한 접근 권한을 정의하는 것이다. 자바스크립트에서 변수는 전역 범위 또는 지역 범위에 속할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전역 범위 - 연산자 없이 변수를 선언하게되면 전역변수를 생성함&lt;/li&gt;
&lt;li&gt;함수 범위 - var&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 변수 호이스팅 (variable hoisting) : var를 사용하여 변수를 선언하면 어디에서 선언하든 &lt;b&gt;변수 선언&lt;/b&gt;이 &lt;b&gt;함수의 맨 앞으로 이동&lt;/b&gt;한다.&lt;/p&gt;
&lt;pre id=&quot;code_1656485864373&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function scope(print){
	if(print){
    	var insideIf = '12';
    }
    console.log(insideIf);
}
scope(true) // 12출력, 오류발생x&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1647416386731&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function scope(print){
	var insideIf
    
	if(print){
    	insideIf = '12';
    }
    console.log(insideIf);
}
scope(true)
//위의 함수와 동일하다. var은 함수범위로 정의되며 호이스팅이 일어난다.&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;블록 범위 - let, const : 변수가 선언된 { } 내에서만 유효함&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1647416393413&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function scope(print){
	if(print){
    	let insideIf = '12';
    }
    console.log(insideIf);
}
scope(true) // 12 x, ''를 출력함&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;등가와 형&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변수형&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;boolean, number, string, undefined, object, function, symbol&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 선언만 되고 값이 할당되지 않은 변수에는 undefined가 할당된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;true / false 확인&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if 내의 매개변수는 대개의 다른 언어와는 달리 꼭 boolean형이 아니어도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- false로 평가되는 경우 : false, 0, '', &quot;&quot;, NaN, undefined, null&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- true로 평가되는 경우 : true, 0이 아닌 다른 숫자, 비어있지 않은 문자열, 비어있지 않은 객체&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;=== vs ==&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트는 변수 선언 시 변수에 형이 할당되지 않으며, 코드가 실행될 때 해당 변수의 형이 해석된다. 따라서 ===는 ==에 비해 등가를 조금 더 엄격히 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;==: 값만 같은지 여부를 확인&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;===: 형과 값 모두 같은지 여부를 확인&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;객체&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1647417075592&quot; class=&quot;ceylon&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var object1 = {};
var object2 = {};

console.log(object1 == object2); //false
console.log(object1 === object2); //false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 동일한 속성과 값을 가져도 두 변수의 메모리상 주소는 다르기 때문에 두 객체는 동일하지 않다.&lt;/p&gt;
&lt;pre id=&quot;code_1647417145332&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;var function1 = function(){console.log(2)};
var function2 = function(){console.log(2)};

console.log(function1 == function2); //false&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 동일한 연산을 수행해도 두 함수의 메모리상 주소는 다르기 때문에 두 함수는 동일하지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #bdc1c6;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;rarr;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #bdc1c6;&quot;&gt; &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;==, ===연산자는 숫자, 문자열, 불리언과 같은 &lt;b&gt;비객체형&lt;/b&gt;에만 사용가능하다! (객체와 함수에서는 사용x)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3장. 자바스크립트 숫자&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;숫자 체계&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트는 숫자에 대해 64비트 부동소수점 표현을 사용한다. 63번째 비트는 부호를, 63~52번째 비트는 지수 값 e를, 나머지 52비트는 분수 값을 나타낸다. 이 64비트값은 어려운 공식에 의해 계산되는데, 이러한 십진분수로 인하여 자바스크립트에서 부동소수점 체계가 반올림 오류를 일으킬 수 있다. 이러한 이유 때문에 0.1과 0.2는 정확히 표현할 수 없다. 따라서 0.1 + 0.2 === 0.3의 결과는 false이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자바스크립트 숫자 객체&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와같은 숫자 체계의 문제를 해결하는데 도움이 되는 Number객체의 내장된 속성이 있다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정수 반올림&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트는 정수를 정수형으로 명시적으로 선언하지 않고 모든 숫자를 표현할 때 부동소수점을 사용하기 때문에 정수 나눗셈을 하면 부동소숫점의 결과가 나온다. (5/4 = 1.25) 따라서 정수 나눗셈을 하기위해서는 아래와 같은 함수를 이용해야한다.&lt;/p&gt;
&lt;pre id=&quot;code_1647418514628&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Math.floor()
Math.round()
Math.ceil()&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Number.EPSILON&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 개의 표현 가능한 숫자 사이의 가장 작은 간격을 반환한다.&lt;/p&gt;
&lt;pre id=&quot;code_1647862651105&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;function numberEquals(x, y) {
	return Math.abs(x - y) &amp;lt; Number.EPSILON;
}
numberEquals(0.1 + 0.2, 0.3) // true&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최대치&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1647863058893&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2; // true

Number.MAX_VALUE + 1 === Number.VALUE + 2; // true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Number.MAX_SAFE_INTEGER: 가장 큰 정수를 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Number.VALUE: 가장 큰 부동소수점 수를 반환&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최소치&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1647863497333&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Number.MIN_SAFE_INTEGER - 1 === Number.MIN_SAFE_INTEGER -2; // true

Number.MIN_VALUE -1 == -1; // true&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Number.MIN_SAFE_INTEGER: 가장 작은 정수를 반환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Number.MIN_VALUE: 가능한 가장 작은 부동소수점 수를 반환 -&amp;gt; 음수가 아님! (Number.MIN_SAFE_INTEGER &amp;lt; Number.MIN_VALUE)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;무한&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1647863230777&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Infinity &amp;gt; Number.MAX_SAFE_INTEGER; // true
-Infinity &amp;lt; -Number.MAX_SAFE_INTEGER; // true
-Infinity - 32323323 == -Infinity - 1; //true: -Infinity보다 작아질 수 있는것은 없음&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;크기 순서&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1647863330336&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-Infinity &amp;lt; Number.MIN_SAFE_INTEGER &amp;lt; Number.MIN_VALUE &amp;lt; 0 &amp;lt; Number.MAX_SAFE_INTEGER &amp;lt; Number.MAX_VALUE &amp;lt; Infinity&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;무작위 수 생성기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트에는 숫자를 생성하기 위핸 내장 함수인 Math.random()이 있다. 이 함수는 0과 1 사이의 무작위 부동 소수점을 반환한다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4장. 자바스크립트 문자열&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;자바스크립트 문자열 기본&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문자열 접근&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자에 접근하기 위해 .charAt(index)을 사용할 수 있다.&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1656486983916&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'dog'.charAt(1); // &quot;o&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 접근을 위해 .subString(startIndex, endIndex)을 사용할 수 있다. subString은 지정된 인덱스 사이의 문자들을 반환한다. endIndex를 전달하지 않으면 지정된 시작위치부터 끝까지 모든 문자를 반환한다.&lt;/p&gt;
&lt;pre id=&quot;code_1656487059904&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'YouTube'.substring(1,2) // 'o'
'YouTube'.substring(3,6) // 'Tub'
'YouTube'.substring(2) // 'uTube'&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문자열 비교&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자바스크립트에서는 &amp;lt; 와 &amp;gt;를 이용하여 쉽게 문자열을 비교할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1656487225850&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log('a' &amp;lt; 'b') // true
console.log('abb' &amp;lt; 'b') // true
console.log('add' &amp;lt; 'ab') // false&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문자열 검색&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열 내에 특정 문자열을 찾기위해 .indexOf(searchValue[, fromIndex])를 사용할 수 있다. 일치하는 문자열을 찾으면 위치를 반환하고, 찾지 못한다면 -1을 반환한다.&lt;/p&gt;
&lt;pre id=&quot;code_1656487468662&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'Red Dragon'.indexOf('Red') // 0
'Red Dragon'.indexOf('Dragon') // 4
'Red Dragon'.indexOf('Blue') // -1
'Red Dragon'.indexOf('Dragon', 2) // 4
'Red Dragon'.indexOf('Dragon', 6) // -1
'Red Dragon'.indexOf('', 9) // 9&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;startWith는 문자열이 특정 입력으로 시작하면 true를 반환하고, endsWith는 끝나면 true를 반환한다.&lt;/p&gt;
&lt;pre id=&quot;code_1656487605372&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'Red Dragon'.startsWith('Dragon') //false
'Red Dragon'.endsWith('Dragon') //true&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문자열 분해&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문자열을 여러 부분으로 나누기 위해 .split(separator)를 사용할 수 있다. separator를 입력받으면 부분 문자열 배열(Arr)를 생성한다.&lt;/p&gt;
&lt;pre id=&quot;code_1656487757095&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;'chicken,cow,pig'.split(&quot;,&quot;); // [&quot;chicken&quot;, &quot;cow&quot;, &quot;pig&quot;]
'chicken'.split(&quot;&quot;); // [&quot;c&quot;, &quot;h&quot;, &quot;i&quot;, &quot;c&quot;, &quot;k&quot;, &quot;e&quot;, &quot;n&quot;]&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문자열 바꾸기&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.replace(string, replaceString) 문자열 변수 내에 특정 문자열을 다른 문자열로 대체할 수 있다.&lt;/p&gt;
&lt;pre id=&quot;code_1656487823698&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&quot;Red Dragon&quot;.replace(&quot;Red&quot;, &quot;Blue&quot;); // &quot;Blue Dragon&quot;&lt;/code&gt;&lt;/pre&gt;</description>
      <category>cs지식/자료구조</category>
      <category>자료구조</category>
      <author>Eunbae</author>
      <guid isPermaLink="true">https://eunbae11.tistory.com/8</guid>
      <comments>https://eunbae11.tistory.com/entry/%EC%9E%90%EB%A3%8C%EA%B5%AC%EC%A1%B0%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-in-JS1#entry8comment</comments>
      <pubDate>Wed, 29 Jun 2022 16:30:58 +0900</pubDate>
    </item>
    <item>
      <title>OS - 06. Deadlock</title>
      <link>https://eunbae11.tistory.com/entry/OS-06-Deadlock-1</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Preemptable and Nonpreemptable Resources&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이벤트들은 작업에따라 resource를 필요로 한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Request the resource&lt;/li&gt;
&lt;li&gt;Use the resource&lt;/li&gt;
&lt;li&gt;Release the resource&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Resource Acquisition&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 3.27.46.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mEKWL/btrFUMVsXqz/zdjYvVHKnHk4As6mYmbjb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mEKWL/btrFUMVsXqz/zdjYvVHKnHk4As6mYmbjb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mEKWL/btrFUMVsXqz/zdjYvVHKnHk4As6mYmbjb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmEKWL%2FbtrFUMVsXqz%2FzdjYvVHKnHk4As6mYmbjb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;594&quot; height=&quot;257&quot; data-filename=&quot;스크린샷 2022-06-15 오전 3.27.46.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;554&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a: 하나의 리소스를 사용하는 경우. 리소스를 할당받기위해 semaphore을 설정하고 down &amp;gt; use &amp;gt; up을 통해 사용 후 반납한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b: 리소스 2개를 사용하는경우. 리소스를 둘 다 할당받은 후 사용 후 둘 다 반납한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WlUTs/btrFYEPUGoO/IPZ81mk5knkdZo1BK4k9Pk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WlUTs/btrFYEPUGoO/IPZ81mk5knkdZo1BK4k9Pk/img.png&quot; style=&quot;width: 49.9509%; margin-right: 10px;&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;820&quot; data-filename=&quot;스크린샷 2022-06-15 오전 3.30.30.png&quot; data-widthpercent=&quot;50.54&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WlUTs/btrFYEPUGoO/IPZ81mk5knkdZo1BK4k9Pk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWlUTs%2FbtrFYEPUGoO%2FIPZ81mk5knkdZo1BK4k9Pk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;680&quot; height=&quot;820&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccyMvm/btrFUN1bmHC/U1WN1m7Chm1BTYlxwOBmo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccyMvm/btrFUN1bmHC/U1WN1m7Chm1BTYlxwOBmo0/img.png&quot; style=&quot;width: 48.8863%;&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;672&quot; data-origin-height=&quot;828&quot; data-filename=&quot;스크린샷 2022-06-15 오전 3.30.47.png&quot; data-widthpercent=&quot;49.46&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccyMvm/btrFUN1bmHC/U1WN1m7Chm1BTYlxwOBmo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccyMvm%2FbtrFUN1bmHC%2FU1WN1m7Chm1BTYlxwOBmo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;672&quot; height=&quot;828&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a: deadlock free code. 자원의 할당 및 반납순서를 지켜 데드락이 발생하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b: code with a potential deadlock. pA가 resource1을 할당받고 pB가 resource2를 할당받게되면 서로 resource 2,1을 기다리게되므로 데드락이 발생할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 3.32.47.png&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pnhKp/btrFQWLAarL/gyHw7VgQb8Vwk5kKP8AIa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pnhKp/btrFQWLAarL/gyHw7VgQb8Vwk5kKP8AIa1/img.png&quot; data-alt=&quot;Illustation&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pnhKp/btrFQWLAarL/gyHw7VgQb8Vwk5kKP8AIa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpnhKp%2FbtrFQWLAarL%2FgyHw7VgQb8Vwk5kKP8AIa1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;502&quot; height=&quot;259&quot; data-filename=&quot;스크린샷 2022-06-15 오전 3.32.47.png&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;524&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Illustation&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 데드락은 각각의 프로세스가 다른 프로세스의 작업이 수행완료될때까지 기다리는 경우 발생할 수 있다!&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Conditions for Resource Deadlocks&lt;/span&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Mutual exclusion condition&lt;/li&gt;
&lt;li&gt;Hold and wait condition&lt;/li&gt;
&lt;li&gt;No preemption condition&lt;/li&gt;
&lt;li&gt;Circular wait condition&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Deadlock Modeling&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Strategies for deadlock&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Just ignore the problem - 무시한다. 실제로 대부분의 시스템이 사용한다&lt;/li&gt;
&lt;li&gt;Detection and recovery - deadlock을 확인하고 회복한다. 프로세스를 죽여서 할당할 수 있다.&lt;/li&gt;
&lt;li&gt;Dynamic avoidance - deadlock 회피전략.&lt;/li&gt;
&lt;li&gt;Prevention - deadlock일어나는 4가지경우 중 1가지 경우를 아예 없애버린다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Deadlock Detection&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 3.41.05.png&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;574&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vfgYm/btrFT0GGgqu/8WTdx8IRsatJs16Ku1Khv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vfgYm/btrFT0GGgqu/8WTdx8IRsatJs16Ku1Khv0/img.png&quot; data-alt=&quot;Deadlock Detection; with One Resource of Each Type&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vfgYm/btrFT0GGgqu/8WTdx8IRsatJs16Ku1Khv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvfgYm%2FbtrFT0GGgqu%2F8WTdx8IRsatJs16Ku1Khv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;568&quot; height=&quot;270&quot; data-filename=&quot;스크린샷 2022-06-15 오전 3.41.05.png&quot; data-origin-width=&quot;1208&quot; data-origin-height=&quot;574&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Deadlock Detection; with One Resource of Each Type&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 자원이 어디에 할당되어있는지 resource graph를 그려 circle만 남겨서 데드락이 발생하는 b 경우를 파악한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 3.46.16.png&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;858&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EEFJG/btrFQWY7q5O/pR5rkNcbk3oBKcmQQxEet1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EEFJG/btrFQWY7q5O/pR5rkNcbk3oBKcmQQxEet1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EEFJG/btrFQWY7q5O/pR5rkNcbk3oBKcmQQxEet1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEEFJG%2FbtrFQWY7q5O%2FpR5rkNcbk3oBKcmQQxEet1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;625&quot; height=&quot;385&quot; data-filename=&quot;스크린샷 2022-06-15 오전 3.46.16.png&quot; data-origin-width=&quot;1394&quot; data-origin-height=&quot;858&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- P1을 처리하면 사용가능한 자원은 2 3 1 로 p1을 끝낼 수 있다. 하지만 p4를 처리하면 사용 가능한 자원이 0 0 3이 남게되므로 처리가능한 프로세스는 존재하지 않기 때문에 deadlock이 발생한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 이렇게 deadlock이 발생하는 경우를 회피해서 실행 순서를 정할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Recovery from Deadlock&lt;/b&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Recovery through preemption&lt;/li&gt;
&lt;li&gt;Recovery through rollback&lt;/li&gt;
&lt;li&gt;Recovery through killing processes&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;preemption을 뺏거나 프로세스를 rollback, killing하여 자원을 뻇어서 할당함으로써 recovery할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Deadlock Avoidance&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Deadlock을 피해다니면서 할당한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 3.51.05.png&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cX0H8E/btrFY7YGgq2/7WUXdDMdfpMfpPYDX7b0pK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cX0H8E/btrFY7YGgq2/7WUXdDMdfpMfpPYDX7b0pK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cX0H8E/btrFY7YGgq2/7WUXdDMdfpMfpPYDX7b0pK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcX0H8E%2FbtrFY7YGgq2%2F7WUXdDMdfpMfpPYDX7b0pK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;577&quot; height=&quot;342&quot; data-filename=&quot;스크린샷 2022-06-15 오전 3.51.05.png&quot; data-origin-width=&quot;1106&quot; data-origin-height=&quot;656&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 5.24.22.png&quot; data-origin-width=&quot;1172&quot; data-origin-height=&quot;436&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cizWnN/btrFTc8udlD/Z8BOIbjDUCNlsldLol8uM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cizWnN/btrFTc8udlD/Z8BOIbjDUCNlsldLol8uM1/img.png&quot; data-alt=&quot;b의 경우는 C를 끝낼 수 있으므로 deadlock이 발생하지 않지만, c는 끝낼 수 있는 프로세스가 존재하지 않으므로 deadlock이 발생한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cizWnN/btrFTc8udlD/Z8BOIbjDUCNlsldLol8uM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcizWnN%2FbtrFTc8udlD%2FZ8BOIbjDUCNlsldLol8uM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;478&quot; height=&quot;178&quot; data-filename=&quot;스크린샷 2022-06-15 오전 5.24.22.png&quot; data-origin-width=&quot;1172&quot; data-origin-height=&quot;436&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;b의 경우는 C를 끝낼 수 있으므로 deadlock이 발생하지 않지만, c는 끝낼 수 있는 프로세스가 존재하지 않으므로 deadlock이 발생한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Deadlock Prevention&lt;/b&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 3.48.18.png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCg9Xm/btrFZeDqVDa/NNzcXTJTjF1zwXlBhSBwQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCg9Xm/btrFZeDqVDa/NNzcXTJTjF1zwXlBhSBwQ0/img.png&quot; data-alt=&quot;Deadlock Prevention의 접근방법&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCg9Xm/btrFZeDqVDa/NNzcXTJTjF1zwXlBhSBwQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCg9Xm%2FbtrFZeDqVDa%2FNNzcXTJTjF1zwXlBhSBwQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;510&quot; height=&quot;200&quot; data-filename=&quot;스크린샷 2022-06-15 오전 3.48.18.png&quot; data-origin-width=&quot;1092&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Deadlock Prevention의 접근방법&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Attacking Mutual exclusion, Hold and wait, No preemption, Circular wait의 4가지 경우 중 한 경우를 없애버리면 deadlock이 발생하지 않을 수 있다. 이 접근법에는 위의 그림과 같다.&lt;/p&gt;</description>
      <category>cs지식/운영체제</category>
      <category>deadlock</category>
      <category>OS</category>
      <category>운영체제</category>
      <author>Eunbae</author>
      <guid isPermaLink="true">https://eunbae11.tistory.com/27</guid>
      <comments>https://eunbae11.tistory.com/entry/OS-06-Deadlock-1#entry27comment</comments>
      <pubDate>Tue, 28 Jun 2022 14:00:40 +0900</pubDate>
    </item>
    <item>
      <title>OS - 05. Input / Output</title>
      <link>https://eunbae11.tistory.com/entry/OS-05-Input-Output</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Block Device &amp;amp; Character Device&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Block Device&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Read/Write Unit: Block(입출력 단위: Block)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- block마다 주소가 존재하며 HDD, CD-ROM, USB등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Character Device&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Read/Write Unit: Char(입출력 단위: Char)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 각 char는 주소가 없으며 Mouse, Printer, Modem, Keyboard등이 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Device Controllers&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Block Device&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Read/Write Unit: Block(입출력 단위: Block)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- block마다 주소가 존재하며 HDD, CD-ROM, USB등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Device Controller&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 각 device들은 여러 device들을 다루도록 도와주는 device controller가 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- controller는 CPU에 interrupt를 보내거나 block을 bit로 변환하거나 buffer를 관리하는 등의 작업을 수행한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Memory Bus Architecture&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 12.50.49.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CtLRS/btrFT0teFLO/6GEiQ6oGeX2LRIsAcRBZv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CtLRS/btrFT0teFLO/6GEiQ6oGeX2LRIsAcRBZv0/img.png&quot; data-alt=&quot;single bus/ dual bus architecture. dual-bus로 구성하면 전용 버스가 생기므로 메모리 접근 속도가 빨라진다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CtLRS/btrFT0teFLO/6GEiQ6oGeX2LRIsAcRBZv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCtLRS%2FbtrFT0teFLO%2F6GEiQ6oGeX2LRIsAcRBZv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;636&quot; height=&quot;293&quot; data-filename=&quot;스크린샷 2022-06-15 오전 12.50.49.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;single bus/ dual bus architecture. dual-bus로 구성하면 전용 버스가 생기므로 메모리 접근 속도가 빨라진다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Direct Memory Access (DMA)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 12.52.03.png&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;558&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cab1XE/btrFVumJndA/HmTGYHmD23cNfxkj3GEmvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cab1XE/btrFVumJndA/HmTGYHmD23cNfxkj3GEmvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cab1XE/btrFVumJndA/HmTGYHmD23cNfxkj3GEmvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcab1XE%2FbtrFVumJndA%2FHmTGYHmD23cNfxkj3GEmvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;571&quot; height=&quot;267&quot; data-filename=&quot;스크린샷 2022-06-15 오전 12.52.03.png&quot; data-origin-width=&quot;1194&quot; data-origin-height=&quot;558&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램이 디스크로부터 데이터를 읽기 위해서는 CPU와 디스크의 속도차이가 존재하기 때문에 DMA controller를 통해 데이터를 접근한다. CPU가 디스크의 데이터를 읽으려면 DMA Controller에게 주소와 count등의 정보를 넘겨주면 스스로 interrupt한다. DMA Controller는 CPU에게 전달받은 정보를 바탕으로 동작을 수행하여 값을 읽어와 버퍼에 넣는다. 버퍼에 가져온 데이터는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Cycling Stealing(Bus transfer mode)&lt;/span&gt;&lt;/b&gt;을 통해 CPU-Memory간의 버스를 이용하여 메인 메모리에 데이터를 copy한다. 작업이 완료되었다면 CPU는 꺠어나 메인 메모리의 데이터를 이용하여 작업을 계속 수행한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Interrupts Revisited&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bus에 interrupt 라인이 존재하여 CPU에 신호를 보낼 수 있으며 CPU는 신호를 받으면 현재 실행하는 명령까진 실행 한 후 멈추고 다른작업을 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 1.00.35.png&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;484&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ItQbK/btrFT1MmauY/MKxknsstXiAqqM3kjanyKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ItQbK/btrFT1MmauY/MKxknsstXiAqqM3kjanyKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ItQbK/btrFT1MmauY/MKxknsstXiAqqM3kjanyKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FItQbK%2FbtrFT1MmauY%2FMKxknsstXiAqqM3kjanyKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;573&quot; height=&quot;241&quot; data-filename=&quot;스크린샷 2022-06-15 오전 1.00.35.png&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;484&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;interrupt controller는 I/O device의 작업이 수행이 끝나면&lt;/li&gt;
&lt;li&gt;CPU에 interrupt를 발생시킨다.&lt;/li&gt;
&lt;li&gt;CPU는 interrupt가 끝났다는 신호를 보낸다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Precise and Imprecise Interrupts&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;precise interrupt의 속성&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt; PC(Program Counter)는 알려진 장소에서 저장되어야한다.&lt;/li&gt;
&lt;li&gt;PC이전에는 모두(fully) 실행되어야한다.&lt;/li&gt;
&lt;li&gt;PC 이후는 하나도 실행되지 않은 상태여야한다.&lt;/li&gt;
&lt;li&gt;PC가 가리키는 위치는 정확히 알아야한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Precise interrupt - PC 이전에는 모두 실행되며 이후에는 한개도 실행되지 않은 상태.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- imprecise interrupt - 아주 많은 명령이 조금씩 실행된 상태. 이 상태를 그대로 저장 및 복구해서 실행하는것은 어렵기 때문에 현실은 a방식으로 동작하게 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Goal of I/O Software&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 1.11.10.png&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bFiJYh/btrFZk4wLJb/o1KzUolqOZez2DrRPGZeh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bFiJYh/btrFZk4wLJb/o1KzUolqOZez2DrRPGZeh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bFiJYh/btrFZk4wLJb/o1KzUolqOZez2DrRPGZeh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbFiJYh%2FbtrFZk4wLJb%2Fo1KzUolqOZez2DrRPGZeh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;288&quot; height=&quot;259&quot; data-filename=&quot;스크린샷 2022-06-15 오전 1.11.10.png&quot; data-origin-width=&quot;564&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Device Independency&amp;nbsp;&lt;/b&gt;: 각 device는 독립적이어야한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Uniform Naming&amp;nbsp;&lt;/b&gt;: 디바이스마다 이름이 지정되어야한다.(OS가 해준다)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Error Handling&amp;nbsp;&lt;/b&gt;: 버퍼또는 메모리가 없는경우 등에는 에러처리를 해야한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Synchronous vs asynchronous&amp;nbsp;&lt;/b&gt;: 동기적으로 처리(입력후멈추고 하나씩 처리되기를 기다림)하면 속도가 느려지므로 디바이스는 대부분 비동기적인 방식을 사용한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Buffering&amp;nbsp;&lt;/b&gt;: 디바이스의 데이터는 OS 내부의 버퍼로 데이터를 가져와서 프로그램(CPU)에 copy하여 전해진다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Sharable vs dedicated devices&amp;nbsp;&lt;/b&gt;: disk는 공유가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Buffering&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 1.45.14.png&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;488&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JxpCk/btrFY8J3ud0/vmZWonlEVOkKtkCh06gwEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JxpCk/btrFY8J3ud0/vmZWonlEVOkKtkCh06gwEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JxpCk/btrFY8J3ud0/vmZWonlEVOkKtkCh06gwEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJxpCk%2FbtrFY8J3ud0%2FvmZWonlEVOkKtkCh06gwEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;547&quot; height=&quot;279&quot; data-filename=&quot;스크린샷 2022-06-15 오전 1.45.14.png&quot; data-origin-width=&quot;956&quot; data-origin-height=&quot;488&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;user space의 데이터를 OS의 버퍼로 옮기고, DMA회로를 통해 네트워크 컨트롤러 카드의 버퍼로 옮긴다. 이 데이터를 네트워크를 통해 전송한 뒤 반대의 과정이 일어난다. 5번의 많은 copy가 발생한다!&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Magnetic Disks&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 2.17.19.png&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;554&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wqBpT/btrFYw5tFLR/gvcJQAmvstynHAX7EynVh0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wqBpT/btrFYw5tFLR/gvcJQAmvstynHAX7EynVh0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wqBpT/btrFYw5tFLR/gvcJQAmvstynHAX7EynVh0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwqBpT%2FbtrFYw5tFLR%2FgvcJQAmvstynHAX7EynVh0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;401&quot; height=&quot;281&quot; data-filename=&quot;스크린샷 2022-06-15 오전 2.17.19.png&quot; data-origin-width=&quot;790&quot; data-origin-height=&quot;554&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RAID(Redundant Array of Independent Disk)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Data를 strip단위로 쪼개어 여러개의 디스크를 하나의 디스크처럼 사용하기위해 묶어주는 방법이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b73eKY/btrFZpEHLmm/SMcgEtMeEzKFumBO18a3o0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b73eKY/btrFZpEHLmm/SMcgEtMeEzKFumBO18a3o0/img.png&quot; style=&quot;width: 59.1415%; margin-right: 10px;&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;630&quot; data-filename=&quot;스크린샷 2022-06-15 오전 2.19.11.png&quot; data-widthpercent=&quot;59.84&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b73eKY/btrFZpEHLmm/SMcgEtMeEzKFumBO18a3o0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb73eKY%2FbtrFZpEHLmm%2FSMcgEtMeEzKFumBO18a3o0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1002&quot; height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ueDe0/btrFZdEvG80/yPDliwIHKuKpqMH15Vou3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ueDe0/btrFZdEvG80/yPDliwIHKuKpqMH15Vou3K/img.png&quot; style=&quot;width: 39.6957%;&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;664&quot; data-origin-height=&quot;622&quot; data-filename=&quot;스크린샷 2022-06-15 오전 2.19.18.png&quot; data-widthpercent=&quot;40.16&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ueDe0/btrFZdEvG80/yPDliwIHKuKpqMH15Vou3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FueDe0%2FbtrFZdEvG80%2FyPDliwIHKuKpqMH15Vou3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;664&quot; height=&quot;622&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a: RAID level 0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b: RAID level 1, 왼쪽의 disk strip들을 그대로 오른쪽에 복제하여 저장하는 방법이다.(미러링) 하지만 이 방법은 비용이 증가할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c: RAID level 2, bit 1~4를 fraction하여 저장한다. 만약 bit4가 고장났다면 1~3과 5~7을 읽어 복구할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d: RAID level 3, 4bit를 쪼개서 parity를 적는다. 만약 bit4가 고장났다면 나머지 bit와 parity를 읽어서 복구할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;e: RAID level 4, strip 0~3으로 나누어 parity를 strip 묶음마다 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;f: RAID level 5, level 4에서 parity disk는 자주 참조될 수 있으므로 여기에 parity를 분산하여 저장한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Disk Formatting&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 2.35.31.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJ5MW5/btrFWyCHHVE/9OXo7jkpmeIWoS6w8Rjop0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJ5MW5/btrFWyCHHVE/9OXo7jkpmeIWoS6w8Rjop0/img.png&quot; data-alt=&quot;b: single interleaving. c: double interleaving&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJ5MW5/btrFWyCHHVE/9OXo7jkpmeIWoS6w8Rjop0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJ5MW5%2FbtrFWyCHHVE%2F9OXo7jkpmeIWoS6w8Rjop0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;635&quot; height=&quot;183&quot; data-filename=&quot;스크린샷 2022-06-15 오전 2.35.31.png&quot; data-origin-width=&quot;1200&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;b: single interleaving. c: double interleaving&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; &lt;span style=&quot;color: #ee2323;&quot;&gt;interleaving&lt;/span&gt;: 만약 0번 섹터를 읽고 바로 다음 1번섹터에 쓸려면 디스크가 돌아가 지나치게되어 한바퀴를 더 돌고 써야한다. 이를 방지하기위해 연속 섹터에 간격을 주어 1칸 또는 2칸씩 떨어뜨리는 방법을 사용할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;Disk Arm Scheduling&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Algorithms&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Read/write&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;time factors&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Seek time&lt;/li&gt;
&lt;li&gt;Rotational delay&lt;/li&gt;
&lt;li&gt;Actual data transfer time&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Seek time dominates&lt;/li&gt;
&lt;li&gt;Error checking is done by controllers&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;First-in, first-out (FIFO)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요청이 도착한 순서대로 실행하는 방법이다. 실린더 번호 순서대로 요청이 처리된다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 2.41.45.png&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpnyDB/btrFTcUXo7f/WCTKGIXrsGQVwbvzxUgj01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpnyDB/btrFTcUXo7f/WCTKGIXrsGQVwbvzxUgj01/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpnyDB/btrFTcUXo7f/WCTKGIXrsGQVwbvzxUgj01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpnyDB%2FbtrFTcUXo7f%2FWCTKGIXrsGQVwbvzxUgj01%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;425&quot; height=&quot;169&quot; data-filename=&quot;스크린샷 2022-06-15 오전 2.41.45.png&quot; data-origin-width=&quot;880&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Shortest Service Time First&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현재 헤드 위치에서 가장 가까운것을 읽는 방법이다. 다만 이 방법은 현재 헤드 위치와 먼 요청은 starvation이 일어날 수 있다는 문제가 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 2.42.26.png&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2j8gW/btrFXY2g30u/Y4adgPfm1xBL9KWl4NSVXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2j8gW/btrFXY2g30u/Y4adgPfm1xBL9KWl4NSVXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2j8gW/btrFXY2g30u/Y4adgPfm1xBL9KWl4NSVXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2j8gW%2FbtrFXY2g30u%2FY4adgPfm1xBL9KWl4NSVXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;459&quot; height=&quot;180&quot; data-filename=&quot;스크린샷 2022-06-15 오전 2.42.26.png&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;SCAN or elevator algorithm&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;헤드의 트랙의 방향을 정한 후 더이상 처리할게 없으면 방향을 바꾸어 처리한다. 엘리베이터와 똑같이 작동하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; starvation이 없다! 요청들의 바깥쪽,안쪽과 중간부분의 서비스타임 편차가 존재한다(가운데 부분이 가장 서비스 많이됨)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 2.44.49.png&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;346&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/S2pv8/btrFZfvy186/BRdyey16X7rTs3CK0JmFN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/S2pv8/btrFZfvy186/BRdyey16X7rTs3CK0JmFN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/S2pv8/btrFZfvy186/BRdyey16X7rTs3CK0JmFN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FS2pv8%2FbtrFZfvy186%2FBRdyey16X7rTs3CK0JmFN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;520&quot; height=&quot;187&quot; data-filename=&quot;스크린샷 2022-06-15 오전 2.44.49.png&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;346&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;C-SCAN (Circular-SCAN)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;헤드가 양 방향으로 움직이지않고 오직 한 방향으로 움직이는 방식이다. 번호가 큰쪽으로 헤드가 이동하고, 끝까지 읽으면 다시 처음 0번부터 헤드를 빠르게 움직인 다음 서비스한다. 입출력요청이 많은 시스템에서 헤드가 움직이면 운이 좋은 트랙은 바로 서비스되지만 운이 나쁜 트랙은 (헤드가 떠난 다음 요청) 서비스 시간이 오래걸린다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 2.46.50.png&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdXyHG/btrFY6ZLip0/GVMj18hnJJiTcrAt3H2PV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdXyHG/btrFY6ZLip0/GVMj18hnJJiTcrAt3H2PV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdXyHG/btrFY6ZLip0/GVMj18hnJJiTcrAt3H2PV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdXyHG%2FbtrFY6ZLip0%2FGVMj18hnJJiTcrAt3H2PV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;529&quot; height=&quot;190&quot; data-filename=&quot;스크린샷 2022-06-15 오전 2.46.50.png&quot; data-origin-width=&quot;974&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;N-step-SCAN&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Queue가 여러개 존재한다. 한 큐에는 최대 N개까지 요청이 오며, C-SCAN으로 가면서 큐마다 처리한다. (N개의 요청 안에서만 편차-운이 좋고 나쁜 시스템이 존재한다)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;FSCAN&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Queue를 2개 사용한다. 한번 서비스를 시작했으면 이 후에 서비스 요청이 왔다면 다른 큐에 매달리고, 한 큐가 끝나면 다른 큐를 서비스하며 번갈아가며 실행한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Error Handling&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 2.48.48.png&quot; data-origin-width=&quot;1224&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nUxQw/btrFY84mg5W/5eRadrDP0RclON5BYB5VIK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nUxQw/btrFY84mg5W/5eRadrDP0RclON5BYB5VIK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nUxQw/btrFY84mg5W/5eRadrDP0RclON5BYB5VIK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnUxQw%2FbtrFY84mg5W%2F5eRadrDP0RclON5BYB5VIK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;602&quot; height=&quot;219&quot; data-filename=&quot;스크린샷 2022-06-15 오전 2.48.48.png&quot; data-origin-width=&quot;1224&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 트랙마다 spare 섹터가 존재하여서 Bad sector가 있다면 이 공간으로 교체한다.(b) 또는 한 섹터씩 미뤄서 섹터를 연속적으로 만들 수도 있다.(c)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Stable Storage&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 2.50.59.png&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;442&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSuuNQ/btrFXYgPbsP/ZMlUiEmgPgKvknKwueI3h0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSuuNQ/btrFXYgPbsP/ZMlUiEmgPgKvknKwueI3h0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSuuNQ/btrFXYgPbsP/ZMlUiEmgPgKvknKwueI3h0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSuuNQ%2FbtrFXYgPbsP%2FZMlUiEmgPgKvknKwueI3h0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;556&quot; height=&quot;203&quot; data-filename=&quot;스크린샷 2022-06-15 오전 2.50.59.png&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;442&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b: ECC error(변경하다 죽음) ~ crash가 발생하면 a상태로 복구하고, crash가 발생하지 않으면 c상태가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;d: 마찬가지로 crash가 발생하면 1번 disk를 copy하여 e상태가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(새로운 데이터를 기록하다가 crash가 나면 나중에 데이터를 읽어보다가 ECC에 에러를 확인한다.)&lt;/p&gt;</description>
      <category>cs지식/운영체제</category>
      <category>I/O</category>
      <category>OS</category>
      <category>운영체제</category>
      <author>Eunbae</author>
      <guid isPermaLink="true">https://eunbae11.tistory.com/26</guid>
      <comments>https://eunbae11.tistory.com/entry/OS-05-Input-Output#entry26comment</comments>
      <pubDate>Tue, 28 Jun 2022 13:58:17 +0900</pubDate>
    </item>
    <item>
      <title>OS - 04. File systems (2)</title>
      <link>https://eunbae11.tistory.com/entry/OS-04-File-systems-2-1</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;File System Backups&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백업은 disaster(재난), stupidity(실수)에 의한 Recover(복구)하기위해 사용되는 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Backup Type에는 Physical Dump, Logical Dump가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Physical Dump&lt;/b&gt;: 하드디스크 등을 끝까지 통채로 tape에 copy하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Logical Dump&lt;/b&gt;: tree등을 순회하며 파일들을 copy하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- Complete Dump: 파일들을 통채로 copy한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;- Incremental Dump: 마지막 dump이후 변경된 파일만 copy한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 10.54.44.png&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cH9nmi/btrFYxDgLZP/PXjCv0oqdKiicdC53IkeD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cH9nmi/btrFYxDgLZP/PXjCv0oqdKiicdC53IkeD1/img.png&quot; data-alt=&quot;색칠된 부분이 dump(작업중이던 메모리 상태를 저장)할 부분. 색칠 부분의 상위 directory도 dump해야한다. (1, 5, 6, 7, ...)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cH9nmi/btrFYxDgLZP/PXjCv0oqdKiicdC53IkeD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcH9nmi%2FbtrFYxDgLZP%2FPXjCv0oqdKiicdC53IkeD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;556&quot; height=&quot;282&quot; data-filename=&quot;스크린샷 2022-06-14 오후 10.54.44.png&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;색칠된 부분이 dump(작업중이던 메모리 상태를 저장)할 부분. 색칠 부분의 상위 directory도 dump해야한다. (1, 5, 6, 7, ...)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Other considerations&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Recovery from Backup&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 마지막으로 dump된 지점에서 복구하는 방법이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Problems of logical dump ~ 문제점&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: File links는 두번 dump된다.(backup 프로그램은 둘 다 오리지널이므로 구분할 수 없다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; UNIX files에서는 할당되지 않은 블록의 데이터(data block이 없으면 OS는 모두 0으로 채워서 반환함)도 모두 copy하여 백업 용량이 커진다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;File system consistency&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- multiple block을 업데이트 할 때 또는 system crash(전기 x)가 일어날 때 일관성에 문제가 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- File system consistency를 유지하는 Utility에는 UNIX: fsck, Windows: scandisk가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 많은 현대 파일 시스템은 빠른 일관성 회복을 위해 journaling scheme을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; font-size: 1.62em; letter-spacing: -1px; font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif;&quot;&gt;Increasing file system performance&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* Caching&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;: buffer cache or block cache&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt; - Replacement Policy: LRU, Second Chance, FIFO or others&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Meta-data는 일관성유지를 위해 쓰여진 즉시 읽혀야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- MS-DOS: Write-through (변경되면 즉시 캐시와 disk에 기록), UNIX: Write-back (변경되면 캐시에만 기록, 나중에(30초 간격으로) 한번에 disk에 기록)&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* Read-ahead&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: sequential하게 읽어서 앞부분을 읽으면 다음 부분을 OS가 미리 캐시에 넣어둔다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;b&gt;*&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;Reducing disk arm movement&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;&lt;b&gt;*&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;Disk defragmentation&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Caching&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 11.46.20.png&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqaqOI/btrFXXPKb2q/k2XkunggRiPTkqHvDn9D3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqaqOI/btrFXXPKb2q/k2XkunggRiPTkqHvDn9D3k/img.png&quot; data-alt=&quot;buffer cache data structure&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqaqOI/btrFXXPKb2q/k2XkunggRiPTkqHvDn9D3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqaqOI%2FbtrFXXPKb2q%2Fk2XkunggRiPTkqHvDn9D3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;608&quot; height=&quot;210&quot; data-filename=&quot;스크린샷 2022-06-14 오후 11.46.20.png&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;buffer cache data structure&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Hash table을 사용하여 캐시를 추적한다. head들이 linked list로 연결되어있다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;gt; 만약 10번 블록을 찾는다하면 Hash table을 사용하여 캐시를 추적하여 캐시에 존재하면 바로 참조하고, 존재하지 않으면 disk에서 찾아서 캐시에 넣고 return한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- i-node블록과 같은 경우는 드물게 짧은 간격에 두번 참조될 수 있다..??&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 교체정책으로 LRU를 사용하며 영화 데이터같은 경우 순서상 한번만 참조될 것 같으면 MRU말고 LRU에 넣는다. 또 Meta data는 빨리 sync해서 찾아야하고 자주 참조될 데이터는 오래 가지고 있는다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Reducing Disk Arm Motion&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Disk Arm(Head)의 움직임을 최소화하자는것이 목표.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Disk Partition에는 Cylinder Group이 존재하고, 한 그룹내에는 Super block(파일 시스템 전체정보), Group descriptor(Group에 대한 정보~어디서 어디까지 i-node인지 등) 등이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 한 파일이 한 그룹에서 일정 개수이상 차지하면 인접 Group에 할당하도록(독차지하지 못하도록) 설계되어있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 11.55.29.png&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGu4HL/btrFUU7wuul/HlRS8JoCJCJ63XAu2tuIJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGu4HL/btrFUU7wuul/HlRS8JoCJCJ63XAu2tuIJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGu4HL/btrFUU7wuul/HlRS8JoCJCJ63XAu2tuIJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGu4HL%2FbtrFUU7wuul%2FHlRS8JoCJCJ63XAu2tuIJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;636&quot; height=&quot;312&quot; data-filename=&quot;스크린샷 2022-06-14 오후 11.55.29.png&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a: i-node들이 disk의 처음부분부터 적혀져있다. 이 방식은 디스크 헤드의 움직임이 많아지고, 안정성도 떨어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b: i-node들이 disk의 인접 실린더 그룹에 묶여 적혀있다. 이 방식은 헤드의 움직임이 작아 성능이 높고, 안정성도 높다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;File system의 변천&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;The ISO 9660 File system&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 11.58.13.png&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7h3Vd/btrFUS9KmOr/vHQ9HsNv821bA4lC8CAn61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7h3Vd/btrFUS9KmOr/vHQ9HsNv821bA4lC8CAn61/img.png&quot; data-alt=&quot;ISO 9660 directory entry&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7h3Vd/btrFUS9KmOr/vHQ9HsNv821bA4lC8CAn61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7h3Vd%2FbtrFUS9KmOr%2FvHQ9HsNv821bA4lC8CAn61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;727&quot; height=&quot;159&quot; data-filename=&quot;스크린샷 2022-06-14 오후 11.58.13.png&quot; data-origin-width=&quot;1220&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ISO 9660 directory entry&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; CD ROM File System이며, CD ROM은 연속적이므로 start block과 file size만 적혀있으면 된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Rock Ridge Extensions&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UNIX에서 만든 CD ROM의 확장판. fields를 확장하였다. (여러 타입 추가, 속성 및 location등의 값 추가)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Joliet Extension&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MS에서 만든 확장판. 파일 이름을 길게하고 dir 이름을 더 길게 할 수 있는 등으로 확장되었다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;File Access Control&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;허가없이 다른 사용자의 파일 접근을 못하도록 파일 접근 권한을 관리해야한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Access Control Matrix&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;access에 대한 정보를 담은 File과 User에 대한 행렬. &lt;span style=&quot;color: #000000;&quot;&gt;파일 시스템이 이 matrix를 보고 권한허용여부를 결정한다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Access Control   List&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일단위로 축소하여 파일마다 권한을 다 적어놓는다. UNIX가 이를 약간 변형하여 사용하였다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Capability List&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자를 기준으로 파일 권한에 대하여 적어놓는다. 파일 시스템에선 사용되기 어려우며 로그인, 네트워크 등의 유저권한이 중요한 부분에서 사용중인 방식이다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;File System Layout&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;MS-DOS FAT File System&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 12.06.30.png&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xiYzv/btrFXXvsrkQ/nIvXGpkpcHtig3Dk2Lket0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xiYzv/btrFXXvsrkQ/nIvXGpkpcHtig3Dk2Lket0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xiYzv/btrFXXvsrkQ/nIvXGpkpcHtig3Dk2Lket0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxiYzv%2FbtrFXXvsrkQ%2FnIvXGpkpcHtig3Dk2Lket0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;414&quot; height=&quot;263&quot; data-filename=&quot;스크린샷 2022-06-15 오전 12.06.30.png&quot; data-origin-width=&quot;1006&quot; data-origin-height=&quot;638&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;long file name방식(다른 블록에 file name을 적는 방식)은 특허가 있어 다른 시스템에서는 사용하지 못한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;UNIX V7 File System&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 12.09.02.png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;680&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bllpKq/btrFUTU6c2C/5T8ltGAhPTgAzVL2R8RTqk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bllpKq/btrFUTU6c2C/5T8ltGAhPTgAzVL2R8RTqk/img.png&quot; data-alt=&quot;UNIX는 i-node로 block을 관리한다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bllpKq/btrFUTU6c2C/5T8ltGAhPTgAzVL2R8RTqk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbllpKq%2FbtrFUTU6c2C%2F5T8ltGAhPTgAzVL2R8RTqk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;424&quot; height=&quot;264&quot; data-filename=&quot;스크린샷 2022-06-15 오전 12.09.02.png&quot; data-origin-width=&quot;1094&quot; data-origin-height=&quot;680&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;UNIX는 i-node로 block을 관리한다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>cs지식/운영체제</category>
      <category>File Systems</category>
      <category>OS</category>
      <category>운영체제</category>
      <author>Eunbae</author>
      <guid isPermaLink="true">https://eunbae11.tistory.com/25</guid>
      <comments>https://eunbae11.tistory.com/entry/OS-04-File-systems-2-1#entry25comment</comments>
      <pubDate>Tue, 28 Jun 2022 13:54:05 +0900</pubDate>
    </item>
    <item>
      <title>OS - 04. File systems (1)</title>
      <link>https://eunbae11.tistory.com/entry/OS-04-File-systems-1</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;File Systems&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Requirements for long-term information storage&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;많은 양의 정보를 저장할 수 있어야한다.&lt;/li&gt;
&lt;li&gt;process가 종료되더라도 정보는 남아있어야한다(비휘발성)&lt;/li&gt;
&lt;li&gt;다수의 process가 동시에 공유 혹은 접근할 수 있어야한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;File &amp;amp; File system&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;File&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 저장공간에 데이터 저장시 저장되는 가장 기본단위이다.(파일 단위로 저장한다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- byte들의 연속 (OS는 파일 안의 데이터는 관심없고 byte들의 연속이라 생각한다!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 유저에 의해 하나의 단위(single entity)로 취급된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 유일한 path name을 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 접근 권한이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;File system&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일과 관련된 서비스를 유저에게 제공하는 system software&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;File Naming&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.c .gif .pdf .tex .txt .zip 등등의 파일 확장자를 설정할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;File Structure&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 7.03.50.png&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;700&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SnTN9/btrFVvsnM55/iAKgikaTT7oJRkBYexOqtK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SnTN9/btrFVvsnM55/iAKgikaTT7oJRkBYexOqtK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SnTN9/btrFVvsnM55/iAKgikaTT7oJRkBYexOqtK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSnTN9%2FbtrFVvsnM55%2FiAKgikaTT7oJRkBYexOqtK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;489&quot; height=&quot;226&quot; data-filename=&quot;스크린샷 2022-06-14 오후 7.03.50.png&quot; data-origin-width=&quot;1512&quot; data-origin-height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a: 바이트 순서로 나타낸 파일구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b: 레코드 순서로 나타낸 파일구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c: 트리로 나타낸 파일구조&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;File Types&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;OS는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;실행파일을 제외하고 모든 파일의 내용은 신경쓰지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Text: 프로그램 실행 코드&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Data: 초기화된 데이터&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;File Attributes(속성)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Protection: 접근 권한!!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Record length: file size를 나타내며 항상 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Time of last access / change: 파일이 마지막으로 접근 혹은 변경된 시각&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;File Access Semantic(접근 방식)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Sequential Access&lt;br /&gt;: 대부분의 파일 접근방식. 파일을 순차적으로 접근한다.&lt;/li&gt;
&lt;li&gt;Direct(Random) Access: Method 1&lt;br /&gt;- id = open(file)&lt;br /&gt;- pread(id, &amp;amp;buf, from, rwbytes)&lt;br /&gt;: 파일에 번호를 주고 어디서부터 몇 bytes를 버퍼에서 읽어달라고 요청하는 방식&lt;/li&gt;
&lt;li&gt;Direct(Random) Access: Method 2&lt;br /&gt;- id = open(file)&lt;br /&gt;- lseek(id, SEET_SET, from)&lt;br /&gt;- read(id, &amp;amp;buf, rwbytes)&lt;br /&gt;: r/w pointer를 세팅하고(lseek), r/w하면 눈에보이지 않는 r/w pointer가 자동으로 증가하며 접근하는 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Method 2 방식을 프로세스 안에 쓰레드가 1개만 있을때 예전부터 사용해왔지만, 쓰레드가 여러개가 되면서 하나가 파일을 r/w하면 다른 쓰레드는 그 사실을 모르므로 Method 1방식의 pread가 도입되었다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;File Sharing Semantic&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 여러개의 process가 하나의 파일을 r/w하려 하려면 권한 허용이 필요하다! (아니면 lock이 필요하다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파일을 write했을 때 다른 프로세스에 영향이 가는 시기&lt;br /&gt;UNIX: 즉시 새로운 데이터 반영, Andrew File System(분산시스템, 서버 등): 파일이 closed된 이후에 반영&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;File Operations&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 7.17.56.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k06AI/btrFY7dg7Cm/kadddGbCKubPEXaEQC4k8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k06AI/btrFY7dg7Cm/kadddGbCKubPEXaEQC4k8K/img.png&quot; data-alt=&quot;files과 관련된 common system calls&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k06AI/btrFY7dg7Cm/kadddGbCKubPEXaEQC4k8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk06AI%2FbtrFY7dg7Cm%2FkadddGbCKubPEXaEQC4k8K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;380&quot; height=&quot;169&quot; data-filename=&quot;스크린샷 2022-06-14 오후 7.17.56.png&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;files과 관련된 common system calls&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Directory(Folder)&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Hierarchical(계층적) Directory Systems&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n3uCT/btrFWdrtZxf/llB06PrBjkBS5x6aeunK3K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n3uCT/btrFWdrtZxf/llB06PrBjkBS5x6aeunK3K/img.png&quot; style=&quot;width: 42.7334%; margin-right: 10px;&quot; width=&quot;292&quot; height=&quot;229&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;884&quot; data-origin-height=&quot;694&quot; data-filename=&quot;스크린샷 2022-06-14 오후 7.21.42.png&quot; data-widthpercent=&quot;43.24&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n3uCT/btrFWdrtZxf/llB06PrBjkBS5x6aeunK3K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn3uCT%2FbtrFWdrtZxf%2FllB06PrBjkBS5x6aeunK3K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;884&quot; height=&quot;694&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uZXQp/btrFVUsoPb4/mqOKjFMsI1FSACqNvJyJvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uZXQp/btrFVUsoPb4/mqOKjFMsI1FSACqNvJyJvk/img.png&quot; style=&quot;width: 56.1039%;&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1184&quot; data-origin-height=&quot;708&quot; data-filename=&quot;스크린샷 2022-06-14 오후 7.21.48.png&quot; data-widthpercent=&quot;56.76&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uZXQp/btrFVUsoPb4/mqOKjFMsI1FSACqNvJyJvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuZXQp%2FbtrFVUsoPb4%2FmqOKjFMsI1FSACqNvJyJvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1184&quot; height=&quot;708&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우: 계층적 directory구조. 아래의 파일이 위의 파일을 가리킬 수 없다. (Loop x)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;File Name and Path Name&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 9.12.28.png&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;712&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMRtxT/btrFWzn3xLi/uvD8LpWGdAHL7bWuKKWGFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMRtxT/btrFWzn3xLi/uvD8LpWGdAHL7bWuKKWGFK/img.png&quot; data-alt=&quot;UNIX directory tree&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMRtxT/btrFWzn3xLi/uvD8LpWGdAHL7bWuKKWGFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMRtxT%2FbtrFWzn3xLi%2FuvD8LpWGdAHL7bWuKKWGFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;448&quot; height=&quot;392&quot; data-filename=&quot;스크린샷 2022-06-14 오후 9.12.28.png&quot; data-origin-width=&quot;814&quot; data-origin-height=&quot;712&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;UNIX directory tree&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Absolute path(절대경로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Root Directory에서 본 path.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;절대경로의 path는 항상 unique해야한다!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;Relative path(상대경로)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 현재 작동중인 디렉토리에서부터 본 path&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Directory Operations&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;directory들을 관리하는 System calls.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 9.20.46.png&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lmFe9/btrFY6ZIy6f/UFyz1zsUoyJ9qCWSicHLR1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lmFe9/btrFY6ZIy6f/UFyz1zsUoyJ9qCWSicHLR1/img.png&quot; data-alt=&quot;mkdir, link: 파일이름을 link라 본다.(파일 삭제시 unlink)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lmFe9/btrFY6ZIy6f/UFyz1zsUoyJ9qCWSicHLR1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlmFe9%2FbtrFY6ZIy6f%2FUFyz1zsUoyJ9qCWSicHLR1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;370&quot; height=&quot;126&quot; data-filename=&quot;스크린샷 2022-06-14 오후 9.20.46.png&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;mkdir, link: 파일이름을 link라 본다.(파일 삭제시 unlink)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;File System Layout&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 9.21.53.png&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpzBFi/btrFUUl9ftD/zaRKREJRRV89oPMv1yRhnk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpzBFi/btrFUUl9ftD/zaRKREJRRV89oPMv1yRhnk/img.png&quot; data-alt=&quot;전체 Entire 하드디크스 block을 쭉 펴서 생각한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpzBFi/btrFUUl9ftD/zaRKREJRRV89oPMv1yRhnk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpzBFi%2FbtrFUUl9ftD%2FzaRKREJRRV89oPMv1yRhnk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;611&quot; height=&quot;221&quot; data-filename=&quot;스크린샷 2022-06-14 오후 9.21.53.png&quot; data-origin-width=&quot;978&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;전체 Entire 하드디크스 block을 쭉 펴서 생각한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- MBR: Mast Boot Record, 이곳의 Boot code는 partition table을 보고 Boot Block으로 jump동작을 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- disk partition을 4개로 쪼개서 사용하며 Superblock에는 전체 형상정보가 답겨있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Free space mgmt(management)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;File allocation methods&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떻게 파일에 할당된 데이터 블록을 관리할까?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Contiguous allocation(연속적 할당)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 파일 생성시  블록들이 연속적으로 할당된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Chained allocation&lt;/b&gt;: non-contiguous allocation(불연속적)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 다음 블록을 가리키는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;pointer&lt;/b&gt;가 포함된 chain으로 block이 연결되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;- Indexed allocation&lt;/b&gt;: non-contiguous allocation(불연속적)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Index block&lt;/b&gt;이 파일의 data block list를 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Contiguous allocation&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 9.28.51.png&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;542&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0Q0T8/btrFVwdKUvR/nZZBUwolWPLlrAMtvHvlUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0Q0T8/btrFVwdKUvR/nZZBUwolWPLlrAMtvHvlUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0Q0T8/btrFVwdKUvR/nZZBUwolWPLlrAMtvHvlUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0Q0T8%2FbtrFVwdKUvR%2FnZZBUwolWPLlrAMtvHvlUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;485&quot; height=&quot;306&quot; data-filename=&quot;스크린샷 2022-06-14 오후 9.28.51.png&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;542&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;각 데이터 블록에 번호가 존재하며, block개수는 byte크기로 존재한다.&amp;nbsp;&lt;b&gt;이 byte크기를 알면 block의 개수를 알 수 있다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;만약 File C를 요청하면 8번 block부터 8개의 block을 return한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 만약 File A와 B가 삭제되어 각각 5개와 6개의 Free block이 생겼는데, 이 Free block에는 7개 이상의 block을 사용하는 File을 만들지 못한다는 단점이 있다. 보통 CD ROM에서 많이 사용되는 방식이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt; Linked List (Chained) allocation&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 9.33.14.png&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HYTWv/btrFVh2sU8j/fy5Nbi7u2heeZt5126fkkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HYTWv/btrFVh2sU8j/fy5Nbi7u2heeZt5126fkkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HYTWv/btrFVh2sU8j/fy5Nbi7u2heeZt5126fkkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHYTWv%2FbtrFVh2sU8j%2Ffy5Nbi7u2heeZt5126fkkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;488&quot; height=&quot;309&quot; data-filename=&quot;스크린샷 2022-06-14 오후 9.33.14.png&quot; data-origin-width=&quot;860&quot; data-origin-height=&quot;544&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;File B를 읽으려면 1번 block부터 다음 블록번호인 8, 3, 14, 28번을 읽으면 끝난다. 만약 다음 블록번호가 -1이면 끝이라는 뜻이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법은 block은 next block(meta data) + data(file data)이므로 2^n byte가 최적인 데이터가 아니며, 14번 block을 찾으려면 File B의 1번 block부터 3번 읽어야 하므로 바로 찾기(&lt;b&gt;random access&lt;/b&gt;)가&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;불가능&lt;/b&gt;하므로 좋지 않은 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #777777;&quot;&gt;physical block에는 다음 block번호가 적혀있으며 파일을 읽을때 이를 Link하여 읽을 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt; Linked List (Chained) allocation Using a Table in Memory&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;next block pointer만 한곳에 모아 관리하도록 하는 방법&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 9.38.37.png&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;508&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cItq7y/btrFUiOka1q/0d8XP2vm237wNmQRdVx0Ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cItq7y/btrFUiOka1q/0d8XP2vm237wNmQRdVx0Ek/img.png&quot; data-alt=&quot;메모리에서 file allocation table을 사용한 chain allcation방법.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cItq7y/btrFUiOka1q/0d8XP2vm237wNmQRdVx0Ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcItq7y%2FbtrFUiOka1q%2F0d8XP2vm237wNmQRdVx0Ek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;244&quot; height=&quot;302&quot; data-filename=&quot;스크린샷 2022-06-14 오후 9.38.37.png&quot; data-origin-width=&quot;410&quot; data-origin-height=&quot;508&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;메모리에서 file allocation table을 사용한 chain allcation방법.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;FAT(File Allocation Table)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 9.39.45.png&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k6uZu/btrFWdSwVaa/Fek1ukYO8FG5h0YOndRR9K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k6uZu/btrFWdSwVaa/Fek1ukYO8FG5h0YOndRR9K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k6uZu/btrFWdSwVaa/Fek1ukYO8FG5h0YOndRR9K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk6uZu%2FbtrFWdSwVaa%2FFek1ukYO8FG5h0YOndRR9K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;553&quot; height=&quot;349&quot; data-filename=&quot;스크린샷 2022-06-14 오후 9.39.45.png&quot; data-origin-width=&quot;1014&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일을 찾을 때 FirstAddress 번호를 이용해 FAT blocks을 보며 찾는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법은 보통 용량이 작고 호환성이 높은 디스크, USB drive에서 이 시스템을 사용한다. 용량이 커지면 FAT table의 크기가 커져서 사용하기 힘들기 때문이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Allocated block management - Indexed allocation&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 9.44.01.png&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3pwgw/btrFXXoErDg/8Rf7ECn5LUUAbCvgJiSivK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3pwgw/btrFXXoErDg/8Rf7ECn5LUUAbCvgJiSivK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3pwgw/btrFXXoErDg/8Rf7ECn5LUUAbCvgJiSivK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3pwgw%2FbtrFXXoErDg%2F8Rf7ECn5LUUAbCvgJiSivK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;501&quot; height=&quot;308&quot; data-filename=&quot;스크린샷 2022-06-14 오후 9.44.01.png&quot; data-origin-width=&quot;842&quot; data-origin-height=&quot;518&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Index block(24번)에 데이터 block들의 번호가 적혀있다. File B를 찾을 때 24번 Index block에서 데이터를 읽으면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 index block을 다 쓰면 하나 더 채용하거나 tree 형태로 만드는 등 해결책이 필요하다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Design of Unix File System&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 9.46.39.png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wNssw/btrFUUfmsEw/yzCnFFz5rYWwNFDpSE74k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wNssw/btrFUUfmsEw/yzCnFFz5rYWwNFDpSE74k0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wNssw/btrFUUfmsEw/yzCnFFz5rYWwNFDpSE74k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwNssw%2FbtrFUUfmsEw%2FyzCnFFz5rYWwNFDpSE74k0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;499&quot; height=&quot;311&quot; data-filename=&quot;스크린샷 2022-06-14 오후 9.46.39.png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;682&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 위의 해결책으로 미리&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;고정된 위치&lt;/b&gt;에(한곳에)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;index block을 모아놓았고&lt;/b&gt;, 이를 UNIX에서는 I-node blocks라 부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- i-node blocks의 0,1번 블록은 전통적으로 사용하지 않고, i-node에는 Data block번호와 파일의 다른속성까지 모두 기록되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;- i-node에는 이름은 존재하지 않으며 이름은 directory에 존재한다!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;UNIX Block Addressing&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;10개의 data block들이 존재하고 10개가 넘어가면 single, double, triple indirect block을 사용한다. single indirect는 512개의 datablock번호를 기록할 수 있고, double은 512^2, triple은 512^3개의 datablock번호를 기록할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Addressing방법은 나쁘지 않기 때문에 UNIX말고도 많이 사용하는 방법이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Directory Entry of FAT File System&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 9.58.41.png&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dywlox/btrFYxDftIJ/Wc8FjE9qYLw2DqzkVYLSk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dywlox/btrFYxDftIJ/Wc8FjE9qYLw2DqzkVYLSk1/img.png&quot; data-alt=&quot;파일이름 + 확장자(Extension): 8+3, 각 속성과 First block number, 파일의 size값이 존재한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dywlox/btrFYxDftIJ/Wc8FjE9qYLw2DqzkVYLSk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdywlox%2FbtrFYxDftIJ%2FWc8FjE9qYLw2DqzkVYLSk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;685&quot; height=&quot;187&quot; data-filename=&quot;스크린샷 2022-06-14 오후 9.58.41.png&quot; data-origin-width=&quot;1296&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파일이름 + 확장자(Extension): 8+3, 각 속성과 First block number, 파일의 size값이 존재한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Shared Files&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 10.00.48.png&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bPNJPl/btrFUMHRI9y/8koxMV0PKd9RTSjk6PsvPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bPNJPl/btrFUMHRI9y/8koxMV0PKd9RTSjk6PsvPK/img.png&quot; data-alt=&quot;shared file을 가지고있는 file system. shared file은 이름은 서로 다르지만 i-node는 동일하다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bPNJPl/btrFUMHRI9y/8koxMV0PKd9RTSjk6PsvPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbPNJPl%2FbtrFUMHRI9y%2F8koxMV0PKd9RTSjk6PsvPK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;376&quot; height=&quot;353&quot; data-filename=&quot;스크린샷 2022-06-14 오후 10.00.48.png&quot; data-origin-width=&quot;680&quot; data-origin-height=&quot;638&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;shared file을 가지고있는 file system. shared file은 이름은 서로 다르지만 i-node는 동일하다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 10.02.27.png&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pkyyd/btrFVVx4N6Z/cM4AukkJ6DKNlKZ1aWqYXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pkyyd/btrFVVx4N6Z/cM4AukkJ6DKNlKZ1aWqYXk/img.png&quot; data-alt=&quot;link count=1이면 B 또는 C만 link, 2이면 B와 C 둘다 link. b의 경우 둘 다 원본(original)이며 구분이 없다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pkyyd/btrFVVx4N6Z/cM4AukkJ6DKNlKZ1aWqYXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fpkyyd%2FbtrFVVx4N6Z%2FcM4AukkJ6DKNlKZ1aWqYXk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;565&quot; height=&quot;300&quot; data-filename=&quot;스크린샷 2022-06-14 오후 10.02.27.png&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;link count=1이면 B 또는 C만 link, 2이면 B와 C 둘다 link. b의 경우 둘 다 원본(original)이며 구분이 없다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Shared Files - Symbolic Link&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Symbolic Link File (바로가기 파일, 별도의 파일임)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 기존 shared file은 백업시 원본파일과 링크파일 모두 백업해야하는데, 원본이 삭제되었을 때 link는 삭제되지않고 그대로 남기때문에 무한루프 현상이 발생할 수 있다는 문제점있어 symbolic link file을 도입하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- File Type을 Link File로 새로 정의한다.(special)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 바로가기파일로 불리며, 파일의 path가 적혀있다.(pathname O)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- OS가 Link File을 읽으면 pathname을 통해 원본 파일을 읽을 수 있다. 따라서 부작용이 작다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Log-Structured File System (LFS)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 파일들이 고정된 위치에 존재하면 수정 또는 삭제시 파일 위치로 가서 동작하는데, 이는 HDD의 헤드가 왔다갔다 동작을 많이 해야하므로 성능이 떨어질 수 있다. 이에 log-structured file system을 도입하였다. (헤드가 있는 위치에서 파일을 옮겨다니면서 적자!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- segment단위로 기록하며, 각 segment들은 i-nodes와 directory entry blocks, data blocks을 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이 시스템은 변경된 내용, write를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;writing point부터 순차적으로&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;적는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 10.10.56.png&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;384&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/56x9D/btrFY7RRorT/42P9lXhgYQ7NgN6Q3jk9u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/56x9D/btrFY7RRorT/42P9lXhgYQ7NgN6Q3jk9u1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/56x9D/btrFY7RRorT/42P9lXhgYQ7NgN6Q3jk9u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F56x9D%2FbtrFY7RRorT%2F42P9lXhgYQ7NgN6Q3jk9u1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;610&quot; height=&quot;285&quot; data-filename=&quot;스크린샷 2022-06-14 오후 10.10.56.png&quot; data-origin-width=&quot;822&quot; data-origin-height=&quot;384&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Comparison between LFS and FFS&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 10.14.59.png&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5DlqZ/btrFWxDL6Kd/K5yIo31pUZyNelbmhMknok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5DlqZ/btrFWxDL6Kd/K5yIo31pUZyNelbmhMknok/img.png&quot; data-alt=&quot;LFS는 순차적으로 변경된 내용들을 적는 반면, FFS(기존 UNIX 시스템)는 고정된 위치에 변경된 내용을 적는다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5DlqZ/btrFWxDL6Kd/K5yIo31pUZyNelbmhMknok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5DlqZ%2FbtrFWxDL6Kd%2FK5yIo31pUZyNelbmhMknok%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;523&quot; height=&quot;313&quot; data-filename=&quot;스크린샷 2022-06-14 오후 10.14.59.png&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;LFS는 순차적으로 변경된 내용들을 적는 반면, FFS(기존 UNIX 시스템)는 고정된 위치에 변경된 내용을 적는다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;LFS: Cleaning(Garbage Collection)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 디스크 공간은 무한하지 않으므로 사용하지 않는 공간은 재사용하는것이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Cleaner라는 background process를 통해 LFS는 log를 돌며 old segment들을 제거한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 10.17.02.png&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;358&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzAG6F/btrFUj0NXIi/wIWJgdWTtocIxmm3pYXSMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzAG6F/btrFUj0NXIi/wIWJgdWTtocIxmm3pYXSMk/img.png&quot; data-alt=&quot;Obsolete blocks: 빈 공간, 3개의 segment에만 데이터가 존재한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzAG6F/btrFUj0NXIi/wIWJgdWTtocIxmm3pYXSMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzAG6F%2FbtrFUj0NXIi%2FwIWJgdWTtocIxmm3pYXSMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;601&quot; height=&quot;204&quot; data-filename=&quot;스크린샷 2022-06-14 오후 10.17.02.png&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;358&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Obsolete blocks: 빈 공간, 3개의 segment에만 데이터가 존재한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: live block 데이터만 writing point(오른쪽 3개 segment 시작점)에 기록하면 통째로 앞 공간이 비게되어 이 공간을 나중에 다시 사용할 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Journaling File Systems&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;UNIX에서 file을 제거하면 다음과 같은 경우가 발생한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;file의 directory가 삭제된다&lt;/li&gt;
&lt;li&gt;i-node를 free i-nodes(미사용)로 반납한다.&lt;/li&gt;
&lt;li&gt;모든 disk block들을 free disk blocks으로 반납한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용하다 전기가 나가면(shut down) 파일 시스템을 체크하여 consistant한 상태를 유지해야한다. (일관성 회복)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이는 동작시 log(기록)를 남기는 방법으로 처리하며, 파일 시스템 앞부분에 로그기록을 남길수 있는 부분이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 전기가 나가게되면 파일 시스템 전체를 다시 시작하는것이 아닌, 로그기록을 찾아서 필요한 부분만 다시 시작할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Journaling&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: file system 구조가 변경되기 전에 Logging하는 방식이다. failure에대한 빠른 복구가 가능하며 NTFS, Linux Ext3 FS, Reiser FS등의 시스템이 존재한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 10.25.52.png&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;278&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/doaHjU/btrFVuNL9gz/Kyv737Q67FbGCkhD13aCJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/doaHjU/btrFVuNL9gz/Kyv737Q67FbGCkhD13aCJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/doaHjU/btrFVuNL9gz/Kyv737Q67FbGCkhD13aCJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdoaHjU%2FbtrFVuNL9gz%2FKyv737Q67FbGCkhD13aCJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;562&quot; height=&quot;147&quot; data-filename=&quot;스크린샷 2022-06-14 오후 10.25.52.png&quot; data-origin-width=&quot;1064&quot; data-origin-height=&quot;278&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Determining Block Size&lt;/h3&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Large block size&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 작은 사이즈를 넣지 못하므로 낭비되는 공간이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 성능이 좋다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- FAT의 entry수나 i-node의 block address list의 수가 적다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;Small block size&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- space utilization이 좋다.(공간 사용도 높음)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 성능이 떨어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- FAT 또는 i-node의 수가 많다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Disk Space Management Block Size&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 10.33.50.png&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;586&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bTZwlF/btrFQYCzX6l/oQ1C2HjboMs9heN4XIakO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bTZwlF/btrFQYCzX6l/oQ1C2HjboMs9heN4XIakO1/img.png&quot; data-alt=&quot;Disk 공간 활용도는 size가 작을수록 높고(4KB), 성능은 블록 크기가 클수록 커진다. 성능을 중시하는 서버는 8KB도 사용하지만 대부분 4KB를 사용한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bTZwlF/btrFQYCzX6l/oQ1C2HjboMs9heN4XIakO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbTZwlF%2FbtrFQYCzX6l%2FoQ1C2HjboMs9heN4XIakO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;445&quot; height=&quot;237&quot; data-filename=&quot;스크린샷 2022-06-14 오후 10.33.50.png&quot; data-origin-width=&quot;1098&quot; data-origin-height=&quot;586&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Disk 공간 활용도는 size가 작을수록 높고(4KB), 성능은 블록 크기가 클수록 커진다. 성능을 중시하는 서버는 8KB도 사용하지만 대부분 4KB를 사용한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Free space management&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;할당되지 않은 Free block을 관리하는 방법은 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* Bit map (bit vector)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 0이면 free block, 1이면 할당된 block을 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- contiguous free block들을 찾기 쉽다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* Linked List&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 다음 freeblock이 어딘지 pointer로 적어둔다. 찾을때마다 읽어야하므로 효율이 떨어진다는 단점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;b&gt;* Grouping (Indexing)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- index 블록에 여러개의 free block을 등록하는 방식이다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Bit map&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: free block을 bit map으로 관리하는 방법. 공간 차지를 덜하므로 가장 좋은 방법이다. Bitmap은 extra space를 필요로 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;EX)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Block size = 2^12 bytes (4KB)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Disk size = 2^30 bytes (1GB)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- N = 2^30 / 2^12 = 2^18 bytes (32KB), 32KB의 bitmap이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;++ 연속적인 블록을 가져오기 쉽다!&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Linked List&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 10.42.52.png&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;552&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YF7D7/btrFXWXAB95/LRNQKQmRTPsfkPvVEXM6G1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YF7D7/btrFXWXAB95/LRNQKQmRTPsfkPvVEXM6G1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YF7D7/btrFXWXAB95/LRNQKQmRTPsfkPvVEXM6G1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYF7D7%2FbtrFXWXAB95%2FLRNQKQmRTPsfkPvVEXM6G1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;413&quot; height=&quot;249&quot; data-filename=&quot;스크린샷 2022-06-14 오후 10.42.52.png&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;552&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Free block list head는 기록되어있고, 이 헤드블록을 기준으로 linked된 다음 free block들을 읽으며 찾는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법으로 free block을 할당하려면 block을 읽고 계속 찾아야하므로 성능이 떨어질 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Linked List with Grouping (= indexing)&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오후 10.44.27.png&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfhrIe/btrFWyimjCa/xubdN5WvvEXyPMdAXrpBv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfhrIe/btrFWyimjCa/xubdN5WvvEXyPMdAXrpBv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfhrIe/btrFWyimjCa/xubdN5WvvEXyPMdAXrpBv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfhrIe%2FbtrFWyimjCa%2FxubdN5WvvEXyPMdAXrpBv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;422&quot; height=&quot;241&quot; data-filename=&quot;스크린샷 2022-06-14 오후 10.44.27.png&quot; data-origin-width=&quot;916&quot; data-origin-height=&quot;524&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;free block이 다른 free block에 대한 index block역할을 한다. index block list head로부터 다음 index block이 link되어있다.(linked list)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예전의 UNIX가 사용했으며 오래 사용하면 여기저기 흩어져있는 block이 많아지므로 성능이 떨어져 느려질 수 있다.&lt;/p&gt;</description>
      <category>cs지식/운영체제</category>
      <category>File Systems</category>
      <category>OS</category>
      <category>운영체제</category>
      <author>Eunbae</author>
      <guid isPermaLink="true">https://eunbae11.tistory.com/24</guid>
      <comments>https://eunbae11.tistory.com/entry/OS-04-File-systems-1#entry24comment</comments>
      <pubDate>Tue, 28 Jun 2022 13:50:44 +0900</pubDate>
    </item>
    <item>
      <title>OS - 03. Memory Management</title>
      <link>https://eunbae11.tistory.com/entry/OS-03-Memory</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Address Space(주소 공간)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Physical address space: 실제 하드웨어가 지원하는 주소공간&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Logical address space: 프로세스가 자신의 메모리를 바라보는 관점에서의 주소 공간 프로세스는&lt;/b&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;메모리를 가상 메모리 공간으로, 즉 본인의 실제 물리 메모리 공간보다 더 크다고 생각한다!&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Address Generation&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;코드는 컴파일되어 어셈블리어로 번역된다. 이때 적재될 메모리 주소는 어디가 될지 모르므로 보통 0번지의 값을 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제 메모리는 1000번지부터 적재되므로 jmp 175 코드는 실제 메모리의 175로 가면 안되고 1175로 가야 하므로 1175로 바꿔줘야 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오후 9.44.42.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;530&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rkkQ5/btrFUUNayvZ/qORTQ4jZlOb4HciX9sZyy0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rkkQ5/btrFUUNayvZ/qORTQ4jZlOb4HciX9sZyy0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rkkQ5/btrFUUNayvZ/qORTQ4jZlOb4HciX9sZyy0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrkkQ5%2FbtrFUUNayvZ%2FqORTQ4jZlOb4HciX9sZyy0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;426&quot; height=&quot;222&quot; data-filename=&quot;스크린샷 2022-06-13 오후 9.44.42.png&quot; data-origin-width=&quot;1018&quot; data-origin-height=&quot;530&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Multiple Programs Without Memory Abstraction&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단일 프로그램은 하나씩 할당하여 충돌이 발생하지 않을 수 있지만, 여러 개 돌리면 메모리 공간 어디에 적재될지 모르므로 문제가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; relocation이 필요하다!&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Partioning&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;미리 메모리를 여러 개의 partition으로 쪼개 놓아 relocation이 필요 없도록 하는 방법이다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Equal-size partitions&lt;span&gt;&amp;nbsp;&lt;/span&gt;(모든 파티션이 동일한 크기를 가짐)&lt;/li&gt;
&lt;li&gt;Unequal-size partitions&lt;br /&gt;: 파티션 별로 Queue가 존재한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 처음부터 어느 파티션에 들어갈지 시작 주소를 다 알고 있다면 relocation은 필요하지 않다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Placement with Partioning&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;물리 메모리는 고정된 크기의 파티션으로 나누어져 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Internal fragmentation(내부 단편화 - 낭비되는 공간 O), Inefficient와 같은 문제점이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 컴파일 시에는 항상 시작 주소를 0번지로 하고, 실행 시에 실행마다 주소를 바꾸어줄 필요가 있다. -&amp;gt; Dynamic Program Relocation!&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Dynamic Program Relocation&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU는 실시간으로 코드의 주소와 Limit register값을 비교하고 값보다 작다면 Base register의 값을 더해서&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Relocate 한다!&lt;/b&gt;&amp;nbsp;&lt;br /&gt;(Logical Addresses -&amp;gt; Physical Addresses)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오후 9.54.25.png&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkt816/btrFUigsQs0/S7Z1mSCPwvAhMJK73E58VK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkt816/btrFUigsQs0/S7Z1mSCPwvAhMJK73E58VK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkt816/btrFUigsQs0/S7Z1mSCPwvAhMJK73E58VK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbkt816%2FbtrFUigsQs0%2FS7Z1mSCPwvAhMJK73E58VK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;455&quot; height=&quot;260&quot; data-filename=&quot;스크린샷 2022-06-13 오후 9.54.25.png&quot; data-origin-width=&quot;1058&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Dynamic Partitioning&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오후 9.57.27.png&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bchsPm/btrFT34WOIM/wUcUV9sD5w7Uv6bB4cHMA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bchsPm/btrFT34WOIM/wUcUV9sD5w7Uv6bB4cHMA1/img.png&quot; data-alt=&quot;파티션이 나누어져있을 때는 파티션마다 Q가 존재하였지만(a), 0번지를 기준으로 실행파일을 생성한다면 비어있는곳마다 실행하므로 노는 공간이 줄어들게 되고, 하나의 Q로 실행한다.(b)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bchsPm/btrFT34WOIM/wUcUV9sD5w7Uv6bB4cHMA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbchsPm%2FbtrFT34WOIM%2FwUcUV9sD5w7Uv6bB4cHMA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;482&quot; height=&quot;308&quot; data-filename=&quot;스크린샷 2022-06-13 오후 9.57.27.png&quot; data-origin-width=&quot;940&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;파티션이 나누어져있을 때는 파티션마다 Q가 존재하였지만(a), 0번지를 기준으로 실행파일을 생성한다면 비어있는곳마다 실행하므로 노는 공간이 줄어들게 되고, 하나의 Q로 실행한다.(b)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 미리 쪼개지 말고&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;동적으로 파티셔닝 한다!&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파티션은 가변크기의 길이와 숫자를 가진다.&lt;/li&gt;
&lt;li&gt;프로세스는 메모리가 요구하는만큼 할당되어야 한다.&lt;/li&gt;
&lt;li&gt;한 블록에서 모든 메모리를 순서대로 변환할 수 있도록 compaction을 사용해야 한다.??&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오후 10.01.26.png&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;666&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/biO4Qt/btrFYwqMdUc/L3B7mJvUK4sFl4KJb1hOVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/biO4Qt/btrFYwqMdUc/L3B7mJvUK4sFl4KJb1hOVk/img.png&quot; data-alt=&quot;동적 파티셔닝의 예시.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/biO4Qt/btrFYwqMdUc/L3B7mJvUK4sFl4KJb1hOVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbiO4Qt%2FbtrFYwqMdUc%2FL3B7mJvUK4sFl4KJb1hOVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;420&quot; height=&quot;402&quot; data-filename=&quot;스크린샷 2022-06-13 오후 10.01.26.png&quot; data-origin-width=&quot;696&quot; data-origin-height=&quot;666&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;동적 파티셔닝의 예시.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 멀티프로세싱: 메모리에 여러 개의 프로세스를 넣고 실행하는 것&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- a~d: 메모리 공간에 프로세스 1부터 3까지 적재된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- e: 프로세스 2가 입출력 요구 등을 이유로 잠깐 멈추면 메모리 공간에서 쫓아낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- f: 빈 공간에 프로세스 4가 들어와 적재된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 다음과 같은 과정을 거치며 동적 파티셔닝이 일어나는데, 이때 중간중간 빈 공간(h)이 생기게 되어 메모리 효율이 떨어지게 된다.&lt;br /&gt;이를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;메모리 단편화&lt;/b&gt;, 즉&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;fragmentation&lt;/b&gt;&lt;/span&gt;이 일어난다고 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Dynamic Partitioning Placment Algorithm&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Best-fit Algorithm&lt;/li&gt;
&lt;li&gt;First-fit Algorithm&lt;/li&gt;
&lt;li&gt;Next-fit Algorithm&lt;/li&gt;
&lt;li&gt;Worst-fit Algorithm&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 상황에 따라 좋은 알고리즘이 달라지므로, 각 알고리즘 중 어떤 알고리즘이 좋을지는 모른다. 케바케.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오후 10.12.05.png&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dR99lZ/btrFZkJ8DNB/jCfLceMXlFXKgvhQlDwpX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dR99lZ/btrFZkJ8DNB/jCfLceMXlFXKgvhQlDwpX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dR99lZ/btrFZkJ8DNB/jCfLceMXlFXKgvhQlDwpX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdR99lZ%2FbtrFZkJ8DNB%2FjCfLceMXlFXKgvhQlDwpX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;404&quot; height=&quot;461&quot; data-filename=&quot;스크린샷 2022-06-13 오후 10.12.05.png&quot; data-origin-width=&quot;552&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;First-Fit: 항상 처음부터 살펴보다가 적재 가능한 곳이 있으면 발견한 처음 공간에 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Best-Fit: 전체를 다 살펴보고, 가장 딱 들어맞는 크기의 공간에 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Next-Fit: First-Fit과 유사. 한번 검색하면 마지막 검색위치를 기억하여 다음 검색 시에는 이 지점부터 찾기 시작한 후 발견한 공간에 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Worst-Fit: 전체를 다 살펴보고, 가장 큰 공간에 넣는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 전체를 다 살펴보면 오래 걸리게 되고, 처음부터 찾아 바로 넣으면 윗부분의 메모리 사용도가 높아지며 빈 공간이 생길 수 있다는 단점이 존재한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;모든 알고리즘은 장단점이 모두 존재하기 때문에 상황에 따라 달라진다!&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Solutions for Fragmentation&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Coalescing&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오후 10.18.08.png&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvjeD1/btrFXYHN8pH/4belkE3cwxlPrUny2c0kX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvjeD1/btrFXYHN8pH/4belkE3cwxlPrUny2c0kX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvjeD1/btrFXYHN8pH/4belkE3cwxlPrUny2c0kX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvjeD1%2FbtrFXYHN8pH%2F4belkE3cwxlPrUny2c0kX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;542&quot; height=&quot;285&quot; data-filename=&quot;스크린샷 2022-06-13 오후 10.18.08.png&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Program A가 작업이 종료되면 빈공간이 생기는데, 이를 다른 빈 공간과 통합(Coalescing)하는 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU는 2K와 5K를 통합하지 않는다면 각각 따로 생각하기 때문에 통합이 필요하다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Compaction&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오후 10.19.42.png&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;750&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDRE9U/btrFZlhYERA/ZuvUxro2eQTlKNDN8Pjke0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDRE9U/btrFZlhYERA/ZuvUxro2eQTlKNDN8Pjke0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDRE9U/btrFZlhYERA/ZuvUxro2eQTlKNDN8Pjke0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDRE9U%2FbtrFZlhYERA%2FZuvUxro2eQTlKNDN8Pjke0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;481&quot; height=&quot;401&quot; data-filename=&quot;스크린샷 2022-06-13 오후 10.19.42.png&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;750&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리에서 사용되지 않는 공간(unused) 모두를 하나로 크게 통합하는 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Compaction의 문제점&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- optimal compaction 알고리즘을 찾기 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- compaction 하는 동안 시스템은 정지한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Compaction을 수행하는 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 메모리 utilization(효율)이 낮은 수치(75% 정도)로 떨어질 때&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- memory allocation(할당) 실패 시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 주기적으로&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;생각할때는 쉽게 동작하는 것처럼 보이지만 실제로 구현 시 어려움이 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Swapping&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기술이 발전하며 HDD의 속도가 빨라지게 되면서 메모리 사이즈보다 더 많은 프로세스를 넣고 실행하기 위해서 Swap In/Out개념을 도입하였다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오후 11.42.45.png&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;534&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czxcXi/btrFZlbcZ6o/SDqLXlKSbxCbiDgK209Xhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czxcXi/btrFZlbcZ6o/SDqLXlKSbxCbiDgK209Xhk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czxcXi/btrFZlbcZ6o/SDqLXlKSbxCbiDgK209Xhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczxcXi%2FbtrFZlbcZ6o%2FSDqLXlKSbxCbiDgK209Xhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;568&quot; height=&quot;241&quot; data-filename=&quot;스크린샷 2022-06-13 오후 11.42.45.png&quot; data-origin-width=&quot;1258&quot; data-origin-height=&quot;534&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;- 메모리에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;프로세스를 많이 넣으면 넣을수록 CPU의 활용도. 즉 Utilization이 높아진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- c: 프로세스 A.B.C 모두 I/O요구 등의 이유로 중단된다면 이 중 하나인 A를 골라서 Swap out 한다; 프로세스의 메모리 데이터 그대로 - HDD의 swap영역에 넣고 프로세스를 쫓아낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이렇게 Swap in/out을 하면 더 많은 프로세스를 사용할 수 있고 Utilization이 높아진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 현재도 Swap을 사용하는데, CPU Utiilization을 높이려기보다는 threashing 현상으로 시스템이 다운되는 것을 방지하기 위해 사용한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;+) 프로그램 수행 이미지의 크기가 변하는 경우. 사용 가능한 메모리 공간보다 더 커지게 되면 swapping으로 잠시 디스크로 옮기고 큰 공간이 나오게 된다면 그때 수행된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Overlay&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;램보다 프로그램 크기가 클 때 수행하는 방법. Overlay기능을 켜고 작업을 수행할 수 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Program 실행 시 함수 별로 모듈을 생성한다.&lt;/li&gt;
&lt;li&gt;프로그램에 작성되어 있는 오버레이 매니저 코드가 실행된다.&lt;/li&gt;
&lt;li&gt;A를 수행하다 B함수가 호출(call)되면&lt;/li&gt;
&lt;li&gt;매니저가 확인 후에 A를 쫓아내고 B를 실행한다.(overlay)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Memory Management with Bitmaps&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오후 11.52.38.png&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cAdMnM/btrFY7xwpoq/KhyRgpHDGNK04n5qcaq900/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cAdMnM/btrFY7xwpoq/KhyRgpHDGNK04n5qcaq900/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cAdMnM/btrFY7xwpoq/KhyRgpHDGNK04n5qcaq900/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcAdMnM%2FbtrFY7xwpoq%2FKhyRgpHDGNK04n5qcaq900%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;546&quot; height=&quot;226&quot; data-filename=&quot;스크린샷 2022-06-13 오후 11.52.38.png&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;486&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a: 메모리 공간. A~E까지 5개의 프로세스가 적재되어있고, 3개의 비어있는 공간이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b: bitmap. 1이면 사용 중이고 0이면 비어있음을 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;c: b를 linked-list로 표현한 방식. P면 사용 중, H면 비어있음을 나타내고 H 5 3이면 5번부터 3개의 상태가 비어있음을 나타낸다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Virtual Memory&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CPU는 메모리를 공간이 무한한 Logical Memory로 인식한다; 가상 주소와 실제 주소를 분리하여 생각한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 가상 주소 공간에서 프로그램을 실행하고 이는 실제 DRAM에 적재되며, 실제 주소로 변환하여 실행하도록 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오전 12.01.42.png&quot; data-origin-width=&quot;318&quot; data-origin-height=&quot;590&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BbTsf/btrFUiOhpDh/wWPAKNl8JBqKfIdDxj02Z0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BbTsf/btrFUiOhpDh/wWPAKNl8JBqKfIdDxj02Z0/img.png&quot; data-alt=&quot;Virtual Address Space&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BbTsf/btrFUiOhpDh/wWPAKNl8JBqKfIdDxj02Z0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBbTsf%2FbtrFUiOhpDh%2FwWPAKNl8JBqKfIdDxj02Z0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;138&quot; height=&quot;256&quot; data-filename=&quot;스크린샷 2022-06-14 오전 12.01.42.png&quot; data-origin-width=&quot;318&quot; data-origin-height=&quot;590&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Virtual Address Space&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 모든 프로세스는 위 가상공간 모두를 혼자 다 쓴다는 환상을 가지고 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 이 개념을 통해 작은 DRAM보다 size가 더 큰 프로세스를 넣고 실행할 수도 있다. 이는 필요 부분만 DRAM에 적재하고 나머지는 DISK에서 Swap 하여 실행한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Paging(Virtual memory) 기법&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JtNWo/btrFVhuzxtu/TFc3kU5zAsdWwpYfNI2IfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JtNWo/btrFVhuzxtu/TFc3kU5zAsdWwpYfNI2IfK/img.png&quot; style=&quot;width: 72.6016%; margin-right: 10px;&quot; width=&quot;381&quot; height=&quot;234&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;380&quot; data-filename=&quot;스크린샷 2022-06-14 오전 12.04.14.png&quot; data-widthpercent=&quot;73.46&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JtNWo/btrFVhuzxtu/TFc3kU5zAsdWwpYfNI2IfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJtNWo%2FbtrFVhuzxtu%2FTFc3kU5zAsdWwpYfNI2IfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;618&quot; height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRhU9u/btrFUiHxjrJ/V4IKyl1n49Ygrh5L1s2cm0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRhU9u/btrFUiHxjrJ/V4IKyl1n49Ygrh5L1s2cm0/img.png&quot; style=&quot;width: 26.2356%;&quot; width=&quot;228&quot; height=&quot;388&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;382&quot; data-origin-height=&quot;650&quot; data-filename=&quot;스크린샷 2022-06-14 오전 12.04.27.png&quot; data-widthpercent=&quot;26.54&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRhU9u/btrFUiHxjrJ/V4IKyl1n49Ygrh5L1s2cm0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRhU9u%2FbtrFUiHxjrJ%2FV4IKyl1n49Ygrh5L1s2cm0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;382&quot; height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Virtual Address Space을 동일한 크기인&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Page단위로 쪼갠다&lt;/b&gt;.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Virtual Address(VA): 20bit는 페이지 번호로, 12bit는 페이지 안의 offset으로 쪼개어 할당한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;(p, o)&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M4cnz/btrFUUfjAHf/zWgxWFzdhl3tquSvQ6yTx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M4cnz/btrFUUfjAHf/zWgxWFzdhl3tquSvQ6yTx1/img.png&quot; style=&quot;width: 71.3562%; margin-right: 10px;&quot; width=&quot;365&quot; height=&quot;226&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;626&quot; data-origin-height=&quot;388&quot; data-filename=&quot;스크린샷 2022-06-14 오전 12.07.18.png&quot; data-widthpercent=&quot;72.2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M4cnz/btrFUUfjAHf/zWgxWFzdhl3tquSvQ6yTx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM4cnz%2FbtrFUUfjAHf%2FzWgxWFzdhl3tquSvQ6yTx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;626&quot; height=&quot;388&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rowAV/btrFUUzLxIB/ADDxc2KBoGV0gqhnrUQsyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rowAV/btrFUUzLxIB/ADDxc2KBoGV0gqhnrUQsyK/img.png&quot; style=&quot;width: 27.481%;&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;384&quot; data-origin-height=&quot;618&quot; data-filename=&quot;스크린샷 2022-06-14 오전 12.07.25.png&quot; data-widthpercent=&quot;27.8&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rowAV/btrFUUzLxIB/ADDxc2KBoGV0gqhnrUQsyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrowAV%2FbtrFUUzLxIB%2FADDxc2KBoGV0gqhnrUQsyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;384&quot; height=&quot;618&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Physical Memory는 동일한 크기인&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Frame단위로 쪼갠다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Physical Address도 마찬가지로 프레임 번호와 offset으로 쪼개어 할당한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;(f, o)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- (f, o) = (3, 6)이면 3번째 frame의 6번째 offset을 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Page는 frame으로 매핑된다. page의 일부는 DRAM으로, 일부는 Disk의 Swap영역에 적재된다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;가상공간을 페이지 단위로 쪼개어 특정 프레임에 넣고 실행하겠다는 것이&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;페이징 처리이다.&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Virtual Address Translation&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오전 12.12.29.png&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/caPnVh/btrFXXIZpNj/h8RlRLcNAZxMTT6F662sO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/caPnVh/btrFXXIZpNj/h8RlRLcNAZxMTT6F662sO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/caPnVh/btrFXXIZpNj/h8RlRLcNAZxMTT6F662sO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcaPnVh%2FbtrFXXIZpNj%2Fh8RlRLcNAZxMTT6F662sO1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;552&quot; height=&quot;336&quot; data-filename=&quot;스크린샷 2022-06-14 오전 12.12.29.png&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;618&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(p, o) 페이지가 (f, o) 프레임에 적재될 때 가상 주소는 물리 주소로 실시간으로 변환되어 access 하도록 구현되어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이는 CPU 내부의 Page Table을 통해 수행되는데, 과정은 다음과 같다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;(p, o) 가상 주소가 나오면&lt;/li&gt;
&lt;li&gt;Page Table의 p번째 엔트리를 찾는다.&lt;/li&gt;
&lt;li&gt;찾아보니 f가 적혀있기 때문에&lt;/li&gt;
&lt;li&gt;(f, o)을 Access 한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Page Table&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Structure&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Page Table의 contents&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Flags : valid/invalid(resident) bit, dirty bit, reference(clock or used) bit&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- page frame number&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오전 12.19.15.png&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SyhnZ/btrFWyJqhOF/Sm0eWA2Rfe5AWxz1K57fn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SyhnZ/btrFWyJqhOF/Sm0eWA2Rfe5AWxz1K57fn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SyhnZ/btrFWyJqhOF/Sm0eWA2Rfe5AWxz1K57fn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSyhnZ%2FbtrFWyJqhOF%2FSm0eWA2Rfe5AWxz1K57fn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;467&quot; height=&quot;271&quot; data-filename=&quot;스크린샷 2022-06-14 오전 12.19.15.png&quot; data-origin-width=&quot;852&quot; data-origin-height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- PTBR(Page Table Base Register)이 Page Table을 가리키게 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Flag 중 valid bit가 1이면 frame을 access 하고, 0이면 CPU가 스스로 해결하지 못하므로 page interrupt를 걸어 jump 한다. (OS가 swap영역에서 PT에 세팅하여 1로 변환해준다)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- valid bit: 메인 메모리에 해당 페이지가 존재하는가?&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Page Table은 2^20개의 페이지(1MB)가 존재하며 한 entry의 크기는 4kb이므로 프로세스마다 4MB의 Page Table이 필요하다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Translation Lookaside Buffer&lt;/span&gt;(TLB - 명칭 외우기!!)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상 메모리는 PT entry 접근 1번, 물리 주소 접근 1번 총 2번의 접근이 필요하기 때문에(물리 메모리 : 1번만 접근) 메모리 효율이 2배로 떨어진다는 문제점이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 해결하기 위해 CPU의 Cache와 같은 기능을 가지는 Translation Lookaside Buffer(TLB)를 도입하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 최근에 Access 한 PT entry만 caching 하고 있자!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오전 12.34.31.png&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;548&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nFpdX/btrFXXWrnlr/sVudqrixb2hfLoRiMUUGTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nFpdX/btrFXXWrnlr/sVudqrixb2hfLoRiMUUGTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nFpdX/btrFXXWrnlr/sVudqrixb2hfLoRiMUUGTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnFpdX%2FbtrFXXWrnlr%2FsVudqrixb2hfLoRiMUUGTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;499&quot; height=&quot;282&quot; data-filename=&quot;스크린샷 2022-06-14 오전 12.34.31.png&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;548&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;동작 과정&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;- CPU 내부 회로에서 실시간으로 동작한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;가상 주소 변환 시 우선 TLB에서 엔트리를 찾는다.&lt;/li&gt;
&lt;li&gt;TLB에 없다면 PT에 접근(Access)하여 찾는다.&lt;/li&gt;
&lt;li&gt;PT에서 찾았다면(접근했다면) TLB에 넣는다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오전 12.34.43.png&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;818&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wwnGi/btrFY7qLlA1/0TADG8DfsnTdmXxNqqaGIk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wwnGi/btrFY7qLlA1/0TADG8DfsnTdmXxNqqaGIk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wwnGi/btrFY7qLlA1/0TADG8DfsnTdmXxNqqaGIk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwwnGi%2FbtrFY7qLlA1%2F0TADG8DfsnTdmXxNqqaGIk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;494&quot; height=&quot;410&quot; data-filename=&quot;스크린샷 2022-06-14 오전 12.34.43.png&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;818&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;문맥 교환 시 Valid bit의 초기 상태는 모두 0이다.(Invalid)&lt;/li&gt;
&lt;li&gt;TLB에서 못 찾으면 PT를 거쳐서 변환한다&lt;/li&gt;
&lt;li&gt;한번 Access 하면 TLB에 적고, valid bit를 1로 바꾼다.&lt;/li&gt;
&lt;li&gt;Page Table의 valid bit: 1일 때는 존재한다는 것이고, 0일 때는 Disk의 swap영역에 존재한다는 뜻이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문맥 교환 시 TLB의 Valid bit는 0으로 CLEAR 된다. 이는 TLB히트율이 잠시 떨어진다 할 수 있다. (물론 TLB가 다시 채워지면 높아진다)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Protection and Sharing&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Process A, B의 데이터 Page Table은 서로 다르지만 내부 코드 부분의 f=4는 동일하다. f=4에 해당하는 프레임은 메모리에 따로 적재하지 않고 똑같은 프레임을 가리키게 하는데, 이를 Sharing 한다고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 이는 Read-only모드일 때는 가능하지만, Write 명령이라면 OS에 부탁하여 물리 메모리를 copy 하여 두 개의 영역에서 write 하도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;++ OS는 각 프로세스마다 Page Table 을 유지하도록 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Page Table&lt;/h3&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;div&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Assignment of Process Pages to Free Frames&lt;/span&gt;&lt;/h4&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- A process의 0번 페이지, 1번페이지, ... , B process의 0번 페이지, ...를 메모리에 적재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 각 프로세스는 적재될 때 빈 프레임이면 어디든 적재될 수 있다. (process D-꼭 연속적으로 적재될 필요는 없다!)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Process B가 수행 종료되었으므로 PT의 valid bit는 모두 0(N)으로 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프로세스를 페이지 별로 나누어 메모리에 적재하므로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;메모리 단편화(Fragmentation)가 일어나지 않는다!&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;(페이지 내에서 사용되지 않는 공간은 존재할 수는 있다.)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오전 1.11.16.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;478&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ciVDRA/btrFVhOVh7T/rvuv8gX1XRVzQ6BDhdTzy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ciVDRA/btrFVhOVh7T/rvuv8gX1XRVzQ6BDhdTzy1/img.png&quot; data-alt=&quot;Logical-to-Physical Address Translation of Paging. CPU 내부의 하드웨어 회로에 의해 빠르게 진행된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ciVDRA/btrFVhOVh7T/rvuv8gX1XRVzQ6BDhdTzy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FciVDRA%2FbtrFVhOVh7T%2Frvuv8gX1XRVzQ6BDhdTzy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;478&quot; height=&quot;269&quot; data-filename=&quot;스크린샷 2022-06-14 오전 1.11.16.png&quot; data-origin-width=&quot;850&quot; data-origin-height=&quot;478&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Logical-to-Physical Address Translation of Paging. CPU 내부의 하드웨어 회로에 의해 빠르게 진행된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Virtual Memory - Paging&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #777777;&quot;&gt;CPU에서 가상주소는 MMU chip(변환회로)을 통해 가상주소를 물리주소로 바꾸어 Bus를 통해 메모리에 할당한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #777777;&quot;&gt;만약 페이지번호: 0010 -&amp;gt; 2이라면 PT에서 2번째 엔트리를 찾아 110으로 주소를 변환한다.(valid: 1)&lt;/span&gt;&lt;span style=&quot;color: #777777;&quot;&gt; 12-bit offset은 직접적으로 copy된다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Structure of Page Table Entry&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오전 1.18.55.png&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L7MHM/btrFUUl6GFc/uDPbqFZcTkiOKQw4xtt050/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L7MHM/btrFUUl6GFc/uDPbqFZcTkiOKQw4xtt050/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L7MHM/btrFUUl6GFc/uDPbqFZcTkiOKQw4xtt050/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL7MHM%2FbtrFUUl6GFc%2FuDPbqFZcTkiOKQw4xtt050%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;519&quot; height=&quot;146&quot; data-filename=&quot;스크린샷 2022-06-14 오전 1.18.55.png&quot; data-origin-width=&quot;1128&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Caching disabled: 0이면 caching, 해당 bit를 보고 CPU에 캐시할지말지를 결정한다.&lt;/li&gt;
&lt;li&gt;Referenced: 주소 변환할때마다 1로세팅한다. - CPU 교체정책에서 사용된다. 후술.&lt;/li&gt;
&lt;li&gt;Modified(dirty): 해당 페이지가 메인 메모리 프레임에 적재된 이후 변경되었다는것을 표시해준다.&lt;/li&gt;
&lt;li&gt;Protection: read/write/execution의 보호기능을 한다. 운영체제가 이를 점검하여 보안관련 기능이 수행될수있다.&lt;/li&gt;
&lt;li&gt;Present/absent(valid): 메인 메모리에 해당 패이지가 존재하는지 여부를 보여준다.&lt;/li&gt;
&lt;li&gt;Page frame number&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Speeding Up Paging&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가상주소에서 물리주소로 매핑되는 과정은 빨라야 한다.&lt;/li&gt;
&lt;li&gt;가상주소공간이 크면 클수록 Page Table의 크기도 커져야한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; TLB를 사용하더라도 Page Table이 너무 크다면 PT는 메모리의 상당부분을 차지한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Translation Lookaside Buffers&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Page Table에서 주소를 변환하면 TLB에 적재된 후 Valid bit는 1로 바뀐다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- TLB는 최근에 주소변환한 내용만 기억한다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- TLB에 64, 128개 정도의 페이지만 존재하더라도(적은 페이지수) 히트율은 크게 증가한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Problem: Too Large Page Table&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;solution&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Multilevel paging&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;- Inverted page table&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Multilevel paging&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;singlelevel page는 2^20개의 entry가 모두 존재해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PT를 Multilevel로 구현하면 Top-level Page Table에만 entry가 존재하면 되므로 2nd PT부터는 entry가 존재하지 않아도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;페이지번호에는 p1, p2의 여러 단계의 페이지 테이블 번호가 적혀있다.&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법을 사용하면 3번 Access하므로 TLB Miss가 발생하면 많은 메모리를 사용해야하므로 접근율이 떨어질 수 있다는 단점이 존재한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Inverted page table(역페이지 테이블)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Page Table에 페이지 번호(몇번 프로세스에 몇번 페이지가 있는지)가 기록되어있고, 전체 시스템에 하나만 존재한다. (프로세스마다 존재 x)&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Process Id(Pid)를 통해 PT의 entry를 찾는다.&lt;/li&gt;
&lt;li&gt;i번째 프레임에 프로세스가 존재한다는 사실을 안다&lt;/li&gt;
&lt;li&gt;이 i가 물리주소가 되어 변환해준다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 TLB도 존재하며,&amp;nbsp;발상의 전환이라 할 수 있다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- PT의 메모리 공간이 줄어든다는 장점이 있지만, TLB Miss가 나게되면 하드웨어 회로 말고 소프트웨어가 검색(해쉬 탐색등)하여 TLB를 세팅한 후 동작해야한다는 문제점이 존재한다. 이에 현재는 잘 사용하지 않는 방식이다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Address Space and OS&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오전 1.51.34.png&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;690&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bDwPUG/btrFVUFXyBv/ocbjDoVyjdPKG5fX0cWWE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bDwPUG/btrFVUFXyBv/ocbjDoVyjdPKG5fX0cWWE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bDwPUG/btrFVUFXyBv/ocbjDoVyjdPKG5fX0cWWE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbDwPUG%2FbtrFVUFXyBv%2FocbjDoVyjdPKG5fX0cWWE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;520&quot; height=&quot;364&quot; data-filename=&quot;스크린샷 2022-06-14 오전 1.51.34.png&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;690&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 모든 Process는 각각의 OS 코드 데이터가 Mapping되어있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 각 Process가 main, I/O등을 실행하는 코드 실행시 Interrupt service routine을 이 OS 코드 데이터로 자기가 직접 실행한다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Shared Library: paging 기법을 이용해서 Library를 공유할 수 있다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;코드를 미리 적재하지 않고 필요한 페이지가 참조될 때 page fault형태로 핸들링하면서 적재하겠다는 demand paging방법을 요즘 대부분 사용한다!&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Page Faults&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- mapping되지 않은 페이지가 참조되면 page fault가 발생한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 만약 hwp실행파일을 실행했다고 하자. 우선 disk의 swap영역에 수행 이미지를 만들고, 메인 함수를 CPU에서 실행한다. 이때&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;PT를 보면 valid 비트는 모두 0&lt;/b&gt;이다. 메모리의 프레임이 할당되어있지 않은것이다. 따라서 주소변환하지 못하므로 CPU는 할 작업이 없으므로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;스스로 interrupt&lt;/b&gt;를 건다. OS의 fault handler는 이를 보고 정해진 서비스루틴으로 jump한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;OS의 fault handler&lt;/b&gt;는 적재가 안되서 나오는 page fault인지 확인한 후 맞다면 해당 페이지를 swap영역이나 실행파일에서 찾아서 읽고 메인 메모리의 빈 frame에 넣은 후 Page Table의 valid bit를 1로 변환한 후 적재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 빈 프레임이 없다면(메모리가 꽉 찼다면) 기존 적재된 프레임 중 하나를 쫓아내야한다. -&amp;gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;Replacement 정책!&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;!! page fault가 발생할 확률은 매우 작아야한다!&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;만약 또 참조될 프로세스를 쫓아내면 또다시 가져와야한다. 이러한 page fault가 나오면 어마어마한 시간을 손해보기 떄문에 쫓아낼 때 잘 쫓아내는 것이 중요하다!&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Page Replacement Algorithms&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프레임에 새로운 페이지를 넣으려면 기존 메모리에 적재된 페이지를 쫓아내야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 기존 프레임에 적재된 페이지 중 어느것을 쫓아내고 새로운 페이지를 넣을까?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Optimal page replacement algorithm&lt;br /&gt;- 미래를 알고있다는 전제하에 사용하므로 실제 사용할 수 없지만 다른 방법과 성능을 비교할 때 쓰인다.&lt;/li&gt;
&lt;li&gt;Not recently used(NRU) page replacement&lt;/li&gt;
&lt;li&gt;First-In, First-Out page replacement&lt;/li&gt;
&lt;li&gt;Second chance page replacement&lt;/li&gt;
&lt;li&gt;Clock page replacement&lt;/li&gt;
&lt;li&gt;Least recently used(LRU) page replacement&lt;/li&gt;
&lt;li&gt;Working set page replacement&lt;/li&gt;
&lt;li&gt;WSClock page replacement&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;NRU(Not Recently Used), FIFO&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NRU: 최근에 참조되지 않은 페이지를 쫓아내겠다!&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Class 0: Not Referenced, Not Modified&lt;/li&gt;
&lt;li&gt;Class 1: Not Referenced, Modified&lt;/li&gt;
&lt;li&gt;Class 2: Referenced, Not Modified&lt;/li&gt;
&lt;li&gt;Class 3: Referenced, Modified&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; -&amp;gt; Class 0의 페이지를 우선해서 쫓아내고, 만약 없다면 그 다음 Class 1, 2, 3순서로 쫓아낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- reference bit를 확인하여 1로 세팅되어있다면 최근에 참조(주소변환)되었으므로 우선순위가 낮다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- modified: 변경(write 등)안되어있다면 바로 쫓아내고, 변경되었다면 해당페이지를 쫓아내기 전에 swap영역에 다시 적어야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- NRU 기법은 실제로 많이 변형해서 사용하는 기법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FIFO: 선입선출, 가장 먼저 적재되었다고해서 참조가 덜 되는것은 아니기 떄문에 참조가 많이 되는 페이지(hot page)를 쫓아낼 수 있다는 단점이 있다. (성능에 손해를 볼 수 있다)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Second Chance Algorithm&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FIFO를 보완한 알고리즘. 가장 먼저 들어온 페이지의 참조비트가 1이라면 0으로 변경하고 가장 마지막으로 보낸다.(한번 더 기회를 더 줌)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;The Clock Page Replacement Algorithm&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리에 적재된 페이지들 사이에서 Clock hand가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;돌아가며 가리키는 페이지부터 확인한다.&lt;br /&gt;만약 검사하는 페이지의 reference bit가 1이면 넘어가고 0이면 쫓아낸다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;LRU Page Replacement Algorithm&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Top: Most Recently Used (MRU) Page&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;Bottom: Least Recently Used (LRU) page&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항상 LRU page를 교체한다.(쫓아낸다)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;IMG_3A5CDB6D8CD5-1.jpeg&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;910&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNd8A8/btrFUjNc8pl/acCp59kMWOHJn8T39QrIvK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNd8A8/btrFUjNc8pl/acCp59kMWOHJn8T39QrIvK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNd8A8/btrFUjNc8pl/acCp59kMWOHJn8T39QrIvK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNd8A8%2FbtrFUjNc8pl%2FacCp59kMWOHJn8T39QrIvK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;274&quot; data-filename=&quot;IMG_3A5CDB6D8CD5-1.jpeg&quot; data-origin-width=&quot;1316&quot; data-origin-height=&quot;910&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조될때마다 페이지 순서가 LRU page stack에 linked-list로 만든다. 이는 소프트웨어적으로 구현이 쉽지만 하드웨어인 CPU 캐시에 구현하기는 어렵다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 현재 가장 연구가 많이되어있고 성능이 좋은 알고리즘이며 모든 프로그램이 가장 많이 사용하는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 페이지 참조 bit를 행렬로 만들어서 관리하는 방법이 있다. 0번 페이지 참조시 행은 모두 1로, 열은 모두 0으로 만들고 확인시 행으로 가서 가장 큰값을 가지는 페이지가 최근에 참조된것이고, 가장 작은값을 가지는 페이지는 예전에 참조된 것이다. 최근에&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;몇번 참조되었는지 확인할 수 없다&lt;/b&gt;.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방법도 페이지수가 많아지게 되면 CPU가 해주기에는 큰 일이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또다른 LRU 관리 방법)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CPU는 참조(주소변환)될때마다 R bit를 1로 세팅한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- CPU Clock이 한번 tick할때마다 6개 페이지의 R bit를 가장 왼쪽에 각각 기록한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 최근 참조된 bit는 가장 클것이고, 가장 옛날에 참조된 bit는 가장 작을것이다. 또한 최근에&amp;nbsp;&lt;b&gt;참조된 횟수도 표현이 가능&lt;/b&gt;하다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 하지만 페이지 개수가 많아지면 카운트를 유지하기 어려워지기 때문에 실제 시스템 구현시엔 어렵다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Comparison of OPT, LRU, FIFO, CLOCK&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오전 3.14.53.png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;708&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uXBJp/btrFVWcFAlB/hsoS0NbHLLD1CMGceUiu71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uXBJp/btrFVWcFAlB/hsoS0NbHLLD1CMGceUiu71/img.png&quot; data-alt=&quot;OPT에서 3번의 Fault가 나오므로 3번보다 더 줄일 수 있는 알고리즘은 존재하지 않는다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uXBJp/btrFVWcFAlB/hsoS0NbHLLD1CMGceUiu71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuXBJp%2FbtrFVWcFAlB%2FhsoS0NbHLLD1CMGceUiu71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;492&quot; height=&quot;318&quot; data-filename=&quot;스크린샷 2022-06-14 오전 3.14.53.png&quot; data-origin-width=&quot;1096&quot; data-origin-height=&quot;708&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;OPT에서 3번의 Fault가 나오므로 3번보다 더 줄일 수 있는 알고리즘은 존재하지 않는다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Working Set Page Replacement&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Working Set: 작업 집합. 프로그램이 실행하는데 필요한 페이지들&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Working Set이 메모리에 올라오면 잘 작동하고, 없다면 가져와야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- R(Referenced bit)==1이면 놔두고 R==0이면 working set에 속하는지 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- R==0이면서 age(현재 시간 - 마지막 사용시간) &amp;gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&amp;tau;&lt;/span&gt;이면&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;페이지를 제거한다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;WSClock Page Replacemnet Algorithm&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Working Set에 속한 Page들은 꼭 필요하므로 그것들은 메모리에 가지고 있겠다는 것. 특히 멀티프로그래밍에서 기본이 되는 이론이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Clock Page 알고리즘에 Working Set 개념을 추가한 방식이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #777777;&quot;&gt;ex. R bit가 1이면 0으로 바꾸고 clock hand를 움직인다. 만약 R bit가 0이면 페이지를 교체한다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Summary of Page Replacement Algorithms&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-14 오전 3.27.38.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;568&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAlToq/btrFT3KDBLE/1ozbWuDYu1K3DSDN9ds1o1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAlToq/btrFT3KDBLE/1ozbWuDYu1K3DSDN9ds1o1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAlToq/btrFT3KDBLE/1ozbWuDYu1K3DSDN9ds1o1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAlToq%2FbtrFT3KDBLE%2F1ozbWuDYu1K3DSDN9ds1o1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;570&quot; height=&quot;294&quot; data-filename=&quot;스크린샷 2022-06-14 오전 3.27.38.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;568&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LRU Algorithm은 다른 기법의 기본이 되는 알고리즘이다. 하지만 하드웨어적으로 구현이 어려워 Working set..등으로 보완했지만 실질적으로 많은 CPU는 NRU를 응용한 Two handed Clock기법을 사용한다!&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Thrashing&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: 메모리에 너무 많은 process가 적재되어있어서 각 프로세스의  working set이 적재될 수 없는 현상. swapping으로 이를 해결할 수 있다.&lt;/p&gt;</description>
      <category>cs지식/운영체제</category>
      <category>Memory</category>
      <category>OS</category>
      <category>운영체제</category>
      <author>Eunbae</author>
      <guid isPermaLink="true">https://eunbae11.tistory.com/23</guid>
      <comments>https://eunbae11.tistory.com/entry/OS-03-Memory#entry23comment</comments>
      <pubDate>Tue, 28 Jun 2022 13:44:10 +0900</pubDate>
    </item>
    <item>
      <title>OS - 02. Processes and Threads (2)</title>
      <link>https://eunbae11.tistory.com/entry/OS-02-Processes-and-Threads-2</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Scheduling&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음에 실행할 프로세스 또는 쓰레드를 선택하는 과정&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스케줄링 시점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt; 프로세스가 생성될 때&lt;/li&gt;
&lt;li&gt;프로세스가 종료할 때&lt;/li&gt;
&lt;li&gt;프로세스가 I/O, Semaphore, 또는 다른 무언가로 대기할 때&lt;/li&gt;
&lt;li&gt;I/O interrupt가 발생할 때&lt;/li&gt;
&lt;li&gt;선점 스케줄링 알고리즘(preemptive scheduling)의 경우 Clock Interrupt가 발생할 때&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;스케줄링 오버헤드(문맥교환비용)&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모드 변경 비용(사용자 &amp;gt; 커널 &amp;gt; 사용자)&lt;/li&gt;
&lt;li&gt;프로세스 문맥 저장, 복구&lt;/li&gt;
&lt;li&gt;메모리 맵 저장, 복구&lt;/li&gt;
&lt;li&gt;CPU 캐시 무효화&lt;/li&gt;
&lt;li&gt;기타&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Process Behavior - 프로세스의 실행 형태&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt; CPU-bound process : 한번실행하면 I/O요청 거의없이 계속 계산만 하는 프로세스.&lt;/li&gt;
&lt;li&gt; I/O-bound process : 잠깐 계산하고 I/O를 요구하는 프로세스. 대부분의 프로그램이 이에 해당한다.(word, chrome, exel, ...)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오후 4.43.14.png&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b782IJ/btrEhpOlO6Z/cxzwczqJzhcfipxTHtDKEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b782IJ/btrEhpOlO6Z/cxzwczqJzhcfipxTHtDKEk/img.png&quot; data-alt=&quot;a: CPU-bound process, b: I/O-bound process&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b782IJ/btrEhpOlO6Z/cxzwczqJzhcfipxTHtDKEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb782IJ%2FbtrEhpOlO6Z%2FcxzwczqJzhcfipxTHtDKEk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;511&quot; height=&quot;206&quot; data-filename=&quot;스크린샷 2022-06-08 오후 4.43.14.png&quot; data-origin-width=&quot;1188&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;a: CPU-bound process, b: I/O-bound process&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;프로세스의 우선순위&lt;/b&gt;는 &lt;b&gt;CPU-bound &amp;lt; I/O-bound&lt;/b&gt;이다! (자원의 활용도를 높이기 위함)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Type of Scheduling &lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Long-term scheduling : 사용자가 요구할 때, 즉 프로세스 실행시 바로 실행할지 delay해서 실행할지 등을 결정한다.&lt;/li&gt;
&lt;li&gt;Medium-term scheduling : 현재 실행중인 프로세스가 많을 때(threashing) suspend상태로 변경한다.&lt;/li&gt;
&lt;li&gt;Short-term scheduling : 굉장히 자주 실행되며, 어떤 프로세스를 실행할지 짧은 시간안에 결정한다.&lt;/li&gt;
&lt;li&gt;I/O scheduling : 5장에서..&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Queing for Scheduling&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오후 4.54.20.png&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;634&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/balFMg/btrEeJzBEaY/g8hZ2DWtOSfurkIGfAiTwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/balFMg/btrEeJzBEaY/g8hZ2DWtOSfurkIGfAiTwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/balFMg/btrEeJzBEaY/g8hZ2DWtOSfurkIGfAiTwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbalFMg%2FbtrEeJzBEaY%2Fg8hZ2DWtOSfurkIGfAiTwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;482&quot; height=&quot;317&quot; data-filename=&quot;스크린샷 2022-06-08 오후 4.54.20.png&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;634&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Long-term scheduling으로 실행 할 프로세스를 필요한 자원(process Id 등)을 세팅한 다음 Ready Queue에 하나씩 할당한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 프로세스 실행 과정에서 입출력 요구시 프로세스를 block상태로 만들고 Blocked Queue에 할당한다. Block상태 프로세스는 suspend상태나 ready상태가 될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 시스템의 메모리 부족 등을 이유로 Medium-term scheduling이 block, ready중인 프로세스 몇개를 suspend상태로 변경할 수 있다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Categories of Scheduling Algorithms&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Batch - 하나씩 가져가며 쭉 실행&lt;/li&gt;
&lt;li&gt;Interactive - 번갈아가며 실행&lt;/li&gt;
&lt;li&gt;Real time - 실시간으로 실행. 정해지 시간 내에 응답해야함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;각 알고리즘의 주요 목표&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Batch&lt;/b&gt;: Throughput(시간당 몇개의 작업을 끝냈는가), Turnaround time(작업이 시작하고 끝날때까지 걸리는시간), CPU utilization이 높아야한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Interactive&lt;/b&gt;: Response time이 높아야한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Real-time&lt;/b&gt;: 데드라인을 만족하고, 예측가능해야한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Scheduling in Batch Systems&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;First-come first-served&lt;/li&gt;
&lt;li&gt;Shortest job first&lt;/li&gt;
&lt;li&gt;Shortest remaining time next&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;First-come first-served&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오후 5.06.14.png&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;604&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/brRRG1/btrEivtCPdl/p7KApeT6kBV3LWaik9ApS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/brRRG1/btrEivtCPdl/p7KApeT6kBV3LWaik9ApS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/brRRG1/btrEivtCPdl/p7KApeT6kBV3LWaik9ApS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbrRRG1%2FbtrEivtCPdl%2Fp7KApeT6kBV3LWaik9ApS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;481&quot; height=&quot;273&quot; data-filename=&quot;스크린샷 2022-06-08 오후 5.06.14.png&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;604&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스를 온 순서대로 실행한다. 실행시간이 작은 E의 waiting time이 높다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Shortest job first&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오후 5.06.53.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;580&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pTsx6/btrEhWZxt6K/9crxk1pBA7ktjIBxxaDPJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pTsx6/btrEhWZxt6K/9crxk1pBA7ktjIBxxaDPJK/img.png&quot; data-alt=&quot;Time:8일때 도착한 프로세스는 C, D, E이기 때문에 가장 수행시간이 짧은 E 먼저 수행된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pTsx6/btrEhWZxt6K/9crxk1pBA7ktjIBxxaDPJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpTsx6%2FbtrEhWZxt6K%2F9crxk1pBA7ktjIBxxaDPJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;411&quot; height=&quot;244&quot; data-filename=&quot;스크린샷 2022-06-08 오후 5.06.53.png&quot; data-origin-width=&quot;976&quot; data-origin-height=&quot;580&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Time:8일때 도착한 프로세스는 C, D, E이기 때문에 가장 수행시간이 짧은 E 먼저 수행된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스가 종료될 때 남은 프로세스 중 실행시간이 가장 짧은 프로세스부터 수행한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Shortest remaining time next&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오후 5.09.47.png&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;540&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ma26d/btrEhrlezx5/DkSzPLhkMp44qKBQypyxo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ma26d/btrEhrlezx5/DkSzPLhkMp44qKBQypyxo0/img.png&quot; data-alt=&quot;Time:4일 때 B의 남은 작업시간은 5이고, C의 작업시간은 4이므로 C가먼저 실행된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ma26d/btrEhrlezx5/DkSzPLhkMp44qKBQypyxo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fma26d%2FbtrEhrlezx5%2FDkSzPLhkMp44qKBQypyxo0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;458&quot; height=&quot;245&quot; data-filename=&quot;스크린샷 2022-06-08 오후 5.09.47.png&quot; data-origin-width=&quot;1010&quot; data-origin-height=&quot;540&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Time:4일 때 B의 남은 작업시간은 5이고, C의 작업시간은 4이므로 C가먼저 실행된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Shortest Job First의 선점(Preemptive)한 스케줄링. 실행하던 작업을 중단한 후에 실행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 긴 작업은 계속 밀려서 서비스가 안되는 starvation이 발생할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Highest Response Ratio Next(HRRN)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스별로 비율을 계산(오른쪽그림)하여 계산 값이 가장 큰 프로세스가 먼저 수행된다. 앞선 알고리즘의 starvation문제를 해결할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LA9dG/btrEiITNJGz/5XUeYV3BWucIUGBJJwqEF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LA9dG/btrEiITNJGz/5XUeYV3BWucIUGBJJwqEF0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1038&quot; data-origin-height=&quot;288&quot; data-filename=&quot;스크린샷 2022-06-08 오후 5.13.13.png&quot; style=&quot;width: 54.9701%; margin-right: 10px;&quot; data-widthpercent=&quot;55.62&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LA9dG/btrEiITNJGz/5XUeYV3BWucIUGBJJwqEF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLA9dG%2FbtrEiITNJGz%2F5XUeYV3BWucIUGBJJwqEF0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1038&quot; height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHxez0/btrEhZPx176/Rrv6UrzCcz4D639SxO7vjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHxez0/btrEhZPx176/Rrv6UrzCcz4D639SxO7vjK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;604&quot; data-origin-height=&quot;210&quot; data-filename=&quot;스크린샷 2022-06-08 오후 5.13.26.png&quot; style=&quot;width: 43.8671%;&quot; data-widthpercent=&quot;44.38&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHxez0/btrEhZPx176/Rrv6UrzCcz4D639SxO7vjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHxez0%2FbtrEhZPx176%2FRrv6UrzCcz4D639SxO7vjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;604&quot; height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Scheduling in Interactive Systems&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Round-robin scheduling&lt;/li&gt;
&lt;li&gt;Priority scheduling&lt;/li&gt;
&lt;li&gt;Multiple queues&lt;/li&gt;
&lt;li&gt;Shortest process next&lt;/li&gt;
&lt;li&gt;Guaranteed scheduling&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Lottery scheduling&lt;/li&gt;
&lt;li&gt;Fair-share scheduling&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Round-robin Scheduling&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오전 2.34.24.png&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;318&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0ceg3/btrECAVMasZ/QHTi1tGyxiKpVpnGD7okY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0ceg3/btrECAVMasZ/QHTi1tGyxiKpVpnGD7okY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0ceg3/btrECAVMasZ/QHTi1tGyxiKpVpnGD7okY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0ceg3%2FbtrECAVMasZ%2FQHTi1tGyxiKpVpnGD7okY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;634&quot; height=&quot;166&quot; data-filename=&quot;스크린샷 2022-06-13 오전 2.34.24.png&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;318&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스가 같은 우선순위일때, 번갈아가며 실행하는 스케줄링 방법. B는 실행되다 자신의 quantum을 다 쓰면 뒤로간다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오전 2.37.14.png&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;718&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cy3XUL/btrEDRCZjyr/mxhTBgtmIzj40o2Ga4a9t0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cy3XUL/btrEDRCZjyr/mxhTBgtmIzj40o2Ga4a9t0/img.png&quot; data-alt=&quot;a: time quantum이 프로세스 종료시간보다 클 경우, b: time quantum이 프로세스 종료시간보다 짧을 경우(프로세스 종료 전에 문맥교환이 일어나는 경우)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cy3XUL/btrEDRCZjyr/mxhTBgtmIzj40o2Ga4a9t0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcy3XUL%2FbtrEDRCZjyr%2FmxhTBgtmIzj40o2Ga4a9t0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;285&quot; height=&quot;365&quot; data-filename=&quot;스크린샷 2022-06-13 오전 2.37.14.png&quot; data-origin-width=&quot;560&quot; data-origin-height=&quot;718&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;a: time quantum이 프로세스 종료시간보다 클 경우, b: time quantum이 프로세스 종료시간보다 짧을 경우(프로세스 종료 전에 문맥교환이 일어나는 경우)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프로세스는 자신의 time quantum을 다 사용하기 전에 I/O등을 요구하면 비효율적이다. 그래서 자신의 time quantum을 다 소비하기 전까지는 Ready Queue에 들어가지 않고 Auxiliary Queue에 들어간다. 이후 time quantum을 다 소비한다면 Ready Queue에 들어간다. (우선순위: Ready Queue &amp;lt; Auxiliary Queue) 이를 &lt;b&gt;Virtual Round-Robin방식&lt;/b&gt;이라 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오전 2.42.02.png&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;714&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Ja1gL/btrEzniyOKP/smMDMYfVwrTCyt8WeEDgUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Ja1gL/btrEzniyOKP/smMDMYfVwrTCyt8WeEDgUK/img.png&quot; data-alt=&quot;Virtual Round-Robin&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Ja1gL/btrEzniyOKP/smMDMYfVwrTCyt8WeEDgUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJa1gL%2FbtrEzniyOKP%2FsmMDMYfVwrTCyt8WeEDgUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;358&quot; height=&quot;352&quot; data-filename=&quot;스크린샷 2022-06-13 오전 2.42.02.png&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;714&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Virtual Round-Robin&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt; Priority Scheduling&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스마다 우선순위를 가진다. 우선순위가 클수록 숫자가 높고, 낮을수록 숫자가 작다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 동일한 우선순위를 가지는 프로세스는 Round-robin방식을 사용하고, 동일한 우선순위의 프로세스를 다 수행하면 다음 우선순위의 프로세스를 수행한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오전 2.43.53.png&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JROLo/btrECvT8ibI/zkTHeaH6B5K2drKAHCya8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JROLo/btrECvT8ibI/zkTHeaH6B5K2drKAHCya8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JROLo/btrECvT8ibI/zkTHeaH6B5K2drKAHCya8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJROLo%2FbtrECvT8ibI%2FzkTHeaH6B5K2drKAHCya8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;515&quot; height=&quot;230&quot; data-filename=&quot;스크린샷 2022-06-13 오전 2.43.53.png&quot; data-origin-width=&quot;1148&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Multilevel Feedback Queue (Multi Queue)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우선순위가 CPU-bound process &amp;lt; I/O-bound process이도록 하는 스케줄링 방법이다.&lt;/li&gt;
&lt;li&gt;RQ(Ready Queue)0은 우선순위가 가장 높고 RQn은 우선순위가 가장 낮다.&lt;/li&gt;
&lt;li&gt;RQ0에서 프로세스를 하나씩 가져와 처리하는데, 만약 CPU-bound process이면 다음 우선순위 큐로 넣는다.&lt;/li&gt;
&lt;li&gt;RQ0을 다 쓰면 RQ1에서 동작하는데, 이때도 CPU-bound이면 다음우선순위 큐로간다&lt;/li&gt;
&lt;li&gt;이 과정을 거치면 CPU-bound process는 가장 낮은 우선순위의 Ready Queue로 가게되고 이를 우선순위가 낮아진다고 표현한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오전 2.48.42.png&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/655Ne/btrEyvgRCsS/f8877kUPIapsapdx3vTgak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/655Ne/btrEyvgRCsS/f8877kUPIapsapdx3vTgak/img.png&quot; data-alt=&quot;Feedback Scheduling&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/655Ne/btrEyvgRCsS/f8877kUPIapsapdx3vTgak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F655Ne%2FbtrEyvgRCsS%2Ff8877kUPIapsapdx3vTgak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;350&quot; data-filename=&quot;스크린샷 2022-06-13 오전 2.48.42.png&quot; data-origin-width=&quot;726&quot; data-origin-height=&quot;564&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Feedback Scheduling&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Shrot Process Next&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예상 실행시간이 가장 짧은 프로세스를 먼저 실행하는 스케줄링 방법이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실행시간이 짧은 프로세스는 실행시간이 더 긴 프로세스를 뛰어넘어 먼저 실행한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오전 2.53.28.png&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;64&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xTiwD/btrEw8NeFFF/b3QwCaBDMBQZ7egSfILBQk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xTiwD/btrEw8NeFFF/b3QwCaBDMBQZ7egSfILBQk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xTiwD/btrEw8NeFFF/b3QwCaBDMBQZ7egSfILBQk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxTiwD%2FbtrEw8NeFFF%2Fb3QwCaBDMBQZ7egSfILBQk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;338&quot; height=&quot;64&quot; data-filename=&quot;스크린샷 2022-06-13 오전 2.53.28.png&quot; data-origin-width=&quot;338&quot; data-origin-height=&quot;64&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예상 실행시간은 오른쪽의 식과같이 구하고, 이는 과거에 실행했던 실행시간의 평균을 보고 계산하는 방법이다. 식은 마지막 실행시간(Tn)과 그 전의 실행시간의 합(Sn)과 가중치(a)를 곱하는데, 이는 특정 작업이 평균시간보다 더 많이 걸리게 되면 평균이 높아질 수 있지만 식과 같이 계산하면서 &lt;b&gt;변화되는 패턴에 빠르게 대응할 수 있다&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오전 2.54.58.png&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;430&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bWSwGv/btrExF488Mt/3AxXLjIsMmnFXeNlQz2680/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bWSwGv/btrExF488Mt/3AxXLjIsMmnFXeNlQz2680/img.png&quot; data-alt=&quot;Exponetial Smoothing Coefficients&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bWSwGv/btrExF488Mt/3AxXLjIsMmnFXeNlQz2680/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbWSwGv%2FbtrExF488Mt%2F3AxXLjIsMmnFXeNlQz2680%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;499&quot; height=&quot;277&quot; data-filename=&quot;스크린샷 2022-06-13 오전 2.54.58.png&quot; data-origin-width=&quot;774&quot; data-origin-height=&quot;430&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Exponetial Smoothing Coefficients&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Guaranteed Scheduling&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스마다 CPU시간을 1/n씩 할당하여 실행하도록 보장해주는 스케줄링 방법이다. 이는 리눅스의 Fair Share Scheduling(다다음)에서 쓰인다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Lottery Scheduling&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;n값이 랜덤일 때 각 프로세스마다 n%의 실행시간을 가지도록 하는 스케줄링 방법이다. 이때 시행비율을 임의로 조절 가능하다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Fair-share Scheduling&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스마다 &quot;공평한 몫&quot;의 시간을 사용하도록 하는 스케줄링 방법이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오전 2.58.55.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;112&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RKvWj/btrEyu3lFht/kOvpIHbPqKuF21MK12Zo51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RKvWj/btrEyu3lFht/kOvpIHbPqKuF21MK12Zo51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RKvWj/btrEyu3lFht/kOvpIHbPqKuF21MK12Zo51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRKvWj%2FbtrEyu3lFht%2FkOvpIHbPqKuF21MK12Zo51%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;407&quot; height=&quot;58&quot; data-filename=&quot;스크린샷 2022-06-13 오전 2.58.55.png&quot; data-origin-width=&quot;786&quot; data-origin-height=&quot;112&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU(i)값과 G(Group)CPU(i)값은 프로세스마다 1/2씩 decay된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;P(i)값이 가장 작은 프로세스부터 실행되며 GCPU(i)값은 4*Wk(그룹마다 주는 가중치)로 나누어 더한다. 이는 한 프로그램이 프로세스를 여러개(n개)를 사용하면 CPU사용시간이 n배가 되므로 공평하지 않기 때문이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오전 3.01.11.png&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;732&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/emh1w9/btrEF8xtYw6/kjOlMS6KUJ8ZzfuoFwTxc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/emh1w9/btrEF8xtYw6/kjOlMS6KUJ8ZzfuoFwTxc1/img.png&quot; data-alt=&quot;Fair-share Scheduling의 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/emh1w9/btrEF8xtYw6/kjOlMS6KUJ8ZzfuoFwTxc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Femh1w9%2FbtrEF8xtYw6%2FkjOlMS6KUJ8ZzfuoFwTxc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;417&quot; height=&quot;516&quot; data-filename=&quot;스크린샷 2022-06-13 오전 3.01.11.png&quot; data-origin-width=&quot;592&quot; data-origin-height=&quot;732&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Fair-share Scheduling의 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;프로세스가 실행되면 프로세스의 CPU count가 증가한다.&lt;/li&gt;
&lt;li&gt;한 period가 지나면, 각 CPU count에 1/2를 곱한다.&lt;/li&gt;
&lt;li&gt;이때 decay로 1/2씩 곱한다.&lt;/li&gt;
&lt;li&gt;이후 값이 가장 작은 프로세스를 실행하고, 1번 과정부터 4번과정까지 반복된다.&lt;/li&gt;
&lt;li&gt;실행을 안하고 기다리게되면 decay로 우선순위가 다시 높아지게된다. 이는 계속 우선순위가 밀려 실행되지 않는 경우를 방지하고,&amp;nbsp; aging기능이라 할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Scheduling Mechanism vs Policy&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;scheduling mechanism과 scheduling policy를 구분해야한다.&lt;/li&gt;
&lt;li&gt;커널은 스케줄링 메커니즘을 가지고 있어야한다.&lt;/li&gt;
&lt;li&gt;커널 알고리즘 또는 유저 프로세스는 scheduling policy를 결정해야한다. (FIFO, RealTime등의 메커니즘을 갖고있다가 지정하면 policy를 집행할 수 있어야 한다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Thread Scheduling&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오전 3.12.32.png&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;584&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bcRnEZ/btrEBtCDZv8/tRwxjHh1DAXpG9Zik7Jlsk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bcRnEZ/btrEBtCDZv8/tRwxjHh1DAXpG9Zik7Jlsk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bcRnEZ/btrEBtCDZv8/tRwxjHh1DAXpG9Zik7Jlsk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbcRnEZ%2FbtrEBtCDZv8%2FtRwxjHh1DAXpG9Zik7Jlsk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;558&quot; height=&quot;255&quot; data-filename=&quot;스크린샷 2022-06-13 오전 3.12.32.png&quot; data-origin-width=&quot;1278&quot; data-origin-height=&quot;584&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;a: user-level threads를 스케줄링하는 방법. 커널은 프로세스 2개가 있다고 생각하며 A, B만 번갈아가며 실행하고 있다고 생각한다. 프로세스마다 미니 커널이 있어서 이 미니커널이 알아서 쓰레드를 조작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;b: kerner-level threads를 스케줄링하는 방법. 커널이 처음부터 쓰레드를 조작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 현재는 a의 유저레벨 쓰레드는 생각할 필요가 없다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Traditional Unix Scheduling&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오전 3.18.20.png&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;152&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SmSzq/btrEAy5gxor/rK3Z6ySsvLfxvhO4MLeV80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SmSzq/btrEAy5gxor/rK3Z6ySsvLfxvhO4MLeV80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SmSzq/btrEAy5gxor/rK3Z6ySsvLfxvhO4MLeV80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSmSzq%2FbtrEAy5gxor%2FrK3Z6ySsvLfxvhO4MLeV80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;224&quot; height=&quot;59&quot; data-filename=&quot;스크린샷 2022-06-13 오전 3.18.20.png&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;152&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 priority queue들을 갖고있는 Round-robin방식을 이용해 Multilevel feedback을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한번 동작하면 우선순위가 낮아지고, 실행을 안하고 기다리고 있으면 우선순위가 다시 올라가는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;매번 우선순위를 다시 계산하여 Pj(i)값이 작을수록 우선순위가 높다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프로세스의 우선순위를 낮추는 경우는 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Swapper&lt;/li&gt;
&lt;li&gt;Block I/O device control&lt;/li&gt;
&lt;li&gt;File manipulation&lt;/li&gt;
&lt;li&gt;Character I/O device control&lt;/li&gt;
&lt;li&gt;User processes&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Unix Scheduling은 프로세스별로 &lt;b&gt;특정 밴드(Bands)&lt;/b&gt;에 소속되어서 실행하도록 한다. 만약 입출력이 끝나면(깨어나면) 우선순위가 높은 밴드로 가게하여 빨리 처리하도록 한다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오전 3.23.02.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c8vzh1/btrEzoogtJJ/g3v3VdNgl4KALZ4b4eIKU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c8vzh1/btrEzoogtJJ/g3v3VdNgl4KALZ4b4eIKU1/img.png&quot; data-alt=&quot;Traditional Unix Scheduling 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c8vzh1/btrEzoogtJJ/g3v3VdNgl4KALZ4b4eIKU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc8vzh1%2FbtrEzoogtJJ%2Fg3v3VdNgl4KALZ4b4eIKU1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;260&quot; height=&quot;353&quot; data-filename=&quot;스크린샷 2022-06-13 오전 3.23.02.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;670&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Traditional Unix Scheduling 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;BSD and SVR3 scheduling&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프로세스가 실행되는 동안 p_cpu의 값은 증가하게된다.(clock tick increments)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 매 초마다 모든 프로세스의 우선순위는 재계산된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SVR3: 프로세스가 많아질수록 1/2 decay는 과하게 되어서 결국 대부분의 프로세스가 0이 되어서 구별할 수 없게된다.&lt;/li&gt;
&lt;li&gt;BSD: decay = (2*load_avg) / (2*load_avg + 1)의 식으로 동작하여 실행중인 프로세스의 개수에 따라 값이 정해지도록 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Scheduling Examples&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Linux Scheduling&lt;/li&gt;
&lt;li&gt;Unix Scheduling&lt;/li&gt;
&lt;li&gt;Windows Scheduling&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Linux Scheduling&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;O(1): Linux SCHED_OTHER Scheduling&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;I/O-bound process에게 높은 우선순위를 주는 정책이다.&lt;/li&gt;
&lt;li&gt;태스크(task, 리눅스에서 thread를 부르는 용어)의 실행시간 대비 휴먼시간 비율(sleep_avg)을 유지한다.&lt;/li&gt;
&lt;li&gt;우선순위와 타임슬라이스 계산식&lt;br /&gt;effective prio = 인터액티브 정도 + 정적 우선순위&lt;br /&gt;새로운 타임슬라이스 = effective prio에 비례함&lt;/li&gt;
&lt;li&gt;인터액티브 태스크는 expired Q가 아닌 active Q에 넣어 또 실행할 수 있도록 한다. &lt;br /&gt;(원래 태스크의 time slice를 다 소비하면 expired Q에 넣는다)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;문제점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Nice값이 timeslice의 절대값을 결정한다.&lt;/li&gt;
&lt;li&gt;Nice값의 차이가 timeslice 차이에 비례하지 않는다.&lt;/li&gt;
&lt;li&gt;Timeslice와&amp;nbsp; timertick의 granularity(정밀도)문제가 있다.&lt;/li&gt;
&lt;li&gt;Interactive task의 우선 문제가 있다.&lt;br /&gt;- sleep에서 깨어나면 무조건 active Q로 들어온다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;CFS 스케줄러&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞선 O(1)의 문제점을 보완하고 개선한 RSDL을 개발하였다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;I/O-bound와 CPU-bound process의 구분을 없애고 CPU할당시간을 공평하게 분배하였다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Run Q를 없애고 RB-tree를 사용하였다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Jiffies와 HZ상수를 이용하지 않고 나노초단위로 동작하게(정확히 집행하도록) 하였다.&lt;/li&gt;
&lt;li&gt;통계적 기법이나 휴리스틱을 이용하지 않았다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;Virtual Runtime&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: Time slice와 timertick의 granularity문제를 해결한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 문맥교환(time slice) 주기가 20ms. 두 태스크가 45ms, 15ms비율로 수행해야하면 실제로는 40ms, 20ms씩 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 수행시간 40ms, 20ms에 scale factor(1:3)을 곱하여 virtual runtime을 구하는데, 40ms, 60ms로 같지 않다면 뒤쳐진 태스크(40ms)를 수행하여(-&amp;gt; 20ms더 수행하면 60ms, 60ms) 시간을 보상한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;따라서 CFS의 목표는 모든 Virtual Runtime을 균등하도록 하는 것이다!&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Unix SVR4 Scheduling&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 160개의 우선순위를 가진 스케줄링 Queue를 가진다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- Preemption point를 넣어 작동하도록 한다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Preemption point&lt;/b&gt;: 만약 시스템 호출하여 데이터를 리턴하기 전에 스케줄링한다면 시스템호출+스케줄링의 시간이 많이 길어질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 방지하기위해 커널에 preemption point, 즉 &lt;b&gt;스케줄이 되는 지점&lt;/b&gt;을 몇개 넣어서 시스템 호출이 되더라도 이 point에 도달하면 급하게 작업할 프로세스(RealTime 등)가 있다면&lt;b&gt; 바로 스케줄하여 작업을 실행&lt;/b&gt;하도록 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오전 3.43.35.png&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ewQKRK/btrEyvVvRcX/Hcs2JK976lyI4V7oRq48A1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ewQKRK/btrEyvVvRcX/Hcs2JK976lyI4V7oRq48A1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ewQKRK/btrEyvVvRcX/Hcs2JK976lyI4V7oRq48A1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FewQKRK%2FbtrEyvVvRcX%2FHcs2JK976lyI4V7oRq48A1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;546&quot; height=&quot;125&quot; data-filename=&quot;스크린샷 2022-06-13 오전 3.43.35.png&quot; data-origin-width=&quot;970&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Windows Scheduling&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우선순위는 두가지의 band 혹은 class로 나뉜다. - Real time 또는 Variable(Non-Real time)&lt;/li&gt;
&lt;li&gt;우선순위기반 preemptive scheduler을 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오전 3.44.51.png&quot; data-origin-width=&quot;1292&quot; data-origin-height=&quot;846&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zywOP/btrEvJFP5Lp/9wFkcauzOwdH3HDiYkwnQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zywOP/btrEvJFP5Lp/9wFkcauzOwdH3HDiYkwnQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zywOP/btrEvJFP5Lp/9wFkcauzOwdH3HDiYkwnQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzywOP%2FbtrEvJFP5Lp%2F9wFkcauzOwdH3HDiYkwnQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;648&quot; height=&quot;424&quot; data-filename=&quot;스크린샷 2022-06-13 오전 3.44.51.png&quot; data-origin-width=&quot;1292&quot; data-origin-height=&quot;846&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Real-time: 31~16, Variable(일반 프로그램): 15~0값과 각각의 Queue를 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;15~0의 일반 프로그램은 한번 동작하면 우선순위가 낮아지고, 실행을 안하고 기다리고 있으면 우선순위가 다시 올라가는 방식을 사용하여 동적으로 할당된다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Dining Philosophers Problem&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock floatRight&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오전 3.48.36.png&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;650&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKkVgt/btrEDQKSl9X/Z1pdLQ2nLuADKYaZzKajLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKkVgt/btrEDQKSl9X/Z1pdLQ2nLuADKYaZzKajLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKkVgt/btrEDQKSl9X/Z1pdLQ2nLuADKYaZzKajLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKkVgt%2FbtrEDQKSl9X%2FZ1pdLQ2nLuADKYaZzKajLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;135&quot; height=&quot;127&quot; data-filename=&quot;스크린샷 2022-06-13 오전 3.48.36.png&quot; data-origin-width=&quot;692&quot; data-origin-height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;식사하는 철학자 문제. 데드락의 동기화 문제를 설명한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;철학자가 식사하려면 양쪽의 모든 포크를 집어야하고, 어떤 경우는 철학자 모두 식사를 못하고 계속 굶어 죽을 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-13 오전 3.49.31.png&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;380&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tD3YA/btrEDRpwbwv/DAIyHFIyEJtxa47veRYuRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tD3YA/btrEDRpwbwv/DAIyHFIyEJtxa47veRYuRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tD3YA/btrEDRpwbwv/DAIyHFIyEJtxa47veRYuRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtD3YA%2FbtrEDRpwbwv%2FDAIyHFIyEJtxa47veRYuRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;533&quot; height=&quot;192&quot; data-filename=&quot;스크린샷 2022-06-13 오전 3.49.31.png&quot; data-origin-width=&quot;1054&quot; data-origin-height=&quot;380&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>cs지식/운영체제</category>
      <category>OS</category>
      <category>Process</category>
      <category>Thread</category>
      <category>운영체제</category>
      <author>Eunbae</author>
      <guid isPermaLink="true">https://eunbae11.tistory.com/16</guid>
      <comments>https://eunbae11.tistory.com/entry/OS-02-Processes-and-Threads-2#entry16comment</comments>
      <pubDate>Mon, 13 Jun 2022 03:51:56 +0900</pubDate>
    </item>
    <item>
      <title>OS - 02. Processes and Threads (1)</title>
      <link>https://eunbae11.tistory.com/entry/OS-Processes-and-Threads-1</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Race Conditions&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-07 오후 3.58.01.png&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;718&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0hXJ9/btrD9E6oD6R/6sV0IM8OORkZo9fuRHc0Wk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0hXJ9/btrD9E6oD6R/6sV0IM8OORkZo9fuRHc0Wk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0hXJ9/btrD9E6oD6R/6sV0IM8OORkZo9fuRHc0Wk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0hXJ9%2FbtrD9E6oD6R%2F6sV0IM8OORkZo9fuRHc0Wk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;416&quot; height=&quot;718&quot; data-filename=&quot;스크린샷 2022-06-07 오후 3.58.01.png&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;718&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- ProcessA와 B가 동시에 공유 메모리를 access(접근)하기 원하는 상태. 경쟁상황이 발생할 수 있고, 경쟁 결과에 따라 결과값이 변경될 수 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Critical Regions&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;race condition을 피하기 위한 필요 조건&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Mutual Exclusion : 상호배제, 동시에 임계구역에 들어갈 수 없도록한다.&lt;/li&gt;
&lt;li&gt;Progress : &lt;span style=&quot;background-color: #ffffff; color: #000000;&quot;&gt;임계 영역 밖에서 실행되는 어떠한 프로세스도 다른 프로세스를 차단할 수 없다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Bounded Waiting : 임계 영역에 들어가기 위해 영원히 기다리는 프로세스는 없도록 한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-07 오후 4.04.43.png&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bZMcvp/btrEdzvCdIL/1873ek6o943XnnMqckD4tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bZMcvp/btrEdzvCdIL/1873ek6o943XnnMqckD4tk/img.png&quot; data-alt=&quot;process A가 임계구역에 들어가면 B는 A가 나올때까지 기다린다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bZMcvp/btrEdzvCdIL/1873ek6o943XnnMqckD4tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbZMcvp%2FbtrEdzvCdIL%2F1873ek6o943XnnMqckD4tk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;685&quot; height=&quot;344&quot; data-filename=&quot;스크린샷 2022-06-07 오후 4.04.43.png&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;620&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;process A가 임계구역에 들어가면 B는 A가 나올때까지 기다린다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;상호배제(Mutual Exclusion)를 구현하기 위한 제안&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Disabling interrupts&lt;/li&gt;
&lt;li&gt;Lock variables&lt;/li&gt;
&lt;li&gt;Strict alternation&lt;/li&gt;
&lt;li&gt;peterson's solution&lt;/li&gt;
&lt;li&gt;The TSL instruction&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Strict Alternation&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;process j가 임계 영역에 들어갈때까지 process i는 계속 대기 상태가 되어 실행되지 않는다. 제대로된 해결책이 아님!&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Dekker's Solution&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Process i는 상대방 flag를 보고 j가 TRUE면 while문에서 기다린다. FALSE이면 turn이 j인지 확인하고, j라면 자신의 flag를 FALSE로 만들고 turn이 i가 될때까지 기다린다. turn이 i이면 그때 임계구역에 들어갈 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- flag: 들어가겠다는 표지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- turn: 실제 배정받은 turn(실행중 표시)&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Peterson's Solution&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dekker와 비슷하지만 여기서 turn의 의미는 양보할 프로세스이다. Process i는 flag가 i, turn이 j일때까지 기다렸다가 임계구역에 들어간다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Bakery Algorithm&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스(쓰레드)의 개수가 n개일때, 빵집처럼 번호표를 받아서 번호표가 같을 때 고유 id 순으로 임계 영역에 들어간다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;The TSL Instruction&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 빵집알고리즘은 소프트웨어적 도구인데, 이를 수행하기에는 너무 heavy함으로 하드웨어의 도움이 필요하다. 이에 TSL Register를 도입하여 하드웨어적으로 작성한다. (TSL = Test and Set Lock)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVTP4H/btrD9FRNmbZ/3l5rHJaGuKh2y7GxTmXkd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVTP4H/btrD9FRNmbZ/3l5rHJaGuKh2y7GxTmXkd0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1206&quot; data-origin-height=&quot;730&quot; data-filename=&quot;스크린샷 2022-06-07 오후 4.30.54.png&quot; style=&quot;width: 47.151%; margin-right: 10px;&quot; data-widthpercent=&quot;47.71&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVTP4H/btrD9FRNmbZ/3l5rHJaGuKh2y7GxTmXkd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVTP4H%2FbtrD9FRNmbZ%2F3l5rHJaGuKh2y7GxTmXkd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1206&quot; height=&quot;730&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LI32p/btrEdR31BNQ/xnqIbe1nDvyTXgiwk9GtTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LI32p/btrEdR31BNQ/xnqIbe1nDvyTXgiwk9GtTK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1322&quot; data-origin-height=&quot;730&quot; data-filename=&quot;스크린샷 2022-06-07 오후 4.31.08.png&quot; style=&quot;width: 51.6862%;&quot; data-widthpercent=&quot;52.29&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LI32p/btrEdR31BNQ/xnqIbe1nDvyTXgiwk9GtTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLI32p%2FbtrEdR31BNQ%2FxnqIbe1nDvyTXgiwk9GtTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1322&quot; height=&quot;730&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;좌: TSL Instruction, 우: XCHG&amp;nbsp;Instruction&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TSL은 Lock 변수를 register로 가져와서 1로 세팅한다. 세팅 이전의 Lock값이 0인지 확인 한 후, 0이라면 return하여 임계구역에 진입하고 1이라면 다른 process가 이미 1로 세팅하여 사용중이므로 loop를 돌며 확인한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;XCHG는 Lock변수와 Register를 exchange(swap)하여 &lt;span&gt;TSL과 같은 과정을 거친다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;The Producer-Consumer Problem&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Producer-Consumer관계의 두 프로세스는 둘 다 Sleep할 수 있는 치명적인 race condition을 가질 수 있다.&lt;/li&gt;
&lt;li&gt;producer는 item을 만들어서 queue에 넣고, count가 N에 도달(queue가 꽉 참)하면 스스로 sleep한다. 이를 consumer가 count가 N-1이 될 때(꽉 차지 않게됨)를 확인 후 producer를 깨워주는 방식으로 동작한다.&lt;/li&gt;
&lt;li&gt;producer의 sleep직전에 cousumer가 실행되어 wakeup하게되면 producer는 sleep상태를 유지하게되고 이후 cousumer는 큐를 모두 소비하고 sleep하게되므로 결국 둘 다 sleep하게되는 문제가 발생한다. 이는 반대의 경우(consumer의 sleep직전에 producer가 실행되어 wakeup)도 마찬가지로 문제가 발생한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Semaphores&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Semaphore는 Up&amp;amp;Down연산자를 사용하고, mutual exclusion(상호배제)와 synchronization(동기화)를 위해 사용될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오후 2.43.17.png&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;622&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/djqA1d/btrEeYjjQ7A/KMvbZkPIINv9btCRovjFw1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/djqA1d/btrEeYjjQ7A/KMvbZkPIINv9btCRovjFw1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/djqA1d/btrEeYjjQ7A/KMvbZkPIINv9btCRovjFw1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdjqA1d%2FbtrEeYjjQ7A%2FKMvbZkPIINv9btCRovjFw1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;436&quot; height=&quot;347&quot; data-filename=&quot;스크린샷 2022-06-08 오후 2.43.17.png&quot; data-origin-width=&quot;782&quot; data-origin-height=&quot;622&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;down은 count를 감소시키고 만약 카운트가 0보다 작다면 (즉, sleep조건이면) down을 호출한 프로세스를 sleep시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;up도 down과 마찬가지로 count를 증가시키고 만약 카운트가 0보다 같거나 작다면 sleep중인 프로세스를 wake up시켜준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 down과 up과정은 수행중 끼어들 수 없고, 이를 아토믹하게(원자적으로) 진행한다고 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오후 2.34.39.png&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUEpxP/btrEguILfS7/C7iOUg3LPwlBkkK3f4kjP1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUEpxP/btrEguILfS7/C7iOUg3LPwlBkkK3f4kjP1/img.png&quot; data-alt=&quot;producer-cousumer problem을 Semaphore로 해결한 과정&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUEpxP/btrEguILfS7/C7iOUg3LPwlBkkK3f4kjP1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUEpxP%2FbtrEguILfS7%2FC7iOUg3LPwlBkkK3f4kjP1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;579&quot; height=&quot;323&quot; data-filename=&quot;스크린샷 2022-06-08 오후 2.34.39.png&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;656&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;producer-cousumer problem을 Semaphore로 해결한 과정&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Producer과 Consumer사이에는 유한한 큐 버퍼가 존재하고, Semaphore n, mutex, e를 설정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;down(mutex)를 producer와 consumer가 동시에 호출해도 OS자체에서 한 프로세스만 down하도록 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 producer가 down mutex를 하면 1에서 0으로 바꾸어 먼저 수행하고, consumer는 0에서 -1로 바꾸어 실행을 대기한다(sleep).&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후 producer가 작업을 수행하고 임계 영역을 나올 때 mutex를 up하면 -1에서 0로 바뀌고 sleep을 호출한 프로세스(consumer)를 깨워주고 consumer은 바로 semaphore을 획득하여 임계 영역에 들어가 바로 실행하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Priority Inversion(우선순위 역전)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sleep과 wakeup이 수행될 때 우선순위를 기반으로한 선점 스케줄링(priority-based preemptive scheduling scheme)에서 우선순위 역전이 일어날 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오후 2.52.46.png&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;456&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/czYeAR/btrEhZImVDX/bHahBRmSlcj7erhx39Bh5k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/czYeAR/btrEhZImVDX/bHahBRmSlcj7erhx39Bh5k/img.png&quot; data-alt=&quot;우선순위: T1 &amp;amp;gt; T2 &amp;amp;gt; T3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/czYeAR/btrEhZImVDX/bHahBRmSlcj7erhx39Bh5k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FczYeAR%2FbtrEhZImVDX%2FbHahBRmSlcj7erhx39Bh5k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;379&quot; height=&quot;258&quot; data-filename=&quot;스크린샷 2022-06-08 오후 2.52.46.png&quot; data-origin-width=&quot;670&quot; data-origin-height=&quot;456&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;우선순위: T1 &amp;gt; T2 &amp;gt; T3&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;T3이 필요한 데이터를 Lock을 하여 실행중인데, T1이 깨어나서 수행 시 T3이 Lock을 한 데이터를 필요로 한다. 이 때 T1은 T3이 수행 종료되어 Lock을 반환할 때 까지 기다려야하는데, 그 사이 &lt;b&gt;T2가 스케줄링되어 실행되면 T2가 T1보다 먼저 수행되며 종료하는 우선순위 역전이 생길 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Priority Inheritance&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오후 2.53.17.png&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;446&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cpGiLF/btrEh8rw86b/FWC9dD2DsKKlKXGkw4IMoK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cpGiLF/btrEh8rw86b/FWC9dD2DsKKlKXGkw4IMoK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cpGiLF/btrEh8rw86b/FWC9dD2DsKKlKXGkw4IMoK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcpGiLF%2FbtrEh8rw86b%2FFWC9dD2DsKKlKXGkw4IMoK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;330&quot; height=&quot;255&quot; data-filename=&quot;스크린샷 2022-06-08 오후 2.53.17.png&quot; data-origin-width=&quot;578&quot; data-origin-height=&quot;446&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;T1의 우선순위를 T3에게 상속&lt;/b&gt;하여 T3 수행 중에 T2는 깨어나도 T3이 우선순위가 더 높기 때문에 T3이 수행 종료된 후 수행된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Mutexes&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Semaphore는 OS에 시스템 호출을 함으로써 상호배제를 구현한다. 반대로 Mutex는 OS에 부탁하지 않고 독립적으로 상호배제를 할 수 있는 방법이다.&lt;/li&gt;
&lt;li&gt;Mutex는 쓰레드들 간에 OS 공유없이 가능한 공유방법으로, 하나의 프로세스 내에서 TSL연산을 그대로 이용할 수 있다.&lt;/li&gt;
&lt;li&gt;따라서 Mutex는 멀티 쓰레드로 구현하고 싶을 때 효율적일 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오후 3.01.34.png&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;498&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVEZyN/btrEirj7f8N/gvpkvU1AclnDuvssKLYmM0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVEZyN/btrEirj7f8N/gvpkvU1AclnDuvssKLYmM0/img.png&quot; data-alt=&quot;TSL과 마찬가지로, registe는 mutex를 1로 세팅하고, 이전값이 0이었다면 return하고 1이었다면 mutex가 수행중(다른 쓰레드 스케줄중)이므로 처음부터 다시수행하며 대기한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVEZyN/btrEirj7f8N/gvpkvU1AclnDuvssKLYmM0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVEZyN%2FbtrEirj7f8N%2FgvpkvU1AclnDuvssKLYmM0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;206&quot; data-filename=&quot;스크린샷 2022-06-08 오후 3.01.34.png&quot; data-origin-width=&quot;1288&quot; data-origin-height=&quot;498&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;TSL과 마찬가지로, registe는 mutex를 1로 세팅하고, 이전값이 0이었다면 return하고 1이었다면 mutex가 수행중(다른 쓰레드 스케줄중)이므로 처음부터 다시수행하며 대기한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Mutexes in pthreads&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대부분의 OS는 Mutex연산을 제공하여 하나의 프로세스 안에서 멀티 쓰레드로 일을 할 때 사용하는것이 가능하다!&lt;/li&gt;
&lt;li&gt;하지만 mutex는 semaphore과는 다르게 동기화(sleep-wakeup)는 해주지 못하기 때문에 condition 변수를 도입하였다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8Z7ZV/btrEiapnnW9/TuK8OaFMeS1zkW70i8tDZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8Z7ZV/btrEiapnnW9/TuK8OaFMeS1zkW70i8tDZk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;398&quot; data-filename=&quot;스크린샷 2022-06-08 오후 3.07.40.png&quot; style=&quot;width: 42.3249%; margin-right: 10px;&quot; data-widthpercent=&quot;42.82&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8Z7ZV/btrEiapnnW9/TuK8OaFMeS1zkW70i8tDZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8Z7ZV%2FbtrEiapnnW9%2FTuK8OaFMeS1zkW70i8tDZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;998&quot; height=&quot;398&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/md7Rk/btrEh9RxLlh/TtxmfrHOWN6UShhNUFlv40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/md7Rk/btrEh9RxLlh/TtxmfrHOWN6UShhNUFlv40/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1212&quot; data-origin-height=&quot;362&quot; data-filename=&quot;스크린샷 2022-06-08 오후 3.07.49.png&quot; style=&quot;width: 56.5123%;&quot; data-widthpercent=&quot;57.18&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/md7Rk/btrEh9RxLlh/TtxmfrHOWN6UShhNUFlv40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fmd7Rk%2FbtrEh9RxLlh%2FTtxmfrHOWN6UShhNUFlv40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1212&quot; height=&quot;362&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;Pthread 패키지, mutex 변수를 생성하거나(init) 삭제(destroy), lock, unlock등의 기능을 제공한다. signal, broadcast를 이용하여 쓰레드를 하나만 깨우거나 모두 깨우는 등의 작업도 가능하&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오후 3.13.15.png&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;722&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ynzCk/btrEguPEZzg/CxDdJRKVjVVB6JNlchNDJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ynzCk/btrEguPEZzg/CxDdJRKVjVVB6JNlchNDJK/img.png&quot; data-alt=&quot; 쓰레드를 이용하여 producer-cousumer problem를 해결한 코드.&amp;amp;amp;nbsp;consumer와 producer를 별도의 쓰레드로 생성하여 병렬 실행한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ynzCk/btrEguPEZzg/CxDdJRKVjVVB6JNlchNDJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FynzCk%2FbtrEguPEZzg%2FCxDdJRKVjVVB6JNlchNDJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;623&quot; height=&quot;333&quot; data-filename=&quot;스크린샷 2022-06-08 오후 3.13.15.png&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;722&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt; 쓰레드를 이용하여 producer-cousumer problem를 해결한 코드.&amp;amp;nbsp;consumer와 producer를 별도의 쓰레드로 생성하여 병렬 실행한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 만약 producer가 lock을 하고 버퍼가 MAX에 도달하면 unlock하지 않고 잠들게되어 consumer는 이를 깨워줄 수 없게 된다. 따라서 sleep직전에 unlock하도록 설계되어있고, 깨어날 때 lock을 하지 않고 깨면 안되므로 lock을 하고 깨어나도록 하는 코드도 설계되어 있다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Monitors&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;up&amp;amp;down연산(high level)과 lock&amp;amp;unlock연산(low level)은 설계시 코드가 수천줄이 넘어가면 up&amp;amp;down쌍을 맞추기 어렵다는 문제점이 있다.&lt;/li&gt;
&lt;li&gt;Monitor은 동기화를 프로그래머가 설계하는것이 아니라 컴파일러 수준에서 하도록 설계한 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오후 3.25.20.png&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;566&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/71S9t/btrEeXrjdd5/7aMBx44tGhvrc8WFpjTTO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/71S9t/btrEeXrjdd5/7aMBx44tGhvrc8WFpjTTO0/img.png&quot; data-alt=&quot;모니터.&amp;amp;amp;nbsp;쓰레드가 동시에 호출해도 컴파일러는 항상 한번에 하나씩만 실행해준다.(상호배제)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/71S9t/btrEeXrjdd5/7aMBx44tGhvrc8WFpjTTO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F71S9t%2FbtrEeXrjdd5%2F7aMBx44tGhvrc8WFpjTTO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;243&quot; height=&quot;261&quot; data-filename=&quot;스크린샷 2022-06-08 오후 3.25.20.png&quot; data-origin-width=&quot;526&quot; data-origin-height=&quot;566&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;모니터.&amp;amp;nbsp;쓰레드가 동시에 호출해도 컴파일러는 항상 한번에 하나씩만 실행해준다.(상호배제)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오후 3.25.59.png&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;740&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Pcnxd/btrEhq0BC3X/k2klKmUIaeDElYfCMjlGeK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Pcnxd/btrEhq0BC3X/k2klKmUIaeDElYfCMjlGeK/img.png&quot; data-alt=&quot;모니터로 구현한 producer-cousumer problem.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Pcnxd/btrEhq0BC3X/k2klKmUIaeDElYfCMjlGeK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPcnxd%2FbtrEhq0BC3X%2Fk2klKmUIaeDElYfCMjlGeK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;574&quot; height=&quot;345&quot; data-filename=&quot;스크린샷 2022-06-08 오후 3.25.59.png&quot; data-origin-width=&quot;1230&quot; data-origin-height=&quot;740&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;모니터로 구현한 producer-cousumer problem.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2개의 쓰레드가 동시에 실행되는 중에 동시에 insert, remove를 부르게 되더라도 컴파일러가 알아서 동시에 실행되지않도록 구현된다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Structure of a Monitor&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오후 3.28.24.png&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;718&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cVU7ne/btrEgv18QJ2/qNpKIQrKl4bk5IKCiy12b0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cVU7ne/btrEgv18QJ2/qNpKIQrKl4bk5IKCiy12b0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cVU7ne/btrEgv18QJ2/qNpKIQrKl4bk5IKCiy12b0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcVU7ne%2FbtrEgv18QJ2%2FqNpKIQrKl4bk5IKCiy12b0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;348&quot; height=&quot;477&quot; data-filename=&quot;스크린샷 2022-06-08 오후 3.28.24.png&quot; data-origin-width=&quot;524&quot; data-origin-height=&quot;718&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;프로세스들은 Queue에서 기다리다 하나씩&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;모니터로 들어와&lt;/span&gt; 실행한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;첫번째 프로세스가 실행하다 sleep하는 코드를 만나면 monitor의 waiting area로 들어가서 기다린다.&lt;/li&gt;
&lt;li&gt;그동안 모니터가 비게되면 두번째 프로세스가 들어와서 실행한다.&lt;/li&gt;
&lt;li&gt;이때 첫번째 프로세스를 wake up해주는 코드가 있다고 하면 깨워준 이후 두 프로세스는 동시에 수행될수 없으므로&lt;/li&gt;
&lt;li&gt;두번째 프로세스는 1) wake up을 시켜주고 바로 urgent Queue로 들어가 기다리고 첫번째 프로세스를 실행하거나 / 2) &lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;wake up을 시켜주고 쭉 수행 후 종료된 다음 첫번째 프로세스를 실행할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Hoare's Monitor : 1) 방법. 안멈추고 실행시 이후 코드에 따라 다른 일을 하게되면 조건이 훼손될 수 있다는 이유가 명확하다.&lt;/li&gt;
&lt;li&gt;Lampson&amp;amp;Redell's Monitor: 2) 방법. 첫번째 프로세스가 깨어나면 바로 실행(if문으로 작성)하는것이 아니라 처음 코드로 다시 돌아가서(while문으로 작성) count가 0인지 확인하는 등의 작업을 하여 조건 훼손 가능성(에러 가능성)이 없도록 구현하였다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Lock-free Data Structure&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU의 core수가 많아져서 공유 변수를 수정할 때 Lock이 병목현상을 일으킬 수 있게되어 성능이 떨어질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;따라서 CPU는 Atomic한 CAS기능(Compare-and-Swap 명령어)을 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오후 3.43.03.png&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;356&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBofY2/btrEhpN9Z6U/8a3Rf9Akfw5xYnHM6yU8R0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBofY2/btrEhpN9Z6U/8a3Rf9Akfw5xYnHM6yU8R0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBofY2/btrEhpN9Z6U/8a3Rf9Akfw5xYnHM6yU8R0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBofY2%2FbtrEhpN9Z6U%2F8a3Rf9Akfw5xYnHM6yU8R0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;314&quot; height=&quot;191&quot; data-filename=&quot;스크린샷 2022-06-08 오후 3.43.03.png&quot; data-origin-width=&quot;586&quot; data-origin-height=&quot;356&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Lock-free Push and Pop&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오후 4.07.14.png&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;800&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7fl5U/btrEeWTzgKQ/2XpK8wOsDtSZJO9yAfwlJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7fl5U/btrEeWTzgKQ/2XpK8wOsDtSZJO9yAfwlJ0/img.png&quot; data-alt=&quot;push&amp;amp;amp;pop 자료구조의 포인터 위치의 변경을 CAS로 구현할 수 있다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7fl5U/btrEeWTzgKQ/2XpK8wOsDtSZJO9yAfwlJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7fl5U%2FbtrEeWTzgKQ%2F2XpK8wOsDtSZJO9yAfwlJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;514&quot; height=&quot;309&quot; data-filename=&quot;스크린샷 2022-06-08 오후 4.07.14.png&quot; data-origin-width=&quot;1330&quot; data-origin-height=&quot;800&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;push&amp;amp;pop 자료구조의 포인터 위치의 변경을 CAS로 구현할 수 있다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;ABA Problem&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오후 4.08.27.png&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;818&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/G7ymu/btrEeWTzsOM/nenrKFk74szYUKo4udTHp0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/G7ymu/btrEeWTzsOM/nenrKFk74szYUKo4udTHp0/img.png&quot; data-alt=&quot;Node들이 Linked list로 연결되어있다. head를 Node A에서 B로 변경하는 Thread1을 수행하기 전에 pop을 2번, A를 push하는 Thread2가 수행되면 head가 잘못 옮겨지는 문제가 발생한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/G7ymu/btrEeWTzsOM/nenrKFk74szYUKo4udTHp0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FG7ymu%2FbtrEeWTzsOM%2FnenrKFk74szYUKo4udTHp0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;491&quot; height=&quot;301&quot; data-filename=&quot;스크린샷 2022-06-08 오후 4.08.27.png&quot; data-origin-width=&quot;1336&quot; data-origin-height=&quot;818&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Node들이 Linked list로 연결되어있다. head를 Node A에서 B로 변경하는 Thread1을 수행하기 전에 pop을 2번, A를 push하는 Thread2가 수행되면 head가 잘못 옮겨지는 문제가 발생한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Synchronization(동기화)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Message Passing&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오후 4.19.08.png&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;150&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vLI0T/btrEiv1hMe9/ZhBOub26HkhvwKCMLosef0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vLI0T/btrEiv1hMe9/ZhBOub26HkhvwKCMLosef0/img.png&quot; data-alt=&quot;send와 receive를 통해 데이터를 주고받을 수 있다. 이때 destination, source등을 위해 addressing이 필요하다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vLI0T/btrEiv1hMe9/ZhBOub26HkhvwKCMLosef0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvLI0T%2FbtrEiv1hMe9%2FZhBOub26HkhvwKCMLosef0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;478&quot; height=&quot;87&quot; data-filename=&quot;스크린샷 2022-06-08 오후 4.19.08.png&quot; data-origin-width=&quot;824&quot; data-origin-height=&quot;150&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;send와 receive를 통해 데이터를 주고받을 수 있다. 이때 destination, source등을 위해 addressing이 필요하다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Synchronization&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sender와 Receiver는 메세지를 전달될때까지 기다리는동안 blocking될 수도있고 안될수도있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Blocking send, blocking receive : sender와 receiver가 메세지가 전달될 때 까지 모두 block된다.&lt;/li&gt;
&lt;li&gt;Nonblocking send, blocking receive : sender는 메세지를 보내고 꼭 기다릴 필요 없고(작업 수행) 자기일을 한다. &lt;b&gt;가장 일반적&lt;/b&gt;인 경우.&lt;/li&gt;
&lt;li&gt;Nonblocking send, nonblocking receive : sender와 receiver모두 메세지가 전달될 때 까지 block되지 않는다. 이때 &lt;b&gt;메세지를 저장하는 Q가 중간과정에 별도로 존재&lt;/b&gt;해야한다!&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Addressing&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Direct Addressing&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;process id로 Addressing하는 방법. Addressing시 몇번 process인지 알 수 있다. 하지만 process id는 실행될 때 마다 동작이 할당되기 때문에 프로그램 작성시 몇 번일지 예측할 수 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Indirect Addressing&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;mailbox(=port, Queue)를 이용하는 방법. 보통 이 방법을 많이 사용한다.&lt;/li&gt;
&lt;li&gt;ex) sender은 mailbox 10번에 데이터를 할당 한 후 receiver가 이를 가져간다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오후 4.30.11.png&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/E2b7w/btrEfDzx6RU/z3IZKkRbIKTliXutYYiws1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/E2b7w/btrEfDzx6RU/z3IZKkRbIKTliXutYYiws1/img.png&quot; data-alt=&quot;Indirect Process Communication&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/E2b7w/btrEfDzx6RU/z3IZKkRbIKTliXutYYiws1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FE2b7w%2FbtrEfDzx6RU%2Fz3IZKkRbIKTliXutYYiws1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;395&quot; data-filename=&quot;스크린샷 2022-06-08 오후 4.30.11.png&quot; data-origin-width=&quot;1026&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Indirect Process Communication&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오후 4.30.57.png&quot; data-origin-width=&quot;1104&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/P9C4l/btrEej2CAmj/NagumCn0ZhcXm2Jsf4kuCK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/P9C4l/btrEej2CAmj/NagumCn0ZhcXm2Jsf4kuCK/img.png&quot; data-alt=&quot;N개의 message를 이용한 producer-cousumer problem. 메세지 자체를 주고받으므로 임계 영역은 필요하지 않다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/P9C4l/btrEej2CAmj/NagumCn0ZhcXm2Jsf4kuCK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FP9C4l%2FbtrEej2CAmj%2FNagumCn0ZhcXm2Jsf4kuCK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;481&quot; height=&quot;375&quot; data-filename=&quot;스크린샷 2022-06-08 오후 4.30.57.png&quot; data-origin-width=&quot;1104&quot; data-origin-height=&quot;860&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;N개의 message를 이용한 producer-cousumer problem. 메세지 자체를 주고받으므로 임계 영역은 필요하지 않다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Barriers&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 쓰레드가 특정 지점(Barrier)에 도달할 때까지 기다렸다가 다음단계를 진행하도록 한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-08 오후 4.33.57.png&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;496&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2GAcE/btrEhrej4Fa/KikFwLmsuahwTHkMs5v5uK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2GAcE/btrEhrej4Fa/KikFwLmsuahwTHkMs5v5uK/img.png&quot; data-alt=&quot;a -&amp;amp;gt; b -&amp;amp;gt; c, 모든 프로세스가 Barrier에 도달하면 그 이후 프로세스가 진행된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2GAcE/btrEhrej4Fa/KikFwLmsuahwTHkMs5v5uK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2GAcE%2FbtrEhrej4Fa%2FKikFwLmsuahwTHkMs5v5uK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;573&quot; height=&quot;245&quot; data-filename=&quot;스크린샷 2022-06-08 오후 4.33.57.png&quot; data-origin-width=&quot;1160&quot; data-origin-height=&quot;496&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;a -&amp;gt; b -&amp;gt; c, 모든 프로세스가 Barrier에 도달하면 그 이후 프로세스가 진행된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>cs지식/운영체제</category>
      <category>OS</category>
      <category>Process</category>
      <category>Thread</category>
      <category>운영체제</category>
      <author>Eunbae</author>
      <guid isPermaLink="true">https://eunbae11.tistory.com/15</guid>
      <comments>https://eunbae11.tistory.com/entry/OS-Processes-and-Threads-1#entry15comment</comments>
      <pubDate>Tue, 7 Jun 2022 16:46:50 +0900</pubDate>
    </item>
    <item>
      <title>OS - Introduction</title>
      <link>https://eunbae11.tistory.com/entry/OS-Introduction</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Dual Mode of Processors&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/or1t3/btrENIGAqTx/V0totTdNDc0bsdGP7DIyq0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/or1t3/btrENIGAqTx/V0totTdNDc0bsdGP7DIyq0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;606&quot; data-filename=&quot;스크린샷 2022-06-15 오전 3.55.23.png&quot; width=&quot;373&quot; height=&quot;350&quot; data-widthpercent=&quot;42.38&quot; style=&quot;width: 41.8891%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/or1t3/btrENIGAqTx/V0totTdNDc0bsdGP7DIyq0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2For1t3%2FbtrENIGAqTx%2FV0totTdNDc0bsdGP7DIyq0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;646&quot; height=&quot;606&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bicMQZ/btrEPcAcEHN/WVkikLnket1txCUwjfxCxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bicMQZ/btrEPcAcEHN/WVkikLnket1txCUwjfxCxK/img.png&quot; data-origin-width=&quot;942&quot; data-origin-height=&quot;650&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2022-06-15 오전 3.55.43.png&quot; style=&quot;width: 56.9481%;&quot; data-widthpercent=&quot;57.62&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bicMQZ/btrEPcAcEHN/WVkikLnket1txCUwjfxCxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbicMQZ%2FbtrEPcAcEHN%2FWVkikLnket1txCUwjfxCxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;942&quot; height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- OS는 Code data형태로 존재하고, 프로세스는 필요하면 시스템 호출을 통해 Interrupt를 통해 OS code를 실행하고 돌아간다!&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;-&amp;gt; OS는 프로세스가 아니고, 코드 데이터 형태로 Library처럼 어딘가에 존재하며 프로세스가 언제든 호출할수있도록 준비된 형태로 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 사용자 프로그램은 직접 입출력장치를 구동하면 안되며 유저 모드에서 실행한다. 운영체제 코드는 입출력 장치를 실행할 수 있어야 하므로 CPU의 모드는 OS코드 실행시 자동으로 커널모드로 바뀐다. 이후 interrupt return을 하면 다시 유저 모드로 바뀌게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 커널 모드일때만 특권 명령(입출력, 메모리 영역 조절, 프로세서 상태 변경 등)을 실행할 수 있도록 하드웨어적으로 CPU 설계가 되어있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 4.12.37.png&quot; data-origin-width=&quot;1294&quot; data-origin-height=&quot;788&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/66yeZ/btrENVZORMy/ybw6ZOfhuAH0h0VR13FPt0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/66yeZ/btrENVZORMy/ybw6ZOfhuAH0h0VR13FPt0/img.png&quot; data-alt=&quot;Timer interrupt가 주기적으로 수행되며 사용자 프로그램 실행 시 유저모드, OS 코드 실행시 커널모드로 바뀐다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/66yeZ/btrENVZORMy/ybw6ZOfhuAH0h0VR13FPt0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F66yeZ%2FbtrENVZORMy%2Fybw6ZOfhuAH0h0VR13FPt0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;578&quot; height=&quot;352&quot; data-filename=&quot;스크린샷 2022-06-15 오전 4.12.37.png&quot; data-origin-width=&quot;1294&quot; data-origin-height=&quot;788&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Timer interrupt가 주기적으로 수행되며 사용자 프로그램 실행 시 유저모드, OS 코드 실행시 커널모드로 바뀐다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Buses&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;예전 PC에선 ISA버스 하나만 존재하였다. 속도가 빨라지며 PCI 버스 추가되었으며 전용 메모리/캐시 버스도 추가되었다. 각 버스의 속도는 다르기 때문에 맞춰주기 위해 bridge회로를 추가하여 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;System Calls&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-06-15 오전 4.16.34.png&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;684&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmgAVa/btrELUVGm8Y/cCcDl3eRSsfylIkIJ2HArk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmgAVa/btrELUVGm8Y/cCcDl3eRSsfylIkIJ2HArk/img.png&quot; data-alt=&quot;trap to the kernal : interrupt를 걺, dispatch: interrupt service routine, interrupt return하면 돌아감&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmgAVa/btrELUVGm8Y/cCcDl3eRSsfylIkIJ2HArk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmgAVa%2FbtrELUVGm8Y%2FcCcDl3eRSsfylIkIJ2HArk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;682&quot; height=&quot;484&quot; data-filename=&quot;스크린샷 2022-06-15 오전 4.16.34.png&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;684&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;trap to the kernal : interrupt를 걺, dispatch: interrupt service routine, interrupt return하면 돌아감&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;시스템 호출을 할 때 interrupt를 건다!&lt;/p&gt;</description>
      <category>cs지식/운영체제</category>
      <category>OS</category>
      <category>운영체제</category>
      <author>Eunbae</author>
      <guid isPermaLink="true">https://eunbae11.tistory.com/14</guid>
      <comments>https://eunbae11.tistory.com/entry/OS-Introduction#entry14comment</comments>
      <pubDate>Tue, 7 Jun 2022 15:51:25 +0900</pubDate>
    </item>
    <item>
      <title>Firebase에서 Github 인증 사용설정하기</title>
      <link>https://eunbae11.tistory.com/entry/Firebase%EC%97%90%EC%84%9C-Github-%EC%9D%B8%EC%A6%9D-%EC%82%AC%EC%9A%A9%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. Firebase 콘솔에서 승인 콜백 URL 얻기&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-11 오후 3.07.54.png&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;640&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sgMgX/btrBQFlKiDl/JkXPkBmAx2PlnUvV2t3bXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sgMgX/btrBQFlKiDl/JkXPkBmAx2PlnUvV2t3bXK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sgMgX/btrBQFlKiDl/JkXPkBmAx2PlnUvV2t3bXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsgMgX%2FbtrBQFlKiDl%2FJkXPkBmAx2PlnUvV2t3bXK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1844&quot; height=&quot;640&quot; data-filename=&quot;스크린샷 2022-05-11 오후 3.07.54.png&quot; data-origin-width=&quot;1844&quot; data-origin-height=&quot;640&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-11 오후 3.06.18.png&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;906&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mjPX8/btrBMbFO6cM/CFIhMKPU4RZkqcriD5AsV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mjPX8/btrBMbFO6cM/CFIhMKPU4RZkqcriD5AsV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mjPX8/btrBMbFO6cM/CFIhMKPU4RZkqcriD5AsV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmjPX8%2FbtrBMbFO6cM%2FCFIhMKPU4RZkqcriD5AsV0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;791&quot; height=&quot;448&quot; data-filename=&quot;스크린샷 2022-05-11 오후 3.06.18.png&quot; data-origin-width=&quot;1600&quot; data-origin-height=&quot;906&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;Firebase 콘솔의 인증창에서 &quot;로그인 방법 설정&quot;버튼을 누르고 로그인 제공업체 탭에서 깃허브를 선택하면 위와같이 승인 콜백 URL와 클라이언트 ID, 비밀번호를 입력하는 창이 뜨게된다.&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. 깃허브 설정에서 OAuth App 등록하기&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uXtwH/btrBNcrkYpH/oqlClYZq4CbXS9lkz2j5k0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uXtwH/btrBNcrkYpH/oqlClYZq4CbXS9lkz2j5k0/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;298&quot; data-origin-height=&quot;814&quot; data-filename=&quot;스크린샷 2022-05-11 오후 3.15.01.png&quot; width=&quot;119&quot; data-widthpercent=&quot;54.68&quot; height=&quot;325&quot; style=&quot;width: 54.0402%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uXtwH/btrBNcrkYpH/oqlClYZq4CbXS9lkz2j5k0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuXtwH%2FbtrBNcrkYpH%2FoqlClYZq4CbXS9lkz2j5k0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;298&quot; height=&quot;814&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b4vM8p/btrBSMRy4k8/OKDlMD5Zn4fokKNNluiKZk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b4vM8p/btrBSMRy4k8/OKDlMD5Zn4fokKNNluiKZk/img.png&quot; width=&quot;149&quot; height=&quot;491&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;454&quot; data-origin-height=&quot;1496&quot; data-filename=&quot;스크린샷 2022-05-11 오후 3.11.55.png&quot; data-widthpercent=&quot;45.32&quot; style=&quot;width: 44.797%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b4vM8p/btrBSMRy4k8/OKDlMD5Zn4fokKNNluiKZk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb4vM8p%2FbtrBSMRy4k8%2FOKDlMD5Zn4fokKNNluiKZk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;454&quot; height=&quot;1496&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-11 오후 3.18.06.png&quot; data-origin-width=&quot;1806&quot; data-origin-height=&quot;420&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBa1CO/btrBOuLP3G6/Du1MVE9wOBSd5CEabRUY60/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBa1CO/btrBOuLP3G6/Du1MVE9wOBSd5CEabRUY60/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBa1CO/btrBOuLP3G6/Du1MVE9wOBSd5CEabRUY60/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBa1CO%2FbtrBOuLP3G6%2FDu1MVE9wOBSd5CEabRUY60%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1806&quot; height=&quot;420&quot; data-filename=&quot;스크린샷 2022-05-11 오후 3.18.06.png&quot; data-origin-width=&quot;1806&quot; data-origin-height=&quot;420&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-10 오전 12.26.30.png&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;630&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfC3Qb/btrBR9mmUI5/ChS3bHrDrPLFwcKNCnfgH0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfC3Qb/btrBR9mmUI5/ChS3bHrDrPLFwcKNCnfgH0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfC3Qb/btrBR9mmUI5/ChS3bHrDrPLFwcKNCnfgH0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfC3Qb%2FbtrBR9mmUI5%2FChS3bHrDrPLFwcKNCnfgH0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;787&quot; height=&quot;630&quot; data-filename=&quot;스크린샷 2022-05-10 오전 12.26.30.png&quot; data-origin-width=&quot;787&quot; data-origin-height=&quot;630&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;깃허브로 가서 Settings &amp;gt; Developer Settings &amp;gt; OAuth Apps로 들어가면 새로운 Oauth App을 생성할 수 있다. &lt;br /&gt;생성하기에서 App이름과 홈페이지 URL, 그리고 1번 과정에서 얻은 승인 콜백 URL을 입력해준다.&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;3. 클라이언트 ID, 비밀번호 등록&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-10 오전 12.35.16.png&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;581&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mQTK0/btrBPeWi5rY/ci058cBzg6syyPk7mpTQdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mQTK0/btrBPeWi5rY/ci058cBzg6syyPk7mpTQdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mQTK0/btrBPeWi5rY/ci058cBzg6syyPk7mpTQdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmQTK0%2FbtrBPeWi5rY%2Fci058cBzg6syyPk7mpTQdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;767&quot; height=&quot;581&quot; data-filename=&quot;스크린샷 2022-05-10 오전 12.35.16.png&quot; data-origin-width=&quot;767&quot; data-origin-height=&quot;581&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-05-11 오후 3.26.58.png&quot; data-origin-width=&quot;1948&quot; data-origin-height=&quot;378&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dSINTp/btrBRojMg6u/2Pn27uPVh0r4vVio9OyC3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dSINTp/btrBRojMg6u/2Pn27uPVh0r4vVio9OyC3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dSINTp/btrBRojMg6u/2Pn27uPVh0r4vVio9OyC3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdSINTp%2FbtrBRojMg6u%2F2Pn27uPVh0r4vVio9OyC3k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1948&quot; height=&quot;378&quot; data-filename=&quot;스크린샷 2022-05-11 오후 3.26.58.png&quot; data-origin-width=&quot;1948&quot; data-origin-height=&quot;378&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;생성된 OAuth App에 들어가면 클라이언트 ID와 비밀번호를 얻을 수 있다. 이를 다시 파이어베이스 콘솔창으로 돌아와서 입력해주면 사용 설정된다!&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 -&lt;span style=&quot;color: #666666;&quot;&gt;&amp;nbsp;&lt;a href=&quot;https://firebase.google.com/docs/auth/web/github-auth?authuser=1&quot;&gt;https://firebase.google.com/docs/auth/web/github-auth?authuser=1&lt;/a&gt;&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>기타</category>
      <category>Firebase</category>
      <category>Github인증설정</category>
      <author>Eunbae</author>
      <guid isPermaLink="true">https://eunbae11.tistory.com/13</guid>
      <comments>https://eunbae11.tistory.com/entry/Firebase%EC%97%90%EC%84%9C-Github-%EC%9D%B8%EC%A6%9D-%EC%82%AC%EC%9A%A9%EC%84%A4%EC%A0%95%ED%95%98%EA%B8%B0#entry13comment</comments>
      <pubDate>Wed, 11 May 2022 15:30:31 +0900</pubDate>
    </item>
    <item>
      <title>논리회로 및 설계(1)</title>
      <link>https://eunbae11.tistory.com/entry/%EB%85%BC%EB%A6%AC%ED%9A%8C%EB%A1%9C-%EB%B0%8F-%EC%84%A4%EA%B3%841</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;Chaper 01 From Zero to One&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;수업의 목적&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴퓨터 내부에 대해서 배운다.&lt;/li&gt;
&lt;li&gt;디지털 설계에 대한 원칙에 대해서 배운다.&lt;/li&gt;
&lt;li&gt;마이크로프로세서를 설계 및 구축한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Digital Discipline: Binary(이진)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음과 같은 분리된 두가지 value를 고려한다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1, True, High&lt;/li&gt;
&lt;li&gt;0, False, Low&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;수의 체계 (Number Systems)&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Decimal Numbers (십진수) - ex. 5374&lt;/li&gt;
&lt;li&gt;Binary Numbers (이진수) - ex. 1101&lt;/li&gt;
&lt;li&gt;Hexadecimal Numbers (16진수) - 이진수를 짧게 표현한것, ex. 4AF&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5374(10진수) = 5x10^3 + 3x10^2 + 7x10^1 + 4x10^0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1101(2진수) = 1x2^3 + 1x2^2 + 0x2^1 + 1x2^0 = 13(10진수)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4AF(16진수) = 0100 | 1010 |&amp;nbsp;1111(2진수)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;수의 범위 - 십진수: [0, 10^N - 1], 이진수: [0, 2^N-1]&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Bits, Bytes, Nibbles ...&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Bits - 10010110, 가장 앞에 있는 bit: Most Significant Bit(MSB), 가장 마지막에 있는 bit: Least Significant Bit(LSB)&lt;/li&gt;
&lt;li&gt;Bytes &amp;amp; Nibbles - 10110110에서 0110:nibble(4bits), 전체: 1byte(8bits)&lt;/li&gt;
&lt;li&gt;Bytes - CEBF9AD7에서 CE: 1 byte, C: nibble&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Addition (더하기)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(이진수) 1011 + 0011 = 1110 (올림수-carries 발생)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1011 + 0110 = 10001 : Overflow(오버플로우, 넘침)현상 발생, 4bit로 표현할 수 없음!&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Signed Binary Numbers(부호를 가진 수의 표현)&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Sign/Magnitude Numbers(부호/절대값)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Sign bit는 MSB, Negative number: sign bit = 1, Positive number: sign bit = 0&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N-bit 부호/절대값의 범위: [-(2^(N-1)-1),&amp;nbsp;2^(N-1)-1]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex. 1101 = -5, 0101=+5&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 다음과 같은 문제가 발생한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Addition doesn't work: 1101 + 0101 = 10010 (-5+5!=0)&lt;/li&gt;
&lt;li&gt;Two representations of 0: 1000, 0000은 똑같은 0&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Two's Complement Numbers(2의 보수)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MSB는 -2^N-1의 value를 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex. Most positive 4-bit number: 0111(7),&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;Most negative 4-bit number: 1000(-8)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;N-bit 부호/절대값의 범위: [-2^(N-1),&amp;nbsp;2^(N-1)-1]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2의 보수 표현에서 음수화 작업하는 방법&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Invert the bits&lt;/li&gt;
&lt;li&gt;Add 1&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex. 0111 -&amp;gt; 1000 -&amp;gt; 1001&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Logic Gates&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;inversion(NOT), AND, OR, NAND, NOR, etc..&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;트랜지스터(Transistor)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: Three-ported voltage-controlled switch&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;nMOS transistor: pass good 0's, so connect source to GND&lt;/li&gt;
&lt;li&gt;pMOS transistor: pass good 1's, so connect source to VDD&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>cs지식</category>
      <category>논리회로</category>
      <author>Eunbae</author>
      <guid isPermaLink="true">https://eunbae11.tistory.com/12</guid>
      <comments>https://eunbae11.tistory.com/entry/%EB%85%BC%EB%A6%AC%ED%9A%8C%EB%A1%9C-%EB%B0%8F-%EC%84%A4%EA%B3%841#entry12comment</comments>
      <pubDate>Fri, 6 May 2022 21:22:47 +0900</pubDate>
    </item>
    <item>
      <title>쿠키 - 세션쿠키와 지속쿠키의 차이점(+지속쿠키 설정 방법)</title>
      <link>https://eunbae11.tistory.com/entry/%EC%BF%A0%ED%82%A4-%EC%84%B8%EC%85%98%EC%BF%A0%ED%82%A4%EC%99%80-%EC%A7%80%EC%86%8D%EC%BF%A0%ED%82%A4%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;세션쿠키 vs 지속쿠키&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세션쿠키(Session Cookie) : 세션쿠키는 메모리에 저장되어(디스크x) 브라우저가 종료되면 삭제된다.&lt;/li&gt;
&lt;li&gt;지속쿠키(Persistent Cookie) : 지속쿠키는 디스크에 저장되어 브라우저가 종료되거나 심지어 컴퓨터가 재시동 되더라도 남아있다. 만료 시간이 존재하고, 만료되면 삭제되는것이 특징이다. 예시로 Google Analytics Cookie가 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr; &lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px;&quot;&gt;쿠키 저장시 Max-Age, Expires값을 설정한다면 저장 기한이 있는 지속쿠키로 저장되고,&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, AppleSDGothicNeo-Regular, 'Malgun Gothic', '맑은 고딕', dotum, 돋움, sans-serif; letter-spacing: 0px;&quot;&gt;이 두 값을 설정하지 않고 저장하면 자동으로 세션쿠키로 저장된다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;react-cookie에서 지속쿠키 설정 방법&lt;/h4&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const cookies = new Cookies();
cookies.set('ACCESS_TOKEN', res.data.accessToken, { maxAge: 2 * 60 * 60 }); // 단위: 초, 2시간&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const cookies = new Cookies();
const expires = new Date();
expires.setFullYear(expires.getFullYear() + 1);
cookies.set('ACCESS_TOKEN', res.data.accessToken, { expires: expires });&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: maxAge값을 주어 현재 시간부터 기간을 설정하거나, expires값을 주어 만료 시간을 직접 설정하게 되면 지속쿠키로 설정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여담으로 프로젝트에서 쿠키에 저장된 Access Token의 저장기한을 주도록 구현하기 위해 관련 내용을 조사했는데, 이대로 구현한다면 토큰은 지속쿠키가 되었다. 하지만 브라우저가 종료되면 로그인 정보도 사라지도록 구현해야 했기 때문에 결국 세션쿠키로 구현하였다..ㅜ^ㅜ&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;참고문서&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;a href=&quot;https://www.cookiepro.com/knowledge/what-is-a-persistent-cookie/&quot;&gt;https://www.cookiepro.com/knowledge/what-is-a-persistent-cookie/&lt;/a&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- &lt;a href=&quot;https://www.npmjs.com/package/react-cookie&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://www.npmjs.com/package/react-cookie&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>기타</category>
      <category>react-cookie</category>
      <category>쿠키</category>
      <author>Eunbae</author>
      <guid isPermaLink="true">https://eunbae11.tistory.com/11</guid>
      <comments>https://eunbae11.tistory.com/entry/%EC%BF%A0%ED%82%A4-%EC%84%B8%EC%85%98%EC%BF%A0%ED%82%A4%EC%99%80-%EC%A7%80%EC%86%8D%EC%BF%A0%ED%82%A4%EC%9D%98-%EC%B0%A8%EC%9D%B4%EC%A0%90#entry11comment</comments>
      <pubDate>Sat, 12 Mar 2022 03:02:37 +0900</pubDate>
    </item>
    <item>
      <title>box-sizing : border-box 이용하기</title>
      <link>https://eunbae11.tistory.com/entry/box-sizing-border-box-%EC%9D%B4%EC%9A%A9%ED%95%98%EA%B8%B0</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;✔️&amp;nbsp; box-sizing&amp;nbsp;속성은 요소(element)의 너비와 높이를 계산하는 방법을 지정한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;content-box는 css의 기본 설정으로, 크기값을 컨텐츠 영역에 적용하고 border와 padding값은 추가로 더해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;border-box는 border와 padding도 요소의 크기값에 포함하기 때문에 컨텐츠 영역이 줄어들게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 content-box설정에서 height값을 100px주고, padding값을 10px, border를 5px주게되면 총 높이는 100+10*2+5*2=130px가 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;반면 border-box설정을 주게되면 총 높이는 padding값과 border값과는 상관없이 100px이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cJYXLZ/btrvcHbQ7LJ/mxYoIi9iFsvPhb2o61mS4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cJYXLZ/btrvcHbQ7LJ/mxYoIi9iFsvPhb2o61mS4K/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;88&quot; data-filename=&quot;스크린샷 2022-03-05 오후 2.59.37.png&quot; data-widthpercent=&quot;71.02&quot; style=&quot;width: 70.1989%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cJYXLZ/btrvcHbQ7LJ/mxYoIi9iFsvPhb2o61mS4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcJYXLZ%2FbtrvcHbQ7LJ%2FmxYoIi9iFsvPhb2o61mS4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;331&quot; height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Yd5T3/btru7sN3Q6l/kegLKo2mKpZ31l0wk7Hhu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Yd5T3/btru7sN3Q6l/kegLKo2mKpZ31l0wk7Hhu1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;534&quot; data-origin-height=&quot;348&quot; data-filename=&quot;스크린샷 2022-03-05 오후 2.56.00.png&quot; width=&quot;262&quot; height=&quot;171&quot; data-widthpercent=&quot;28.98&quot; style=&quot;width: 28.6383%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Yd5T3/btru7sN3Q6l/kegLKo2mKpZ31l0wk7Hhu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYd5T3%2Fbtru7sN3Q6l%2FkegLKo2mKpZ31l0wk7Hhu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;534&quot; height=&quot;348&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;텍스트 중앙 정렬을 위해 padding-top값을 3.5px주었더니 컨텐츠 영역에 21px가 적용되어 총 높이가 26.5px가 되어버렸다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KbeVb/btrveK0eIMD/KLkwHDId2sraTLLS1SHIV1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KbeVb/btrveK0eIMD/KLkwHDId2sraTLLS1SHIV1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;331&quot; data-origin-height=&quot;110&quot; data-filename=&quot;스크린샷 2022-03-05 오후 2.59.37.png&quot; data-widthpercent=&quot;65.34&quot; style=&quot;width: 64.5775%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KbeVb/btrveK0eIMD/KLkwHDId2sraTLLS1SHIV1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKbeVb%2FbtrveK0eIMD%2FKLkwHDId2sraTLLS1SHIV1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;331&quot; height=&quot;110&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lUa13/btrveLkw61F/tXRvUbAfVyH7awwRMgmBZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lUa13/btrveLkw61F/tXRvUbAfVyH7awwRMgmBZ1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;332&quot; data-filename=&quot;스크린샷 2022-03-05 오후 2.56.18.png&quot; width=&quot;278&quot; data-widthpercent=&quot;34.66&quot; style=&quot;width: 34.2597%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lUa13/btrveLkw61F/tXRvUbAfVyH7awwRMgmBZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlUa13%2FbtrveLkw61F%2FtXRvUbAfVyH7awwRMgmBZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;530&quot; height=&quot;332&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;이를 해결하기 위해 box-sizing: border-box를 주었고, 높이값이 원하는 값인 21px로 적용되었다!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6n2ot/btrvbhLgSk7/eWVFl8HwB2WlzkhK5PxAL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6n2ot/btrvbhLgSk7/eWVFl8HwB2WlzkhK5PxAL0/img.png&quot; data-origin-width=&quot;484&quot; data-origin-height=&quot;114&quot; data-is-animation=&quot;false&quot; data-filename=&quot;스크린샷 2022-03-05 오후 2.55.52.png&quot; width=&quot;250&quot; height=&quot;59&quot; style=&quot;width: 45.4888%; margin-right: 10px;&quot; data-widthpercent=&quot;46.02&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6n2ot/btrvbhLgSk7/eWVFl8HwB2WlzkhK5PxAL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6n2ot%2FbtrvbhLgSk7%2FeWVFl8HwB2WlzkhK5PxAL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;484&quot; height=&quot;114&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MNdTN/btru7sAtlUW/Pe9Fw7YKK6SHz1pHERyBS1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MNdTN/btru7sAtlUW/Pe9Fw7YKK6SHz1pHERyBS1/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;478&quot; data-origin-height=&quot;96&quot; data-filename=&quot;스크린샷 2022-03-05 오후 2.56.10.png&quot; width=&quot;288&quot; height=&quot;58&quot; data-widthpercent=&quot;53.98&quot; style=&quot;width: 53.3484%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MNdTN/btru7sAtlUW/Pe9Fw7YKK6SHz1pHERyBS1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMNdTN%2Fbtru7sAtlUW%2FPe9Fw7YKK6SHz1pHERyBS1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;478&quot; height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
  &lt;figcaption&gt;수정 전 -&amp;gt; 수정 후&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참고 - &lt;a href=&quot;https://developer.mozilla.org/ko/docs/Web/CSS/box-sizing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://developer.mozilla.org/ko/docs/Web/CSS/box-sizing&lt;/a&gt;&lt;/p&gt;</description>
      <category>css</category>
      <category>css</category>
      <author>Eunbae</author>
      <guid isPermaLink="true">https://eunbae11.tistory.com/10</guid>
      <comments>https://eunbae11.tistory.com/entry/box-sizing-border-box-%EC%9D%B4%EC%9A%A9%ED%95%98%EA%B8%B0#entry10comment</comments>
      <pubDate>Sat, 5 Mar 2022 15:09:14 +0900</pubDate>
    </item>
    <item>
      <title>Iroom 클론 프로젝트 기록</title>
      <link>https://eunbae11.tistory.com/entry/Iroom-%ED%81%B4%EB%A1%A0-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B8%B0%EB%A1%9D</link>
      <description>&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;✔️ 작업 기간&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
 &lt;li&gt;2021.11.05~2021.11.26&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;✔️ &lt;/b&gt;팀원 구성&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
 &lt;li&gt;Front-end(3명) : 공은배, 서지수, 조은&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;✔️ &lt;/b&gt;깃허브 주소&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
 &lt;li&gt;&lt;a href=&quot;https://github.com/jseo9732/iroom-clone&quot; target=&quot;_blank&quot;&gt;&lt;span&gt;https://github.com/jseo9732/iroom-clone&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;figure data-ke-type=&quot;opengraph&quot; data-og-title=&quot;GitHub - jseo9732/iroom-clone: 모임공간이룸 클론코딩 - https://www.iroomstudy.com/&quot; data-ke-align=&quot;alignLeft&quot; data-og-description=&quot;모임공간이룸 클론코딩 - https://www.iroomstudy.com/. Contribute to jseo9732/iroom-clone development by creating an account on GitHub.&quot; data-og-host=&quot;github.com&quot; data-og-source-url=&quot;https://github.com/jseo9732/iroom-clone&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bomGp9/hyMv5shQ1e/PqoxK5CkOeR1T66e0hkK4K/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600&quot; data-og-url=&quot;https://github.com/jseo9732/iroom-clone&quot;&gt;
 &lt;a href=&quot;https://github.com/jseo9732/iroom-clone&quot; target=&quot;_blank&quot; data-source-url=&quot;https://github.com/jseo9732/iroom-clone&quot;&gt;
  &lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bomGp9/hyMv5shQ1e/PqoxK5CkOeR1T66e0hkK4K/img.png?width=1200&amp;amp;height=600&amp;amp;face=0_0_1200_600')&quot;&gt; 
  &lt;/div&gt;
  &lt;div class=&quot;og-text&quot;&gt;
   &lt;p class=&quot;og-title&quot;&gt;GitHub - jseo9732/iroom-clone: 모임공간이룸 클론코딩 - https://www.iroomstudy.com/&lt;/p&gt;
   &lt;p class=&quot;og-desc&quot;&gt;모임공간이룸 클론코딩 - https://www.iroomstudy.com/. Contribute to jseo9732/iroom-clone development by creating an account on GitHub.&lt;/p&gt;
   &lt;p class=&quot;og-host&quot;&gt;github.com&lt;/p&gt;
  &lt;/div&gt;&lt;/a&gt;
&lt;/figure&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;✔️ &lt;/b&gt;사용 기술 스택&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
 &lt;li&gt;HTML, CSS&lt;/li&gt;
 &lt;li&gt;React, React Hooks, React Router&lt;/li&gt;
 &lt;li&gt;JavaScript (ES6)&lt;/li&gt;
 &lt;li&gt;Firebase (Back-end)&lt;/li&gt;
 &lt;li&gt;GitHub&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;✔️ &lt;/b&gt;파트별 기능 구현&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
 &lt;li&gt;&lt;b&gt;메인 페이지 (Main)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
 &lt;li&gt;Navigation component&lt;/li&gt;
 &lt;li&gt;Footer component&lt;/li&gt;
 &lt;li&gt;Router&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
 &lt;li&gt;&lt;b&gt;소개 페이지 (Introduction)&lt;/b&gt;&lt;/li&gt;
 &lt;li&gt;&lt;b&gt;예약 페이지 (Reservation)&lt;/b&gt;&lt;/li&gt;
 &lt;li&gt;&lt;b&gt;마이 페이지 (Profile)&lt;/b&gt;&lt;/li&gt;
 &lt;li&gt;&lt;b&gt;로그인 페이지 (Login)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
 &lt;li&gt;회원가입 및 로그인&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;✔️ &lt;/b&gt;나의 작업 부분&lt;/b&gt;&lt;/h2&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1728&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oWUMC/btrmmdcD5Lq/d7EuLW4Z6hTuLp2rukEimk/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oWUMC/btrmmdcD5Lq/d7EuLW4Z6hTuLp2rukEimk/img.gif&quot; data-alt=&quot; 예약신청 및 마이페이지에서 확인, 취소기능 &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oWUMC/btrmmdcD5Lq/d7EuLW4Z6hTuLp2rukEimk/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/oWUMC/btrmmdcD5Lq/d7EuLW4Z6hTuLp2rukEimk/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1728&quot; height=&quot;1080&quot; data-origin-width=&quot;1728&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt; 예약신청 및 마이페이지에서 확인, 취소기능 &lt;/figcaption&gt;
&lt;/figure&gt;

&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
 &lt;li&gt;&lt;b&gt;예약 페이지(Reservation)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
 &lt;li&gt;예약 모달창 구현&lt;/li&gt;
 &lt;li&gt;예약 정보 전송 (&lt;span style=&quot;background-color: #FFFFFF;&quot;&gt;→Firebase)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
 &lt;li&gt;&lt;b&gt;마이 페이지(Profile)&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
 &lt;li&gt;마이페이지 레이아웃 구현&lt;/li&gt;
 &lt;li&gt;예약 정보 표시 및 삭제기능 구현&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;✔️ &lt;/b&gt;작업 기록 (예약 페이지)&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot; style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;모달창 구현&lt;/b&gt;&lt;/p&gt;
&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;export default function Reservation({userObj, isLoggedIn}) { const [IsopenReserveModal, setIsOpenReserveModal] = useState(false); const toggleReserveModal = () =&amp;gt; { setIsOpenReserveModal((prev) =&amp;gt; !prev) } ... { openReserveModal &amp;amp;&amp;amp; &amp;lt;ReserveModal toggleReserveModal={toggleReserveModal} /&amp;gt; }&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
 &lt;li&gt;예약하기 버튼을 눌렀을 때 toggleReserveModal 함수를 실행하여 useState의 현재 상태를 true로 바꾸고, 값이 true일 때 ReserveModal 컴포넌트를 띄우는 방식으로 모달창 띄우기를 구현하였다.&lt;/li&gt;
 &lt;li&gt;또한 상태를 바꾸는 함수를 ReserveModal 컴포넌트로 줘서 모달 창에서 닫기 버튼을 눌렀을 때 이 함수를 실행하는 방식으로 모달창 닫기를 구현하였다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: justify;&quot;&gt; &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot; style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;useNavigate 이용해 Redirect 구현&lt;/b&gt;&lt;/p&gt;
&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt; const navigate = useNavigate(); const redirectLogin = () =&amp;gt; { window.alert(&quot;로그인 후 이용해주세요&quot;); navigate('/login'); }&lt;/code&gt;&lt;/pre&gt;
&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;{ openReserveModal &amp;amp;&amp;amp; ( isLoggedIn ? &amp;lt;ReserveModal uid={userObj.uid} username={userObj.displayName} isLoggedIn={isLoggedIn} toggleReserveModal={toggleReserveModal} /&amp;gt; : redirectLogin()) }&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size18&quot; style=&quot;text-align: justify;&quot;&gt; &lt;br&gt;&lt;b&gt;Firebase로 데이터 전송&lt;/b&gt;&lt;/p&gt;
&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const {phoneNum, room, reserveDate, reserveTime, reserveRemainTime} = reserveInputs; const onReserveSubmit = async (e) =&amp;gt; { e.preventDefault(); const reserveObj = { ...reserveInputs, createdAt: Date.now(), userId: uid, } if (phoneNum &amp;amp;&amp;amp; room &amp;amp;&amp;amp; reserveDate &amp;amp;&amp;amp; reserveTime &amp;amp;&amp;amp; reserveRemainTime) { const ok = window.confirm(&quot;위의 정보로 예약하시겠습니까?&quot;); if(ok) { try { await setDoc(doc(dbService, &quot;reservations&quot;, `${reserveObj.createdAt}`), reserveObj); } catch (e) { console.error(&quot;Error adding document: &quot;, e); } setReserveInputs({ phoneNum: &quot;&quot;, room: &quot;&quot;, reserveDate: &quot;&quot;, reseveTime: &quot;&quot;, reserveRemainTime: &quot;&quot;, }) toggleReserveModal(); window.alert(&quot;예약되었습니다&quot;); } } else { window.alert(&quot;정보를 전부 입력해주세요&quot;); } }&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;✔️ &lt;/b&gt;문제 해결&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size18&quot; style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;여러개의 input 통합하여 관리하기&lt;/b&gt;&lt;/p&gt;
&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const [phoneNum, setPhoneNum] = useState(&quot;&quot;); const [room, setRoom] = useState(&quot;&quot;); const [reserveDate, setReserveDate] = useState(&quot;&quot;); const [reserveTime, setReserveTime] = useState(&quot;&quot;); const [reserveRemainTime, setReserveRemainTime] = useState(&quot;&quot;); const onPhoneNumChange = (e) =&amp;gt; { const { target : { value } } = e setPhoneNum(value); } const onRoomChange = (e) =&amp;gt; { const { target : { value } } = e setRoom(value); } const onReserveDateChange = (e) =&amp;gt; { const { target : { value } } = e setReserveDate(value); } const onReserveTimeChange = (e) =&amp;gt; { const { target : { value } } = e setReserveTime(value); } const onReserveRemainTimeChange = (e) =&amp;gt; { const { target : { value } } = e setReserveRemainTime(value); }&lt;/code&gt;&lt;/pre&gt;
&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot;&gt;&lt;code&gt;const [reserveInputs, setReserveInputs] = useState({ phoneNum: &quot;&quot;, room: &quot;&quot;, reserveDate: &quot;&quot;, reseveTime: &quot;&quot;, reserveRemainTime: &quot;&quot;, }); const onReserveChange = (e) =&amp;gt; { const { target : { value, name }} = e setReserveInputs({ ...reserveInputs, [name] : value }) }&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
 &lt;li&gt;예약하기에서 예약 정보를 받을 때 정보들을 input과 select값 여러개로 받게되어 useState를 각각의 값마다 작성하였다.&lt;/li&gt;
 &lt;li&gt;하지만 이렇게 작성하니 코드도 길어지고, 가독성이 떨지는 문제점이 생겼다.&lt;/li&gt;
 &lt;li&gt;이를 useState에 받은 전체 값들을 객체로 저장하였고, 값이 변경되었을 때 spread문법을 이용하여 저장하는 방식으로 코드를 고쳐서 개선하였다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;text-align: justify;&quot; data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;&lt;b&gt;✔️ &lt;/b&gt;프로젝트 후기&lt;/b&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: justify;&quot;&gt;리액트 스터디를 다 진행하고, 스터디 팀원들이 다 프론트쪽이라 백엔드를 따로 구하기는 애매해서 파이어베이스를 사용하여 프로젝트를 진행하기로 하였고, 이를 위해 노마드코더의 트위터 클론코딩 강의를 스터디원들끼리 각 파트를 분배하여 정리하며 공부하였다. 강의정리를 마친 후 3명이서 모임공간이룸 홈페이지 클론을 진행하였는데, 이 사이트에서 예약은 네이버예약으로 받았기에 우리가 예약 기능과 로그인 기능, 예약 정보를 볼수있는 마이페이지를 추가하였다. 그중 나는 예약페이지랑 마이페이지의 기능 구현을 맡았고 이를 구현하기 위해 모달창 생성, Firebase로 데이터 전송 및 불러오기, 불러온 데이터 표시 등 다양한 작업을 할 수 있었다.&lt;br&gt; &lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot; style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;느낀 점&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
 &lt;li&gt;어떤 프로젝트를 진행하며 협업을 하는것이 처음이라 시작할 때는 막연함에서 온 무서움(내가 깃허브에 커밋을 잘못해서 꼬여버리면 어떡하지? 와 같은..) 도 있었지만 프로젝트를 진행해보니 별거 아닌 걱정이었다. 일단 시작해봐야 배울점이 많다는것을 깨달았다.&lt;/li&gt;
 &lt;li&gt;또 슬랙과 깃허브를 이번 기회에 처음 사용해보았다. 특히 깃허브를 사용하여 프로젝트를 관리하는것이 어색하고 잘 사용할 수 있을지 걱정했는데, 계속 커밋, 풀, 푸시 등을 이용하여 사용하니까 이 과정들이 익숙해졌고 깃을 이용해 버전관리를 하는 전체적인 흐름을 어느정도 이해하게 되었다.&lt;/li&gt;
 &lt;li&gt;Firebase를 이용하여 프로젝트를 진행하면서 NoSQL기반의 데이터베이스 구조에 대해 조금 더 공부할 수 있었고, 공식문서가 잘 나와있어서 문서를 읽어가며 공부하였고, 공식문서를 읽는 것도 조금은 더 익숙해진거같다. 그런데 Firebase를 이용하면 코드가 간결하고 작업이 줄어서 좋긴 했지만, SQL을 사용한 db를 연결하여 작업을 해보고 싶은 아쉬움도 있었다.&lt;/li&gt;
 &lt;li&gt;이번 프로젝트를 진행하며 아직 많이 부족하고 배워야할 부분도 많다는 것을 절실히 깨달았고, 다음에는 백엔드 개발자도 포함된 더 큰 규모의 프로젝트 진행해보고 싶고, TypeScript 언어나 Redux 사용법도 배워서 이를 이용한 프로젝트도 해 봐야겠다고 생각했다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: justify;&quot;&gt;&lt;/p&gt;</description>
      <category>프로젝트</category>
      <author>Eunbae</author>
      <guid isPermaLink="true">https://eunbae11.tistory.com/3</guid>
      <comments>https://eunbae11.tistory.com/entry/Iroom-%ED%81%B4%EB%A1%A0-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8-%EA%B8%B0%EB%A1%9D#entry3comment</comments>
      <pubDate>Sun, 28 Nov 2021 02:09:27 +0900</pubDate>
    </item>
  </channel>
</rss>