<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>devrepo</title>
    <link>https://devrepo.tistory.com/</link>
    <description>who wants to be a D.E</description>
    <language>ko</language>
    <pubDate>Sun, 21 Jun 2026 16:59:11 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>TIlearn</managingEditor>
    <image>
      <title>devrepo</title>
      <url>https://tistory1.daumcdn.net/tistory/6369373/attach/6d306128ff5946c68966300603e86396</url>
      <link>https://devrepo.tistory.com</link>
    </image>
    <item>
      <title>[운영체제] 디스크 스케쥴링(Disk Scheduling)은 어떻게 일어날까</title>
      <link>https://devrepo.tistory.com/125</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;디스크의 구조&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스크 스케쥴링을 알아보기 전에 디스크의 구조에 대해 자세히 알아보자.&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;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-origin-width=&quot;1181&quot; data-origin-height=&quot;705&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfoa4F/btsHnfu86eT/I5XKZvziN6Y6CWG7H4fOkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfoa4F/btsHnfu86eT/I5XKZvziN6Y6CWG7H4fOkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfoa4F/btsHnfu86eT/I5XKZvziN6Y6CWG7H4fOkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbfoa4F%2FbtsHnfu86eT%2FI5XKZvziN6Y6CWG7H4fOkk%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;706&quot; height=&quot;421&quot; data-origin-width=&quot;1181&quot; data-origin-height=&quot;705&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;디스크는 크게 track과 sector로 구성된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 track은 한 면에 존재하는 것으로 위 그림에서 원의 안쪽으로 들어갈수록 &lt;b&gt;트랙 번호가 커진다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;약간 달리기 경주할 때 track으로 생각하면 쉽다.&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;sector는 각 트랙에 존재하는 부분&lt;/b&gt;으로 한 sector를 읽음으로써 보통 데이터를 가져올 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;cylinder는 같은 위치에 있는 트랙&lt;/b&gt;들을 의미하고, &lt;b&gt;surface는 디스크의 한 면&lt;/b&gt;을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스크를 읽기 위해서는 &lt;b&gt;디스크 암&lt;/b&gt;을 통해서 읽어야 한다. 이때, 디스크의 &lt;b&gt;head에서 sector 값&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;b&gt;sector와 sector 사이에는 보이지 않는 책선&lt;/b&gt;이 존재한다. 이러한 책선에서 보통 데이터가 &lt;b&gt;오류가 있는지 없는지 검증하는 오류 검사&lt;/b&gt;를 진행한다. 그렇기 때문에 너무 많은 데이터를 담도록 sector를 두지는 않는다.&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1개의 disk pack = 1개 이상의 disk&lt;/li&gt;
&lt;li&gt;1개의 disk = 1~2개의 surface&lt;/li&gt;
&lt;li&gt;1개의 surface = 20 ~ 1500 tracks&lt;/li&gt;
&lt;li&gt;1 track = 4 ~ 20개의 sectors&lt;/li&gt;
&lt;li&gt;1 sectors = 32 ~ 4096개의 blocks&lt;/li&gt;
&lt;li&gt;1 block = 하나 이상의 sectors&lt;/li&gt;
&lt;li&gt;Rotation 속도 = 3600 ~ 7200 rpm(3600 rpm은 1초에 60번 회전한다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스크를 읽는 순서는 &lt;b&gt;하나의 트랙에 있는 섹터(블록)를 전부 돈 후&lt;/b&gt;에 그다음 &lt;b&gt;cylinder&lt;/b&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;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;디스크 I/O 전송 시간&lt;/h2&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-origin-width=&quot;1175&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NVc91/btsHpxgEvRm/HpU9oQhmogt89VpkwVgna1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NVc91/btsHpxgEvRm/HpU9oQhmogt89VpkwVgna1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NVc91/btsHpxgEvRm/HpU9oQhmogt89VpkwVgna1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNVc91%2FbtsHpxgEvRm%2FHpU9oQhmogt89VpkwVgna1%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;705&quot; height=&quot;132&quot; data-origin-width=&quot;1175&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;_Wait for Device_는 디스크가 충분히 1초에 60번 돌아갈 때까지 걸리는 시간&lt;/b&gt;을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;_Seek Time_은 원하는 트랙으로 이동하기까지 걸리는 시간&lt;/b&gt;을 말하며,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;_Rotational Delay_는 암이 원하는 Sector까지 이동하는 데 걸리는 시간&lt;/b&gt;을 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;_Data Transfer_는 Sector에서 데이터를 실제로 읽는 데 걸리는 시간&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;b&gt;_Access Time_은 _Seek Time_과 _Rotational Delay_를 합한 것&lt;/b&gt;을 말한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU입장에서는 실제로 &lt;b&gt;_Seek Time_를 줄이는 것&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;b&gt;디스크 스케쥴링을 통해 _Seek Time_을 줄일 수 있도록&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;디스크 스케쥴링 : FIFO&lt;/h2&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;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-origin-width=&quot;1112&quot; data-origin-height=&quot;336&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhe9Uf/btsHpehtjlu/SOJpFhxFgBcRkdNdQoxQrK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhe9Uf/btsHpehtjlu/SOJpFhxFgBcRkdNdQoxQrK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhe9Uf/btsHpehtjlu/SOJpFhxFgBcRkdNdQoxQrK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbhe9Uf%2FbtsHpehtjlu%2FSOJpFhxFgBcRkdNdQoxQrK%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;748&quot; height=&quot;226&quot; data-origin-width=&quot;1112&quot; data-origin-height=&quot;336&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 트랙을 처리하기 위해 너무나 많은 거리를 거쳐야 한다. _Access Time_이 커져 성능이 안 좋아지는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 해결하기 위해 나온 것이 &lt;b&gt;SSTF(Shortest Seek Time First)이다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;디스크 스케쥴링 : SSTF&lt;/h2&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-origin-width=&quot;1192&quot; data-origin-height=&quot;351&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mV1M4/btsHntGYq8O/SSn2qXPs5bbYFk9qRZ95u0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mV1M4/btsHntGYq8O/SSn2qXPs5bbYFk9qRZ95u0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mV1M4/btsHntGYq8O/SSn2qXPs5bbYFk9qRZ95u0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmV1M4%2FbtsHntGYq8O%2FSSn2qXPs5bbYFk9qRZ95u0%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;190&quot; data-origin-width=&quot;1192&quot; data-origin-height=&quot;351&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식은 제일 가까운 트랙을 찾아가는 방식이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 우선순위에 기반한 방식이기 때문에 만약 트랙 넘버가 치우쳐진 트랙들이 많다면, 뒤에 있는 트랙들은 &lt;b&gt;Starvation으로 인해 접근하지 못하는 상황이 발생한다.&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;b&gt;SCAN&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;디스크 스케쥴링 : SCAN&lt;/h2&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-origin-width=&quot;1190&quot; data-origin-height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dVGknS/btsHpb57zcM/q8gSKfSlWEN42JlciCn2MK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dVGknS/btsHpb57zcM/q8gSKfSlWEN42JlciCn2MK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dVGknS/btsHpb57zcM/q8gSKfSlWEN42JlciCn2MK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdVGknS%2FbtsHpb57zcM%2Fq8gSKfSlWEN42JlciCn2MK%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;773&quot; height=&quot;230&quot; data-origin-width=&quot;1190&quot; data-origin-height=&quot;354&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SCAN은 &lt;b&gt;Elevator Algorithm 또는 Look Policy&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;b&gt;Starvation 문제를 해결할 수 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Knowledge/운영체제(OS)</category>
      <category>디스크 스케쥴링</category>
      <author>TIlearn</author>
      <guid isPermaLink="true">https://devrepo.tistory.com/125</guid>
      <comments>https://devrepo.tistory.com/125#entry125comment</comments>
      <pubDate>Mon, 13 May 2024 16:34:57 +0900</pubDate>
    </item>
    <item>
      <title>[운영체제] I/O Control : Polling, Interrupt Driven I/O, DMA방법이란?</title>
      <link>https://devrepo.tistory.com/124</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I/O, 즉 입출력을 제어하는 방법에는 여러 가지가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;Polling&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Interrupt Driven I/O&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Direct Memory Access(DMA)&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 방법 중에서 먼저 Polling 방법에 대해 알아보자.&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;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;Polling이란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Polling을 이해하기 위해서는 입출력이 이루어지는 과정부터 이해할 필요가 있다.&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-origin-width=&quot;322&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dyU1eI/btsHouYzZ3B/UtG205f0FPkeOetuz0VmBK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dyU1eI/btsHouYzZ3B/UtG205f0FPkeOetuz0VmBK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dyU1eI/btsHouYzZ3B/UtG205f0FPkeOetuz0VmBK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyU1eI%2FbtsHouYzZ3B%2FUtG205f0FPkeOetuz0VmBK%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;218&quot; height=&quot;325&quot; data-origin-width=&quot;322&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림에서 System Call이 먼저 호출된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서서 배웠던 것처럼, Interrupt에 의해 &lt;b&gt;Kernel 영역으로 실행의 흐름이 옮겨진다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때&lt;b&gt; I/O Management에서 실제로 입/출력을 담당하는 장치가 무엇인지 판단&lt;/b&gt;한다. 이게 가능한 이유는 중간에 &lt;b&gt;Device-drive-interface&lt;/b&gt;가 존재하기 때문이다. Device-drive-interface는 실제 Device Driver와 I/O Management를 이어주는 역할을 하기 때문에 어떠한 Device Driver가 오더라도 I/O Management와 호환시켜 준다.&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;Device Driver는 해당 장치를 만든 회사에서 구현해야 한다.&lt;/b&gt; 운영체제 입장에서는 너무나도 많은 장치가 자신의 운영체제에 장착(?)될 수 있기 때문에 호환시켜 줄 I/O Management만 필요하지, Device Driver를 구현할 필요는 없다. 이러한 &lt;b&gt;Device Driver는 장치가 어떠한 입력이 주어졌을 때, 어떤 출력(동작)을&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;Polling을 한 줄로 설명하자면, &lt;b&gt;&quot;끝날 때까지 계속 묻는 것&quot;&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: #333333; text-align: start;&quot;&gt;이는 생각보다 단순하다. 장치는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Control Register, Status Register, 그리고 Internal Buffer&lt;/b&gt;로 구성되는데, Control Register는 Command(명령)을 전달하기 위해 사용되는 레지스터이고, Status Register는 현재 I/O가 완료되었는지, 진행 중인지 혹은 오류 등이 일어났는지 알려주는 레지스터이다.&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;먼저, 모든 레지스터는 Controller안에 위치한다. 여기에 있는 &lt;b&gt;레지스터 값을 Host와 Device&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;최초에 장치로 요청이 들어오면, Controller안의 &lt;b&gt;busy bit&lt;/b&gt;이라는 비트를 읽으며, 해당 비트가 1일 때는 장치가 다른 작업을 하고 있으므로 I/O를 진행할 수 없는 상태라고 파악한다. 만약 1이 아닌 0이라면 Control register안에 있는 write bit를 1로 세팅하고, &lt;b&gt;data-out register&lt;/b&gt;에 입력 바이트 값을 집어넣는다. 이 data-out register는 &lt;b&gt;Internal Buffer&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;b&gt;command-ready&lt;/b&gt; 상태라고 하는데, 이는 Host가 Device한테 입/출력할 준비됐어요~하는 것과 같다.&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;이내, Controller는 command-ready가 1로 set 된 것을 보고 &lt;b&gt;busy bit를 1&lt;/b&gt;로 set 한다. 장치는 이제 control register(write command)를 읽고, &lt;b&gt;data-out register를 통해 입력 값을 받아들여&lt;/b&gt; I/O를 수행한다.&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: #ee2323;&quot;&gt;&lt;b&gt;Polling 한다는 것은 위와 같은 방식으로 동작하는 장치에 대해서 주기적으로 status를 확인하는 방식이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, Device Driver의 코드를 계속해서 실행시켜하기 때문에 &lt;b&gt;busy wating이 발생한다는 단점&lt;/b&gt;이 있다.(Pragrammed I/O)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;Interrupt-Driven I/O란?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Polling 방식에서는 입/출력이 빠른 것에는 효율적이나, 입/출력이 느린 것에는 효율적이지 않다. 매번 busy waiting을 하기 때문이다.&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;Interrupt-Driven I/O&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-origin-width=&quot;1500&quot; data-origin-height=&quot;888&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eyXRhy/btsHnvjEbZe/41uTT8ZKWDr1FxpaQtrpPK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eyXRhy/btsHnvjEbZe/41uTT8ZKWDr1FxpaQtrpPK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eyXRhy/btsHnvjEbZe/41uTT8ZKWDr1FxpaQtrpPK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeyXRhy%2FbtsHnvjEbZe%2F41uTT8ZKWDr1FxpaQtrpPK%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;679&quot; height=&quot;402&quot; data-origin-width=&quot;1500&quot; data-origin-height=&quot;888&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식은 User Process에서 I/O 요청이 일어나면, Device Driver가 Device를 실행할 수 있도록 하는데, 만약 Device가 I/O 작업에 들어가게 된다면 &lt;b&gt;현재의 프로세스를 Block 시킨다.&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;즉, I/O 작업 중인 프로세스를 Block 상태로 만들어버리기 때문에 &lt;b&gt;다른 프로세스에서 작업하는 게&lt;/b&gt; 가능하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 Block 된 프로세스로 인해 다른 프로세스로 &lt;b&gt;컨텍스트 스위치&lt;/b&gt;가 발생하여 새로운 프로세스로 넘어갔다고 해보자. 그러다가 CPU가 Block 된 프로세스의 I/O 작업이 완료되어 수행이 완료되었다는 &lt;b&gt;IRQ(Interrupt Request)&lt;/b&gt;를 받게 되면, IRQ를 받음으로 인해 &lt;b&gt;ISR(Interrupt Service Routine)&lt;/b&gt;이 실행되고 &lt;b&gt;인터럽트에 대한 함수&lt;/b&gt;를 처리한다. 그리고, Block 된 프로세스를 Ready 상태로 변경시킨다.&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;이제, Kernel Mode에서 프로세스로 돌아가야 한다. 이때 돌아가기 전에 프로세스에 도착한 시그널이 있는지, 혹은 남은 ISR이 있는지 등을 확인한다.&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;I/O작업이 완료된 프로세스로 돌아갈 것인지, 혹은 새로운 프로세스로 돌아갈 것인지 선택해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 과정은 &lt;b&gt;스케쥴러가 결정&lt;/b&gt;하며, 만약 I/O 작업이 완료된 프로세스의 우선순위가 더 높다면 해당 프로세스로 돌아간다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;Direct Memory Access(DMA)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입/출력은 항상 Processor를 거쳐서 들어가거나 나간다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 입/출력이 굉장히 많아진다면, 인터럽트도 엄청나게 많이 나온다. 그러면 사용자 프로그램은 정상적으로 돌아가기 어려울 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 문제를 해결하기 위해 나온 것이 DMA이다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1124&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sQvGK/btsHmcMoiBQ/YTo2KuqJsbk2fsqWJCci40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sQvGK/btsHmcMoiBQ/YTo2KuqJsbk2fsqWJCci40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sQvGK/btsHmcMoiBQ/YTo2KuqJsbk2fsqWJCci40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsQvGK%2FbtsHmcMoiBQ%2FYTo2KuqJsbk2fsqWJCci40%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;663&quot; height=&quot;386&quot; data-origin-width=&quot;1124&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;프로세서는 I/O 작업을 DMA 모듈로 위임한다.&lt;/b&gt; 이때 DMA 모듈은 하나가 아니라 여러 개가 될 수 있기 때문에 여러 I/O를 프로세서의 현재 동작과 관계없이 수행할 수 있다.&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;이후, I/O작업이 종료되면, DMA는 쌓아놓은 I/O 처리 결과를 프로세서로 한 번에 송신한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Knowledge/운영체제(OS)</category>
      <category>DMA</category>
      <category>interrupt-driven i/o</category>
      <category>polling</category>
      <author>TIlearn</author>
      <guid isPermaLink="true">https://devrepo.tistory.com/124</guid>
      <comments>https://devrepo.tistory.com/124#entry124comment</comments>
      <pubDate>Mon, 13 May 2024 13:15:21 +0900</pubDate>
    </item>
    <item>
      <title>[운영체제] 인터럽트란 무엇이고, 어떻게 발생할까</title>
      <link>https://devrepo.tistory.com/123</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커널로의 진입이 필요한 시점은 3가지 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Interrupt&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Trap (software interrupt)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;System Call&lt;/b&gt;&lt;/li&gt;
&lt;/ul&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;인터럽트란?&lt;/h2&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;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;반대로 동기란 이벤트가 일어날 시간이 정해져 있다는 뜻이다.&lt;/blockquote&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-origin-width=&quot;1493&quot; data-origin-height=&quot;655&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctiTIg/btsHkVbvI4g/cWxbbCEQHVHh9ZZyLL90bK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctiTIg/btsHkVbvI4g/cWxbbCEQHVHh9ZZyLL90bK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctiTIg/btsHkVbvI4g/cWxbbCEQHVHh9ZZyLL90bK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctiTIg%2FbtsHkVbvI4g%2FcWxbbCEQHVHh9ZZyLL90bK%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;714&quot; height=&quot;313&quot; data-origin-width=&quot;1493&quot; data-origin-height=&quot;655&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터럽트가 발생하면 가장 먼저 &lt;b&gt;PIC(Programmable Interrupt Controller)에 신호&lt;/b&gt;가 도착한다. PIC 칩은 곧장 CPU로 &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;b&gt;Clock 인터럽트만 다른 인터럽트와 달리 PIC를 거치지 않고&lt;/b&gt;, 바로 CPU로 신호를 전달하는데, 이는 Clock 인터럽트가 굉장히 자주 일어나기 때문이다.&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;CPU는 매번 인터럽트가 발생했는 지 확인&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;b&gt;인터럽트가 발생하면&lt;/b&gt;, 실행 중인 프로세스는 곧장 &lt;b&gt;커널 모드&lt;/b&gt;로 바꾼다. 그리곤, 레지스터 값들을 커널 스택에 저장하는데, 만약 이미 커널 모드 중에 있다면 굳이 &lt;b&gt;Mode Change&lt;/b&gt;를 진행하지 않는다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커널 모드로 바뀐 이후, 이제 &lt;b&gt;인터럽트 핸들러(Interrupt Handler)&lt;/b&gt;를 실행한다. 인터럽트 핸들러는 누가 인터럽트를 발생시켰는지 확인하는 역할을 한다. 만약, PIC 쪽에서 연결된 인터럽트가 발생했다면, &lt;b&gt;PIC가 해당 인터럽트에 대한 번호&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;b&gt;인터럽트 핸들러는 해당 번호&lt;/b&gt;를 받아, &lt;b&gt;IDT(Interrupt Descriptor Table) = IVT&lt;/b&gt;라는 테이블에 등록된 함수를 실행한다. 이 함수는 실제로 인터럽트를 처리하는 함수가 된다. 다른 말로 &lt;b&gt;Interrupt Service Routine(ISR)&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;이전에 Time Slice마다, 컨텍스트 스위치가 일어난다는 것을 배운 적이 있다. 이때 Time Slice를 판단하는 것도 사실, Clock Interrupt에 의해 수행된다. Clock Interrupt가 걸릴 때마다 &lt;b&gt;IDT에서 time_intr()함수&lt;/b&gt;를 호출하여 count값을 증가시키기 때문이다. 이를 통해 1ms마다 count값이 100이 될 때까지 증가시키고, 100번째가 된다면 다른 프로세스로 콘텍스트 스위치 할 수 있도록 한다.&lt;/p&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;b&gt;왜 1ms까지 매번 커널로 들어가야 할까?&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;운영체제로써, 미뤄놓았던 커널에서의 처리를 해야 하는데, 만약 100ms마다 커널로 들어간다면, 그 사이에는 확인할 수 없다. 즉, 한 번 들어갈때 운영체제에서 해야 할 &lt;b&gt;부가적인 일을 처리&lt;/b&gt;하고 나오기 때문에 매번 들어가야 한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;인터럽트가 처리되는 부분&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터럽트를 처리하는 부분은 사실 두 두분이다.&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;p data-ke-size=&quot;size16&quot;&gt;따라서, ISR은 급하게 빨리 해야 할 일은 빠르게 실행하고, 미뤄놓아도 좋을 것은 뒤로 미룬다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;인터럽트 중간에 인터럽트가 발생한다면?&lt;/h2&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;b&gt;nested interrupt&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;349&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6GRGG/btsHmEBpqXq/7x1se6ufuuedesR4emYFbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6GRGG/btsHmEBpqXq/7x1se6ufuuedesR4emYFbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6GRGG/btsHmEBpqXq/7x1se6ufuuedesR4emYFbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6GRGG%2FbtsHmEBpqXq%2F7x1se6ufuuedesR4emYFbK%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;541&quot; height=&quot;256&quot; data-origin-width=&quot;737&quot; data-origin-height=&quot;349&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 data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 말하는 부가적인 일이란 아래와 같은 것들이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;미뤄놓은 인터럽트에 대한 처리&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;새로운 시그널이 오지 않았는지 확인&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;새로운 프로세스가 도착하지 않았는 지 등 확인&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;Trap Hanlding&lt;/h2&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;Trap이란 동기적인 소프트웨어 인터럽트를 실행한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어, 0으로 나눈 경우 Divide by Zero 오류와 같은 것이나, 유효하지 않은 Machine code, Sementation fault(허용되지 않은 메모리 주소), protection fault(읽기만 허용되고 쓸 수는 없을 때 쓰려고 한 경우), page fault(실행해야 하는 메인 메모리에 없는 경우)등이 될 수 있다.&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;page fault를 제외하고는 전부 프로그램을 중지시킨다.&lt;/b&gt; 오직 page fault만이 &lt;b&gt;프로그램을 중지시키지 않는다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;소프트웨어 인터럽트이지만, 인터럽트를 거는 주체는 CPU이다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Trap이 걸리면, 일단 프로세스를 중단시키고 커널로 들어가야 한다. 따라서, 커널 스택에 레지스터 값을 저장하고 똑같이 인터럽트 핸들러를 실행시키며 ISR 함수를 통해 인터럽트 함수를 처리한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;System Call&lt;/h2&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;&amp;nbsp;System Call이란 프로세스가 운영체제에게 요청을 보내는 것을 말한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때, 입력과 출력 외에도 System call을 부르는 경우는 많다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;유저 프로그램에서도 System Call이 불러지면, 처음에는 &lt;b&gt;어셈블리 인스트럭션을 통해 명령을 수행&lt;/b&gt;한다. 이러한 어셈블리 인스트럭션은 &lt;b&gt;IDT상에서 _0x80_ 메모리 주소 상의 값을 수행하도록 하는데,&lt;/b&gt; 여기에는 system call 함수가 존재한다.&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-origin-width=&quot;644&quot; data-origin-height=&quot;272&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/u229y/btsHmsazPUj/3taScaKavaQDV9U1fJfrI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/u229y/btsHmsazPUj/3taScaKavaQDV9U1fJfrI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/u229y/btsHmsazPUj/3taScaKavaQDV9U1fJfrI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fu229y%2FbtsHmsazPUj%2F3taScaKavaQDV9U1fJfrI0%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;229&quot; data-origin-width=&quot;644&quot; data-origin-height=&quot;272&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;sys call table&lt;/b&gt;이 존재하는 이유는 system call에 &lt;b&gt;종류가 굉장히 많기 때문이다.&lt;/b&gt;&lt;/p&gt;</description>
      <category>  Knowledge/운영체제(OS)</category>
      <category>인터럽트</category>
      <author>TIlearn</author>
      <guid isPermaLink="true">https://devrepo.tistory.com/123</guid>
      <comments>https://devrepo.tistory.com/123#entry123comment</comments>
      <pubDate>Sun, 12 May 2024 15:56:47 +0900</pubDate>
    </item>
    <item>
      <title>[운영체제] 입/출력 관리(I/O Management)</title>
      <link>https://devrepo.tistory.com/122</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;I/O Devices의 종류&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I/O Devices는 입/출력을 관리하는 장치로 목적에 따라 여러 종류가 있다.&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;가 있다. 그리고 센서나 Controllers, Actuators, Disk, tape driver 등의 &lt;b&gt;기계가 이용하는 장치&lt;/b&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;/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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;I/O Devices&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I/O Devices는 대개 3 개의 요소로 이루어진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Controller Register, Status Register, Internel Buffer이다.&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;엥? Register는 CPU에만 있는 게 아닌가? Devices에서 왜 Register가 들어갈까? 라는 생각이 들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;맞는 말이다. 실제로도 Device 자체에 Register가 있는 게 아니라 Device driver가 Register값을 변경시킴으로써, Device로 전기적인 신호를 보낸다.&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: #409d00;&quot;&gt;&lt;b&gt;Controller Register이 하는 역할은 보통 Device가 1과 0을 통해서 해야할 명령을 수행한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;Status Register는 현재 I/O 작업이 수행 전인지, 수행 중인지, 수행이 끝났는 지 체크한다.&lt;/b&gt;&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;I/O Management&lt;/h2&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-origin-width=&quot;847&quot; data-origin-height=&quot;778&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ce2su6/btsHcsAISyC/pujf3UPzfRlmbzrZZU4xdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ce2su6/btsHcsAISyC/pujf3UPzfRlmbzrZZU4xdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ce2su6/btsHcsAISyC/pujf3UPzfRlmbzrZZU4xdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fce2su6%2FbtsHcsAISyC%2Fpujf3UPzfRlmbzrZZU4xdK%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;518&quot; height=&quot;476&quot; data-origin-width=&quot;847&quot; data-origin-height=&quot;778&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;따라서 운영체제 자체에서 Status Register를 관리하는 것은 옳지 않다. 각 장치들마다 Status Register에 따라 동작하는 방식이 다를 수도 있기 때문이다.&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;그렇기 때문에 Kernel 영역이나, I/O만을 담당하는 특수한 커널 계층을 만들게 되었다. 바로 &quot;&lt;b&gt;Kernel I/O Subsystem&quot;&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;이에 따라 그 밑의 하드웨어 단에서도 변화가 생겼다. 그냥 Device 자체를 연결시키는 것은 무리이기 때문에 이를 &lt;b&gt;모듈 형태로 구현하였다.&lt;/b&gt; 모듈 형태로 구현한다면 쉽게 탈/부착 가능하기 때문이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하드웨어 영역은 &lt;b&gt;Device와 Device Controller&lt;/b&gt;로 분리하였고, 소프트웨어 영역은 &lt;b&gt;Device Driver와 Kernel I/O SubSystem&lt;/b&gt;으로 분리하였다. 소프트웨어 영역의 &lt;b&gt;Device Driver를 통해 실제로 하드웨어에 접근하여 관리&lt;/b&gt;를 할 수 있게 된 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;그렇기 때문에 Device Driver는 각 제조사 측에서 만들어야 한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;device driver만 만들면 끝일까? Kernel I/O subsystem 상에서의 I/O 명령을 모든 device driver가 전부 수용할 수 있을까? 안그래도 OS도 여러가지인데 쉽지는 않을 것이다.&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;그렇기에 만든 것이 device-driver interface이다.&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;device driver가 여러 가지이더라도 운영체제에 맞는 device-driver interface를 작성&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;720&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQ9YQv/btsHcqJGQFJ/OvYKp5qpHTAVl6ufK0CmbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQ9YQv/btsHcqJGQFJ/OvYKp5qpHTAVl6ufK0CmbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQ9YQv/btsHcqJGQFJ/OvYKp5qpHTAVl6ufK0CmbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ9YQv%2FbtsHcqJGQFJ%2FOvYKp5qpHTAVl6ufK0CmbK%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;627&quot; height=&quot;355&quot; data-origin-width=&quot;1272&quot; data-origin-height=&quot;720&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 프로세스가 명령을 내리면, Device는 위와 같은 과정을 통해 명령을 수행한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;특이한 것은 DDI(Device Driver Interface)가 마치 File System과 같이 동작한다는 것이다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;kernel I/O Management&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;I/O만 담당한다고 했던 _Kernel I/O Management_가 실제로 수행하는 역할은 무엇인지 한번 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Device Reservation&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장치를 예약하고 할당한다.&lt;/li&gt;
&lt;li&gt;앞서서 다른 작업을 하고 있다면, 대기 큐에 집어넣고 다른 작업을 수행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Device Scheduling&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;큐에 들어가 있는 작업 중에서 어떤 작업을 수행할 지 정한다.&lt;/li&gt;
&lt;li&gt;큐이지만, 들어온대로 작업을 하지 않을 수도 있다. 이는 &quot;성능&quot; 때문이다.&lt;/li&gt;
&lt;li&gt;프로세스 스케쥴링(=프로세서 스케쥴링)과 비슷한 맥락이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Error Handling&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;디바이스 드라이버가 장치에 오류가 발생했음을 알린다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Buffering&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입/출력 내용을 임시로 저장한다&lt;/li&gt;
&lt;li&gt;커널 메모리 안에 저장한다.&lt;/li&gt;
&lt;li&gt;목적은 다음과 같다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;장치와 커널간의 속도 차이를 극복하기 위해서&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대량의 내용을 전달하기 위해 사이즈를 조절&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;출력 버튼을 눌렀을 때의 내용만을 출력하기 위해서 = Copy Semantics&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Caching&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴퓨터의 실행 속도를 높이기 위해 커널 메모리 상에 임시로 데이터를 저장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Spooling&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보조 기억 장치의 공간의 일부를 출력을 위해 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Knowledge/운영체제(OS)</category>
      <author>TIlearn</author>
      <guid isPermaLink="true">https://devrepo.tistory.com/122</guid>
      <comments>https://devrepo.tistory.com/122#entry122comment</comments>
      <pubDate>Mon, 6 May 2024 11:36:43 +0900</pubDate>
    </item>
    <item>
      <title>[운영체제] 파일 시스템 사례(Linux)</title>
      <link>https://devrepo.tistory.com/121</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size23&quot;&gt;Unix에서의 파일 관리&lt;/h3&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-origin-width=&quot;1308&quot; data-origin-height=&quot;254&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UZwB0/btsHbOqw1u1/Cb5NGwYPFK76SjzJx6CJHK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UZwB0/btsHbOqw1u1/Cb5NGwYPFK76SjzJx6CJHK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UZwB0/btsHbOqw1u1/Cb5NGwYPFK76SjzJx6CJHK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUZwB0%2FbtsHbOqw1u1%2FCb5NGwYPFK76SjzJx6CJHK%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;731&quot; height=&quot;142&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;254&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 알아보았듯이, Unix에서는 위와 같은 &lt;a title=&quot;파일 시스템&quot; href=&quot;https://devrepo.tistory.com/119&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;파일 시스템&lt;/a&gt; 구조를 지닌다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;inode는 특정한 파일에 대한 주요 정보를 가지고 있는 제어 구조&lt;/b&gt;라고 했다. 여기에는 직/간접적으로 연결되어 있는 파일들의 개수인 Link Count 등의 정보가 들어간다고 하였다. 또한 unix에서의 inode가 파일에 대한 제어 정보를 가지고 있는 FCB와 대응된다는 것도 기억해 보자.&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;자 이제 기억해야 할 것은 각각의 inode는 파일에 대한 제어 정보를 가지고 있다는 것이고, 여기서 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;파일을 저장하기 위해 _indexed allocation_ 방식을 사용한다는 것이다.&lt;/b&gt;&lt;/span&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 title=&quot;indexed allocation&quot; href=&quot;https://devrepo.tistory.com/120&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;indexed allocation&lt;/a&gt;은 파일의 정보를 저장하기 위해 특정 Block을 Index를 관리하는 Block으로 두는 방식이었다. 여기서 특정 Block은 Index Block이라고 부르며 다른 Data Block들과 동일하게 취급한다.&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;아무튼, inode 안에서 Data Block을 관리하기 위해 정확히는 아래와 같은 구조를 사용한다.&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-origin-width=&quot;1478&quot; data-origin-height=&quot;764&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWfFdE/btsHcSr9HYm/qBF9d2wydJkoqla0fA3UT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWfFdE/btsHcSr9HYm/qBF9d2wydJkoqla0fA3UT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWfFdE/btsHcSr9HYm/qBF9d2wydJkoqla0fA3UT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWfFdE%2FbtsHcSr9HYm%2FqBF9d2wydJkoqla0fA3UT1%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;653&quot; height=&quot;338&quot; data-origin-width=&quot;1478&quot; data-origin-height=&quot;764&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그림을 보면 10개의 Direct Block과 3개의 Indirect Blocks가 있다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;먼저 Direct Block은 가장 먼저 저장되는 Data Block들에 대한 번호들을 저장한 Index Block이다.&lt;/b&gt; Direct Block 하나가 2^10인 1024Byte만큼의 Data Block들을 저장할 수 있기 때문에 총 10 * 2^10 * 4 = 40KB 만큼이 10개의 Direct Block의 크기라고 본다.&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;다음으로 Single Indirect는 Direct Block만으로도 파일의 크기를 전부 담을 수 없을 때 사용하는 Block이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기에는 하나당 4KB인 Index Block들 자체들를 저장하는 간접적인 Block 하나를 사용한다. 하나의 Block은 1024개만큼의 Block 주소를 담을 수 있기 때문에 총 4KB * 2^10 = 4MB의 공간을 저장할 수 있다.&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;Double Indirect는 Single Indirect 만으로도 크기가 부족할 때 사용하는 것인데, 원리는 Single Indirect와 유사하다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4MB만큼의 공간을 가지는 하나의 Index Block자체들을 저장하는 간접적인 Block하나를 추가로 만드는 것이다. 그러면, 총 4MB * 2^10 = 4GB만큼의 공간을 저장할 수 있다.&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;Triple Indriect도 4GB만큼의 공간을 가지는 Index Block들을 저장하는 간접적인 Block 하나를 추가하여 총 4TB만큼의 공간을 가질 수 있다.&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: #ee2323;&quot;&gt;&lt;b&gt;하나의 Inode는 4KB + 4MB + 4GB + 4TB의 공간을 가질 수 있다.&lt;/b&gt;&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size23&quot;&gt;Linux Virtual File System&lt;/h3&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: #409d00;&quot;&gt;&lt;b&gt;리눅스에서도 파일 시스템의 종류에 관계없이 쉽게 유저가 파일에 접근하고 사용할 수 있도록 하기 위해 Virtual File System을 제공한다.&lt;/b&gt;&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-origin-width=&quot;1066&quot; data-origin-height=&quot;1060&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/V1fip/btsHbj5GJfH/SJNnyiSHrKYvHKfGt7yazK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/V1fip/btsHbj5GJfH/SJNnyiSHrKYvHKfGt7yazK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/V1fip/btsHbj5GJfH/SJNnyiSHrKYvHKfGt7yazK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FV1fip%2FbtsHbj5GJfH%2FSJNnyiSHrKYvHKfGt7yazK%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;557&quot; height=&quot;554&quot; data-origin-width=&quot;1066&quot; data-origin-height=&quot;1060&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그림과 같이 파일 시스템이 달라지더라도 하나의 모듈로써 파일 시스템의 종류를 커널 안으로 넣을 수 있다. 이로 인해 사용자는 굳이 신경 쓰지 않더라도 File System을 이용 가능하다.&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;위에 보이는 _page cache_는 _disk cache_와 같은 의미로 disk에서 block을 읽어오면 임시로 저장하는 공간이라고 생각하면 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size23&quot;&gt;Linux inode&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 inode의 구조가 동일한 것은 아니다. 운영체제마다 조금씩 차이점이 존재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Linux에서는 10개의 Direct Blocks를 사용하는 Unix와 달리 Direct Blocks를 12개 사용한다.&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;또한 파일 시스템의 종류에 따라서 inode의 크기 또한 다르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;ext2, ext3에서는 128바이트&lt;br /&gt;ext4에서는 256바이트이다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;h3 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size23&quot;&gt;File Operation&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;System Call은 프로세스가 운영체제에게 알리는 이벤트라고 하였다. File Operation도 결국 System Call이기 때문에 프로세스가 해당 이벤트를 알린다. 하지만,&lt;b&gt; File에서 사용하는 System Call은 장치, 혹은 타입마다 다르기 때문에 특별한 테이블 구조를 만들어 사용한다.&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-origin-width=&quot;1503&quot; data-origin-height=&quot;971&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kGUOa/btsHbTeho9a/vBF4dcIcRKaVorjBHuVo4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kGUOa/btsHbTeho9a/vBF4dcIcRKaVorjBHuVo4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kGUOa/btsHbTeho9a/vBF4dcIcRKaVorjBHuVo4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkGUOa%2FbtsHbTeho9a%2FvBF4dcIcRKaVorjBHuVo4K%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;429&quot; data-origin-width=&quot;1503&quot; data-origin-height=&quot;971&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 그림과 같이 파일 시스템, 혹은 장치에 따라 같은 종류의 _open_함수이더라도 다른 동작을 해야 하는 경우가 생긴다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NFS에서는 _nfs file open_함수가 불러지면, 다른 PC와 remote 통신을 하는 추가 작업이 수행될 수 있다.&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;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;h3 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size23&quot;&gt;Linux File Operation&lt;/h3&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-origin-width=&quot;1442&quot; data-origin-height=&quot;730&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIEAcb/btsHb7Dndc2/6A89UcMV3RGC12Xk41kva0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIEAcb/btsHb7Dndc2/6A89UcMV3RGC12Xk41kva0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIEAcb/btsHb7Dndc2/6A89UcMV3RGC12Xk41kva0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIEAcb%2FbtsHb7Dndc2%2F6A89UcMV3RGC12Xk41kva0%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;720&quot; height=&quot;364&quot; data-origin-width=&quot;1442&quot; data-origin-height=&quot;730&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스에서 File Operation이 수행되는 흐름은 위와 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 새로운 프로세스가 만들어지면 task struct라는 구조가 만들어진다. 이는 PCB와 동일한 것이고 이 안에 file structure 정보를 가진다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;file structure은 파일 시스템 아래에 있는 &lt;b&gt;파일들에 참조 정보를 지닌다.&lt;/b&gt; 또한 각각의 파일들은 파일 시스템 내부에 정의된 구조에 따라서 inode라는 FCB정보를 가진다. 이는 어떤 파일 시스템을 가지냐에 따라 구조가 달라질 수 있다.&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;마지막으로 inode는 Disk 내부에 저장된 Block 할당 방식에 따라 파일 정보를 저장한다.&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-origin-width=&quot;1471&quot; data-origin-height=&quot;707&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zKva5/btsHaPKQtTu/yzZE8zYG25Uau3dw4FSzi1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zKva5/btsHaPKQtTu/yzZE8zYG25Uau3dw4FSzi1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zKva5/btsHaPKQtTu/yzZE8zYG25Uau3dw4FSzi1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzKva5%2FbtsHaPKQtTu%2FyzZE8zYG25Uau3dw4FSzi1%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;575&quot; height=&quot;276&quot; data-origin-width=&quot;1471&quot; data-origin-height=&quot;707&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 실행되는 코드를 살펴보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;task struct와 files struct는 프로세스 단에서 실행되는 것이고, struct file과 file operation을 저장한 테이블인 file operations는 운영체제가 만들어 관리한다.&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;이때 file operation은 실행되는 파일 시스템 모듈에 따라 달리질 수 있음을 기억해 보자.&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-origin-width=&quot;1455&quot; data-origin-height=&quot;865&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CbIen/btsHbCYabEa/G7s1veJS4q0ninTt53T7oK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CbIen/btsHbCYabEa/G7s1veJS4q0ninTt53T7oK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CbIen/btsHbCYabEa/G7s1veJS4q0ninTt53T7oK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCbIen%2FbtsHbCYabEa%2FG7s1veJS4q0ninTt53T7oK%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;752&quot; height=&quot;447&quot; data-origin-width=&quot;1455&quot; data-origin-height=&quot;865&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같이 장치나 파일 시스템에 따라 open함수도 여러 File Operation 테이블에 따라 동작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Knowledge/운영체제(OS)</category>
      <author>TIlearn</author>
      <guid isPermaLink="true">https://devrepo.tistory.com/121</guid>
      <comments>https://devrepo.tistory.com/121#entry121comment</comments>
      <pubDate>Sun, 5 May 2024 12:12:26 +0900</pubDate>
    </item>
    <item>
      <title>[운영체제] 데이터 블록(Data Block)의 관리</title>
      <link>https://devrepo.tistory.com/120</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;파일 시스템에서의 Data Blcok&lt;/h2&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;파일에서는 Block이라고 하는 것을 저장단위로 사용한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 Block 하나의 크기는 4096바이트이다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스크에서 파일을 저장할 때, Block을 무작위로 저장하지는 않는다. 어떻게 배치하느냐에 따라 그 전략이 달라진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선, 지금은 잘 사용하지 않는 _Contiguous Allocation_에 대해 알아보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size23&quot;&gt;Contiguous Allocation&lt;/h3&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: #409d00;&quot;&gt;&lt;b&gt;이름을 보고 유추할 수 있듯이, _Contiguous Allocation_방식은 파일을 저장할 때 연속적으로 Block을 배치한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식을 사용하면 File Allocation Table을 사용하는데, 여기에 파일의 시작 Block과 Block의 길이를 저장한다. 물론 파일의 FCB에서도 파일의 시작 Block과 Block의 길이 정보를 같이 저장한다.&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-origin-width=&quot;1620&quot; data-origin-height=&quot;940&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfZN2w/btsHa1KGL1m/NOItK0PAh7bMJ1Q7RhU8e0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfZN2w/btsHa1KGL1m/NOItK0PAh7bMJ1Q7RhU8e0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfZN2w/btsHa1KGL1m/NOItK0PAh7bMJ1Q7RhU8e0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfZN2w%2FbtsHa1KGL1m%2FNOItK0PAh7bMJ1Q7RhU8e0%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;638&quot; height=&quot;370&quot; data-origin-width=&quot;1620&quot; data-origin-height=&quot;940&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 이 방식을 굉장히 좋지 못한데 그 이유는 크게 두 가지다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;첫 번째로, _external fragmentation_이 발생한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fragmentation은 데이터가 연속적으로 저장됨으로 인해 부분적으로 빈 공간이 발생하는 것을 말한다. 이때 각 파일의 외부 공간에 대해서 fragmentation이 발생하는 것을&amp;nbsp; _external fragmentation_이라고 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;파일 내부에서 발생하는 fragmentation은 internal fragmentation이라고 한다.&lt;/blockquote&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;각각의 파일들은 연속적으로 자리를 차지하고 있다. 그렇기 때문에 fragmentation에서는 부분적으로 공간을 늘릴 수는 있으나, 원하는 만큼 크게 늘리진 못한다. 만약 옮기고 싶다면 전체를 복사해서 새로운 공간에 할당해야 하기 때문에 시간도 굉장히 많이 든다.&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;위와 같은 단점들로 인해 Contiguous Allocation은 사용하지 않는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;h3 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size23&quot;&gt;Chained Allocation(Linked Allocation)&lt;/h3&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-origin-width=&quot;1375&quot; data-origin-height=&quot;762&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JFeGj/btsHbiMojPz/Kq4GIAPmFmqFufvyiKuj3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JFeGj/btsHbiMojPz/Kq4GIAPmFmqFufvyiKuj3k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JFeGj/btsHbiMojPz/Kq4GIAPmFmqFufvyiKuj3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJFeGj%2FbtsHbiMojPz%2FKq4GIAPmFmqFufvyiKuj3k%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;647&quot; height=&quot;359&quot; data-origin-width=&quot;1375&quot; data-origin-height=&quot;762&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;이 방식은 Linked List를 사용하는 방법으로 생각하면 쉽다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;각 Block이 그다음 Block의 참조를 가진다.&lt;/b&gt;&lt;/span&gt; 따라서 _external fragmentaion_과 같은 문제는 없어진다.&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;p data-ke-size=&quot;size16&quot;&gt;먼저, Block을 탐색하다가 중간에 참조가 끊어지면 그 뒤에 있는 Block은 읽지 못한다. 또한 하나의 파일 안에서 특정 블록에 대해 바로 접근하는 _direct access_가 불가능하다.&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;이러한 문제를 해결하기 위해 나온 것이 _indexed allocation_이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size23&quot;&gt;Indexed Allocation&lt;/h3&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-origin-width=&quot;1355&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBIQqX/btsHdeBKRyZ/DRav2iTKOA1T2SqRonpec0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBIQqX/btsHdeBKRyZ/DRav2iTKOA1T2SqRonpec0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBIQqX/btsHdeBKRyZ/DRav2iTKOA1T2SqRonpec0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBIQqX%2FbtsHdeBKRyZ%2FDRav2iTKOA1T2SqRonpec0%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;563&quot; height=&quot;322&quot; data-origin-width=&quot;1355&quot; data-origin-height=&quot;776&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;_index allocation_은 여러 Block 중 임의로 하나를 파일의 인덱스를 관리하는 Block으로 만드는 방식이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식으로 사용하면, 해당 Block은 파일을 구성하는 다른 Block들에 대한 정보를 순서대로 지니고 있게 된다.&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;즉, _Direct Access_가 가능하고, _Fragmentation_도 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;Free-Space Management&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;빈 공간을 관리하는 방법에도 여러 종류가 있다.&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;h3 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size23&quot;&gt;counting&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;counting 방식은 간단하게 시작 Block 번호와 해당 Block으로 부터 얼마만큼 Free Block인지 세는 방법이다.&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-origin-width=&quot;736&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tHHuh/btsHaS8t5p5/VJ0Iez7y8q2EFZZ7BCdbI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tHHuh/btsHaS8t5p5/VJ0Iez7y8q2EFZZ7BCdbI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tHHuh/btsHaS8t5p5/VJ0Iez7y8q2EFZZ7BCdbI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtHHuh%2FbtsHaS8t5p5%2FVJ0Iez7y8q2EFZZ7BCdbI1%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;599&quot; height=&quot;262&quot; data-origin-width=&quot;736&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size23&quot;&gt;Linked List (free list)&lt;/h3&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-origin-width=&quot;870&quot; data-origin-height=&quot;1002&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bx63Bn/btsHbjxOan4/dltfyCCtF18cJ542mPmcdk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bx63Bn/btsHbjxOan4/dltfyCCtF18cJ542mPmcdk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bx63Bn/btsHbjxOan4/dltfyCCtF18cJ542mPmcdk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbx63Bn%2FbtsHbjxOan4%2FdltfyCCtF18cJ542mPmcdk%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;403&quot; height=&quot;464&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;1002&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 파일을 관리하는 방식 중, Chained allocation과 굉장히 유사하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;마찬가지로 Free Block 들을 Linked List로 관리하여 공간을 관리한다.&lt;/b&gt;&lt;/span&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;이때, 새로운 Free Block을 할당하기 위해서 맨 앞의 head 값을 사용하기 때문에 할당은 간단하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만, 여전히 하나의 Block의 참조가 끊키면 다른 Block들도 다 못 사용하기 때문에 좋지 않다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size23&quot;&gt;Grouping&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 방식은 앞선 Indexed Allocation 방식과 유사하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;임의의 Block이 Free Block들에 대해 관리하는 방식이다.&lt;/b&gt;&lt;/span&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;하지만 Free Block들이 적지는 않다. 고작 4096바이트 밖에 되지 않고, 하나의 Free Block을 기록하기 위해 4바이트를 사용하여 총 1024개의 Free Block을 적을 수 있을 텐데, 어떻게 많은 Free Block을 관리할 수 있을까?&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;이는 바로 Grouping에서 사용하는 특수한 저장 방식으로 해결 가능하다.&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-origin-width=&quot;1174&quot; data-origin-height=&quot;596&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqvOrJ/btsHcUcpTof/PsnlXa7QGDi4wlKKVKHKjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqvOrJ/btsHcUcpTof/PsnlXa7QGDi4wlKKVKHKjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqvOrJ/btsHcUcpTof/PsnlXa7QGDi4wlKKVKHKjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqvOrJ%2FbtsHcUcpTof%2FPsnlXa7QGDi4wlKKVKHKjK%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;616&quot; height=&quot;313&quot; data-origin-width=&quot;1174&quot; data-origin-height=&quot;596&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기에 Free Block들을 관리하기 위해 Super Block List에 모든 Free Block 정보를 넣는다. 여기 안에서 하나씩 꺼내서 각각의 Free Block들을 할당하는데, 만약 Free Block들이 너무 많아진다면 마지막으로 저장한 Free Block으로 이동하여 새롭게 Free Block을 저장한다.&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;위의 예시에서는 109번이 마지막으로 저장되므로 109번 Block으로 가서 다시 처음부터 Free Block을 저장한다.&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-origin-width=&quot;1240&quot; data-origin-height=&quot;565&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cc65Rd/btsHbB51eQB/dAkz6jMPfoiinKicAGnBLk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cc65Rd/btsHbB51eQB/dAkz6jMPfoiinKicAGnBLk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cc65Rd/btsHbB51eQB/dAkz6jMPfoiinKicAGnBLk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcc65Rd%2FbtsHbB51eQB%2FdAkz6jMPfoiinKicAGnBLk%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;665&quot; height=&quot;303&quot; data-origin-width=&quot;1240&quot; data-origin-height=&quot;565&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용하는 것도 마찬가지다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;109번 Block앞의 모든 Block을 전부 사용했다면 109번 Block을 Free Block에서 Block으로 할당하기 위해, 109번 Block 안에 있던 모든 정보를 Super Block List로 전부 이동시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;h3 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size23&quot;&gt;Bit-vector&lt;/h3&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: #409d00;&quot;&gt;&lt;b&gt;마지막으로 Bit-vector 방식인데, 이 방식은 모든 Block 들에 대해 Free Block은 1로, 할당된 Block은 0으로 두는 방식이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개념적으로는 아주 간단하고 좋은 방식이나 모든 Block들을 저장하는데 8K disk Block이 필요하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Knowledge/운영체제(OS)</category>
      <author>TIlearn</author>
      <guid isPermaLink="true">https://devrepo.tistory.com/120</guid>
      <comments>https://devrepo.tistory.com/120#entry120comment</comments>
      <pubDate>Sun, 5 May 2024 10:05:13 +0900</pubDate>
    </item>
    <item>
      <title>[운영체제] 파일시스템이란?</title>
      <link>https://devrepo.tistory.com/119</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;File Systems&lt;/h2&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: #409d00;&quot;&gt;&lt;b&gt;파일 시스템이란 파일들을 담아놓는 자료구조이자, 자료들을 처리하는 알고리즘을 포함하는 Logical storage unit을 말한다.&lt;/b&gt;&lt;/span&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Boot block&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Partition control block(super block)&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Directory structure&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제에 따라 있을 수도 있고, 없을 수도 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;File control blocks&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Data blocks&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 파일의 내용을 저장하는 곳이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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-origin-width=&quot;1721&quot; data-origin-height=&quot;966&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cdmXVA/btsG3ghpW9Y/iKzN0GVqP36X3b0g9Bjvok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cdmXVA/btsG3ghpW9Y/iKzN0GVqP36X3b0g9Bjvok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cdmXVA/btsG3ghpW9Y/iKzN0GVqP36X3b0g9Bjvok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcdmXVA%2FbtsG3ghpW9Y%2FiKzN0GVqP36X3b0g9Bjvok%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;760&quot; height=&quot;427&quot; data-origin-width=&quot;1721&quot; data-origin-height=&quot;966&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;논리적으로 디스크를 나누어 놓은 것을 파티션&lt;/b&gt;이라고 하는데, 각 파티션에는 위와 같이 &lt;b&gt;Partition Control Block&lt;/b&gt;이 존재한다. 여기에는 &lt;b&gt;boot block, super block, FCB list와 data blocks&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-origin-width=&quot;1777&quot; data-origin-height=&quot;801&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buFVI9/btsG5EHRxfB/abiMfsKCMbogGDMwxbbRa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buFVI9/btsG5EHRxfB/abiMfsKCMbogGDMwxbbRa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buFVI9/btsG5EHRxfB/abiMfsKCMbogGDMwxbbRa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuFVI9%2FbtsG5EHRxfB%2FabiMfsKCMbogGDMwxbbRa1%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;758&quot; height=&quot;342&quot; data-origin-width=&quot;1777&quot; data-origin-height=&quot;801&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;unix와 window에서도 이러한 구조를 살펴볼 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;unix에서 inode list가 FCB list이고, window에서는 master file table이 FCB list이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 window에서 system files가 super block의 역할을 한다.&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-origin-width=&quot;1717&quot; data-origin-height=&quot;1198&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ACdI0/btsG6eIDIrO/ofa2RiLGzsMH6gtKDNIpS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ACdI0/btsG6eIDIrO/ofa2RiLGzsMH6gtKDNIpS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ACdI0/btsG6eIDIrO/ofa2RiLGzsMH6gtKDNIpS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FACdI0%2FbtsG6eIDIrO%2Fofa2RiLGzsMH6gtKDNIpS0%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;801&quot; height=&quot;559&quot; data-origin-width=&quot;1717&quot; data-origin-height=&quot;1198&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;boot block은 부팅이 되는 과정에 있어 사용된다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;초기에 boot block에서 boot code가 나오고, 여기 있는 코드가 실행되며 OS 단으로 이동한다. 여기 있는 코드가 OS 영역의 코드를 메모리 내로 적재하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;Partition Control Block (Super Block)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;앞서 File System에 대해서 알아보았다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 File System은 독립적으로 존재하는 것이 아니라 누군가에 관리된다. 이를 해주는 것이&amp;nbsp;&lt;b&gt;Partition Control Block&lt;/b&gt;이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Partition Control Block에는 다음과 같은 정보를 가진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;File System의 사이즈(Block 개수)&lt;/li&gt;
&lt;li&gt;File System의 빈 Data Block의 개수&lt;/li&gt;
&lt;li&gt;빈 Data Block의 List&lt;/li&gt;
&lt;li&gt;inode table안의 inode의 개수&lt;/li&gt;
&lt;li&gt;File System안의 빈 inode의 개수&lt;/li&gt;
&lt;li&gt;빈 inode의 List&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;File Control Blocks (inode List)&lt;/h2&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: #409d00;&quot;&gt;&lt;b&gt;파일 하나 당 FCB가 하나씩 할당되는데, FCB(inode)들이 연결된 것을 inode List라고 한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;288&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xhfbh/btsG33BOqcd/Yv9pg1bR2X5ieUbwdeyaSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xhfbh/btsG33BOqcd/Yv9pg1bR2X5ieUbwdeyaSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xhfbh/btsG33BOqcd/Yv9pg1bR2X5ieUbwdeyaSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fxhfbh%2FbtsG33BOqcd%2FYv9pg1bR2X5ieUbwdeyaSk%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;782&quot; height=&quot;170&quot; data-origin-width=&quot;1328&quot; data-origin-height=&quot;288&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 inode는 128바이트만큼 영역을 차지한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;또한 커널은 특정 inode를 구분하기 위해 배열에서 인덱스를 찾듯이 inode List에서도 인덱싱을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;inode 2가 root 노드이다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 관리자는 파일 시스템을 확인할 때 inode List의 사이즈를 가지고 있다.&lt;/p&gt;</description>
      <category>  Knowledge/운영체제(OS)</category>
      <author>TIlearn</author>
      <guid isPermaLink="true">https://devrepo.tistory.com/119</guid>
      <comments>https://devrepo.tistory.com/119#entry119comment</comments>
      <pubDate>Wed, 1 May 2024 10:20:14 +0900</pubDate>
    </item>
    <item>
      <title>[운영체제] 디렉토리를 알아보자.</title>
      <link>https://devrepo.tistory.com/118</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;File Directory&lt;/h2&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: #409d00;&quot;&gt;&lt;b&gt;디렉토리는 파일들에 대한 정보를 가지고 있다.&lt;/b&gt;&lt;/span&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;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;디렉터리는 각각의 파일 포인터인 FCB(File Control Block)를 지닌다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;디렉토리도 그 자체로 OS에 의해 소유되는 파일이다.&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;Hierarchical Directory&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;413&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAWnhS/btsG11JfMDi/0x6oC6bsojVGpdt08nNapK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAWnhS/btsG11JfMDi/0x6oC6bsojVGpdt08nNapK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAWnhS/btsG11JfMDi/0x6oC6bsojVGpdt08nNapK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAWnhS%2FbtsG11JfMDi%2F0x6oC6bsojVGpdt08nNapK%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;737&quot; height=&quot;335&quot; data-origin-width=&quot;908&quot; data-origin-height=&quot;413&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위 그림은 &lt;b&gt;계층형 디렉토리(Hierarchical Directory)의 구조&lt;/b&gt;를 나타낸 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 위에 있는 요소를 _root_ 혹은 _master_라고 한다.&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;특히 현재 디렉토리를 _working directory_라고 하는데, 이러한 개념이 없다면 특정 파일의 경로를 구할 때 매우 힘들 것이다. 이는 _root_로부터 매번 경로를 절대적으로 확인해야하기 때문이다.&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;리눅스에서의 FCB 구조를 통해 더 쉽게 이해해보자.&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-origin-width=&quot;868&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8UMDf/btsGZTSZvmN/cuquoZvePAzYkha1KsPQhK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8UMDf/btsGZTSZvmN/cuquoZvePAzYkha1KsPQhK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8UMDf/btsGZTSZvmN/cuquoZvePAzYkha1KsPQhK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8UMDf%2FbtsGZTSZvmN%2FcuquoZvePAzYkha1KsPQhK%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;726&quot; height=&quot;293&quot; data-origin-width=&quot;868&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;_byte offset_은 현재 파일로 부터 위치한 &lt;b&gt;상대적인 거리&lt;/b&gt;를 나타낸다. 그림과 같이 16바이트 단위로 파일들이 나열해있음을 확인해보면 된다.&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;_inode number_가 바로 &lt;b&gt;FCB의 식별자&lt;/b&gt;이다. 이 값을 보고 계층형 구조에서 파일을 찾는게 가능해진다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;unix 운영체제에서는 &lt;b&gt;_root_ 의 inode는 2번&lt;/b&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;그러면 _root_ 로부터 특정 파일을 찾아갈 때까지의 흐름을 그림으로 살펴보자.&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-origin-width=&quot;1137&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bntTlU/btsGZMzGzYK/fOLBOXUfZ1hEBxtO9KXkKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bntTlU/btsGZMzGzYK/fOLBOXUfZ1hEBxtO9KXkKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bntTlU/btsGZMzGzYK/fOLBOXUfZ1hEBxtO9KXkKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbntTlU%2FbtsGZMzGzYK%2FfOLBOXUfZ1hEBxtO9KXkKk%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;690&quot; height=&quot;239&quot; data-origin-width=&quot;1137&quot; data-origin-height=&quot;394&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;우선 _root_부터 시작해야 하므로, inode 2번에 저장된 주소 값을 읽어준다. 이 주소는 _root_ 디렉토리에 해당되는 주소이며 따라가면 _root_디렉토리의 data block이 나온다.&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;여기 data block에는 자기 자신, 부모 그리고 자신의 형제 노드에 대한 정보를 &lt;b&gt;inode의 참조값 형태&lt;/b&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;우리는 _/usr/member/list.txt_라는 파일을 탐색해보고자 한다. 즉, data block의 좌측에 적혀있는 번호(inode) 값을 통해 계속 찾아가야 한다.&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;_/user_ 디렉토리의 inode 값은 4이다. 이 inode의 값을 따라가 마찬가지로 data block을 찾아주자. 그러면 _/user_디렉토리에서도 자신의 자식 노드에 대한 정보를 찾을 수 있고, 여기서 _member_를 발견할 수 있다.&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;이러한 방식으로 파일에 대한 탐색을 진행한다면 결국 _list.txt_라는 파일에 도달할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;Acyclic-Graph Directories&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 어떤 동일한 파일을 찾기 위해서 두 가지 접근을 할 수 있다고 생각해보자. 예들들어 아래 그림과 같이 a라는 원본 자원과 직접 연결된 링크와 b라는 간접적으로 연결된 링크를 통해서 같은 자원에 도달할 수 있다. 이는 &quot;바로가기&quot;와 같은 기능을 떠올려보면 쉽게 구현 가능한 상황임을 짐작할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;519&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzjspg/btsGY9vpqub/qWiVaGM1Kp9ASuZCRdq1p0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzjspg/btsGY9vpqub/qWiVaGM1Kp9ASuZCRdq1p0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzjspg/btsGY9vpqub/qWiVaGM1Kp9ASuZCRdq1p0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzjspg%2FbtsGY9vpqub%2FqWiVaGM1Kp9ASuZCRdq1p0%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;612&quot; height=&quot;466&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;519&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 만약 a와 a밑에 연결된 파일의 자원을 지웠다고 해보자. 그러면 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;이미 자원은 없어진 상황인데, b는 a밑의 자원을 여전히 가리킨다. 이를 &quot;dangling pointer&quot;현상이라고 한다.&lt;/b&gt; &lt;/span&gt;우리가 c언어에서 배웠던 그 &quot;dangling pointer&quot;와 의미적으로 거의 유사해보인다.&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;dangling pointer를 해결할 수 있는 방법은 총 2가지다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;그냥 가만히 두기.&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;바로가기 링크가 살아있어도, 클릭하면 &quot;해당 파일이 없습니다&quot;라는 에러문구가 주는 형식이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Entry-count solution&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 자원을 가리키는 링크의 갯수를 FCB안에 저장해 놓는 방법이다.&lt;/li&gt;
&lt;li&gt;예를 들어, a와 b가 모두 같은 파일을 가리킨다면 이 파일의 count값은 2이다.&lt;/li&gt;
&lt;li&gt;이렇게 Entry-count값이 0이면 지워도 되지만, 0이 아니면 지우면 안된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;그외 쓰지는 않는 해결방법 2가지&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;1. 직접 파일 시스템을 뒤져가며 링크를 지운다.&lt;/b&gt;&lt;br /&gt;이는 시간이 너무 오래 걸리기 때문에 사용하지 않는다.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;2. BackPointers&lt;/b&gt;&lt;br /&gt;reference list라는 파일의 링크들을 모아놓은 리스트를 활용한다.&lt;br /&gt;하지만, 구현 방법이 너무 복잡하여 잘 사용하지 않는다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;File Sharing&lt;/h2&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;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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;기본적으로 동시 접근에 있어서는 다음과 같은 방안을 취한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;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;파일이 사용 중이라면 lock한다.&lt;/li&gt;
&lt;li&gt;파일의 일부인 record에 대해서만 lock한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 동시 접근을 제대로 보장하기 위해서는 Mutual Exclusion을 지켜주어야 하며 DeadLock이 발생하지 않도록 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size23&quot;&gt;Access Rights&lt;/h3&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;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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;여기에는 읽기(read), 쓰기(write), 실행(execute)의 3가지 모드가 존재한다.&lt;/b&gt;&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-origin-width=&quot;611&quot; data-origin-height=&quot;215&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qLQsi/btsG11P3AkG/TwlMBJ9pkadhPWCj3da2u1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qLQsi/btsG11P3AkG/TwlMBJ9pkadhPWCj3da2u1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qLQsi/btsG11P3AkG/TwlMBJ9pkadhPWCj3da2u1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqLQsi%2FbtsG11P3AkG%2FTwlMBJ9pkadhPWCj3da2u1%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;173&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;215&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 숫자 1은 가능하다는 것을 의미하고, 0은 가능하지 않음을 의미한다.&lt;/p&gt;</description>
      <category>  Knowledge/운영체제(OS)</category>
      <author>TIlearn</author>
      <guid isPermaLink="true">https://devrepo.tistory.com/118</guid>
      <comments>https://devrepo.tistory.com/118#entry118comment</comments>
      <pubDate>Sun, 28 Apr 2024 21:32:04 +0900</pubDate>
    </item>
    <item>
      <title>[데이터통신] Physical Layer 알아보기</title>
      <link>https://devrepo.tistory.com/117</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;아날로그 데이터 vs. 디지털 데이터&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;데이터는 아날로그 혹은 디지털의 형태일 수 있다. 아날로그 데이터는 &quot;연속적인 정보&quot;를 나타내는 데이터이고, 디지털 데이터는 &quot;이산적인 상태&quot;를 가지는 정보를 나타낸다. 예를 들어, 시곗바늘이 연속적으로 움직여 시/분/초의 정보를 알려주는 아날로그시계는 아날로그 데이터의 형태이고, 12:30분에서 12:31분으로 한 번에 시간이 변하는 디지털시계는 디지털 데이터의 형태이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;경우에 따라 이러한 디지털 형태의 데이터를 아날로그 형태로 변환하거나 아날로그 형태를 디지털 형태로 바꾸어야 하는 상황이 발생한다. 하지만, 데이터는 일관적이지 않을 수 있다. 아날로그에서 의도한 값이 디지털로 변환했을 때 그러한 값이 아닐 수도 있으며 그 반대의 경우도 마찬가지이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;위와 같은 상황은 주로 시간에 따라 반복되는 패턴이나 사이클이 나타나지 않는 비주기적 신호에서 나타난다. 반대로 주기적 신호는 측정 가능한 시간 프레임 내에서 패턴을 &lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;완료하고 이후 동일한 주기에 해당 패턴을 반복한다.&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size23&quot;&gt;Sine Wave&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사인파는 주기적인 아날로그 신호의 대표적인 형태이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;특히 사인파는 세 가지 요소에 의해서 구분되어 질 수 있는데, 하나는 Amplitude, 다른 하나는 Frequency, 마지막은 Phase이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Amplitude가 다른 경우는 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1583&quot; data-origin-height=&quot;996&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBFy1y/btsF2u1e6wN/1ybGeImuFqzavnFhk6Qmk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBFy1y/btsF2u1e6wN/1ybGeImuFqzavnFhk6Qmk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBFy1y/btsF2u1e6wN/1ybGeImuFqzavnFhk6Qmk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBFy1y%2FbtsF2u1e6wN%2F1ybGeImuFqzavnFhk6Qmk1%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;717&quot; height=&quot;451&quot; data-origin-width=&quot;1583&quot; data-origin-height=&quot;996&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Frequency가 다른 경우는 아래와 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1681&quot; data-origin-height=&quot;913&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bn1pNM/btsF4WvB7Mk/Tvq0Ij8aljvSq1X2PbyazK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bn1pNM/btsF4WvB7Mk/Tvq0Ij8aljvSq1X2PbyazK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bn1pNM/btsF4WvB7Mk/Tvq0Ij8aljvSq1X2PbyazK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbn1pNM%2FbtsF4WvB7Mk%2FTvq0Ij8aljvSq1X2PbyazK%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;786&quot; height=&quot;427&quot; data-origin-width=&quot;1681&quot; data-origin-height=&quot;913&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 알 수 있는 것은 Hz가 크면 더 많은 패턴을 반복하고, 작으면 더 작은 패턴을 반복한다. 즉, Frequency는 시간에 따른 변화율이다. 따라서 Frequency가 크다는 것은 짧은 시간 동안 변화함을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 Frequency가 0이라면 신호가 전혀 바뀌지 않는 것이고, 무한대라면 신호가 순간적으로 변하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Phase는 다음과 같다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;1031&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/UBdjz/btsF1ta1Aw5/WvSwHog61pfaRyDpakg6j1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/UBdjz/btsF1ta1Aw5/WvSwHog61pfaRyDpakg6j1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/UBdjz/btsF1ta1Aw5/WvSwHog61pfaRyDpakg6j1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FUBdjz%2FbtsF1ta1Aw5%2FWvSwHog61pfaRyDpakg6j1%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;776&quot; height=&quot;565&quot; data-origin-width=&quot;1416&quot; data-origin-height=&quot;1031&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Phase(위상)은 시간 0에 따른 파형의 위치를 의미한다. 이는 첫 번째 주기의 상태를 말하기도 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size23&quot;&gt;Composite Signal&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 간단한 Sine Line가지고는 간단한 일밖에 하지 못한다. 전기 에너지 운반 혹은 간단한 부저음이 그러한 예시가 된다. 그렇기 때문에 복잡한 데이터 통신에서는 _Composite Signal_을 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;복합 신호(Composite Signal)는 다른 진폭, 주파수 및 위상을 갖는 간단한 사인파의 조합이다. 이러한 복합 신호는 주기적일 수도 있고, 비주기적일 수도 있다.&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1279&quot; data-origin-height=&quot;638&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kAyyE/btsF5rCg1h3/8Rf3aKsyczcdTKM6Zgql30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kAyyE/btsF5rCg1h3/8Rf3aKsyczcdTKM6Zgql30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kAyyE/btsF5rCg1h3/8Rf3aKsyczcdTKM6Zgql30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkAyyE%2FbtsF5rCg1h3%2F8Rf3aKsyczcdTKM6Zgql30%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;774&quot; height=&quot;386&quot; data-origin-width=&quot;1279&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size23&quot;&gt;Bandwith(대역폭)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;_Bandwith_란 복합 신호에 포함된 주파수의 범위이다. 이는 일반적으로 두 숫자의 차이로 구할 수 있다. 예를 들어, 복합 신호의 주파수가 1000과 5000 사이라면 _Bandwith_는 4000이다.&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-origin-width=&quot;1424&quot; data-origin-height=&quot;963&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Bawbx/btsF5IcIJLx/aUKEkAOMHc5NeJ6hZCU4J1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Bawbx/btsF5IcIJLx/aUKEkAOMHc5NeJ6hZCU4J1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Bawbx/btsF5IcIJLx/aUKEkAOMHc5NeJ6hZCU4J1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBawbx%2FbtsF5IcIJLx%2FaUKEkAOMHc5NeJ6hZCU4J1%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;733&quot; height=&quot;496&quot; data-origin-width=&quot;1424&quot; data-origin-height=&quot;963&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;5 GHz는 대역폭도 넓기 때문에 좋긴 하나, 주파수가 크다는 것은 회절성이 안 좋다. 따라서 주변에 장애물이 있다면 별로 안 좋다. 반대로 2.4 GHZ는 주파수는 작지만, 회절성이 좋기 때문에 장애물이 있어도 멀리 뻗어나갈 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size23&quot;&gt;Digital Signals&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디지털 신호는 2개 이상의 신호를 가질 수 있다. 디지털 신호는 아날로그 신호와 달리 구별할 수 있는 단위가 &lt;b&gt;amplitude&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1717&quot; data-origin-height=&quot;649&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PwKad/btsF14VZZ23/UX3ZbhRpj1VrnNAPnGG6o1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PwKad/btsF14VZZ23/UX3ZbhRpj1VrnNAPnGG6o1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PwKad/btsF14VZZ23/UX3ZbhRpj1VrnNAPnGG6o1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPwKad%2FbtsF14VZZ23%2FUX3ZbhRpj1VrnNAPnGG6o1%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;799&quot; height=&quot;302&quot; data-origin-width=&quot;1717&quot; data-origin-height=&quot;649&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비주기적인 데이터 신호를 구분할 수 있는 단위가 주기와 주파수로 표현하기에는 무리가 있다. 따라서 &quot;비트 속도(Bits Rate)&quot;라는 단위를 통해 디지털 신호를 구분한다. 이는 1초 동안 전송된 비트의 수, 즉 초당 비트 수(bps)로 표현한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size23&quot;&gt;Digital as Composite Analog&lt;/h3&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;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;Fourier 분석에 따르면, 디지털 신호는 복합 아날로그 신호이다. 이때, 대역폭은 무한하다.(신호가 즉시 변경되면 그 주파수는 무한하다.).&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-origin-width=&quot;1490&quot; data-origin-height=&quot;656&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv7guL/btsF1Jx0cVS/b0iW6S1ZUex0k1hrNKS1g0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv7guL/btsF1Jx0cVS/b0iW6S1ZUex0k1hrNKS1g0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv7guL/btsF1Jx0cVS/b0iW6S1ZUex0k1hrNKS1g0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv7guL%2FbtsF1Jx0cVS%2Fb0iW6S1ZUex0k1hrNKS1g0%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;708&quot; height=&quot;312&quot; data-origin-width=&quot;1490&quot; data-origin-height=&quot;656&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size23&quot;&gt;디지털 신호의 전송&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다음 두 가지 방법을 사용하여 디지털 신호를 전송할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;베이스밴드 전송&lt;/b&gt;: 디지털 신호를 아날로그 신호로 변환하지 않고 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;채널을 통해 디지털 신호를 전송하는 것이다&lt;/b&gt;&lt;/span&gt;. (대역폭이 &lt;b&gt;제로에서 시작하는 채널&lt;/b&gt;. 이는 대역폭이 하나의 채널로만 구성된 전용 매체인 경우의 경우이다.)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;브로드밴드 전송 (변조)&lt;/b&gt;: 전송을 위해 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;디지털 신호를 아날로그 신호&lt;/b&gt;&lt;/span&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;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;&lt;b&gt; 변조는 대역폭이 제로에서 시작하지 않는 밴드패스 채널&lt;/b&gt;을 사용할 수 있도록 해준다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p 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-origin-width=&quot;1515&quot; data-origin-height=&quot;663&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLTo99/btsF3mV263H/d9kR4mhsKpIYznKFjf99v0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLTo99/btsF3mV263H/d9kR4mhsKpIYznKFjf99v0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLTo99/btsF3mV263H/d9kR4mhsKpIYznKFjf99v0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLTo99%2FbtsF3mV263H%2Fd9kR4mhsKpIYznKFjf99v0%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;757&quot; height=&quot;331&quot; data-origin-width=&quot;1515&quot; data-origin-height=&quot;663&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;신호 손상&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 신호가 손상되는 원인은 다음 세 가지로 구분될 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;감쇠(Attenuatoin)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;감쇠는 에너지의 손실을 의미한다.&lt;/li&gt;
&lt;li&gt;신호에 있는 일부의 전기 에너지가 열 에너지로 전환된다.&lt;/li&gt;
&lt;li&gt;손상을 보충하기 위해 증폭기가 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cXR6cU/btsF5EaA8Pu/meTKQBcymURtCudQK7FS4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cXR6cU/btsF5EaA8Pu/meTKQBcymURtCudQK7FS4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cXR6cU/btsF5EaA8Pu/meTKQBcymURtCudQK7FS4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcXR6cU%2FbtsF5EaA8Pu%2FmeTKQBcymURtCudQK7FS4K%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;528&quot; height=&quot;536&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;왜곡(Distortion)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;신호의 형태나 모양을 바꾸는 것을 의미한다.&lt;/li&gt;
&lt;li&gt;서로 다른 주파수를 가진 복합 신호에서 나타난다.&lt;/li&gt;
&lt;li&gt;각 신호는 고유의 전파속도를 가지기 때문에 신호가 도착해도 고유의 지연이 발생한다.&lt;/li&gt;
&lt;li&gt;이러한 지연의 차이가 주기 기간과 일치하지 않는다면 위상의 차이가 발생한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;616&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LyK8t/btsF1U7gDJV/vjxTTLqGY226kVt459SfV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LyK8t/btsF1U7gDJV/vjxTTLqGY226kVt459SfV0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LyK8t/btsF1U7gDJV/vjxTTLqGY226kVt459SfV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLyK8t%2FbtsF1U7gDJV%2FvjxTTLqGY226kVt459SfV0%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;661&quot; height=&quot;616&quot; data-origin-width=&quot;1216&quot; data-origin-height=&quot;616&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;잡음(Noise)&lt;/b&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;background-color: #ffffff; color: #0d0d0d; text-align: left;&quot;&gt;thermal noise, induced noise, crosstalk, impulse noise과 같은 여러 종류의 잡음이 신호를 손상시킨다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: left;&quot;&gt;thermal noise는 전자의 무작위 운동으로 발생하는 추가 신호이다. 이는 전송 측에서는 없는 신호다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: left;&quot;&gt; &lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: left;&quot;&gt;induced noise는 모터와 같은 원본에서 발생한다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: left;&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: left;&quot;&gt;crosstalk는 한 전선이 다른 전선에 미치는 영향이다.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1235&quot; data-origin-height=&quot;518&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/coV5TZ/btsF4X9kyxl/ZuAc6obXQrwSfiZgjybQXk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/coV5TZ/btsF4X9kyxl/ZuAc6obXQrwSfiZgjybQXk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/coV5TZ/btsF4X9kyxl/ZuAc6obXQrwSfiZgjybQXk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcoV5TZ%2FbtsF4X9kyxl%2FZuAc6obXQrwSfiZgjybQXk%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;658&quot; height=&quot;518&quot; data-origin-width=&quot;1235&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size23&quot;&gt;SNR(Signal-to-Noise Ratio)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SNR은 Noise당 Signal을 의미하는데, 그래서 SNR이 크면 상대적으로 Noise가 적고, SNR이 작으면 상대적으로 Noise가 크다.&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-origin-width=&quot;1126&quot; data-origin-height=&quot;709&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wrp6O/btsF4ztYfNY/GwKcQatsoHKvUuk74Spym0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wrp6O/btsF4ztYfNY/GwKcQatsoHKvUuk74Spym0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wrp6O/btsF4ztYfNY/GwKcQatsoHKvUuk74Spym0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwrp6O%2FbtsF4ztYfNY%2FGwKcQatsoHKvUuk74Spym0%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;711&quot; height=&quot;448&quot; data-origin-width=&quot;1126&quot; data-origin-height=&quot;709&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;Data Rate Limit&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;채널을 통해 데이터를 얼마나 빠른 속도로 보내는 가를 계산하는 방법에는 두 가지가 있다. 하나는 노이즈가 없는 채널에 대한 니클리스트 공식이고, 다른 하나는 노이스가 있는 채널에 대한 샤넌의 공식이다.&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;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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;BitRate = 2 * bandwith * log2 L&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;샤넌 공식&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제로는 채널은 항상 소음이 있다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;Capacity = bandwith * log2(1+SNR)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;L은 신호레벨&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;네트워크 성능 평가&lt;/h2&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 style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;네트워크 성능을 측정하는 한 가지 특성은 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;대역폭(Bandwith)&lt;/b&gt;&lt;/span&gt;이다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 가지 다른 맥락에서 사용되며 두 가지 다른 측정값을 갖는다
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이는 &lt;b&gt;헤르츠 단위의 대역폭&lt;/b&gt;과 &lt;b&gt;초당 비트 단위의 대역폭&lt;/b&gt;이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;헤르츠 단위의 대역폭&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;복합 신호에 포함된 주파수 범위 또는 채널이 전달할 수 있는 주파수 범위&lt;/b&gt;&lt;/span&gt;이다.&lt;/li&gt;
&lt;li&gt;예를 들어, 가입자 전화 회선의 대역폭은 4 kHz라고 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;초당 비트 단위의 대역폭&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;채널, 링크 또는 심지어 네트워크가 전송할 수 있는 초당 비트 수&lt;/b&gt;&lt;/span&gt;이다.&lt;/li&gt;
&lt;li&gt;예를 들어, 패스트 이더넷 네트워크 (또는 이 네트워크의 링크)의 대역폭이 최대 100 Mbps라고 할 수 있다.&lt;/li&gt;
&lt;li&gt;이것은 이 네트워크가 100 Mbps를 보낼 수 있다는 것을 의미합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;기본적으로, &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;헤르츠 단위의 대역폭이 증가하면 초당 비트 단위의 대역폭&lt;/b&gt;&lt;/span&gt;도 증가한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;성능을 평가하는 지표 중 다른 하나인 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;처리량(&lt;/b&gt;&lt;b&gt;Throuput)은 네트워크를 통해 실제로 데이터를 전송할 수 있는 속도의 측정값이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #0d0d0d; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;초당 비트 단위의 대역폭과 처리량은 처음에는 같아 보이지만 실제로는 다르다.&lt;/li&gt;
&lt;li&gt;한 링크의 대역폭이 B bps일 수 있지만, 실제로는 이 링크를 통해 항상 B보다 작은 T bps만 전송할 수 있다.&lt;/li&gt;
&lt;li&gt;대역폭은 링크의 잠재적인 측정값이며, &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;처리량(Throuput)은 실제로 데이터를 얼마나 빠르게 전송할 수 있는지의 실제 측정값이다.&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;예를 들어, 대역폭이 1 Mbps인 링크가 있을 수 있지만, 링크 끝에 연결된 장치는 200 kbps만 처리할 수 있을 수 있다. 이는 이 링크를 통해 200 kbps보다 많은 데이터를 전송할 수 없다는 것을 의미한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;Latency(지연)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: start;&quot;&gt;지연 또는 지연 시간은 첫 번째 비트가 출발지에서 전송된 시점부터 전체 메시지가 목적지에 완전히 도착하는 데 걸리는 시간을 정의한다.&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #0d0d0d; text-align: left;&quot;&gt;지연은 &lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;전파 시간(propagation time), 전송 시간(transmission time), 대기 시간(queuing time) 및 처리 지연(processing delay)&lt;/b&gt;&lt;/span&gt;의 네 가지 구성 요소로 이루어져 있다. 꽤 중요하므로 공식까지 제대로 알아야 한다.&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;전파 시간(Propagation time)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터가 출발지에서 목적지까지 도달하는데 걸리는 시간&lt;/li&gt;
&lt;li&gt;계산 방법은 거리 / 전파속도&amp;nbsp;&lt;/li&gt;
&lt;li&gt;$d$: 물리적 링크의 길이&lt;/li&gt;
&lt;li&gt;$s$: 매체 내 전파 속도 (약 2x10^8 m/sec)&lt;/li&gt;
&lt;li&gt;$d_{\text {prop}} = \frac {d}{s}$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 두 지점 사이의 거리가 12,000km이고, 케이블 내에서의 전파 속도가 초당 2.4 &amp;times; 10^8미터라면, 전파 시간은 50ms(밀리초)가 된다. 이는 대서양을 건너는 데이터가 50ms만에 전달될 수 있음을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;(12000 * 1000) / (2.4 * 10^8) = 50ms&lt;/blockquote&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;전송 시간(Transmission Time)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제로 데이터를 전송할 때는, 단 하나의 비트만 보내는 것이 아니라, 여러 비트로 이루어진 메시지를 보낸다. 첫 번째 비트는 전파 시간만큼의 시간이 걸려 도착하지만, &lt;b&gt;메시지의 크기와 채널의 대역폭에 따라 마지막 비트가 도착하는 데까지 걸리는 시간이 달라지기 때문이다.&amp;nbsp;&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;계산 방법은 메세지 크기 / 대역폭이다.&lt;/li&gt;
&lt;li&gt;$L$: 패킷 길이 (비트)&lt;/li&gt;
&lt;li&gt;$R$: 링크 대역폭 (bps)&lt;/li&gt;
&lt;li&gt;$d_{\text {trans}} = \frac {L}{R}$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;※ 전파 시간 vs. 전송 시간&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;어느 것이 더 중요한가는 상황에 따라 다르다.&lt;br /&gt;&lt;br /&gt;2.5KB 메시지의 경우, 대역폭이 1Gbps이고 거리가 12,000km일 때, &lt;b&gt;전파 시간&lt;/b&gt;이 전송 시간보다 주요한 요소가 된다. 즉, &lt;b&gt;메시지가 짧고 대역폭이 높아서&lt;/b&gt; 전송 시간보다는 &lt;b&gt;데이터가 목적지까지 도달하는 데 걸리는 시간&lt;/b&gt;이 더 중요하다.&lt;br /&gt;&lt;br /&gt;반대로 5MB 메시지의 경우, 대역폭이 1Mbps일 때는 &lt;b&gt;메시지 길이가 길고 대역폭이 낮으므로&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;처리 지연(Processing Delay)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오류 비트 확인&lt;/li&gt;
&lt;li&gt;출력 링크 결정&lt;/li&gt;
&lt;li&gt;일반적으로 밀리 초 단위로 수행된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;대기 시간(Queuing Time)&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메시지가 &lt;b&gt;중간 장치나 최종 장치에서 처리될 때까지 기다려야 하는 시간&lt;/b&gt;을 말한다. 이 시간은 네트워크의 부하에 따라 달라질 수 있다.&lt;/li&gt;
&lt;li&gt;네트워크에 트래픽이 많을 때, 대기 시간은 증가한다. 라우터 같은 중간 장치는 도착한 메시지를 순차적으로 처리하기 때문에, 메시지가 많으면 각 메시지는 기다려야 한다.&lt;/li&gt;
&lt;li&gt;라우터의 혼잡 수준에 따라 다르다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;553&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GkmSV/btsF1LW1AwR/OQUKELLTKDf7fdn6jp2J8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GkmSV/btsF1LW1AwR/OQUKELLTKDf7fdn6jp2J8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GkmSV/btsF1LW1AwR/OQUKELLTKDf7fdn6jp2J8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGkmSV%2FbtsF1LW1AwR%2FOQUKELLTKDf7fdn6jp2J8k%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;603&quot; height=&quot;286&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;553&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Knowledge/데이터통신</category>
      <author>TIlearn</author>
      <guid isPermaLink="true">https://devrepo.tistory.com/117</guid>
      <comments>https://devrepo.tistory.com/117#entry117comment</comments>
      <pubDate>Sun, 21 Apr 2024 14:05:25 +0900</pubDate>
    </item>
    <item>
      <title>[데이터통신] 데이터 통신에서 에러 감지하기</title>
      <link>https://devrepo.tistory.com/116</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;데이터 통신에서의 오류&lt;/h2&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;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: #409d00;&quot;&gt;&lt;b&gt;Single Bit Error는 데이터 중 하나의 비트만이 변경된 것을 말한다.&lt;/b&gt;&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-origin-width=&quot;1372&quot; data-origin-height=&quot;670&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Szxq3/btsGN0ElsUV/EkKaM8iKiDPOIbZG8Z7nLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Szxq3/btsGN0ElsUV/EkKaM8iKiDPOIbZG8Z7nLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Szxq3/btsGN0ElsUV/EkKaM8iKiDPOIbZG8Z7nLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSzxq3%2FbtsGN0ElsUV%2FEkKaM8iKiDPOIbZG8Z7nLK%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;541&quot; height=&quot;264&quot; data-origin-width=&quot;1372&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;그리고 여기서 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;변조된 비트를 Corrupted Bit라고 부른다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두 번째로 &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;Burst Error는 이러한 Corrupted Bit가 두 개이상인 에러를 의미한다.&lt;/b&gt;&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-origin-width=&quot;1490&quot; data-origin-height=&quot;593&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kL333/btsGMf37sK5/Mj3mZrvAOkE9Vaj873E4M0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kL333/btsGMf37sK5/Mj3mZrvAOkE9Vaj873E4M0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kL333/btsGMf37sK5/Mj3mZrvAOkE9Vaj873E4M0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkL333%2FbtsGMf37sK5%2FMj3mZrvAOkE9Vaj873E4M0%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;227&quot; data-origin-width=&quot;1490&quot; data-origin-height=&quot;593&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여기서 처음 변조가 일어난 Corrupted Bit와 마지막 Corrupted Bit까지 &lt;b&gt;총 8비트를 에러가 난 부분이라고 판단한다.&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;Error Detection&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이전에 Block Coding은 추가적인 Redundancy(여분의)를 통해 오류를 탐지하는데 도움을 준다고 했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 이 여분의 정보를 통해 어떻게 에러 감지가 가능한 지 알아볼 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;오류를 감지하거나 수정하는 핵심 개념은 중복성이다.&lt;/b&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1780&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/706la/btsGNy2yqYo/pWzNVQjVTcwSQzscrfWus1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/706la/btsGNy2yqYo/pWzNVQjVTcwSQzscrfWus1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/706la/btsGNy2yqYo/pWzNVQjVTcwSQzscrfWus1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F706la%2FbtsGNy2yqYo%2FpWzNVQjVTcwSQzscrfWus1%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;637&quot; height=&quot;212&quot; data-origin-width=&quot;1780&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블록 코딩에서는 메시지를 k비트짜리 블록으로 나누고, 이를 Dataword라고 부른다. 이때, 각 블록에 r개의 중복 비트를 추가하여 &lt;b&gt;전체 길이가 n = k + r이 되게 한다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이렇게 생성된 n비트 블록을 Codeword라고 한다.&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-origin-width=&quot;1859&quot; data-origin-height=&quot;309&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfgeFC/btsGNL8qxyI/04e1kxODveGISrXR1KIZg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfgeFC/btsGNL8qxyI/04e1kxODveGISrXR1KIZg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfgeFC/btsGNL8qxyI/04e1kxODveGISrXR1KIZg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfgeFC%2FbtsGNL8qxyI%2F04e1kxODveGISrXR1KIZg0%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;782&quot; height=&quot;130&quot; data-origin-width=&quot;1859&quot; data-origin-height=&quot;309&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 위와 같은 표로 Dataword에 대한 Codewords를 정해놓았다고 하자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그러면, 송신자 측에서는 보내는 비트들에 대해 해당 표를 보고 여분의 비트를 추가할 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수신자 측에서는 이제 Codewords 비트들을 받게 될 것인데, 마찬가지로 위 표를 보고 해석하여 Datawords를 추출한다. 만약, 들어오는 Codewords가 표에서 존재하지 않는다면, 정보가 변조되었다는 뜻이므로 에러를 감지할 수 있다.&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;p data-ke-size=&quot;size16&quot;&gt;하지만, 만약 하나의 비트가 아니라 두 개 이상의 비트가 변조된다면 어떨까? 예를 들어, 000이 전달되는 와중에 변조가 되어 011이 되었다고 하자. 그래도 수신자 측에서 해당 Codewords는 표에 존재하는 비트이므로 에러로 판단하지 않을 것이다. 즉, 에러가 감지되어야 할 상황에 정상적인 비트라고 &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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;Simple Parity Bit&lt;/h2&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-origin-width=&quot;1828&quot; data-origin-height=&quot;761&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qzhPt/btsGNhfFBtP/D7UfLK1k69opgKOCbF9MU1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qzhPt/btsGNhfFBtP/D7UfLK1k69opgKOCbF9MU1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qzhPt/btsGNhfFBtP/D7UfLK1k69opgKOCbF9MU1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqzhPt%2FbtsGNhfFBtP%2FD7UfLK1k69opgKOCbF9MU1%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;622&quot; height=&quot;259&quot; data-origin-width=&quot;1828&quot; data-origin-height=&quot;761&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문제가 발생한다는 사실은 알고 있지만, 어떤 방식으로 Codewords가 만들어지고 검사 되는지 &lt;b&gt;Simple Parity Bit&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;사실 만드는 방법은 매우 간단하다. 방법도 두 가지로 나뉘는데, Datawords를 모두 더했을 때 짝수가 나오도록 Codewords를 작성한다면, 짝수 패리티 비트이고, 홀수가 나오도록 한다면 홀수 패리티비트이다.&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;실제로는 2와 모듈 연산을 통해 비트를 추가하도록 하는데, 의미적으로 본다면 그냥 &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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1935&quot; data-origin-height=&quot;818&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dc31Go/btsGMz9hAcm/EdqqezP5XhCwn5Ark7TbA0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dc31Go/btsGMz9hAcm/EdqqezP5XhCwn5Ark7TbA0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dc31Go/btsGMz9hAcm/EdqqezP5XhCwn5Ark7TbA0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdc31Go%2FbtsGMz9hAcm%2FEdqqezP5XhCwn5Ark7TbA0%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;697&quot; height=&quot;295&quot; data-origin-width=&quot;1935&quot; data-origin-height=&quot;818&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;_Generator_는 앞서 말한 짝/홀수 패리티 비트를 만드는 도구이다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그리고 수신자 측에서 받은 Codeword를 _Checker_가 Syndrome으로 만드는데, &lt;b&gt;이 Syndrome은 Codeword의 값을 2와 모듈 연산한 것이다.&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;즉, 홀수 패리티 비트를 만들었다면 1이라는 값이 Syndrome이 되고, 짝수 패리티 비트를 만들었다면 0이라는 값이 Syndrome이 될 것이다. &lt;span style=&quot;color: #409d00;&quot;&gt;&lt;b&gt;Decision Logic은 해당 Syndrome에 저장된 값을 보고 에러가 났는지 나지 않았는지 감지한다.&amp;nbsp;&lt;/b&gt;&lt;/span&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;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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;_1011_이라는 Dataword를 Codeword로 나타내기 위해 _10111_으로 바꾸어주었다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 오류가 없는 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;_10111_이 아무런 변조 없이 그대로 수신자에게 도착했다면 문제가 없을 것이다.&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. Dataword의 비트 중 하나가 corrupted bit가 된 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 경우는 Dataword 비트 중 하나가 변조가 일어난 경우이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;_10111_에서 _10011_과 같이 변했다고 하면, Syndrome은 1이 되므로 &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;b&gt;3. Parity 비트가 corrupted bit가 된 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Dataword는 정상적이지만, Parity 비트가 비정상적으로 도착했다. 송신자가 보내는 데이터 자체는 정상적인데, 추가적으로 붙은 Parity 비트 때문에 수신자 측에서는 &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;예를 들어, _10110_으로 잘못 도착했지만, Dataword는 정상이다. 하지만, Parity 비트로 인해 해당 신호를 에러가 난 것으로 판단한다.&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;4. Parity 비트와 Dataword 중 하나의 비트가 corrupted bit가 된 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;_00110_이 그와 같은 상황이 될 수 있는데, Dataword는 잘못된 값이 도착했으나, Syndrome은 0으로 나와 에러를 감지하지 못한다.&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;5. Dataword의 비트 중 3개가 corrupted bit인 경우&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;_01011_과 같은 상황으로 제대로 에러를 감지한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;&lt;b&gt;이를 통해 이 Parity Check 코드는 홀수 개의 오류만 감지 가능하다는 것을 알 수 있다.&lt;/b&gt;&lt;/span&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;padding: 0.3em 0.5em 0.3em 0.5em; margin: 0.5em 0em; color: #000000; border-left: 10px solid #333333; font-weight: bold;&quot; data-ke-size=&quot;size26&quot;&gt;Two-dimensional Parity-check Code&lt;/h2&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: #409d00;&quot;&gt;&lt;b&gt;Two-dimensional Parity-check Code는 Single Parity Check Code에서 홀수 개의 오류만을 감지한다는 한계점을 개선한 오류 검출 방식이다.&lt;/b&gt;&lt;/span&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;짝수 개의 오류를 감지하기 위해 2차원 배열을 사용하고, 각각 패리티 비트를 추가한다.&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-origin-width=&quot;864&quot; data-origin-height=&quot;652&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Zdx54/btsGPPB9M1Z/0M3ojzIRo0xbJEV36OID0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Zdx54/btsGPPB9M1Z/0M3ojzIRo0xbJEV36OID0k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Zdx54/btsGPPB9M1Z/0M3ojzIRo0xbJEV36OID0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZdx54%2FbtsGPPB9M1Z%2F0M3ojzIRo0xbJEV36OID0k%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;443&quot; height=&quot;334&quot; data-origin-width=&quot;864&quot; data-origin-height=&quot;652&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;593&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7YnYP/btsGNBZg9NR/wtLuD5ivhBHVVQ3Yytk1d1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7YnYP/btsGNBZg9NR/wtLuD5ivhBHVVQ3Yytk1d1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7YnYP/btsGNBZg9NR/wtLuD5ivhBHVVQ3Yytk1d1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7YnYP%2FbtsGNBZg9NR%2FwtLuD5ivhBHVVQ3Yytk1d1%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;466&quot; height=&quot;356&quot; data-origin-width=&quot;777&quot; data-origin-height=&quot;593&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;556&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KCzzo/btsGM9oxSsq/xjSfL37EuxJU3JoS4ckI30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KCzzo/btsGM9oxSsq/xjSfL37EuxJU3JoS4ckI30/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KCzzo/btsGM9oxSsq/xjSfL37EuxJU3JoS4ckI30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKCzzo%2FbtsGM9oxSsq%2FxjSfL37EuxJU3JoS4ckI30%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;430&quot; height=&quot;320&quot; data-origin-width=&quot;746&quot; data-origin-height=&quot;556&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아래와 같이 구성된 경우 3가지 에러가 난다면, 4개의 패리티 비트에서 검출 가능하다.&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-origin-width=&quot;764&quot; data-origin-height=&quot;564&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dT6uOz/btsGMEJn8vi/J4IRqqXyxKfvEejv4iqFv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dT6uOz/btsGMEJn8vi/J4IRqqXyxKfvEejv4iqFv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dT6uOz/btsGMEJn8vi/J4IRqqXyxKfvEejv4iqFv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdT6uOz%2FbtsGMEJn8vi%2FJ4IRqqXyxKfvEejv4iqFv1%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;400&quot; height=&quot;295&quot; data-origin-width=&quot;764&quot; data-origin-height=&quot;564&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;단, 아래와 같이 &lt;b&gt;같은 행과 같은 열에 2개씩 오류가 난다면, 에러를 감지할 수 없다. 따라서 이 Two-dimensional Parity Check도 완전하다고는 할 수 없다.&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-origin-width=&quot;743&quot; data-origin-height=&quot;541&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Sdov4/btsGOf9hWIN/WBZccyBKwcONq5GzyQf8gK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Sdov4/btsGOf9hWIN/WBZccyBKwcONq5GzyQf8gK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Sdov4/btsGOf9hWIN/WBZccyBKwcONq5GzyQf8gK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSdov4%2FbtsGOf9hWIN%2FWBZccyBKwcONq5GzyQf8gK%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;438&quot; height=&quot;319&quot; data-origin-width=&quot;743&quot; data-origin-height=&quot;541&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  Knowledge/데이터통신</category>
      <category>Error Detection</category>
      <author>TIlearn</author>
      <guid isPermaLink="true">https://devrepo.tistory.com/116</guid>
      <comments>https://devrepo.tistory.com/116#entry116comment</comments>
      <pubDate>Sun, 21 Apr 2024 13:42:28 +0900</pubDate>
    </item>
  </channel>
</rss>