<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>고밍고밍의 연습장</title>
    <link>https://goming0925.tistory.com/</link>
    <description>IT/개발</description>
    <language>ko</language>
    <pubDate>Sat, 18 Apr 2026 19:17:54 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>고밍고밍</managingEditor>
    <item>
      <title>혼자 공부하는 SQL 6주차</title>
      <link>https://goming0925.tistory.com/26</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;725&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/baIotE/btsrBNt54zF/oYPAY8uU4xkcrE7vOvfsNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/baIotE/btsrBNt54zF/oYPAY8uU4xkcrE7vOvfsNK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/baIotE/btsrBNt54zF/oYPAY8uU4xkcrE7vOvfsNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbaIotE%2FbtsrBNt54zF%2FoYPAY8uU4xkcrE7vOvfsNK%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;1280&quot; height=&quot;725&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;725&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;  기본 미션&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;p. 363 market_db의 고객 테이블(member)에 입력된 회원의 정보가 변경될 때 변경한 사용자, 시간, 변경 전의 데이터 등을 기록하는 트리거 작성하고 인증하기&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-20 오후 11.58.37.png&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;791&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tkB2g/btsrBqezO04/mCa5pGkyyAeLDaKBFhIHkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tkB2g/btsrBqezO04/mCa5pGkyyAeLDaKBFhIHkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tkB2g/btsrBqezO04/mCa5pGkyyAeLDaKBFhIHkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtkB2g%2FbtsrBqezO04%2FmCa5pGkyyAeLDaKBFhIHkK%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;742&quot; height=&quot;791&quot; data-filename=&quot;스크린샷 2023-08-20 오후 11.58.37.png&quot; data-origin-width=&quot;742&quot; data-origin-height=&quot;791&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;수정, 삭제시 작동하는 트리거를 생성하여 수정 및 삭제 명령어를 수행하여보면 backup_singer 테이블에 백업 데이터가 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-21 오전 12.04.16.png&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;179&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GznUR/btsrBOzNs7o/EWyLkwIir314lmkSv4BAu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GznUR/btsrBOzNs7o/EWyLkwIir314lmkSv4BAu1/img.png&quot; data-alt=&quot;update 수행으로 생성된 백업 데이터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GznUR/btsrBOzNs7o/EWyLkwIir314lmkSv4BAu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGznUR%2FbtsrBOzNs7o%2FEWyLkwIir314lmkSv4BAu1%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;498&quot; height=&quot;179&quot; data-filename=&quot;스크린샷 2023-08-21 오전 12.04.16.png&quot; data-origin-width=&quot;498&quot; data-origin-height=&quot;179&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;update 수행으로 생성된 백업 데이터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-21 오전 12.10.42.png&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;307&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUpv66/btsrDCd27X8/Mpuy391l8Tkx2d0DHwL8A0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUpv66/btsrDCd27X8/Mpuy391l8Tkx2d0DHwL8A0/img.png&quot; data-alt=&quot;delete 수행으로 생성된 백업 데이터&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUpv66/btsrDCd27X8/Mpuy391l8Tkx2d0DHwL8A0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUpv66%2FbtsrDCd27X8%2FMpuy391l8Tkx2d0DHwL8A0%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;633&quot; height=&quot;307&quot; data-filename=&quot;스크린샷 2023-08-21 오전 12.10.42.png&quot; data-origin-width=&quot;633&quot; data-origin-height=&quot;307&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;delete 수행으로 생성된 백업 데이터&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>혼공SQL</category>
      <category>혼공</category>
      <category>혼공SQL</category>
      <category>혼공학습단</category>
      <author>고밍고밍</author>
      <guid isPermaLink="true">https://goming0925.tistory.com/26</guid>
      <comments>https://goming0925.tistory.com/26#entry26comment</comments>
      <pubDate>Sun, 20 Aug 2023 23:55:16 +0900</pubDate>
    </item>
    <item>
      <title>혼자 공부하는 SQL 5주차</title>
      <link>https://goming0925.tistory.com/25</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;725&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OsEbM/btsrasvE2OK/XVANu5QmyQtUwJ8vtoxdpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OsEbM/btsrasvE2OK/XVANu5QmyQtUwJ8vtoxdpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OsEbM/btsrasvE2OK/XVANu5QmyQtUwJ8vtoxdpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOsEbM%2FbtsrasvE2OK%2FXVANu5QmyQtUwJ8vtoxdpK%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;1280&quot; height=&quot;725&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;725&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;  기본 미션&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;p. 310 인덱스 생성하고 key_name이 PRIMARY로 출력된 결과 화면 캡쳐하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-08-13 오후 11.28.25.png&quot; data-origin-width=&quot;2194&quot; data-origin-height=&quot;860&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/AiKJb/btsqZDyOTyV/GkcUjHIQKPZKuKzISIrs51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/AiKJb/btsqZDyOTyV/GkcUjHIQKPZKuKzISIrs51/img.png&quot; data-alt=&quot;생성한 인덱스 2개와 PRIMARY 인덱스 정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/AiKJb/btsqZDyOTyV/GkcUjHIQKPZKuKzISIrs51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FAiKJb%2FbtsqZDyOTyV%2FGkcUjHIQKPZKuKzISIrs51%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;2194&quot; height=&quot;860&quot; data-filename=&quot;스크린샷 2023-08-13 오후 11.28.25.png&quot; data-origin-width=&quot;2194&quot; data-origin-height=&quot;860&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;생성한 인덱스 2개와 PRIMARY 인덱스 정보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>혼공SQL</category>
      <category>혼공</category>
      <category>혼공SQL</category>
      <category>혼공학습단</category>
      <author>고밍고밍</author>
      <guid isPermaLink="true">https://goming0925.tistory.com/25</guid>
      <comments>https://goming0925.tistory.com/25#entry25comment</comments>
      <pubDate>Sun, 13 Aug 2023 23:30:20 +0900</pubDate>
    </item>
    <item>
      <title>혼자 공부하는 SQL 4주차</title>
      <link>https://goming0925.tistory.com/24</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;725&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8xtUv/btsplQ7yv7R/KQIRT4RB1MkON9SGvOcwlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8xtUv/btsplQ7yv7R/KQIRT4RB1MkON9SGvOcwlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8xtUv/btsplQ7yv7R/KQIRT4RB1MkON9SGvOcwlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8xtUv%2FbtsplQ7yv7R%2FKQIRT4RB1MkON9SGvOcwlK%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;1280&quot; height=&quot;725&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;725&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;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;  기본 미션&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;p. 226의 market_db의 회원 테이블(member) 생성하고, p.229 데이터 입력한 후 인증하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-30 오후 11.41.06.png&quot; data-origin-width=&quot;2592&quot; data-origin-height=&quot;1738&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k80MK/btspl81bTV9/bdqsiPgJZeXSUCVkHzZeL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k80MK/btspl81bTV9/bdqsiPgJZeXSUCVkHzZeL1/img.png&quot; data-alt=&quot;member 테이블의 생성과 데이터 입력&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k80MK/btspl81bTV9/bdqsiPgJZeXSUCVkHzZeL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk80MK%2Fbtspl81bTV9%2FbdqsiPgJZeXSUCVkHzZeL1%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;2592&quot; height=&quot;1738&quot; data-filename=&quot;스크린샷 2023-07-30 오후 11.41.06.png&quot; data-origin-width=&quot;2592&quot; data-origin-height=&quot;1738&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;member 테이블의 생성과 데이터 입력&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-30 오후 11.42.13.png&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bejfZ7/btspsUAPIc5/5HKg9gViI1ILBvteTE5Ou0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bejfZ7/btspsUAPIc5/5HKg9gViI1ILBvteTE5Ou0/img.png&quot; data-alt=&quot;생성된 테이블에 입력된 데이터를 확인&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bejfZ7/btspsUAPIc5/5HKg9gViI1ILBvteTE5Ou0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbejfZ7%2FbtspsUAPIc5%2F5HKg9gViI1ILBvteTE5Ou0%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;1178&quot; height=&quot;432&quot; data-filename=&quot;스크린샷 2023-07-30 오후 11.42.13.png&quot; data-origin-width=&quot;1178&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;생성된 테이블에 입력된 데이터를 확인&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>혼공SQL</category>
      <category>혼공</category>
      <category>혼공SQL</category>
      <category>혼공학습단</category>
      <author>고밍고밍</author>
      <guid isPermaLink="true">https://goming0925.tistory.com/24</guid>
      <comments>https://goming0925.tistory.com/24#entry24comment</comments>
      <pubDate>Sun, 30 Jul 2023 23:43:18 +0900</pubDate>
    </item>
    <item>
      <title>혼자 공부하는 SQL 3주차</title>
      <link>https://goming0925.tistory.com/23</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;725&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMic5k/btsoIMwxuGH/zQdmWZ4rteNjcMRp3AhBK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMic5k/btsoIMwxuGH/zQdmWZ4rteNjcMRp3AhBK1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMic5k/btsoIMwxuGH/zQdmWZ4rteNjcMRp3AhBK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMic5k%2FbtsoIMwxuGH%2FzQdmWZ4rteNjcMRp3AhBK1%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;1280&quot; height=&quot;725&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;725&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;  기본 미션&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;p. 195의 확인 문제 4번 풀고 인증하기&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음 SQL은 회원으로 가입만 하고, 한 번도 구매한 적이 없는 회원의 목록입니다. 빈칸에 들어갈 가장 적합한 것을 고르세요.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;SELECT DISTINCT M.mem_idm B.prod_name, M.mem_name, M.addr&lt;br /&gt;&amp;nbsp; &amp;nbsp;FROM member M&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;LEFT OUTER JOIN buy B&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;ON M.mem_id = B.mem_id&lt;br /&gt;&lt;span style=&quot;background-color: #666666;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;background-color: #666666; color: #666666; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #666666; color: #666666; text-align: left;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;OREDR BY M.mem_id;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① JOIN B.prod_name IS NULL&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;② LIMIT B.prod_name IS NULL&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;③ HAVING B.prod_name IS NULL&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;④ WHERE B.prod_name IS NULL&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;풀이 ) 빈칸의 위치는 FROM절과 ORDER절의 사이이다. 보기 2번인 LIMIT는 쿼리의 마지막에 위치하므로 제외, 보기 3번인 HAVING절은 GROUP BY로 그룹화 된 결과에 대한 조건절이다. 그룹화 되지 않았으므로 역시 제외...&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보기 1번 JOIN은 내부 조인을 의도하는 것으로 보이지만, JOIN 선언 후 테이블 명이 존재하지 않으므로 제외한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정답은 보기 &lt;b&gt;4번&lt;/b&gt;이며, 위 SQL의 LEFT OUTER JOIN 이후에 대한 조건을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고로 buy 테이블에서 prod_name이 존재하지 않는다는 조건이며, buy 테이블은 물품을 구매할때 레코드가 생성되는 것으로 추측된다.&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;p. 183 [좀 더 알아보기] 손코딩 실행하고 결과화면 인증하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-23 오후 11.09.42.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/com90F/btsoxHqvs3T/KWoDHIa7kt5KFhmwZ6LSC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/com90F/btsoxHqvs3T/KWoDHIa7kt5KFhmwZ6LSC0/img.png&quot; data-alt=&quot;buy 테이블과 member 테이블의 JOIN으로 출력한 정보&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/com90F/btsoxHqvs3T/KWoDHIa7kt5KFhmwZ6LSC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcom90F%2FbtsoxHqvs3T%2FKWoDHIa7kt5KFhmwZ6LSC0%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;600&quot; height=&quot;415&quot; data-filename=&quot;스크린샷 2023-07-23 오후 11.09.42.png&quot; data-origin-width=&quot;870&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;buy 테이블과 member 테이블의 JOIN으로 출력한 정보&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>혼공SQL</category>
      <category>혼공</category>
      <category>혼공SQL</category>
      <category>혼공학습단</category>
      <author>고밍고밍</author>
      <guid isPermaLink="true">https://goming0925.tistory.com/23</guid>
      <comments>https://goming0925.tistory.com/23#entry23comment</comments>
      <pubDate>Sun, 23 Jul 2023 23:10:28 +0900</pubDate>
    </item>
    <item>
      <title>혼자 공부하는 SQL 2주차</title>
      <link>https://goming0925.tistory.com/22</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;725&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bApZyb/btsnGOiBhRl/lPGdOOI1OBte2r6p439E0K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bApZyb/btsnGOiBhRl/lPGdOOI1OBte2r6p439E0K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bApZyb/btsnGOiBhRl/lPGdOOI1OBte2r6p439E0K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbApZyb%2FbtsnGOiBhRl%2FlPGdOOI1OBte2r6p439E0K%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;1280&quot; height=&quot;725&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;725&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  기본 미션&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;p. 138의 확인 문제 2번 풀고 인증하기&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;다음 보기 중에서 각 문항의 빈칸에 들어갈 것을 고르세요.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;LIKE, DESC, ORDER BY, DISTINCT, ASC, AND, OR, &amp;gt;=, LIMIT&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1️⃣ SELECT * FROM member (&amp;nbsp;  &amp;nbsp; ) height;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- member의 컬럼 속성인 height를 이용하는건 &lt;b&gt;ORDER BY&lt;/b&gt;로 정렬을 할때이다. (나머지는 height의 값이나, 부가적인 문구가 있어야한다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2️⃣ SELECT * FROM member (&amp;nbsp;  &amp;nbsp; ) 5,2;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 특정 컬럼의 값이 아닌 숫자를 이용하며 ',' 를 이용하는건 &lt;b&gt;LIMIT&lt;/b&gt;이다. 5번째부터 2개의 데이터를 추출한다는 의미&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3️⃣ SELECT (&amp;nbsp;  &amp;nbsp; ) phone1 FROM member;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 열이름 앞에 붙이는건 &lt;b&gt;DISTINCT&lt;/b&gt;이다. phone1 컬럼의 중복된 결과를 제거 하는 SQL이다.&lt;/p&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>혼공SQL</category>
      <category>혼공</category>
      <category>혼공SQL</category>
      <category>혼공학습단</category>
      <author>고밍고밍</author>
      <guid isPermaLink="true">https://goming0925.tistory.com/22</guid>
      <comments>https://goming0925.tistory.com/22#entry22comment</comments>
      <pubDate>Sun, 16 Jul 2023 22:36:14 +0900</pubDate>
    </item>
    <item>
      <title>혼자 공부하는 SQL 1주차</title>
      <link>https://goming0925.tistory.com/21</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-09 오후 11.17.29.png&quot; data-origin-width=&quot;1982&quot; data-origin-height=&quot;1124&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yhlNA/btsmRNSK5Oc/hCByiUwKK6dOycNMW1fmn1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yhlNA/btsmRNSK5Oc/hCByiUwKK6dOycNMW1fmn1/img.png&quot; data-alt=&quot;다시 돌아온 각설이...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yhlNA/btsmRNSK5Oc/hCByiUwKK6dOycNMW1fmn1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyhlNA%2FbtsmRNSK5Oc%2FhCByiUwKK6dOycNMW1fmn1%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;1982&quot; height=&quot;1124&quot; data-filename=&quot;스크린샷 2023-07-09 오후 11.17.29.png&quot; data-origin-width=&quot;1982&quot; data-origin-height=&quot;1124&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;다시 돌아온 각설이...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  기본 미션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;p. 80의 shop_db의 회원 테이블(member)에서 아이유 회원에 대한 정보만 추출한 후 결과 화면 인증하기&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-07-09 오후 11.19.08.png&quot; data-origin-width=&quot;3680&quot; data-origin-height=&quot;2224&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ba9xWR/btsmRnmuTQe/4bBzbNGpQ9GQm4yOePKCN1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ba9xWR/btsmRnmuTQe/4bBzbNGpQ9GQm4yOePKCN1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ba9xWR/btsmRnmuTQe/4bBzbNGpQ9GQm4yOePKCN1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fba9xWR%2FbtsmRnmuTQe%2F4bBzbNGpQ9GQm4yOePKCN1%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;3680&quot; height=&quot;2224&quot; data-filename=&quot;스크린샷 2023-07-09 오후 11.19.08.png&quot; data-origin-width=&quot;3680&quot; data-origin-height=&quot;2224&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt; ) 만들어진 member 테이블에서의  회원이름으로 '아이유' 회원을 찾아 정보를 추출하였다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>혼공SQL</category>
      <category>혼공</category>
      <category>혼공SQL</category>
      <category>혼공학습단</category>
      <author>고밍고밍</author>
      <guid isPermaLink="true">https://goming0925.tistory.com/21</guid>
      <comments>https://goming0925.tistory.com/21#entry21comment</comments>
      <pubDate>Sun, 9 Jul 2023 23:21:14 +0900</pubDate>
    </item>
    <item>
      <title>혼자 공부하는 컴퓨터 구조+운영체제 6주차 (14~15)</title>
      <link>https://goming0925.tistory.com/20</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2002&quot; data-origin-height=&quot;1252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bv3QUm/btrZK26dYsW/NYoob3CspjXQR9vVOfK50k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bv3QUm/btrZK26dYsW/NYoob3CspjXQR9vVOfK50k/img.png&quot; data-alt=&quot;커리큘럼  &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bv3QUm/btrZK26dYsW/NYoob3CspjXQR9vVOfK50k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbv3QUm%2FbtrZK26dYsW%2FNYoob3CspjXQR9vVOfK50k%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;2002&quot; height=&quot;1252&quot; data-origin-width=&quot;2002&quot; data-origin-height=&quot;1252&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;커리큘럼  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  기본 미션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;p.400, 확인 문제 1번 ) 메모리 할당 방식에 대한 설명으로 올바른 것을 다음 보기에서 찾아 써 보세요.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;보기) 최초 적합, 최적 적합, 최악 적합&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(①) : 최초로 발견한 적재 가능한 빈 공간에 프로세스를 배치하는 방식&lt;br /&gt;(②) : 프로세스가 적재될 수 있는 가장 큰 공간에 프로세스를 배치하는 방식&lt;br /&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;'14-1 메모리 할당' 을 참고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  선택 미션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ch.14 (14-3) 프로세스가 사용할 수 있는 프레임이 3개 있고, 페이지 참조열이 '2414523423'일 때 FIFO, 최적 페이지, LRU 페이지 교체 알고리즘으로 이 페이지를 참조한다면 몇 번의 페이지 폴트가 발생하는지 풀어보기&lt;/p&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&gt;  )&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-02-21 오전 1.24.10.png&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;1040&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwbyPL/btrZ5kezd53/k3yxBzSn0pZcbBJ04igOlK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwbyPL/btrZ5kezd53/k3yxBzSn0pZcbBJ04igOlK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwbyPL/btrZ5kezd53/k3yxBzSn0pZcbBJ04igOlK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwbyPL%2FbtrZ5kezd53%2Fk3yxBzSn0pZcbBJ04igOlK%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;600&quot; height=&quot;477&quot; data-filename=&quot;스크린샷 2023-02-21 오전 1.24.10.png&quot; data-origin-width=&quot;1308&quot; data-origin-height=&quot;1040&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&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;FIFO : 4번&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;LRU 페이지 교체 : 4번&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;FIFO는 프레임에 먼저 적재된 페이지부터 교체되고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최적페이지 알고리즘은 남은 페이지 참조열 중 사용 빈도가 가장 낮을 페이지를 교체하며&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;LRU 페이지 교체 알고리즘은 가장 오래 사용되지 않은 페이지를 교체하였다.&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;1️⃣&lt;/span&gt;&lt;span&gt;4️⃣&lt;/span&gt;&amp;nbsp;가상 메모리&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;14-1 연속 메모리 할당&lt;/h4&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅&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;스와핑&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 사용되지 않는 프로세스들을 보조기억장치의 일부 영역으로 쫓아내고, 빈 공간에 새 프로세스를 적재하여 실행하는 방식&lt;/li&gt;
&lt;li&gt;현재 실행되지 않는 프로세스 메모리에서 스왑 영역으로 옮겨지는 것을 &lt;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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;569&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsjtqA/btrZLVFEqHl/vsINla2RIErXNvDlEy6Kfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsjtqA/btrZLVFEqHl/vsINla2RIErXNvDlEy6Kfk/img.png&quot; data-alt=&quot;SSD 중에서도 빠른걸 써야겠네  &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsjtqA/btrZLVFEqHl/vsINla2RIErXNvDlEy6Kfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdsjtqA%2FbtrZLVFEqHl%2FvsINla2RIErXNvDlEy6Kfk%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;600&quot; height=&quot;267&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;569&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SSD 중에서도 빠른걸 써야겠네  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스들이 요구하는 메모리 공간 크기가 실제 메모리 크기보다 큰 경우에도 동시 실행 가능&lt;/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;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;최초 적합, 최적 적합, 최악 적합&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;최초 적합 (first fit)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제가 메모리 내의 빈 공간을 순서대로 검색하다 적재할 수 있는 공간을 발견하면 그 공간에 프로세스를 배치하는 방식&lt;/li&gt;
&lt;li&gt;공간 검색을 최소화 할 수 있고 결국 빠른 할당이 가능&lt;/li&gt;
&lt;/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;최적 적합(best fit)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제가 빈 공간을 모두 검색해본 뒤, 적재 가능한 가장 작은 공간에 할당하는 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;최악 적합(worst fit)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제가 빈 공간을 모두 검색해본 뒤, 적재 가능한 가장 큰 공간에 할당&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;외부 단편화&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스를 메모리에 연속적으로 배치하는 연속 메모리 할당은 비효율적인 방식이다&lt;/li&gt;
&lt;li&gt;외부 단편화(external fragmentation)이라는 문제가 발생하기 때문&lt;/li&gt;
&lt;li&gt;프로세스를 연속적으로 배치하여 수행 중, 먼저 종료되는 프로세스가 발생할 경우 다음과 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;725&quot; data-origin-height=&quot;1013&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bRtgKD/btrZKxZJJ3F/miXXcEDCzwMoBBl0ZdyJYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bRtgKD/btrZKxZJJ3F/miXXcEDCzwMoBBl0ZdyJYK/img.png&quot; data-alt=&quot;분명 공간은 있는데 애매한게 내 방 같구만...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bRtgKD/btrZKxZJJ3F/miXXcEDCzwMoBBl0ZdyJYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbRtgKD%2FbtrZKxZJJ3F%2FmiXXcEDCzwMoBBl0ZdyJYK%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;500&quot; height=&quot;699&quot; data-origin-width=&quot;725&quot; data-origin-height=&quot;1013&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;분명 공간은 있는데 애매한게 내 방 같구만...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;비어있는 공간의 총 합은 50MB지만, 50MB 크기의 프로세스를 적재할 수 없다 ➡️&amp;nbsp;외부 단편화&lt;/li&gt;
&lt;li&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;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;메모리 압축(compaction)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;여기저기 흩어져 있는 빈 공간들을 하나로 모으는 방식&lt;/li&gt;
&lt;li&gt;프로세스를 적당히 재배치시켜 흩어져있는 작은 빈 공간들을 하나의 큰 빈 공간으로 만드는 방법&lt;/li&gt;
&lt;li&gt;빈 공간을 합치는 과정에서 많은 오버헤드가 발생하고, 옮겨지는 프로세스들의 중단 등의 문제가 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;가상 메모리 기법, 페이징&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;769&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uTKLX/btrZJdAwDFr/ZtZ4B81fEYO9M45ohwEiqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uTKLX/btrZJdAwDFr/ZtZ4B81fEYO9M45ohwEiqK/img.png&quot; data-alt=&quot;메모리 압축을 수행하면 내 방에 가구 놓을 공간 마련하듯 공간을 만든다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uTKLX/btrZJdAwDFr/ZtZ4B81fEYO9M45ohwEiqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuTKLX%2FbtrZJdAwDFr%2FZtZ4B81fEYO9M45ohwEiqK%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;600&quot; height=&quot;376&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;769&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;메모리 압축을 수행하면 내 방에 가구 놓을 공간 마련하듯 공간을 만든다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;14-2 페이징을 통한 가상 메모리 관리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연속 메모리 할당의 두 가지 문제점&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;외부 단편화&lt;/li&gt;
&lt;li&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;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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이징(paging)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;외부 단편화는 각기 다른 크기의 프로세스가 메모리에 연속적으로 할당되었기 때문이다.&lt;/li&gt;
&lt;li&gt;프로세스를 일정 크기로 자르고, 이를 메모리에 불연속적으로 할당할 수 있다면 해결&lt;/li&gt;
&lt;li&gt;프로세스의 논리 주소 공간을 페이지(page)라는 일정 단위로 자른다.&lt;/li&gt;
&lt;li&gt;메모리의 물리 주소 공간을 프레임(frame)이라는 페이지와 동일한 일정한 단위로 자른다.&lt;/li&gt;
&lt;li&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;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;li&gt;즉, 물리 메모리보다 큰 프로세스도 실행될 수 있다. (페이지 단위로 메모리에 적재되니깐)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;506&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cLmfMT/btrZPS9Dmco/8H7SC95TvnkiOrUOE5S8B1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cLmfMT/btrZPS9Dmco/8H7SC95TvnkiOrUOE5S8B1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cLmfMT/btrZPS9Dmco/8H7SC95TvnkiOrUOE5S8B1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcLmfMT%2FbtrZPS9Dmco%2F8H7SC95TvnkiOrUOE5S8B1%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;600&quot; height=&quot;237&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;506&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스가 메모리에 불연속적으로 배치되는 페이징 기법에선 CPU가 &amp;lsquo;다음에 실행할 명령어 위치&amp;rsquo;를 찾기 어려워진다.&lt;/li&gt;
&lt;li&gt;(실제 메모리 내의 주소인) 물리 주소에 불연속적으로 배치되더라도&lt;/li&gt;
&lt;li&gt;(CPU가 바라보는 주소인) 논리 주소에는 연속적으로 배치되도록 하는 방법&lt;/li&gt;
&lt;li&gt;페이지 번호와 프레임 번호를 짝지어 주는 일종의 이정표 (프로세스마다 존재해서 짝지어 주는 이정표)&lt;/li&gt;
&lt;li&gt;물리적으로는 분산되어 저장되어 있더라도 CPU 입장에서 바라본 논리 주소는 연속적으로 보임&lt;/li&gt;
&lt;li&gt;CPU는 그저 논리 주소를 순차적으로 실행하면 될 뿐이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;633&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mjXn9/btrZJXqIkzX/l5R6rA2qc4JGKARKk95z2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mjXn9/btrZJXqIkzX/l5R6rA2qc4JGKARKk95z2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mjXn9/btrZJXqIkzX/l5R6rA2qc4JGKARKk95z2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmjXn9%2FbtrZJXqIkzX%2Fl5R6rA2qc4JGKARKk95z2K%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;600&quot; height=&quot;297&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;633&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이지 크기가 10KB, 프로세스 크기가 108KB일 경우&lt;/li&gt;
&lt;li&gt;2KB 만큼의 내부 단편화가 발생할 수 있다.&lt;/li&gt;
&lt;li&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;PTBR&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;각 페이지 테이블은 CPU 내의 프로세스 테이블 베이스 레지스터(PTBR)가 가리킨다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;535&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Nxfwe/btrZV756JW4/jwoe08s5deDNdrXmI9Jni0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Nxfwe/btrZV756JW4/jwoe08s5deDNdrXmI9Jni0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Nxfwe/btrZV756JW4/jwoe08s5deDNdrXmI9Jni0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNxfwe%2FbtrZV756JW4%2Fjwoe08s5deDNdrXmI9Jni0%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;600&quot; height=&quot;251&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;535&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;TLB&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;메모리에 접근하는 시간을 줄이기 위해 CPU 옆에 (일반적으로 MMU내에) TLB(Translation Lookaside Buffer)라는 페이지 테이블의 일부를 가져와 저장하는 캐시 메모리를 이용한다.&lt;/li&gt;
&lt;li&gt;CPU가 접근하려는 논리 주소가 TLB에 있다면 ➡️&amp;nbsp;TLB 히트 : 메모리 접근을 한 번한다.&lt;/li&gt;
&lt;li&gt;CPU가 접근하려는 논리 주소가 TLB에 없다면 ➡️&amp;nbsp;TLB 미스 : 메모리 접근을 두 번 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이징에서의 주소 변환&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 주소에 접근하고자 할때 필요한 정보
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;어떤 페이지/프레임에 접근하고 싶은지에 대한 정보&lt;/li&gt;
&lt;li&gt;접근하려는 주소가 그 페이지 혹은 프레임으로부터 얼마나 떨어져 있는지에 대한 정보&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;페이징 시스템에서의 논리 주소 : 페이지 번호(pgae number)와 변위(offset)로 이루어져있다.&lt;/li&gt;
&lt;li&gt;&amp;lt;페이지 번호, 변위&amp;gt; 는 페이지 테이블을 거쳐 &amp;lt;프레임 번호, 변위&amp;gt;로 변환된다.&lt;/li&gt;
&lt;li&gt;변위는 동일하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBphj0/btrZPS2Vnmq/818kAlkXeLG5tg0LHdeli0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBphj0/btrZPS2Vnmq/818kAlkXeLG5tg0LHdeli0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBphj0/btrZPS2Vnmq/818kAlkXeLG5tg0LHdeli0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBphj0%2FbtrZPS2Vnmq%2F818kAlkXeLG5tg0LHdeli0%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;600&quot; height=&quot;222&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;473&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이지 테이블의 각각의 행 : 페이지 테이블 엔트리(PTE)&lt;/li&gt;
&lt;li&gt;페이지 번호, 프레임 정보 외에 담기는 정보가 존재&lt;/li&gt;
&lt;li&gt;유효 비트 : 현재 해당 페이지에 접근 가능한지 여부를 나타내는 비트 정보 (메모리에 적재되어 있는지 여부를 알려준다.)&lt;/li&gt;
&lt;li&gt;유효 비트가 0인 페이지에 접근하려 할 경우 페이지 폴트(page fault)라는 인터럽트가 발생한다.&lt;/li&gt;
&lt;li&gt;보호 비트 : 페이지 보호 기능을 위해 존재하는 비트&lt;/li&gt;
&lt;li&gt;보호 비트를 읽기, 쓰기, 실행으로 권한을 나누어 저장할 수 있다.&lt;/li&gt;
&lt;li&gt;참조 비트 : CPU가 이 페이지에 접근한 적이 있는지 여부를 나타내는 비트&lt;/li&gt;
&lt;li&gt;수정 비트(=dirty bit) : CPU가 이 페이지에 데이터를 쓴 적이 있는지 여부를 알려준다.&lt;/li&gt;
&lt;li&gt;수정 비트는 페이지가 메모리에서 사라질 때 보조기억장치에 쓰기 작업을 해야 하는지, 할 필요가 없느지를 판단하기 위해 존재한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;14-3 페이지 교체와 프레임 할당&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;요구 페이징&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;처음부터 모든 페이지를 적재하지 않고 필요한 페이지만을 메모리에 적재하는 기법&lt;/li&gt;
&lt;li&gt;요구되는 페이지만 적재하는 기법&lt;/li&gt;
&lt;li&gt;아무런 페이지도 메모리에 적재하지 않은 채 무작정 실행하는 경우 &amp;lsquo;요구 페이징의 기본적인 양상&amp;rsquo;에 따라 페이지 폴트가 지속적으로 발생하게 되고, 점차적으로 페이지 폴트 발생 빈도가 떨어지게 된다. 이를 순수 요구 페이징(pure demand paging) 기법이라고 한다.&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;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU가 특정 페이지에 접근하는 명령어를 실행한다.&lt;/li&gt;
&lt;li&gt;해당 페이지가 현재 메모리에 있을 경우 (유효 비트가 1일 경우) CPU는 페이지가 적재된 프레임에 접근한다.&lt;/li&gt;
&lt;li&gt;해당 페이지가 현재 메모리에 없을 경우 (유효 비트가 0일 경우) 페이지 폴트가 발생한다.&lt;/li&gt;
&lt;li&gt;페이지 폴트 처리 루틴은 해당 페이지를 메모리로 적재하고 유효 비트를 1로 설정한다.&lt;/li&gt;
&lt;li&gt;다시 1번을 수행한다.&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;요구 페이징 시스템이 안정적으로 작동하기 위해 해결해야 할 묹&lt;/p&gt;
&lt;ol 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;/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;페이지 교체 알고리즘&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;요구 페이징 기법으로 페이지들을 적재하다보면 메모리가 가득 차게 되며, 스와핑을 수행하게 된다.&lt;/li&gt;
&lt;li&gt;페이지 스와핑에서 스왑 아웃(페이지 아웃)을 수행할 페이지를 결정하는 방법을 페이지 교체 알고리즘이라 한다.&lt;/li&gt;
&lt;li&gt;일반적으로 페이지 폴트가 적은 알고리즘을 좋은 페이지 교체 알고리즘이라 한다.&lt;/li&gt;
&lt;li&gt;페이지 폴트 횟수는 페이지 참조열을 통해 알 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅&amp;nbsp;페이지 참조열(page reference string)&lt;br /&gt;&amp;nbsp;- CPU가 참조하는 페이지들 중 연속된 페이지를 생략한 페이지열&lt;br /&gt;2223555337 의 페이지를 참조했다고 가정할 경우 23537이 페이지 참조열이 된다.&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;FIFO 페이지 교체 알고리즘&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 단순한 방식&lt;/li&gt;
&lt;li&gt;메모리에 가장 먼저 올라온 페이지부터 내쫒는 방식&lt;/li&gt;
&lt;li&gt;아래 그림에서 페이지 교체시에 발생하는 페이지 폴트만 고려 (순수 페이지 폴트는 생략)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byzHgs/btrZ4c1WhzG/F2FF9uRKcak3bHbeCBr0o1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byzHgs/btrZ4c1WhzG/F2FF9uRKcak3bHbeCBr0o1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byzHgs/btrZ4c1WhzG/F2FF9uRKcak3bHbeCBr0o1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyzHgs%2FbtrZ4c1WhzG%2FF2FF9uRKcak3bHbeCBr0o1%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;600&quot; height=&quot;240&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아이디어와 구현은 간단하지만 마냥 좋지는 않다. ➡️&amp;nbsp;프로그램 실행 내내 사용될 페이지가 메모리에 먼저 적재되었다고 교체 당할 수 있다.&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;FIFO 페이지 교체 알고리즘 - 보완책&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2차 기회(second-chance) 페이지 교체 알고리즘&lt;/li&gt;
&lt;li&gt;참조 비트 1 : CPU가 한 번 참조한 적이 있는 페이지&lt;/li&gt;
&lt;li&gt;참조 비트 0 : CPU가 참조한 적이 없는 페이지&lt;/li&gt;
&lt;li&gt;참조 비트를 활용하여 FIFO 페이지 교체 알고리즘을 수행한다.&lt;/li&gt;
&lt;li&gt;내쫒으려는 대상 페이지의 참조 비트가 1일 경우 당장 내쫒지 않고 참조 비트를 0으로 만든 뒤, 현재 시간을 적재시간으로 수정한다.&lt;/li&gt;
&lt;li&gt;CPU가 접근한 적이 있을 경우 한 번의 기회를 더 주는 셈&lt;/li&gt;
&lt;li&gt;메모리에 가장 오래 머무른 페이지의 참조 비트가 0일 경우 오래되었으면서 사용되지 않은 페이지므로 교체대상이 된다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU에 의해 참조되는 횟수를 고려&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;624&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7V9HG/btrZ6jT2klO/mvI9ubdKW58bN4HGHnQg11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7V9HG/btrZ6jT2klO/mvI9ubdKW58bN4HGHnQg11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7V9HG/btrZ6jT2klO/mvI9ubdKW58bN4HGHnQg11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7V9HG%2FbtrZ6jT2klO%2FmvI9ubdKW58bN4HGHnQg11%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;600&quot; height=&quot;293&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;624&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FIFO 페이지 교체 알고리즘 보타 페이지 폴트가 적어졌다&lt;/li&gt;
&lt;li&gt;가장 낮은 페이지 폴트율을 보장하는 페이지 교체 알고리즘&lt;/li&gt;
&lt;li&gt;실제 구현이 어렵다 ➡️&amp;nbsp;사용되지 않을 페이지를 예측하는 일  &lt;/li&gt;
&lt;li&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;LRU(Least-Recently-Used) 페이지 교체 알고리즘&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;LRU 페이지 교체 알고리즘은 &amp;lsquo;가장 오래 사용되지 않은 페이지&amp;rsquo;를 교체하는 것으로 구현이 가능하다.&lt;/li&gt;
&lt;li&gt;최근 사용되지 않은 페이지는 앞으로도 사용되지 않지 않을까? 라는 아이디어에서 출발한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;545&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdVw7D/btrZ67lt4sd/37kGyQixBy8u9qINgI5uyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdVw7D/btrZ67lt4sd/37kGyQixBy8u9qINgI5uyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdVw7D/btrZ67lt4sd/37kGyQixBy8u9qINgI5uyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdVw7D%2FbtrZ67lt4sd%2F37kGyQixBy8u9qINgI5uyK%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;600&quot; height=&quot;255&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;545&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;LRU 페이지 교체 알고리즘의 파생 알고리즘들이 존재한다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;페이지 폴트가 자주 발생하는 이유는 근본적으로 &amp;lsquo;프로세스가 사용할 수 있는 프레임 자체가 적어서&amp;rsquo; 이다.&lt;/li&gt;
&lt;li&gt;결국 프레임이 부족하면 페이지 폴트가 자주 발생하고 결과적으로 CPU의 이용률이 떨어진다.&lt;/li&gt;
&lt;li&gt;프로세스가 실행되는 시간보다 페이징에 더 많은 시간을 소요하여 성능(CPU 이용률이 저해되는 문제)를 스레싱이라 한다.&lt;/li&gt;
&lt;li&gt;동시 실행되는 프로세스의 수를 늘린다고 CPU의 이용률이 높아지는 것이 아니다. (스레싱 발생)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;547&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SnchX/btrZ0I7T90h/rfhkumrJqXK6rqGpDiHhak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SnchX/btrZ0I7T90h/rfhkumrJqXK6rqGpDiHhak/img.png&quot; data-alt=&quot;동시에 실행되는 프로세스를 확 늘렸더니 프레임이 부족해져서 스레싱이 발생한다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SnchX/btrZ0I7T90h/rfhkumrJqXK6rqGpDiHhak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSnchX%2FbtrZ0I7T90h%2FrfhkumrJqXK6rqGpDiHhak%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;600&quot; height=&quot;327&quot; data-origin-width=&quot;1003&quot; data-origin-height=&quot;547&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;동시에 실행되는 프로세스를 확 늘렸더니 프레임이 부족해져서 스레싱이 발생한다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스레싱이 발생하는 근본적인 이유로는 각 프로세스가 필요로 하는 최소한의 프레임 수가 보장되지 않았기 때문이다.&lt;/li&gt;
&lt;li&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;균등 할당(equal allocation)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가장 단순한 할당 방식&lt;/li&gt;
&lt;li&gt;모든 프로세스들에게 균등하게 프레임을 할당하는 방식&lt;/li&gt;
&lt;li&gt;프로세스별 크기가 다르기 때문에 합리적이지 않다.&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;비례 할당(proportional allocation)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스의 크기를 고려한 할당 방식&lt;/li&gt;
&lt;li&gt;프로세스의 크기에 비례하여 프레임을 할당한다.&lt;/li&gt;
&lt;li&gt;프로세스의 크기와 요구되는 프레임 수는 일치하지 않기 때문에 결국 실행해봐야 필요한 프레임 수를 알게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅&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;작업 집합 모델&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;스레싱이 발생하는 이유가 빈번한 페이지 교체 때문이니 CPU가 특정 시간 동안 주로 참조한 페이지 개수만큼만 프레임을 할당하는 아이디어&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;ol 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;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/doM6ze/btrZ9FBxsT8/zb6hix1Jo0TbeWKqmTW9kK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/doM6ze/btrZ9FBxsT8/zb6hix1Jo0TbeWKqmTW9kK/img.png&quot; data-alt=&quot;특정 시간에서 참조한 페이지&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/doM6ze/btrZ9FBxsT8/zb6hix1Jo0TbeWKqmTW9kK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdoM6ze%2FbtrZ9FBxsT8%2Fzb6hix1Jo0TbeWKqmTW9kK%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;600&quot; height=&quot;171&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;365&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;특정 시간에서 참조한 페이지&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지 폴트 빈도 기반 프레임 할당&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스가 실행하는 과정에서 배분할 프레임 결정&lt;/li&gt;
&lt;li&gt;두 개의 가정에서 생겨난 아이디어
&lt;ol 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;/ol&gt;
&lt;/li&gt;
&lt;li&gt;페이지 폴트율에 대해 상한선과 하한선을 정하고, 그 내부 범위 안에서만 프레임을 할당하는 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EZ6eA/btrZ7F3kquo/ZLckKdveQ7KSc1zktV5KxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EZ6eA/btrZ7F3kquo/ZLckKdveQ7KSc1zktV5KxK/img.png&quot; data-alt=&quot;적당히 선을 지키는게 중요하다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EZ6eA/btrZ7F3kquo/ZLckKdveQ7KSc1zktV5KxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEZ6eA%2FbtrZ7F3kquo%2FZLckKdveQ7KSc1zktV5KxK%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;600&quot; height=&quot;222&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;474&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;적당히 선을 지키는게 중요하다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅&amp;nbsp;동적 할당 방식 : 프로세스가 실행하는 과정을 통해서 프레임을 할당하는 방식 (작업 집합 모델, 페이지 폴트 빈도 기반 프레임 할당)&lt;/blockquote&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span&gt;1️⃣&lt;/span&gt;&lt;span&gt;5️⃣&lt;/span&gt;&amp;nbsp;파일 시스템&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;15-1 파일과 디렉터리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 시스템(file system)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일과 디렉터리를 관리하는 운영체제 내의 프로그램&lt;/li&gt;
&lt;li&gt;파일과 디렉터리를 다루어 주는 프로그램&lt;/li&gt;
&lt;li&gt;한 컴퓨터 내에 여러 파일 시스템을 이용할 수도 있다.&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보조기억장치의 데이터 덩어리&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;보조기억장치에 저장된 관련 정보의 집합&lt;/li&gt;
&lt;li&gt;의미 있고 관련 있는 정보를 모은 논리적 단위&lt;/li&gt;
&lt;li&gt;파일을 이루는 정보 = 파일을 실행하기 위한 정보 + 부가 정보(= 속성, 메타 데이터)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일의 속성&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dt3Sna/btrZ7rqtmwE/LhhYHlZndU61Z3VKOXdrbK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dt3Sna/btrZ7rqtmwE/LhhYHlZndU61Z3VKOXdrbK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dt3Sna/btrZ7rqtmwE/LhhYHlZndU61Z3VKOXdrbK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdt3Sna%2FbtrZ7rqtmwE%2FLhhYHlZndU61Z3VKOXdrbK%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;600&quot; height=&quot;318&quot; data-origin-width=&quot;988&quot; data-origin-height=&quot;524&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;/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;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;ol 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;li&gt;파일 읽기&lt;/li&gt;
&lt;li&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;디렉터리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;윈도우에서는 폴더(folder)라고 부른다.&lt;/li&gt;
&lt;li&gt;과거 운영체제에서는 하나의 디렉터리만 존재 : 1단계 디렉터리&lt;/li&gt;
&lt;li&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;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;blockquote data-ke-style=&quot;style3&quot;&gt;✅&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;디렉터리 엔트리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사실 많은 운영체제에서는 디렉터리를 그저 &amp;lsquo;특별한 형태의 파일&amp;rsquo;로 간주한다.&lt;/li&gt;
&lt;li&gt;디렉터리는 그저 &amp;lsquo;포함된 정보가 조금 특별한 파일&amp;rsquo;이다.&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0cApj/btrZ6IM5ugp/4ixLkRjnFWwkWNo45kbN4k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0cApj/btrZ6IM5ugp/4ixLkRjnFWwkWNo45kbN4k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0cApj/btrZ6IM5ugp/4ixLkRjnFWwkWNo45kbN4k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0cApj%2FbtrZ6IM5ugp%2F4ixLkRjnFWwkWNo45kbN4k%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;600&quot; height=&quot;204&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;디렉터리 엔트리에 파일 속성을 명시하는 경우도 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;15-2 파일 시스템&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파티셔닝(partitioning)&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;파티셔닝 작업을 통해 나누어진 영역 하나하나를 파티션(partition)이라 한다.&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;포매팅(formatting)&lt;/p&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;파일 시스템을 설정하여 어떤 방식으로 파일을 관리할지 결정, 새로운 데이터를 쓸 준비하는 작업&lt;/li&gt;
&lt;li&gt;USB 포매팅시 파일 시스템을 골라 포매팅 한다. 즉 파일 시스템은 포매팅할 때 결정된다.&lt;/li&gt;
&lt;li&gt;파일 시스템에는 여러 종류가 있고, 파티션마다 다른 파일 시스템을 설정할 수도 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅&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;파일 할당 방법&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;포매팅까지 끝난 하드 디스크에 파일 저장하기&lt;/li&gt;
&lt;li&gt;운영체제는 파일/디렉터리를 블록 단위로 읽고 쓴다.&lt;/li&gt;
&lt;li&gt;하나의 파일이 보조기억장치에 저장될 때에는 여러 블록에 걸쳐 저장된다.&lt;/li&gt;
&lt;li&gt;파일을 보조기억장치에 할당하는 두 가지 방법 : 연속 할당, 불연속 할당&lt;/li&gt;
&lt;li&gt;불연속 할당은 연결 할당과 색인 할당으로 나누어진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅&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;연속 할당&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이름 그대로 보조기억장치 내 연속적인 블록에 파일 할당&lt;/li&gt;
&lt;li&gt;연속된 파일에 접근하기 위해 파일의 첫 번째 블록 주소와 블록 단위의 길이만 알면 된다.&lt;/li&gt;
&lt;li&gt;디렉터리 엔트리 : 파일 이름 &amp;amp; 첫번째 블록 주소 &amp;amp; 블록 단위 길이 명시&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;509&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s9pUQ/btrZ8Ns0MuD/bKCNEpIRdP8B3MCX9frFZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s9pUQ/btrZ8Ns0MuD/bKCNEpIRdP8B3MCX9frFZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s9pUQ/btrZ8Ns0MuD/bKCNEpIRdP8B3MCX9frFZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs9pUQ%2FbtrZ8Ns0MuD%2FbKCNEpIRdP8B3MCX9frFZ1%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;600&quot; height=&quot;273&quot; data-origin-width=&quot;1118&quot; data-origin-height=&quot;509&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;구현이 단순하다는 장점이 있지만 외부 단편화를 야기할 수 있다.&lt;/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;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;디렉터리 엔트리 : 파일 이름 &amp;amp; 첫번째 블록 주소 &amp;amp; 블록 단위의 길이&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1239&quot; data-origin-height=&quot;682&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6AOk2/btrZ9MHshvy/QM13bnfEl1M8P6lrjl3ZF0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6AOk2/btrZ9MHshvy/QM13bnfEl1M8P6lrjl3ZF0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6AOk2/btrZ9MHshvy/QM13bnfEl1M8P6lrjl3ZF0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6AOk2%2FbtrZ9MHshvy%2FQM13bnfEl1M8P6lrjl3ZF0%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;600&quot; height=&quot;330&quot; data-origin-width=&quot;1239&quot; data-origin-height=&quot;682&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;외부 단편화 문제를 해결하지만 단점이 존재
&lt;ol 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;/ol&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;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;디렉터리 엔트리 : 파일 이름 &amp;amp; 색인 블록 주소&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1243&quot; data-origin-height=&quot;631&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWeCLw/btrZ6jmccUL/V3NscK7fXtmPptzNUxr6G1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWeCLw/btrZ6jmccUL/V3NscK7fXtmPptzNUxr6G1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWeCLw/btrZ6jmccUL/V3NscK7fXtmPptzNUxr6G1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWeCLw%2FbtrZ6jmccUL%2FV3NscK7fXtmPptzNUxr6G1%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;600&quot; height=&quot;305&quot; data-origin-width=&quot;1243&quot; data-origin-height=&quot;631&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;FAT 파일 시스템&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;연결 할당 기반 파일 시스템&lt;/li&gt;
&lt;li&gt;연결 할당의 단점을 보완한 파일 시스템이다.&lt;/li&gt;
&lt;li&gt;파일 할당 테이블(FAT, File Allocation Table)에 각 블록에 포함된 다음 블록 주소를 한데 모아 관리한다.&lt;/li&gt;
&lt;li&gt;FAT가 메모리에 캐시될 수 있기 때문에 캐시될 경우 느린 임의 접근 속도를 개선할 수 있다.&lt;/li&gt;
&lt;li&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;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;색인 블록을 i-node 라고 부른다.&lt;/li&gt;
&lt;li&gt;i-node 에는 파일 속성 정보와 열다섯 개의 블록 주소가 저장될 수 있다.&lt;/li&gt;
&lt;li&gt;i-node의 크기보다 큰 블록의 파일을 저장하기 위해서 유닉스 파일 시스템은 다음과 같이 해결한다.
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;블록 주소 중 열두 개에는 직접 블록 주소를 저장한다. (직접 블록 : 파일 데이터가 저장된 블록)&lt;/li&gt;
&lt;li&gt;1번으로 충분하지 않다면 13번째 주소에 단일 간접 블록 주소를 저장한다. (단일 간접 블록 : 파일 데이터를 저장한 블록 주소가 저장된 블록)&lt;/li&gt;
&lt;li&gt;2번으로 충분하지 않다면 14번째 주소에 이중 간접 블록 주소를 저장한다. (이중 간접 블록 : 단일 간접 블록들의 주소를 저장하는 블록)&lt;/li&gt;
&lt;li&gt;3번으로 충분하지 않다면 15번째 주소에 삼중 간접 블록 주소 저장 (삼중 간접 블록 : 이중 간접 블록들의 주소를 저장하는 블록)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>혼공컴운</category>
      <category>혼공</category>
      <category>혼공컴운</category>
      <category>혼공학습단</category>
      <author>고밍고밍</author>
      <guid isPermaLink="true">https://goming0925.tistory.com/20</guid>
      <comments>https://goming0925.tistory.com/20#entry20comment</comments>
      <pubDate>Sun, 19 Feb 2023 23:47:17 +0900</pubDate>
    </item>
    <item>
      <title>혼자 공부하는 컴퓨터 구조+운영체제 5주차 (12~13)</title>
      <link>https://goming0925.tistory.com/19</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2002&quot; data-origin-height=&quot;1252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XiZTI/btrYTgdqWWK/GkqNctBAIM5oP43VuMRj01/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XiZTI/btrYTgdqWWK/GkqNctBAIM5oP43VuMRj01/img.png&quot; data-alt=&quot;커리큘럼  &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XiZTI/btrYTgdqWWK/GkqNctBAIM5oP43VuMRj01/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXiZTI%2FbtrYTgdqWWK%2FGkqNctBAIM5oP43VuMRj01%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;2002&quot; height=&quot;1252&quot; data-origin-width=&quot;2002&quot; data-origin-height=&quot;1252&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;커리큘럼  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  기본 미션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;p.363, 확인 문제 1번 ) 뮤텍스 락과 세마포에 대한 설명으로 옳지 않은 것을 고르세요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① 뮤텍스 락은 임계 구역을 잠근 뒤 임계 구역에 진입함으로써 상호 배제를 위한 동기화를 이룹니다.&lt;br /&gt;② 세마포는 공유 자원이 여러 개 있는 상황에서도 이용할 수 있습니다.&lt;br /&gt;③ 세마포를 이용해 프로세스 실행 순서 제어를 위한 동기화도 이룰 수 있습니다.&lt;br /&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;  ) ④, 프로세스를 대기 상태로 변경하여 CPU 사이클에서 제외하는 방법도 존재한다.&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  선택 미션&lt;br /&gt;Ch.12 (12-1) 임계 구역, 상호 배제 개념을 정리하기&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  )&lt;/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;프로세스들이 번갈아가며 자원을 사용하게끔 임계 구역에 한 프로세스의 입장을 허락하게 함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;#5주차선택&quot;&gt;&lt;span&gt;자세한 내용 확인하러 가기 &amp;zwj;♀️&lt;/span&gt;&lt;/a&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1️⃣2️⃣&amp;nbsp;프로세스 동기화&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;12-1 동기화란&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동기화의 의미&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공동의 목적을 위해 동시에 수행되는 프로세스는 서로 데이터를 주고받으며 협력하며 실행될 수 있다.&lt;/li&gt;
&lt;li&gt;자원의 일관성을 보장하기 위해서 (프로세스) 동기화가 필수적이다.&lt;/li&gt;
&lt;li&gt;프로세스들의 수행 시기를 맞추는 것을 동기화라고 한다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;실행 순서 제어 : 프로세스를 올바른 순서대로 실행하기&lt;/li&gt;
&lt;li&gt;상호 배제 : 동시에 접근해서는 안 되는 자원에 하나의 프로세스만 접근하게 하기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&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;실행 순서 제어를 위한 동기화 : reader writer problem&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Writer : Book.txt 파일에 값을 저장하는 프로세스&lt;/li&gt;
&lt;li&gt;Reader : Book.txt 파일에 저장된 값을 읽어들이는 프로세스&lt;/li&gt;
&lt;li&gt;Wirter 프로세스와 Reader 프로세스가 무작정 실행되면? ➡️&amp;nbsp; &lt;/li&gt;
&lt;li&gt;실행의 순서를 지켜 실행 될 경우 의도성을 가진채로 실행 가능 (예외적인 상황 발생을 억제할 수 있다)&lt;/li&gt;
&lt;li&gt;ex) Reader 프로세스는 &amp;lsquo;Book.txt 안에 값이 존재한다&amp;rsquo;는 특정 조건이 만족되어야만 실행 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;span id=&quot;5주차선택&quot;&gt;&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;상호 배제를 위한 동기화 : Bank account problem&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공유가 불가능한 자원의 동시 사용을 피하기 위한 동기화&lt;/li&gt;
&lt;li&gt;한번에 하나의 프로세스만 접근해야 하는 자원에 동시 접근을 피하기 위한 동기화&lt;/li&gt;
&lt;li&gt;하나의 프로세스에서 자원에 접근 중일때 같은 자원을 접근하는 나머지 프로세스는 대기하여야 한다.&lt;/li&gt;
&lt;li&gt;ex) 은행 계좌의 조작 프로세스 (계좌의 값을 읽어들여서 계산 후 저장하는 과정에서 동기화가 이루어지지 않으면 예상치 못한 값이 저장될 수 있다.)&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;상호 배제를 위한 동기화 : Producer &amp;amp; Consumer problem&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;물건을 계속해서 생산하는 생산자 (producer, 프로세스 혹은 스레드)&lt;/li&gt;
&lt;li&gt;물건을 계속해서 소비하는 소비자 (consumer, 프로세스 혹은 스레드)&lt;/li&gt;
&lt;li&gt;&amp;lsquo;총합&amp;rsquo; 변수를 공유&lt;/li&gt;
&lt;li&gt;생산자와 소비자를 무작정 100,000번 실행하면 총합의 변수 값이 10이 아닌 예상 밖의 값이 된다.&lt;/li&gt;
&lt;li&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;공유 자원(shared resource)과 임계 구역 (critical section)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공유 자원 : 여러 프로세스 혹은 스레드가 공유하는 자원 (ex : 전역 변수, 파일, 입출력장치, 보조기억장치, &amp;hellip;)&lt;/li&gt;
&lt;li&gt;임계 구역 : 동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역 (ex : 예시의 &amp;lsquo;총합&amp;rsquo; 변수, &amp;lsquo;잔액&amp;rsquo; 변수,&amp;hellip;)&lt;/li&gt;
&lt;li&gt;임계 구역에 진입하고자 하면 진입한 프로세스 이외에는 대기해야 한다. (동기화를 위해)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;693&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bd6S7d/btrY5mpiaEB/kKPIqxqfXeysxiVRIKsNxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bd6S7d/btrY5mpiaEB/kKPIqxqfXeysxiVRIKsNxK/img.png&quot; data-alt=&quot;아주 중요함...  &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bd6S7d/btrY5mpiaEB/kKPIqxqfXeysxiVRIKsNxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbd6S7d%2FbtrY5mpiaEB%2FkKPIqxqfXeysxiVRIKsNxK%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;600&quot; height=&quot;325&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;693&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아주 중요함...  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;레이스 컨디션(race condition) : 임계 구역에 동시에 접근하여 자원의 일관성이 깨지는 상태&lt;/li&gt;
&lt;li&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;rsquo;상호 배제를 위한 동기화&amp;rsquo;를 지키기 위한 세 가지 원칙)&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;상호 배제 (mutual exclusion)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;한 프로세스가 임계 구역에 진입했다면 다른 프로세스는 들어올 수 없다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;진행 (progress)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;임계 구역에 어떤 프로세스도 진입하지 않았다면 진입하고자 하는 프로세는 들어갈 수 있어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;유한 대기 (bounded waiting)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;한 프로세스가 임계 구역에 진입하고 싶다면 언젠가는 임계 구역에 들어올 수 있어야 한다&lt;/li&gt;
&lt;li&gt;임계 구역에 들어오기 위해 무한적 대기해서는 안 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;12-2 동기화 기법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;뮤텍스 락 (Mutex lock)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상호 배제를 위한 동기화 도구(자물쇠 역할)&lt;/li&gt;
&lt;li&gt;뮤텍스 락의 단순한 형태 : 전역 변수 하나, 함수 두 개
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;자물쇠 역할 : 프로세스들이 공유하는 전역 변수 Lock&lt;/li&gt;
&lt;li&gt;임계 구역을 잠그는 역할 : acquire 함수&lt;/li&gt;
&lt;li&gt;임계 구역의 잠금을 해제하는 역할 : release 함수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;acquire 함수
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;프로세스가 임계 구역에 진입하기 전에 호출&lt;/li&gt;
&lt;li&gt;임계 구역이 잠겨 있다면 ➡️&amp;nbsp;임계 구역이 열릴 때까지(lock이 false가 될 때까지) 임계 구역을 반복적으로 확인한다.&lt;/li&gt;
&lt;li&gt;임계 구역이 열려 있다면 ➡️&amp;nbsp;임계 구역을 잠근다 (lock을 true로 바꾸기)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;release 함수
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;임계 구역에서의 작업이 끝나고 호출&lt;/li&gt;
&lt;li&gt;현재 잠긴 임계 구역을 열기 (lock을 false로 바꾸기)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅&amp;nbsp;바쁜 대기 (busy waiting) : lock이 잠겨있는지 계속 확인해보는 것 ➡️&amp;nbsp;좋은 방식은 아님&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;814&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b7OZ8B/btrYUSpk9Hn/ennnOoK8oeKwmpJ76tAwO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b7OZ8B/btrYUSpk9Hn/ennnOoK8oeKwmpJ76tAwO0/img.png&quot; data-alt=&quot;스도 코드 형태로 나타낸 뮤텍스 락  &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b7OZ8B/btrYUSpk9Hn/ennnOoK8oeKwmpJ76tAwO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb7OZ8B%2FbtrYUSpk9Hn%2FennnOoK8oeKwmpJ76tAwO0%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;600&quot; height=&quot;382&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;814&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스도 코드 형태로 나타낸 뮤텍스 락  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;세마포 (Semaphore)&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;뮤텍스 락은 하나의 공유 자원에 접근하는 프로세스를 상정한 방식 &amp;harr;️&amp;nbsp;세마포는 공유 자원이 여러 개 있는 경우에도 적용 가능한 방식&lt;/li&gt;
&lt;li&gt;세마포의 종류로 이진 세마포 (binary semaphore), 카운팅 세마포 (counting semaphore)가 있지만, 이진 세마포는 뮤텍스 락과 비슷한 개념이고 일반화된 개념인 카운팅 세마포를 중점으로 본다.&lt;/li&gt;
&lt;li&gt;임계 구역 앞에서 멈춤 신호를 받으면 잠시 기다리기&lt;/li&gt;
&lt;li&gt;임계 구역 앞에서 가도 좋다는 신호를 받으면 임계 구역 진입&lt;/li&gt;
&lt;li&gt;세마포의 단순한 형태 : 전역 변수 하나, 함수 두 개
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;임계 구역에 진입할 수 있는 프로세스의 개수(사용 가능한 공유 자원의 개수)를 나타내는 전역 변수 S&lt;/li&gt;
&lt;li&gt;임계 구역에 들어가도 좋은지, 기다려야 할지를 알려주는 wait 함수&lt;/li&gt;
&lt;li&gt;임계구역 앞에서 기다리는 프로세스에 &amp;lsquo;이제 가도 좋다&amp;rsquo;고 신호를 주는 signal 함수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;허용된 S의 값으로 프로세스 실행이 결정 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;744&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuc5YF/btrYV9ElXac/cKOfOukFry5DpkDiwvmym0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuc5YF/btrYV9ElXac/cKOfOukFry5DpkDiwvmym0/img.png&quot; data-alt=&quot;스도 코드 형태로 나타낸 세마포 ⚒️&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuc5YF/btrYV9ElXac/cKOfOukFry5DpkDiwvmym0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcuc5YF%2FbtrYV9ElXac%2FcKOfOukFry5DpkDiwvmym0%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;600&quot; height=&quot;349&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;744&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;스도 코드 형태로 나타낸 세마포 ⚒️&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅&amp;nbsp;Mutex lock 과 동일하게 busy waiting 이다. ➡️&amp;nbsp;CPU 사이클 낭비&lt;br /&gt;&lt;br /&gt;해결 방법&lt;br /&gt;사용할 수 있는 자원이 없을 경우 대기 상태로 만듦, CPU 사이클이 필요없는 상태 (해당 프로세스의 PCB를 대기 큐에 삽입) 사용할 수 있는 자원이 생겼을 경우 대기 큐의 프로세스를 준비 상태로 만듦 (해당 프로세스의 PCB를 대기 큐에서 꺼내 준비 큐에 삽입)&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;세마포의 변수 S를 0으로 두고,&lt;/li&gt;
&lt;li&gt;먼저 실행할 프로세스 뒤에 signal 함수&lt;/li&gt;
&lt;li&gt;다음에 실행할 프로세스 앞에 wait 함수를 붙이면 된다.&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;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;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;인터페이스를 위한 큐&lt;/li&gt;
&lt;li&gt;공유자원에 접근하고자 하는 프로세스를 (인터페이스를 위한) 큐에 삽입&lt;/li&gt;
&lt;li&gt;큐에 삽입된 순서대로 (한 번에 하나의 프로세스만) 공유 자원 이용&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYRUQN/btrYUSixgFX/Th4DCqKB1XeHTKTiUlGdZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYRUQN/btrYUSixgFX/Th4DCqKB1XeHTKTiUlGdZK/img.png&quot; data-alt=&quot;공유 자원의 연산은 큐에서 인터페이스를 통해 하나씩 이용한다.  &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYRUQN/btrYUSixgFX/Th4DCqKB1XeHTKTiUlGdZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYRUQN%2FbtrYUSixgFX%2FTh4DCqKB1XeHTKTiUlGdZK%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;600&quot; height=&quot;241&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;공유 자원의 연산은 큐에서 인터페이스를 통해 하나씩 이용한다.  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행 순서 제어를 위한 동기화
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;조건 변수 (condition variable) 이용&lt;/li&gt;
&lt;li&gt;프로세스나 스레드의 실행 순서를 제어하기 위해 사용하는 특별한 변수&lt;/li&gt;
&lt;li&gt;조건변수.wait() : 대기 상태로 변경, 조건 변수에 대한 큐에 삽입&lt;/li&gt;
&lt;li&gt;조건변수.signal() : wait()으로 대기 상태로 접어든 조건변수를 실행 상태로 변경&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;779&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YsCXp/btrYTqfXFAb/N0ko7hPjjVXiNxa2GnvYqK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YsCXp/btrYTqfXFAb/N0ko7hPjjVXiNxa2GnvYqK/img.png&quot; data-alt=&quot;상호 배제를 위한 큐와 조건 변수에 대한 큐가 다름을 인지할 것  &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YsCXp/btrYTqfXFAb/N0ko7hPjjVXiNxa2GnvYqK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYsCXp%2FbtrYTqfXFAb%2FN0ko7hPjjVXiNxa2GnvYqK%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;600&quot; height=&quot;365&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;779&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;상호 배제를 위한 큐와 조건 변수에 대한 큐가 다름을 인지할 것  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모니터 안에는 하나의 프로세스만이 있을 수 있다.
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;wait()를 호출했던 프로세스는 signal()을 호출한 프로세스가 모니터를 떠난 뒤에 수행을 재개하는 방법&lt;/li&gt;
&lt;li&gt;signal()을 호출했던 프로세스의 실행을 일시 중단하고 자신이 실행된 뒤 다시 signal()을 호출한 프로세스의 수행을 재개하는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;특정 프로세스가 아직 실행될 조건이 되지 않았을 때에는 wait를 통해 실행을 중단한다.&lt;/li&gt;
&lt;li&gt;특정 프로세스가 실행될 조건이 충족되었을 때에는 signal을 통해 실행을 재개한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1️⃣3️⃣&amp;nbsp;교착 상태&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;13-1 교착 상태란&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;610&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/4vqk4/btrYTfZR3g6/mN3voE2MttvrHiXKf1gKD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/4vqk4/btrYTfZR3g6/mN3voE2MttvrHiXKf1gKD1/img.png&quot; data-alt=&quot;결혼식장에서 본 풍경... (수저가 없어진건 옆사람이 범인  ️)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/4vqk4/btrYTfZR3g6/mN3voE2MttvrHiXKf1gKD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F4vqk4%2FbtrYTfZR3g6%2FmN3voE2MttvrHiXKf1gKD1%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;600&quot; height=&quot;576&quot; data-origin-width=&quot;635&quot; data-origin-height=&quot;610&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;결혼식장에서 본 풍경... (수저가 없어진건 옆사람이 범인  ️)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;교착상태&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일어나지 않을 사건을 기다리며 진행이 멈춰 버리는 현상&lt;/li&gt;
&lt;li&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;ol 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;/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;자원 할당 그래프&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;교착 상태 발생 조건 파악 가능&lt;/li&gt;
&lt;li&gt;어떤 프로세스가 어떤 자원을 할당 받아 사용 중인지 확인 가능&lt;/li&gt;
&lt;li&gt;어떤 프로세스가 어떤 자원을 기다리고 있는지 확인 가능&lt;/li&gt;
&lt;li&gt;자원 할당 그래프 그리는 방법
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&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;/ol&gt;
&lt;/li&gt;
&lt;li&gt;교착 상태가 일어난 그래프의 특징
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;자원 할당 그래프가 &lt;b&gt;원의 형태&lt;/b&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;교착 상태 발생할 조건&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&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;/ol&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;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;13-2 교착 상태 해결 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;교착 상태 해결&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;예방&lt;/li&gt;
&lt;li&gt;회피&lt;/li&gt;
&lt;li&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;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;상호 배제를 없애면&amp;hellip; : 모든 자원을 공유하게 만든다? ➡️&amp;nbsp;현실적으로 불가능&lt;/li&gt;
&lt;li&gt;점유와 대기를 없애면&amp;hellip; : 특정 프로세스에 자원을 모두 할당하거나, 아예 할당하지 않는 방식으로 배분 ➡️&amp;nbsp;자원의 활용률이 떨어질 수 있음&lt;/li&gt;
&lt;li&gt;비선점 조건을 없애면&amp;hellip; : 선점이 가능한 자원 (CPU)에 한해서 효과적 ➡️&amp;nbsp;모든 자원이 선점 가능한 것은 아니다.&lt;/li&gt;
&lt;li&gt;원형 대기 조건을 없애면&amp;hellip; : 모든 자원에 번호를 붙이고, 오름차순으로 자원을 할당하는 방식 ➡️&amp;nbsp;모든 자원에 번호를 붙이는 것이 어려움, 어떤 자원에 어떤 번호를 붙이느냐에 따라 자원 활용률이 달라짐&lt;/li&gt;
&lt;li&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;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;li&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;/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;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;검출 후 회복 방식 2가지
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;선점을 통한 회복
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;교착 상태가 해결될 때까지 한 프로세스씩 자원을 몰아주는 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프로세스 강제 종료를 통한 회복
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;교착 상태에 놓인 프로세스 모두 강제 종료 (작업 내역을 잃을 위험이 존재한다)&lt;/li&gt;
&lt;li&gt;교착 상태가 해결될 때까지 한 프로세스씩 강제 종료 (교착 상태가 없어졌는지 확인하는 과정에서 오버헤드 발생)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&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;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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&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;</description>
      <category>혼공컴운</category>
      <category>혼공</category>
      <category>혼공컴운</category>
      <category>혼공학습단</category>
      <author>고밍고밍</author>
      <guid isPermaLink="true">https://goming0925.tistory.com/19</guid>
      <comments>https://goming0925.tistory.com/19#entry19comment</comments>
      <pubDate>Sun, 12 Feb 2023 23:10:10 +0900</pubDate>
    </item>
    <item>
      <title>혼자 공부하는 컴퓨터 구조+운영체제 4주차 (9~11)</title>
      <link>https://goming0925.tistory.com/18</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2002&quot; data-origin-height=&quot;1252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dviUFL/btrX3r09f5T/l545u9cZTsvcapOxJzO0Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dviUFL/btrX3r09f5T/l545u9cZTsvcapOxJzO0Yk/img.png&quot; data-alt=&quot;커리큘럼  &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dviUFL/btrX3r09f5T/l545u9cZTsvcapOxJzO0Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdviUFL%2FbtrX3r09f5T%2Fl545u9cZTsvcapOxJzO0Yk%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;2002&quot; height=&quot;1252&quot; data-origin-width=&quot;2002&quot; data-origin-height=&quot;1252&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;커리큘럼  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  기본 미션1&lt;br /&gt;p.304, 확인 문제 1번 ) 다음은 프로세스 상태를 보여주는 프로세스 상태 다이어그램입니다. ① 부터 ⑤ 까지 올바른 상태를 적어 보세요.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1099&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dakVQ9/btrYcgp7z0f/bwlme92h2EUcKSdmSgOeFk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dakVQ9/btrYcgp7z0f/bwlme92h2EUcKSdmSgOeFk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dakVQ9/btrYcgp7z0f/bwlme92h2EUcKSdmSgOeFk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdakVQ9%2FbtrYcgp7z0f%2Fbwlme92h2EUcKSdmSgOeFk%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;600&quot; height=&quot;254&quot; data-origin-width=&quot;1099&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  )&lt;br /&gt;① = 생성 상태&lt;br /&gt;② = 준비 상태&lt;br /&gt;③ = 실행 상태&lt;br /&gt;④ = 종료 상태&lt;br /&gt;⑤ = 대기 상태&lt;br /&gt;&lt;br /&gt;  선택 미션&lt;br /&gt;Ch.11 (11-2) 준비 큐에 A, B, C, D 순으로 삽입 될 때 선입 선처리, 최단 작업 우선, 라운드 로빈, 우선순위 스케줄링에서 어떤 프로세스로 CPU를 할당 받는지 정리해보기&lt;br /&gt;  )&lt;br /&gt;1. 선입 선처리 : 준비 큐에 먼저 적재된 순서대로 CPU를 할당 받는다. (FCFS)&lt;br /&gt;2. 최단 작업 우선 : CPU 사용시간이 가장 짧은 프로세스부터 가장 긴 프로세스까지 순차적으로 할당 받는다. (SJF)&lt;br /&gt;3. 라운드 로빈 : 정해진 타임슬라이스만큼씩 프로세스들에게 CPU를 할당하는데, 할당 순서는 준비 큐에 먼저 적재된 순서대로...&lt;br /&gt;4. 우선순위 스케줄링 : 프로세스들에 우선순위를 부여하고 우선순위가 높은 프로세스부터 순차적으로 실행한다.&lt;br /&gt;&lt;a href=&quot;#4주차선택&quot; target=&quot;_self&quot;&gt;&lt;span&gt;자세한 내용 확인하러 가기 &amp;zwj;♀️&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;수정) 준비 큐에 A, B, C, D 순으로 삽입되었다고 가정했을 때, 선입 선처리 스케줄링 알고리즘을 적용하면 어떤 프로세스 순서대로 CPU를 할당 받는지 풀어보기&lt;br /&gt;  )&lt;br /&gt;선입 선처리 스케줄링 알고리즘은 준비 큐에 적재된 순서대로 CPU를 할당 받는다. 고로 삽입된 순서인 A, B, C, D 의 순서로 CPU를 할당 받는다.&lt;br /&gt;이렇게 할당받아 작업을 수행하는 와중에 준비큐에 적재된 프로세스들의 기다리는 시간이 매우 길어질 수 있다. 그런 호위 효과를 해결하기 위해 다양한 스케줄링 알고리즘이 존재한다. (위의 링크를 눌러봐!!  )&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;9️⃣ 운영체제 시작하기&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;09-1 운영체제를 알아야 하는 이유&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제란&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자원/시스템 자원 : 프로그램 실행에 있어 마땅히 필요한 요소 (컴퓨터의 네 가지 핵심 부품 포함)&lt;/li&gt;
&lt;li&gt;실행할 프로그램에 필요한 자원을 할당하고 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;✅ 응용 프로그램 : 사용자가 특정 목적을 위해 사용하는 일반적인 프로그램&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;운영체제의 메모리 관리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제 또한 메모리에 적재되지만, 매우 특별한 프로그램이므로 항상 컴퓨터가 부팅될 때 메모리 내 커널 영역에 적재된다.&lt;/li&gt;
&lt;li&gt;응용 프로그램의 경우 메모리내에 사용자 영역에 적재된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;591&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/n95M7/btrX7XYVs1d/UKafvWH5PFWgowVOkMJsv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/n95M7/btrX7XYVs1d/UKafvWH5PFWgowVOkMJsv0/img.png&quot; data-alt=&quot;넌 이미 적재되어 있다.  &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/n95M7/btrX7XYVs1d/UKafvWH5PFWgowVOkMJsv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fn95M7%2FbtrX7XYVs1d%2FUKafvWH5PFWgowVOkMJsv0%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;600&quot; height=&quot;277&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;591&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;넌 이미 적재되어 있다.  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;운영체제의 CPU 관리&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;어떤 프로그램부터 CPU를 사용하게 할지, 얼마나 오랫동안 CPU를 이용하게 할지 등의 문제를 운영체제가 해결해준다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;운영체제의 입출력장치 관리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입출력 장치를 이용하는 응용프로그램의 제어와 입출력 장치 간의 자원을 관리한다.&lt;/li&gt;
&lt;li&gt;운영체제는 응용 프로그램과 하드웨어 사이에서 응용 프로그램에 필요한 자원을 할당하고, 응용 프로그램이 올바르게 실행되도록 관리하는 역할을 수행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;872&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oeNfu/btrX32NHnle/dfiZ0qVBYzGGKYuQrs8xI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oeNfu/btrX32NHnle/dfiZ0qVBYzGGKYuQrs8xI1/img.png&quot; data-alt=&quot;중요하다 중요해  &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oeNfu/btrX32NHnle/dfiZ0qVBYzGGKYuQrs8xI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoeNfu%2FbtrX32NHnle%2FdfiZ0qVBYzGGKYuQrs8xI1%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;600&quot; height=&quot;417&quot; data-origin-width=&quot;1254&quot; data-origin-height=&quot;872&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;중요하다 중요해  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;운영체제를 알아야 하는 이유&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하드웨어를 조작하는 코드를 직접 개발해야한다!! ➡️ 으악!!  &lt;/li&gt;
&lt;li&gt;운영체제는 사용자를 위한 프로그램이 아니다. ➡️ 프로그램을 위한 프로그램  &lt;/li&gt;
&lt;li&gt;프로그램을 만드는 개발자는 운영체제를 알아야 한다.&lt;/li&gt;
&lt;li&gt;문제 해결 능력과 관련 : 개발자가 작성한 프로그램이 하드웨어 상에서 어떻게 작동하는지를 파악하는 것은 운영체제 ➡️ 운영체제를 이해함으로써 하드웨어와 프로그램을 더 깊이 이해할 수 있다.&lt;/li&gt;
&lt;li&gt;운영체제가 알려주는 오류 메세지에 대한 깊은 이해 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1269&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhkTwh/btrYdiOSgZ6/f64WDkkshLp77p9cVFkQu0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhkTwh/btrYdiOSgZ6/f64WDkkshLp77p9cVFkQu0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhkTwh/btrYdiOSgZ6/f64WDkkshLp77p9cVFkQu0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhkTwh%2FbtrYdiOSgZ6%2Ff64WDkkshLp77p9cVFkQu0%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;600&quot; height=&quot;301&quot; data-origin-width=&quot;1269&quot; data-origin-height=&quot;636&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;h4 data-ke-size=&quot;size20&quot;&gt;09-2 운영체제의 큰 그림&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;커널&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제는 현존하는 프로그램 중 규모가 가장 큰 프로그램 중 하나&lt;/li&gt;
&lt;li&gt;운영체제가 제공하는 가장 핵심적인 서비스 : 자원에 접근하고 조작하는 기능, 프로그램이 올바르고 안전하게 실행되게 하는 기능&lt;/li&gt;
&lt;li&gt;운영체제의 핵심 서비스를 담당하는 부분을 &lt;b&gt;커널&lt;/b&gt;이라고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅ 운영체제에는 속하는데 커널에는 속하지 않는 기능? ➡️ 유저 인터페이스 (UI; User Interface) &lt;br /&gt;사용자와 컴퓨터 간의 통로일 뿐 운영체제의 핵심 기능(커널)은 아님&lt;/blockquote&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cUiCbs/btrX33skzPg/MLyUJcQ2Pu7vSJLWP866ek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cUiCbs/btrX33skzPg/MLyUJcQ2Pu7vSJLWP866ek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cUiCbs/btrX33skzPg/MLyUJcQ2Pu7vSJLWP866ek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcUiCbs%2FbtrX33skzPg%2FMLyUJcQ2Pu7vSJLWP866ek%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;600&quot; height=&quot;278&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;이중 모드&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식&lt;/li&gt;
&lt;li&gt;사용자 모드
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;운영체제 서비스를 제공받을 수 없는 실행 모드&lt;/li&gt;
&lt;li&gt;커널 영역의 코드를 실행할 수 없는 실행 모드&lt;/li&gt;
&lt;li&gt;자원 접근 불가&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;커널 모드
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;운영체제의 서비스를 제공받을 수 있는 실행 모드&lt;/li&gt;
&lt;li&gt;자원 접근을 비롯한 모든 명령어 실행 가능&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅ 플래그 참조 : 슈퍼바이저 플래그 (&lt;a href=&quot;https://goming0925.tistory.com/16&quot; target=&quot;_self&quot;&gt;&lt;span&gt;https://goming0925.tistory.com/16)&lt;/span&gt;&lt;/a&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;시스템 호출&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제 서비스를 제공받기 위해 커널 모드로 전환하여 실행하기 위해 호출&lt;/li&gt;
&lt;li&gt;일종의 소프트웨어 인터럽트&lt;/li&gt;
&lt;li&gt;시스템 호출이 처리되는 방식은 하드웨어 인터럽트 처리 방식과 유사하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;512&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bjVPWv/btrX30IYmfJ/u92SdMU7sbwH968C8l3KZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bjVPWv/btrX30IYmfJ/u92SdMU7sbwH968C8l3KZ0/img.png&quot; data-alt=&quot;커널 모드로 바꾸는 방법은 DM으로...  &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bjVPWv/btrX30IYmfJ/u92SdMU7sbwH968C8l3KZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbjVPWv%2FbtrX30IYmfJ%2Fu92SdMU7sbwH968C8l3KZ0%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;600&quot; height=&quot;240&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;512&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;커널 모드로 바꾸는 방법은 DM으로...  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;운영체제의 핵심 서비스&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&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;/li&gt;
&lt;li&gt;수많은 프로세스들이 동시에 실행된다.&lt;/li&gt;
&lt;li&gt;윈도우에서 작업 관리자에 출력되는 프로세스!&lt;/li&gt;
&lt;li&gt;프로세스마다 상태, 상황, 사용하고자 하는 자원이 다르다.&lt;/li&gt;
&lt;li&gt;동시다발적으로 생성/실행/삭제되는 다양한 프로세스를 일목요연하게 관리한다. ➡️&amp;nbsp;프로세스와 스레드, 프로세스 동기화, 교착상태 해결&lt;/li&gt;
&lt;/ul&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;CPU (CPU 스케줄링 : 어떤 프로세스를 먼저, 얼마나 오래 실행할까?)&lt;/li&gt;
&lt;li&gt;메모리 (페이징, 스와핑, &amp;hellip;)&lt;/li&gt;
&lt;li&gt;입출력장치&lt;/li&gt;
&lt;/ul&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;/li&gt;
&lt;li&gt;파일들을 묶어 폴더(디렉터리) 단위로 저장 장치에 보관&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅ 운영체제의 어떤 기법에 의해서 모든 프로세스가 메모리에 올라와 있지 않을 수도 있다?! ➡️ 페이징, 스와핑&lt;/blockquote&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;  프로세스와 스레드&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;10-1 프로세스 개요&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행 중인 프로그램&lt;/li&gt;
&lt;li&gt;보조기억장치에 저장된 프로그램을 메모리에 적재하고 실행하는 과정 : &amp;lsquo;프로세스 생성 과정&amp;rsquo;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포그라운드 프로세스 (foreground process)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 볼 수 있는 공간에서 실행되는 프로세스&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;백그라운드 프로세스 (background process)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자가 볼 수 없는 공간에서 실행되는 프로세스&lt;/li&gt;
&lt;li&gt;사용자와 직접 상호작용이 가능한 백그라운드 프로세스&lt;/li&gt;
&lt;li&gt;사용자와 상호작용하지 않고 그저 정해진 일만 수행하는 프로세스 : 데몬(daemon), 서비스(service)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스 제어 블록&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 프로세스는 실행을 위해 CPU가 필요하다. 하지만 CPU의 자원은 한정되어있다.&lt;/li&gt;
&lt;li&gt;프로세스들은 돌아가며 한정된 시간 만큼만 CPU 이용
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;자신의 차례에 정해진 시간만큼 CPU 이용한다.&lt;/li&gt;
&lt;li&gt;타이머 인터럽트가 발생하면 차례를 양보한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;빠르게 번갈아 수행되는 프로세스들을 관리하기 위해 사용되는 자료구조가 프로세스 제어 블록 (이하 PCB)
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;프로세스 관련 정보를 저장하는 자료 구조&lt;/li&gt;
&lt;li&gt;마치 상품에 달린 태그와 같은 정보&lt;/li&gt;
&lt;li&gt;프로세스 생성 시 커널 영역에 생성, 종료 시 폐기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIgtXU/btrX4ZDy0Ea/8KitXuEsF3bgsSX5aH2bW1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIgtXU/btrX4ZDy0Ea/8KitXuEsF3bgsSX5aH2bW1/img.png&quot; data-alt=&quot;프로세스의 태그 PCB, 이거 떼면 반품 못해요?  &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIgtXU/btrX4ZDy0Ea/8KitXuEsF3bgsSX5aH2bW1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIgtXU%2FbtrX4ZDy0Ea%2F8KitXuEsF3bgsSX5aH2bW1%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;490&quot; height=&quot;350&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로세스의 태그 PCB, 이거 떼면 반품 못해요?  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PCB에 담기는 대표적인 정보 (운영체제마다 차이가 있음)
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;프로세스 ID (=PID)&lt;/li&gt;
&lt;li&gt;레지스터 값&lt;/li&gt;
&lt;li&gt;프로세스 상태&lt;/li&gt;
&lt;li&gt;CPU 스케줄링 정보&lt;/li&gt;
&lt;li&gt;메모리 정보&lt;/li&gt;
&lt;li&gt;사용한 파일과 입출력장치 정보&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스 ID&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;특정 프로세스를 식별하기 위해 부여하는 고유한 번호 (학교의 학번, 회사의 사번)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;레지스터 값&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;프로그램 카운터, 스택 포인터 &amp;hellip; 등&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스 상태&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입출력 장치를 사용하기 위해 기다리는 상태&lt;/li&gt;
&lt;li&gt;CPU를 사용하기 위해 기다리는 상태&lt;/li&gt;
&lt;li&gt;CPU를 이용 중인 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU 스케줄링 정보&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스가 언제, 어떤 순서로 CPU를 할당받을지에 대한 정보&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 관리 정보&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스가 어느 주소에 저장되어 있는지에 대한 정보&lt;/li&gt;
&lt;li&gt;페이지 테이블 정보 (지금으로서는 &amp;lsquo;메모리 주소를 알 수 있는 정보가 담기는구나&amp;rsquo; 라고 이해)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용한 파일과 입출력장치 정보&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;할당된 입출력장치, 사용 중인(열린) 파일의 정보&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문맥 교환 (Context switching)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 프로세스 (예시 : 프로세스 A)에서 다른 프로세스 (예시 : 프로세스B)로 실행 순서가 넘어가면 어떤 작업이 이루어지는지?&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;기존에 실행되던 프로세스 A는 지금까지의 중간 정보를 백업해야한다.&lt;/li&gt;
&lt;li&gt;뒤이어 실행할 프로세스 B의 문맥을 복구 ➡️ 자연스럽게 실행 중인 프로세스가 바뀜&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이처럼 기존의 실행 중인 프로세스 문맥을 백업하고, 새로운 프로세스 실행을 위해 문맥을 복구하는 과정을 &lt;b&gt;문맥 교환(context switching)&lt;/b&gt; 이라 한다.&lt;/li&gt;
&lt;li&gt;여러 프로세스가 끊임없이 빠르게 번갈아 가며 실행되는 원리이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;831&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/crX9wL/btrX9GJ3Itj/qrZRYxxzHkZCB27KYxtWo0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/crX9wL/btrX9GJ3Itj/qrZRYxxzHkZCB27KYxtWo0/img.png&quot; data-alt=&quot;프로세스를 번갈아가며 실행할때 발생하는 문맥 교환&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/crX9wL/btrX9GJ3Itj/qrZRYxxzHkZCB27KYxtWo0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcrX9wL%2FbtrX9GJ3Itj%2FqrZRYxxzHkZCB27KYxtWo0%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;600&quot; height=&quot;552&quot; data-origin-width=&quot;904&quot; data-origin-height=&quot;831&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;프로세스를 번갈아가며 실행할때 발생하는 문맥 교환&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;문맥(context)&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;이러한 중간 정보를 문맥(context)라고 한다.&lt;/li&gt;
&lt;li&gt;다음 차례가 왔을 때 실행을 재개하기 위한 정보이다.&lt;/li&gt;
&lt;li&gt;실행 문맥을 백업해두면 언제든 해당 프로세스의 실행을 재개할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅ PCB는 커널영역에서 프로세스를 관리하기 위한 자료 구조 ➡️ 사용자 영역에서는?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;프로세스의 메모리 영역&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 영역에 저장되는 프로세스는 크게 코드 영역 (=텍스트 영역), 데이터 영역, 힙 영역, 스택 영역 4개이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;741&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c7AZ5d/btrX8iWLOXM/RjfU41UkLBKLA3HtYf3o0k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c7AZ5d/btrX8iWLOXM/RjfU41UkLBKLA3HtYf3o0k/img.png&quot; data-alt=&quot;저는 데이터 영역이랑 코드 영역을 건드리는 미천한 나무늘보...  &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c7AZ5d/btrX8iWLOXM/RjfU41UkLBKLA3HtYf3o0k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc7AZ5d%2FbtrX8iWLOXM%2FRjfU41UkLBKLA3HtYf3o0k%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;600&quot; height=&quot;438&quot; data-origin-width=&quot;1016&quot; data-origin-height=&quot;741&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;저는 데이터 영역이랑 코드 영역을 건드리는 미천한 나무늘보...  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;코드 영역 (= 텍스트 영역)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행할 수 있는 코드, 기계어로 이루어진 명령어 저장&lt;/li&gt;
&lt;li&gt;데이터가 아닌 CPU가 실행할 명령어가 담기기에 쓰기가 금지된 영역 (일반적으로 read-only)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;데이터 영역&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;잠깐 썼다가 없앨 데이터가 아닌 프로그램이 실행되는 동안 유지할 데이터 저장&lt;/li&gt;
&lt;li&gt;예시 : 전역 변수&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;힙 영역&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램을 만드는 사용자, 즉 프로그래머가 직접 할당할 수 있는 저장공간&lt;/li&gt;
&lt;li&gt;프로그래밍에서 메모리 공간을 힙 영역으로 할당했다면 다시 반환되어야 함 ➡️ 프로그래밍 언어가 알아서 해주는 경우가 있음 : 가비지 컬렉션&lt;/li&gt;
&lt;li&gt;메모리 공간을 반환하지 않는다면 메모리 내에 계속 남아 메모리 낭비를 초래 ➡️메모리 누수 (Memory leak)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;스택 영역&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터가 일시적으로 저장되는 공간&lt;/li&gt;
&lt;li&gt;(데이터 영역에 담기는 값과는 달리) 잠깐 쓰다가 마는 값들이 저장되는 공간&lt;/li&gt;
&lt;li&gt;예시 : 매개 변수, 지역 변수&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅ 정적 할당 영역 : 코드 영역과 데이터 영역은 크기가 변하지 않는다. 그래서 코드 영역과 데이터 영역을 &amp;lsquo;크기가 고정된 영역&amp;rsquo;이라는 점에서 정적 할당 영역이라고도 부른다.&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅ 동적 할당 영역 : 힙 영역과 스택 영역은 프로세스 실행 과정에서 그 크기가 변할 수 있는 영역이다.&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅ 일반적으로 힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당하고 &lt;br /&gt;스택 영역은 메모리의 높은 주소에서 낮은 주소로 할당하여 데이터가 쌓여도 할당되는 주소가 겹칠 일이 없게 한다.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;600&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BwGu8/btrX8jaozAC/bE3kcalhcH2AGKQzkBVaB1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BwGu8/btrX8jaozAC/bE3kcalhcH2AGKQzkBVaB1/img.png&quot; data-alt=&quot;힙 영역과 스택 영역의 메모리 주소가 겹치지 않게 한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BwGu8/btrX8jaozAC/bE3kcalhcH2AGKQzkBVaB1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBwGu8%2FbtrX8jaozAC%2FbE3kcalhcH2AGKQzkBVaB1%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;600&quot; height=&quot;551&quot; data-origin-width=&quot;653&quot; data-origin-height=&quot;600&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;힙 영역과 스택 영역의 메모리 주소가 겹치지 않게 한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;10-2 프로세스 상태와 계층 구조&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스 상태&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대부분의 운영체제에서 사용하는 프로세스 상태 (차이가 있을 수 있음)&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;생성 상태 (new)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이제 막 메모리에 적재되어 PCB를 할당 받은 상태&lt;/li&gt;
&lt;li&gt;준비가 완료되었다면 준비 상태로 변경한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;준비 상태 (ready)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;당장이라도 CPU를 할당 받아 실행할 수 있지만 자신의 차례가 아니기에 기다리는 상태&lt;/li&gt;
&lt;li&gt;자신의 차례가 된다면 실행 상태로 변경한다. (=디스패치)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;실행 상태 (running)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU를 할당 받아 실행 중인 상태&lt;/li&gt;
&lt;li&gt;할당된 시간을 모두 사용 시 (타이머 인터럽트 발생 시) 준비 상태로 되돌아감&lt;/li&gt;
&lt;li&gt;실행 도중 입출력장치를 사용하면 입출력 작업이 끝날 때까지 대기 상태로 변경됨 (입출력 인터럽트를 받을 때까지)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;대기 상태 (blocked)
&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;입출력 작업은 CPU에 비해 느리기에 이 경우 대기 상태로 접어듬&lt;/li&gt;
&lt;li&gt;입출력 작업이 끝나면 (입출력 완료 인터럽트를 받으면) 준비 상태로 되돌아감&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;종료 상태 (terminated)
&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;PCB, 프로세스의 메모리 영역 정리&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스 상태 다이어그램&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cMzfkJ/btrYiVTGeZA/3AK67vBaQgQMrDLj7aKbL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cMzfkJ/btrYiVTGeZA/3AK67vBaQgQMrDLj7aKbL0/img.png&quot; data-alt=&quot;아주 중요함  &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cMzfkJ/btrYiVTGeZA/3AK67vBaQgQMrDLj7aKbL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcMzfkJ%2FbtrYiVTGeZA%2F3AK67vBaQgQMrDLj7aKbL0%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;600&quot; height=&quot;298&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;아주 중요함  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;프로세스 계층 구조&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로스 실행 도중 (시스템 호출을 통해) 다른 프로세스 생성 가능&lt;/li&gt;
&lt;li&gt;새 프로세스를 생성한 프로세스 : 부모 프로세스&lt;/li&gt;
&lt;li&gt;부모 프로세스에 의해 생성된 프로세스 : 자식 프로세스&lt;/li&gt;
&lt;li&gt;부모 프로세스와 자식 프로세스는 별개의 프로세스이므로 각기 다른 PID를 가짐&lt;/li&gt;
&lt;li&gt;일부 운영체제에서는 자식 프로세스 PCB에 부모 프로세스 PID(PPID)를 명시하기도 한다.&lt;/li&gt;
&lt;li&gt;자식 프로세스는 또 다른 자식 프로세스를 낳을 수 있다. (반복) ➡️ 프로세스의 계층적인 구조 생성&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;618&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wPkZe/btrX7YdcOax/HmEWbCF8e2xgEMCWKXgeWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wPkZe/btrX7YdcOax/HmEWbCF8e2xgEMCWKXgeWk/img.png&quot; data-alt=&quot;최초의 프로세스로부터 계층적으로 구성된 프로세스 예시&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wPkZe/btrX7YdcOax/HmEWbCF8e2xgEMCWKXgeWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwPkZe%2FbtrX7YdcOax%2FHmEWbCF8e2xgEMCWKXgeWk%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;600&quot; height=&quot;290&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;618&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;최초의 프로세스로부터 계층적으로 구성된 프로세스 예시&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅ 데몬이나 서비스 또한 최초 프로세스의 자식 프로세스이다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;프로세스 생성 기법 (Windows 운영체제와는 큰 관련이 없다)&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;부모 프로세스는 fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로 생성&lt;/li&gt;
&lt;li&gt;자식 프로세스는 exec 시스템 호출을 통해 자신의 메모리 공간을 다른 프로그램으로 교체&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fork 시스템 호출&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;fork 시스템 호출을 통해 자신의 복사본을 자식 프로세스로써 생성한다.&lt;/li&gt;
&lt;li&gt;복사본( =자식 프로세스) 생성 (엄연히 다른 프로세스이기에 PID가 다름)&lt;/li&gt;
&lt;li&gt;부모 프로세스의 자원 상속&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;1013&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b8ucMH/btrX4jPImh4/TPJ8bB9qTvxfoGPyrwc3wK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b8ucMH/btrX4jPImh4/TPJ8bB9qTvxfoGPyrwc3wK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b8ucMH/btrX4jPImh4/TPJ8bB9qTvxfoGPyrwc3wK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb8ucMH%2FbtrX4jPImh4%2FTPJ8bB9qTvxfoGPyrwc3wK%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;600&quot; height=&quot;501&quot; data-origin-width=&quot;1214&quot; data-origin-height=&quot;1013&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;exec 시스템 호출&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리 공간을 새로운 프로그램으로 덮어쓰기&lt;/li&gt;
&lt;li&gt;코드/데이터 영역은 실행할 프로그램 내용으로 바뀌고 나머지 영역은 초기화&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;440&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwV2bF/btrYidUqThV/288kSHykDBOGmDDlLdKbZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwV2bF/btrYidUqThV/288kSHykDBOGmDDlLdKbZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwV2bF/btrYidUqThV/288kSHykDBOGmDDlLdKbZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwV2bF%2FbtrYidUqThV%2F288kSHykDBOGmDDlLdKbZ1%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;600&quot; height=&quot;206&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;440&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;h4 data-ke-size=&quot;size20&quot;&gt;10-3 스레드&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스레드&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스레드(thread)는 프로세스를 구성하는 실행 흐름의 단위&lt;/li&gt;
&lt;li&gt;하나의 프로세스는 하나 이상의 스레드를 가질 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅ 단일 스레드 프로세스 : 실행의 흐름 단위가 하나인 프로세스&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅ 멀티 스레드 프로세스 : 실행 흐름이 여러 개인 프로세스 ➡️ 프로세스를 이루는 여러 명령어를 동시 실행 가능&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;스레드의 구성 요소&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스레드ID, 프로그램 카운터를 비롯한 레지스터 값, 스택 등&lt;/li&gt;
&lt;li&gt;실행에 필요한 최소한의 정보를 가지고 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;918&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ATSm9/btrYf018blc/rt3Tb9vbKXkuHVKPc62AKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ATSm9/btrYf018blc/rt3Tb9vbKXkuHVKPc62AKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ATSm9/btrYf018blc/rt3Tb9vbKXkuHVKPc62AKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FATSm9%2FbtrYf018blc%2Frt3Tb9vbKXkuHVKPc62AKK%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;600&quot; height=&quot;571&quot; data-origin-width=&quot;965&quot; data-origin-height=&quot;918&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행에 필요한 최소한의 정보를 가지고 있지만 프로세스의 자원을 공유한다.&lt;/li&gt;
&lt;li&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;style3&quot;&gt;✅ 프로세스가 실행되는 프로그램이라면, 스레드는 프로세스를 구성하는 실행의 흐름 단위 &lt;br /&gt;➡️ 실제로 최근 많은 운영체제에서 CPU에 처리할 작업을 전달할 때 프로세스가 아닌 스레드 단위로 전달한다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;멀티 프로세스와 멀티 스레드&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;동일한 작업을 수행하는 : 단일 스레드 프로세스 여러개 vs 하나의 프로세스를 여러 스레드로 실행&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1010&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/z1F9i/btrX6obXWIX/wY5hJO4KKlbAuEXYDAd5B1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/z1F9i/btrX6obXWIX/wY5hJO4KKlbAuEXYDAd5B1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/z1F9i/btrX6obXWIX/wY5hJO4KKlbAuEXYDAd5B1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fz1F9i%2FbtrX6obXWIX%2FwY5hJO4KKlbAuEXYDAd5B1%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;600&quot; height=&quot;473&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;1010&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;둘 다 결과적으로 3번의 실행이 발생하지만 큰 차이가 있다.&lt;/li&gt;
&lt;li&gt;프로세스끼리는 기본적으로 자원을 공유하지 않음 vs 스레드끼리는 같은 프로세스 내의 자원을 공유함&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;멀티 프로세스의 경우&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스를 fork 할 경우 코드/데이터/힙 영역 등 모든 자원이 복제되어 저장됨&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;blockquote data-ke-style=&quot;style3&quot;&gt;✅ 프로세스 간에도 자원을 주고 받을 수 있다. : 프로세스 간 통신 (IPC) &lt;br /&gt;파일을 통한 프로세스 간 통신, 공유 메모리를 통한 프로세스 간 통신 등이 존재함&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;멀티 스레드의 경우&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스레드들은 각기 다른 스레드 ID, (별도의 실행을 위해 꼭 필요한) 프로그램 카운터 값을 포함한 레지스터 값, 스택을 가질 뿐 프로세스가 가지는 &lt;b&gt;자원을 공유&lt;/b&gt;한다.&lt;/li&gt;
&lt;li&gt;자원을 공유한다. ➡️ 협력과 통신에 유리하다. ➡️ 공유되는 자원으로 문제가 될 수도 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1️⃣1️⃣ CPU 스케줄링&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;11-1 CPU 스케줄링 개요&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU 스케줄링&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제가 프로세스들에게 공정하고 합리적으로 CPU 자원을 배분하는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 공정한 CPU 스케줄링?&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;s&gt;CPU를 사용하고 싶어하는 프로세스들이 차례로 돌아가면서 사용&lt;/s&gt;&lt;/li&gt;
&lt;li&gt;빠르게 처리 되어야 하는 프로세스가 존재한다 (= 프로세스마다 우선순위가 다르다)&lt;/li&gt;
&lt;li&gt;입출력 작업이 많은 프로세스 (= 입출력 집중 프로세스)의 우선순위는 CPU 작업이 많은 프로세스 (= CPU 집중 프로세스)의 우선순위보다 높다.&lt;/li&gt;
&lt;li&gt;입출력 집중 프로세스는 대기 상태가 많기 때문에 먼저 처리하고 대기 상태일때 CPU 집중 프로세스를 처리하면 효율적이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅ 입출력 집중 프로세스 : I/O bound process, CPU 집중 프로세스 : CPU bound process&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;프로세스 우선순위(priority)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PCB에 적힌 우선순위를 기준으로 먼저 처리할 프로세스를 결정한다.&lt;/li&gt;
&lt;li&gt;자연스럽게 우선순위가 높은 프로세스는 더 빨리, 더 자주 실행된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;스케줄링 큐&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;매번 모든 프로세스의 PCB를 검색해서 우선순위를 확인하는 것은 비효율적이다.&lt;/li&gt;
&lt;li&gt;CPU 스케줄링 큐에 프로세스들을 줄 세워둔다.&lt;/li&gt;
&lt;li&gt;스케줄링에서의 큐는 반드시 FIFO(선입선출) 방식일 필요는 없다. (중간에 추가되고 바뀔 수도 있으니)&lt;/li&gt;
&lt;li&gt;같은 큐 내에서도 우선순위에 따라 처리 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1213&quot; data-origin-height=&quot;789&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d64WFA/btrYiUU3Nk0/VxgIp5CgRaWRLklIX1AKa1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d64WFA/btrYiUU3Nk0/VxgIp5CgRaWRLklIX1AKa1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d64WFA/btrYiUU3Nk0/VxgIp5CgRaWRLklIX1AKa1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd64WFA%2FbtrYiUU3Nk0%2FVxgIp5CgRaWRLklIX1AKa1%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;600&quot; height=&quot;390&quot; data-origin-width=&quot;1213&quot; data-origin-height=&quot;789&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;준비 큐&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU를 이용하기 위해 기다리는 줄&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대기 큐&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입출력장치를 이용하기 위해 기다리는 줄&lt;/li&gt;
&lt;li&gt;입출력장치별로 큐가 존재하여 같은 장치를 요구한 프로세스들을 같은 큐로 묶어서 대기&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;선점형 스케줄링 (preemptive scheduling)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스가 CPU를 비롯한 자원을 사용하고 있더라도 운영체제가 프로세스로부터 자원을 강제로 빼앗아 다른 프로세스에게 할당할 수 있는 스케줄링 방식&lt;/li&gt;
&lt;li&gt;장점 : 어느 하나의 프로세스가 자원 사용을 독점을 막고 프로세스들에 골고루 자원을 배분할 수 있다.&lt;/li&gt;
&lt;li&gt;단점 : 그만큼 문맥 교환 과정에서 오버헤드가 발생할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비선점형 스케줄링 (non-preemptive scheduling)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하나의 프로세스가 자원을 사용하고 있다면 그 프로세스가 종료되거나 스스로 대기 상태에 접어들기 전까지 다른 프로세스가 끼어들 수 없는 스케줄링&lt;/li&gt;
&lt;li&gt;장점 : 문맥 교환에서 발생하는 오버헤드가 선점형 스케줄링보다 적다.&lt;/li&gt;
&lt;li&gt;단점 : 모든 프로세스가 골고루 자원을 이용하기 어렵다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span id=&quot;4주차선택&quot;&gt;&lt;/span&gt;11-2 CPU 스케줄링 알고리즘&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU 스케줄링 알고리즘은 다양하고 운영체제마다 다르다.&lt;br /&gt;&lt;br /&gt;CPU 스케줄링의 종류 (일반적인 전공서 기준의 기본)&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;선입 선처리 스케줄링&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;/li&gt;
&lt;li&gt;다단계 큐 스케줄링&lt;/li&gt;
&lt;li&gt;다단계 피드백 큐 스케줄링&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;선입 선처리 스케줄링&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;FCFS (First Come First Served) 스케줄링&lt;/li&gt;
&lt;li&gt;단순히 준비 큐에 삽입된 순서대로 처리하는 비선점 스케줄링&lt;/li&gt;
&lt;li&gt;먼저 CPU를 요청한 프로세스부터 CPU 할당&lt;/li&gt;
&lt;li&gt;단점 : 프로세스들이 기다리는 시간이 매우 길어질 수 있다는 부작용 (=호위 효과)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;최단 작업 우선 스케줄링&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SJF (Shortest Job First) 스케줄링&lt;/li&gt;
&lt;li&gt;선입 선처리 스케줄링에서 호위 효과를 방지하는 스케줄링&lt;/li&gt;
&lt;li&gt;CPU 사용이 긴 프로세스는 나중에 실행, CPU 사용 시간이 짧은 프로세스는 먼저 실행&lt;/li&gt;
&lt;li&gt;CPU 사용 시간이 가장 짧은 프로세스부터 처리하는 스케줄링 방식&lt;/li&gt;
&lt;li&gt;선점형/비선점형으로 구현될 수 있고 기본적으론 비선점형으로 분류됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;라운드 로빈 스케줄링&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RR (Round Robin) 스케줄링&lt;/li&gt;
&lt;li&gt;선입 선처리 스케줄링 + 타임 슬라이스 (time slice)&lt;/li&gt;
&lt;li&gt;타임 슬라이스 : 각 프로세스가 CPU를 사용할 수 있는 정해진 시간&lt;/li&gt;
&lt;li&gt;정해진 타임 슬라이스만큼의 시간 동안 돌아가며 CPU를 이용하는 선점형 스케줄링
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;큐에 삽입된 프로세스들은 순서대로 CPU를 이용하되 정해진 시간만큼만 이용한다.&lt;/li&gt;
&lt;li&gt;정해진 시간을 모두 사용하였음에도 아직 프로세스가 완료되지 않았다면 다시 큐의 맨 뒤에 삽입 (문맥교환)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;타임 슬라이스의 크기가 중요하다. (너무 크면 선입 선처리 스케줄링과 다를 바가 없고, 너무 작으면 문맥 교환에 발생하는 비용이 커진다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;최소 잔여 시간 우선 스케줄링&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;SRT (Shortest Remaining Time) 스케줄링&lt;/li&gt;
&lt;li&gt;최단 작업 우선 스케줄링 + 라운드 로빈 스케줄링&lt;/li&gt;
&lt;li&gt;최단 작업 우선 스케줄링 : 작업 시간이 짧은 프로세스부터 처리하는 스케줄링 알고리즘&lt;/li&gt;
&lt;li&gt;라운드 로빈 스케줄링 : 정해진 타임 슬라이스만큼 돌아가며 사용하는 스케줄링 알고리즘&lt;/li&gt;
&lt;li&gt;정해진 시간만큼 CPU를 이용하되, 다음으로 CPU를 사용할 프로세스는 남은 작업 시간이 가장 적은 프로세스로 선택한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;우선순위 스케줄링&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스들에 우선순위를 부여하고, 우선순위 높은 프로세스부터 실행&lt;/li&gt;
&lt;li&gt;우선순위가 같은 프로세스들은 선입 선처리로 스케줄링&lt;/li&gt;
&lt;li&gt;최단 작업 우선 스케줄링, 최소 잔여 시간 스케줄링은 넓은 의미에서 우선순위 스케줄링에 일종이다.&lt;/li&gt;
&lt;li&gt;우선순위 스케줄링의 근본적인 문제점, 기아(starvation) 현상&lt;/li&gt;
&lt;li&gt;우선순위 높은 프로세스만 주구장창 실행&lt;/li&gt;
&lt;li&gt;우선순위 낮은 프로세스는 (준비 큐에 먼저 삽입되었음에도 불구하고) 실행 연기&lt;/li&gt;
&lt;li&gt;기아현상을 방지하기 위한 기법 : 에이징(aging)&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;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;다단계 큐 스케줄링&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Multilevel queue 스케줄링&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;/li&gt;
&lt;li&gt;다단계 큐 스케줄링에서는 기본적으로 큐 간의 이동이 불가하다.&lt;/li&gt;
&lt;li&gt;우선순위가 낮은 프로세스는 계속해서 실행이 연기 될 수 있다.&lt;/li&gt;
&lt;li&gt;준비 큐 간에 이동이 불가능하기 때문에 기아현상이 발생할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅ 프로세스 유형별로 우선순위를 구분하여 실행하는 것이 편리해진다. ➡️ 준비 큐별로 스케줄링 방식을 다양하게 적용할 수 있다.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;다단계 피드백 큐 스케줄링&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Multilevel feedback queue 스케줄링&lt;/li&gt;
&lt;li&gt;다단계 큐 스케줄링의 발전된 형태&lt;/li&gt;
&lt;li&gt;큐 간의 이동이 가능한 다단계 큐 스케줄링&lt;/li&gt;
&lt;li&gt;자연스럽게 CPU 집중 프로세스의 우선순위가 상대적으로 낮아지고 입출력 집중 프로세스의 우선순위는 상대적으로 높아진다.&lt;/li&gt;
&lt;li&gt;타임슬라이스에서 CPU 작업이 끝나지 않으면(CPU 작업이 많으면 = CPU 집중 프로세스) 다음 우선순위 큐로 이동&amp;hellip;&lt;/li&gt;
&lt;li&gt;다단계 피드백 큐 스케줄링에서도 에이징 기법을 적용할 수 있다.&lt;/li&gt;
&lt;li&gt;어떤 프로세스의 CPU 시간이 길면 우선순위가 낮아지고, 어떤 프로세스가 낮은 우선순위 큐에서 너무 오래 기다리면 우선순위를 높이는 방식&lt;/li&gt;
&lt;li&gt;가장 일반적인 CPU 스케줄링 방식으로 알려져있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLWHNz/btrYhbv3Ndm/YZGw5D3kNFyUAXB6ARpI70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLWHNz/btrYhbv3Ndm/YZGw5D3kNFyUAXB6ARpI70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLWHNz/btrYhbv3Ndm/YZGw5D3kNFyUAXB6ARpI70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLWHNz%2FbtrYhbv3Ndm%2FYZGw5D3kNFyUAXB6ARpI70%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;600&quot; height=&quot;332&quot; data-origin-width=&quot;1150&quot; data-origin-height=&quot;636&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>혼공컴운</category>
      <category>혼공</category>
      <category>혼공컴운</category>
      <category>혼공학습단</category>
      <author>고밍고밍</author>
      <guid isPermaLink="true">https://goming0925.tistory.com/18</guid>
      <comments>https://goming0925.tistory.com/18#entry18comment</comments>
      <pubDate>Sun, 5 Feb 2023 23:15:00 +0900</pubDate>
    </item>
    <item>
      <title>혼자 공부하는 컴퓨터 구조+운영체제 3주차 (6~8)</title>
      <link>https://goming0925.tistory.com/17</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-01-08 오후 10.24.48.png&quot; data-origin-width=&quot;2002&quot; data-origin-height=&quot;1252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vRVeZ/btrW76BJsSF/TnVIeAH4F40gArSawoAj51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vRVeZ/btrW76BJsSF/TnVIeAH4F40gArSawoAj51/img.png&quot; data-alt=&quot;커리큘럼  &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vRVeZ/btrW76BJsSF/TnVIeAH4F40gArSawoAj51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvRVeZ%2FbtrW76BJsSF%2FTnVIeAH4F40gArSawoAj51%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;2002&quot; height=&quot;1252&quot; data-filename=&quot;스크린샷 2023-01-08 오후 10.24.48.png&quot; data-origin-width=&quot;2002&quot; data-origin-height=&quot;1252&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;커리큘럼  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style7&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;  기본 미션1&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;p.185, 확인 문제 3번 ) 다음 설명을 읽고 SRAM에 대한 설명인지 DRAM에 대한 설명인지 쓰세요.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;보기 : SRAM, DRAM&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;① 주로 캐시 메모리로 활용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;② 주로 주기억장치로 활용됩니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;③ 대용량화하기 유리합니다.&lt;/p&gt;
&lt;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;① = SRAM&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;② = DRAM&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;③ = DRAM&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;④ = SRAM&lt;/p&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;p.205, 확인 문제 1번 ) 다음 보기에 있는 저장 장치들로 저장 장치 계층 구조 도식도를 채우세요.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;보기 : 메모리, 보조기억장치, 캐시 메모리, 레지스터&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2023-01-24 오후 11.23.54.png&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/esnEZS/btrWUcKLVpT/KEpyvybhCwf2EfHThgXTE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/esnEZS/btrWUcKLVpT/KEpyvybhCwf2EfHThgXTE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/esnEZS/btrWUcKLVpT/KEpyvybhCwf2EfHThgXTE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FesnEZS%2FbtrWUcKLVpT%2FKEpyvybhCwf2EfHThgXTE1%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;300&quot; height=&quot;257&quot; data-filename=&quot;스크린샷 2023-01-24 오후 11.23.54.png&quot; data-origin-width=&quot;414&quot; data-origin-height=&quot;355&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;③ = 메모리&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;RAID의 정의와 종류를 간단히 정리해보기&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&gt;&lt;a href=&quot;#3주차선택&quot;&gt;문서내 위치로 이동&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 6️⃣&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;06-1 RAM의 특징과 종류&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAM&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행할 프로그램의 명령어와 데이터가 저장됨&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;휘발성 저장 장치&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;RAM이 대표적이다.&lt;/li&gt;
&lt;li&gt;CPU가 &amp;lsquo;실행할 대상&amp;rsquo;을 저장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비 휘발성 저장 장치&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전원이 꺼져도 저장된 내용이 유지되는 저장 장치&lt;/li&gt;
&lt;li&gt;하드 디스크, SSD, CD-ROM, USB 메모리 등이 있다.&lt;/li&gt;
&lt;li&gt;CPU가 직접 접근하지 못한다.&lt;/li&gt;
&lt;li&gt;작업 결과물과 같은 &amp;lsquo;보관할 대상&amp;rsquo;을 저장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅&amp;nbsp;RAM 용량이 크다면 CPU가 실행하고자 하는 프로그램을 RAM에 많이 저장 할 수 있으며, 보조 기억장치로의 접근이 최소화 되어 시간을 절약할 수 있다.&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;DRAM (Dynamic RAM)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;저장된 데이터가 동적으로 사라지는 RAM&lt;/li&gt;
&lt;li&gt;데이터 소멸을 막기 위해 주기적으로 재활성화 해야한다.&lt;/li&gt;
&lt;li&gt;일반적으로 메모리로써 사용하는 RAM&lt;/li&gt;
&lt;li&gt;소비 전력이 비교적 낮고, 용량 대비 저렴, 집적도가 높다&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅&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;SRAM (Static RAM)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;저장된 데이터가 정적인 (사라지지 않는) RAM&lt;/li&gt;
&lt;li&gt;전원 공급이 멈추면 저장된 데이터가 날아가긴 한다.&lt;/li&gt;
&lt;li&gt;DRAM보다 일반적으로 더 빠름&lt;/li&gt;
&lt;li&gt;일반적으로 캐시 메모리에서 사용되는 RAM&lt;/li&gt;
&lt;li&gt;상대적으로 소비전력이 높고, 가격이 높고, 집적도가 낮다&lt;/li&gt;
&lt;li&gt;대용량으로 설계할 필요는 없으나 빨라야 하는 장치에 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;&amp;nbsp;&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;DRAM&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;SRAM&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;재충전&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;필요함&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;필요 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;속도&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;느림&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;빠름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;가격&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;저렴함&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;비쌈&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;집적도&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;높음&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;낮음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;소비 전력&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;적음&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;높음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;사용 용도&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;주기억장치(RAM)&lt;/td&gt;
&lt;td style=&quot;text-align: center;&quot;&gt;캐시 메모리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SDRAM (Synchronous DRAM)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;발전된 형태의 DRAM&lt;/li&gt;
&lt;li&gt;클럭 신호와 동기화된 DRAM&lt;/li&gt;
&lt;li&gt;클럭 신호와 동기화 되어있다는 의미는 CPU와 정보를 주고 받을 수 있다는 의미이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DDR SDRAM(Double Data Rate SDRAM)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;발전된 형태의 SDRAM&lt;/li&gt;
&lt;li&gt;최근 가장 대중적으로 사용하는 RAM&lt;/li&gt;
&lt;li&gt;대역폭을 넓혀 속도를 빠르게 만든 SDRAM&lt;/li&gt;
&lt;li&gt;비유적으로 대역폭은 데이터를 주고 받는 길의 너비&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;06-2 메모리의 주소 공간&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU와 실행 중인 프로그램은 메모리 몇 번지에 무엇이 저장되어 있는지 다 알지 못한다.&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;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;p data-ke-size=&quot;size16&quot;&gt;논리 주소&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU와 실행 중인 프로그램이 사용하는 주소&lt;/li&gt;
&lt;li&gt;CPU와 실행 중인 프로그램 입장에서 바라본 주소&lt;/li&gt;
&lt;li&gt;실행 중인 프로그램 각각에게 부여된 0번지부터 시작하는 주소&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;p data-ke-size=&quot;size16&quot;&gt;결국엔 논리 주소를 물리 주소로 변환해야 한다. &amp;rarr; 실질적인 메모리 접근을 위해서&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MMU (메모리 관리 장치)라는 하드웨어에 의해 변환&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MMU는 논리 주소와 베이스 레지스터 값을 더하여 논리 주소를 물리 주소로 변환한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;532&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MGwok/btrW4FEEYrp/MGrloeFbVaNI0ZSpg3tzxk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MGwok/btrW4FEEYrp/MGrloeFbVaNI0ZSpg3tzxk/img.png&quot; data-alt=&quot;대충 말하면 찰떡같이 알아낸다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MGwok/btrW4FEEYrp/MGrloeFbVaNI0ZSpg3tzxk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMGwok%2FbtrW4FEEYrp%2FMGrloeFbVaNI0ZSpg3tzxk%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;224&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;532&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;대충 말하면 찰떡같이 알아낸다!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;br /&gt;2주차 강의 중 레지스터 항목을 참고 (&lt;a title=&quot;2주차 강의&quot; href=&quot;https://goming0925.tistory.com/16&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://goming0925.tistory.com/16)&lt;/a&gt;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리하면,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;베이스 레지스터는 프로그램의 가장 작은 물리 주소, 프로그램의 첫 물리 주소를 저장한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;논리 주소는 프로그램의 시작점으로부터 떨어진 거리이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 보호 기법&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가정 : 본인 프로그램 논리 주소번지를 벗어나는 값의 데이터를 변경한다 ➡️ 타 프로그램의 데이터에 변화가 생긴다 ➡️ 으악☠️&lt;/li&gt;
&lt;li&gt;논리 주소 범위를 벗어나는 명령어 실행을 방지하고 실행 중인 프로그램이 다른 프로그램에 영향을 받지 않도록 보호할 방법이 필요 : 한계 레지스터&lt;/li&gt;
&lt;li&gt;CPU는 메모리에 접근하지 전에 접근하고자 하는 논리 주소가 한계 레지스터보다 작은지를 항상 검사한다.&lt;/li&gt;
&lt;li&gt;실행 중인 프로그램의 독립적인 실행 공간을 확보&lt;/li&gt;
&lt;li&gt;하나의 프로그램이 다른 프로그램을 침범하지 못하게 보호&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YnLUJ/btrWVLe6Q19/zHajqgsmUKtDk2UJ5TNaE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YnLUJ/btrWVLe6Q19/zHajqgsmUKtDk2UJ5TNaE0/img.png&quot; data-alt=&quot;타 프로그램의 메모리 영역을 침범하는건 해킹?  &amp;amp;amp;zwj; &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YnLUJ/btrWVLe6Q19/zHajqgsmUKtDk2UJ5TNaE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYnLUJ%2FbtrWVLe6Q19%2FzHajqgsmUKtDk2UJ5TNaE0%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;600&quot; height=&quot;246&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;타 프로그램의 메모리 영역을 침범하는건 해킹?  &amp;amp;zwj; &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한계 레지스터&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램의 영역을 침범할 수 있는 명령어의 실행을 막을때 사용&lt;/li&gt;
&lt;li&gt;베이스 레지스터가 실행 중인 프로그램의 가장 작은 물리 주소를 저장한다면, 한계 레지스터는 논리 주소의 최대 크기를 저장&lt;/li&gt;
&lt;li&gt;베이스 레지스터 값 &amp;le; 프로그램의 물리 주소 범위 &amp;lt; 베이스 레지스터 + 한계 레지스터 값&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;505&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WSM2W/btrW0PA0cln/Kqflg4SAtswyLb5Xr26V3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WSM2W/btrW0PA0cln/Kqflg4SAtswyLb5Xr26V3k/img.png&quot; data-alt=&quot;CPU가 접근하려는 논리 주소는 한계 레지스터가 저장한 값보다 커서는 안된다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WSM2W/btrW0PA0cln/Kqflg4SAtswyLb5Xr26V3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWSM2W%2FbtrW0PA0cln%2FKqflg4SAtswyLb5Xr26V3k%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;271&quot; data-origin-width=&quot;745&quot; data-origin-height=&quot;505&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CPU가 접근하려는 논리 주소는 한계 레지스터가 저장한 값보다 커서는 안된다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;06-3 캐시 메모리&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장 장치의 일반적인 명제 (저장 장치 계층 구조의 개념)&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU와 가까운 저장 장치는 빠르고, 멀리 있는 저장 장치는 느리다.&lt;/li&gt;
&lt;li&gt;속도가 빠른 저장 장치는 저장 용량이 작고, 가격이 비싸다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;낮은 가격대의 대용량 저장 장치를 원한다면 느린 속도를 감수해야 하고, 빠른 속도의 저장 장치를 원한다면 작은 용량과 비싼 가격을 감수해야 한다.모든 것을 만족시키기엔 현실적으로 어렵다!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;269&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6aDge/btrW1Pnf2Qf/U7ordnxsOx0kfIufHA95AK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6aDge/btrW1Pnf2Qf/U7ordnxsOx0kfIufHA95AK/img.png&quot; data-alt=&quot;트라이포스!! 내 소원을 들어줘!!  ️ ️&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6aDge/btrW1Pnf2Qf/U7ordnxsOx0kfIufHA95AK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6aDge%2FbtrW1Pnf2Qf%2FU7ordnxsOx0kfIufHA95AK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;314&quot; height=&quot;269&quot; data-origin-width=&quot;314&quot; data-origin-height=&quot;269&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;트라이포스!! 내 소원을 들어줘!!  ️ ️&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;저장 장치의 계층 구조 (memory hierachy)&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;컴퓨터가 사용하는 저장 장치들을 &amp;lsquo;CPU에 얼마나 가까운지&amp;rsquo;를 기준으로 계층적으로 나타낼 수 있다. &amp;rarr; 저장 장치 계층 구조&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;457&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/89vvZ/btrWX4rF9wV/TxruGVX85pcuAtfogH1VVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/89vvZ/btrWX4rF9wV/TxruGVX85pcuAtfogH1VVk/img.png&quot; data-alt=&quot;저장 장치에도 계층이 있다니...&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/89vvZ/btrWX4rF9wV/TxruGVX85pcuAtfogH1VVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F89vvZ%2FbtrWX4rF9wV%2FTxruGVX85pcuAtfogH1VVk%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;151&quot; data-origin-width=&quot;1210&quot; data-origin-height=&quot;457&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;저장 장치에도 계층이 있다니...&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐시 메모리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU와 메모리 사이에 위치한, 레지스터보다 용량이 크고 메모리보다 빠른 SRAM 기반의 저장 장치&lt;/li&gt;
&lt;li&gt;CPU의 연산 속도와 메모리의 접근 속도의 차이를 조금이나마 줄이기 위해 탄생&lt;/li&gt;
&lt;li&gt;매번 CPU와 메모리의 접근이 발생하면 시간이 오래 걸리니, 메모리에서 CPU가 사용할 일부 데이터를 미리 캐시 메모리로 가지고 와서 쓰자는 컨셉&lt;/li&gt;
&lt;li&gt;저장 장치의 계층 구조상으로는 레지스터와 메모리의 사이에 위치한다.&lt;/li&gt;
&lt;li&gt;캐시 메모리는 여러 개가 존재하며, CPU(코어)와 가까운 순서대로 계층을 구성한다.&lt;/li&gt;
&lt;li&gt;코어와 가장 가까운 캐시 메모리를 L1(level 1) 캐시, L2(level 2) 캐시, L3(level 3) 캐시 순서로 나열할 수 있다.&lt;/li&gt;
&lt;li&gt;용량 : L1 &amp;lt; L2 &amp;lt; L3&lt;/li&gt;
&lt;li&gt;속도 : L1 &amp;gt; L2 &amp;gt; L3&lt;/li&gt;
&lt;li&gt;가격 : L1 &amp;gt; L2 &amp;gt; L3&lt;/li&gt;
&lt;/ul&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;366&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rJBnR/btrW1OoljVD/Q7890Mst2GVUWfMDBhl271/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rJBnR/btrW1OoljVD/Q7890Mst2GVUWfMDBhl271/img.png&quot; data-alt=&quot;CPU 살때 캐시 메모리 보는 사람?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rJBnR/btrW1OoljVD/Q7890Mst2GVUWfMDBhl271/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrJBnR%2FbtrW1OoljVD%2FQ7890Mst2GVUWfMDBhl271%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;600&quot; height=&quot;186&quot; data-origin-width=&quot;1181&quot; data-origin-height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;CPU 살때 캐시 메모리 보는 사람?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅ 코어와 가장 가까운 L1 캐시는 조금이라도 접근 속도를 빠르게 만들기 위해 명령어만을 저장하는 L1I 과 데이터만을 저장하는 L1D 캐시로 분리하는 분리형 캐시(split cache)도 존재한다.&lt;br /&gt;✅&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;참조 지역성의 원리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캐시 메모리는 CPU가 자주 사용할 법한 내용을 예측해서 저장해야한다.&lt;/li&gt;
&lt;li&gt;CPU가 사용할 법한 데이터를 예측하는 방법을 &lt;b&gt;참조 지역성의 원리&lt;/b&gt;라고 한다.&lt;/li&gt;
&lt;li&gt;CPU가 메모리에 접근할 때의 주된 경향을 바탕으로 만들어진 원리
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;CPU는 최근에 접근했던 메모리 공간에 다시 접근하려는 경향이 있다.&lt;/li&gt;
&lt;li&gt;CPU는 접근한 메모리 공간 근처를 접근하려는 경향이 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조 지역성의 원리 1&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변수에 저장한 값을 다시 접근해서 사용하려는 형태&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;참조 지역성의 원리 2&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공간 지역성&lt;/li&gt;
&lt;li&gt;메모리 공간을 구획으로 나누어 만들어진 프로그램은 인접한 영역에서 관련 기능 및 데이터가 존재한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beEyja/btrWS1QkxQg/sPB5Kj0rMfXbQ7D1UlL1vK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beEyja/btrWS1QkxQg/sPB5Kj0rMfXbQ7D1UlL1vK/img.png&quot; data-alt=&quot;끼리끼리 모인다.  &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beEyja/btrWS1QkxQg/sPB5Kj0rMfXbQ7D1UlL1vK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeEyja%2FbtrWS1QkxQg%2FsPB5Kj0rMfXbQ7D1UlL1vK%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;332&quot; data-origin-width=&quot;487&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;끼리끼리 모인다.  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐시 히트&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU가 캐시 메모리에 저장된 값을 활용할 경우, 즉 예측이 들어맞을 경우를 &amp;lsquo;캐시 히트&amp;rsquo;라고 표현한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐시 미스&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU가 캐시 메모리에 저장된 값을 활용하지 않는 경우(메모리에 접근해야 하는 경우), 즉 예측이 틀린 경우를 &amp;lsquo;캐시 미스&amp;rsquo;라고 표현한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐시 적중률&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;캐시 히트 횟수 / (캐시 히트 횟수 + 캐시 미스 횟수)&lt;/li&gt;
&lt;li&gt;캐시 적중률이 높을 수록 성능이 좋다 &amp;rarr; CPU와 메모리와의 접근 횟수를 줄일 수 있다.&lt;/li&gt;
&lt;li&gt;최근 CPU의 캐시 적중률은 80퍼센트에 육박한다. (무려!!)&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter &lt;span&gt;7️⃣&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;07-1 다양한 보조기억장치&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하드 디스크&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자기적인 방식으로 데이터를 저장하는 보조기억장치&lt;/li&gt;
&lt;li&gt;자기 디스크의 일종&lt;/li&gt;
&lt;li&gt;실질적으로 데이터가 저장되는 플래터 : 자기 물질로 덮여 있어 N극과 S극의 정보를 저장 (0과 1의 역할)&lt;/li&gt;
&lt;li&gt;플래터를 회전시키는 스핀들&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;401&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/1bpJr/btrW569RCeY/1ktXKkNd8twuAkHgKVs1bK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/1bpJr/btrW569RCeY/1ktXKkNd8twuAkHgKVs1bK/img.png&quot; data-alt=&quot;동작할때 흔들면 난리나는 이유 (물리적 충격에 약한 이유)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/1bpJr/btrW569RCeY/1ktXKkNd8twuAkHgKVs1bK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F1bpJr%2FbtrW569RCeY%2F1ktXKkNd8twuAkHgKVs1bK%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;316&quot; data-origin-width=&quot;508&quot; data-origin-height=&quot;401&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;동작할때 흔들면 난리나는 이유 (물리적 충격에 약한 이유)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅&amp;nbsp;일반적으로 플래터 양면을 모두 사용한다.&lt;br /&gt;✅&amp;nbsp;RPM(Revolution Per Minute) : 분당 회전수, 스핀들이 플래터를 돌리는 속도 단위&lt;/blockquote&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;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;421&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cEbWEI/btrW0OvlSYr/QltqsneVuUcVLwOea9usJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cEbWEI/btrW0OvlSYr/QltqsneVuUcVLwOea9usJ0/img.png&quot; data-alt=&quot;플래터의 면마다 헤드가 존재한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cEbWEI/btrW0OvlSYr/QltqsneVuUcVLwOea9usJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcEbWEI%2FbtrW0OvlSYr%2FQltqsneVuUcVLwOea9usJ0%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;261&quot; data-origin-width=&quot;645&quot; data-origin-height=&quot;421&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;플래터의 면마다 헤드가 존재한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하드 디스크 - 저장 단위&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본적으로 트랙(track)과 섹터(sector) 단위로 데이터를 저장&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;li&gt;섹터의 크기는 512 바이트 ~ 4096 바이트&lt;/li&gt;
&lt;li&gt;하나 이상의 섹터를 묶어 블록(block)이라고 표현하기도 한다.&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;b&gt;한&lt;/b&gt; &lt;b&gt;실린더&lt;/b&gt;에 기록된다. : 헤드를 따로 움직이지 않고 한번에 읽을 수 있기 때문에 (플래터 사이사이에 많기 때문에)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하드 디스크 - 데이터 접근 과정&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하드 디스크가 저장된 데이터에 접근하는 시간을 크게 3개로 나눌 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;탐색 시간 (seek time)&lt;/li&gt;
&lt;li&gt;회전 지연 (rotational latency)&lt;/li&gt;
&lt;li&gt;전송 시간 (transfer time)&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하드 디스크의 작업 성능은 많이 향상되었지만 컴퓨터 작업내에선 정말 많은 시간이 소요된다.&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;탐색 시간 (seek time)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;접근하려는 데이터가 저장된 트랙까지 헤드를 이동시키는 시간&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;회전 지연 (rotational latency)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;헤드가 있는 곳으로 플래터를 회전시키는 시간&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전송 시간 (transfer time)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하드 디스크와 컴퓨터 간에 데이터를 전송하는 시간&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;477&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M8bKe/btrWUIbOfUH/ZLMdFSeRPVhTxAMvE73GP0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M8bKe/btrWUIbOfUH/ZLMdFSeRPVhTxAMvE73GP0/img.png&quot; data-alt=&quot;탐색, 회전, 전송!!!  &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M8bKe/btrWUIbOfUH/ZLMdFSeRPVhTxAMvE73GP0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM8bKe%2FbtrWUIbOfUH%2FZLMdFSeRPVhTxAMvE73GP0%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;235&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;477&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;탐색, 회전, 전송!!!  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;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;blockquote data-ke-style=&quot;style3&quot;&gt;✅&amp;nbsp;플래시 메모리는 NAND 연산을 수행하는 회로 기반으로 만들어진 NAND 플래시 메모리와 NOR 연산 회로 기반으로 만들어진 NOR 플래시 메모리가 있다. 대용량 저장 장치로 많이 사용되는건 NAND 플래시 메모리이다.&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;셀 (cell)&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;셀이 모여서 MB, GB, TB 저장 장치가 된다.&lt;/li&gt;
&lt;li&gt;한 셀에 1 비트를 저장할 수 있는 플래시 메모리 : SLC&lt;/li&gt;
&lt;li&gt;한 셀에 2 비트를 저장할 수 있는 플래시 메모리 : MLC&lt;/li&gt;
&lt;li&gt;한 셀에 3 비트를 저장할 수 있는 플래시 메모리 : TLC&lt;/li&gt;
&lt;li&gt;한 셀에 4 비트를 저장할 수 있는 플래시 메모리 : QLC&lt;/li&gt;
&lt;li&gt;셀에 저장할 수 있는 비트 수에 따라 플래시 메모리의 수명, 성능, 가격에 영향을 미친다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SLC&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 셀로 두 개의 정보를 표현할 수 있다.&lt;/li&gt;
&lt;li&gt;비트의 빠른 입출력&lt;/li&gt;
&lt;li&gt;긴 수명&lt;/li&gt;
&lt;li&gt;용량 대비 가격이 높다&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;MLC&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;SLC 보다 느린 입출력&lt;/li&gt;
&lt;li&gt;SLC 보다 짧은 수명&lt;/li&gt;
&lt;li&gt;SLC 보다 저렴하다.&lt;/li&gt;
&lt;li&gt;시중에서 많이 사용 (MLC, TLC, QLC)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TLC&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;MLC 보다 느린 입출력&lt;/li&gt;
&lt;li&gt;MLC 보다 짧은 수명&lt;/li&gt;
&lt;li&gt;MLC 보다 저렴하다.&lt;/li&gt;
&lt;li&gt;시중에서 많이 사용 (MLC, TLC, QLC)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;플래시 메모리 - 저장 단위&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;셀들이 모여서 페이지(page)&lt;/li&gt;
&lt;li&gt;페이지들이 모여서 블록(block)&lt;/li&gt;
&lt;li&gt;블록이 모여서 플레인(plane)&lt;/li&gt;
&lt;li&gt;플레인이 모여서 다이(die)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;읽기와 쓰기&lt;/b&gt;는 페이지 단위로 이루어진다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;&lt;span data-token-index=&quot;0&quot;&gt;삭제&lt;/span&gt;&lt;/b&gt;는 (페이지보다 큰) 블록 단위로 이루어진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;477&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bBMR6h/btrW7T3tPoe/pETSiS8VkSHYfUB0YbpAmK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bBMR6h/btrW7T3tPoe/pETSiS8VkSHYfUB0YbpAmK/img.png&quot; data-alt=&quot;중요한건 읽기/쓰기 와 삭제의 단위가 다르다는 점?!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bBMR6h/btrW7T3tPoe/pETSiS8VkSHYfUB0YbpAmK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbBMR6h%2FbtrW7T3tPoe%2FpETSiS8VkSHYfUB0YbpAmK%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;237&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;477&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;중요한건 읽기/쓰기 와 삭제의 단위가 다르다는 점?!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;페이지의 상태&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Free 상태 : 어떠한 데이터도 저장하고 있지 않아 새로운 데이터를 저장할 수 있는 상태&lt;/li&gt;
&lt;li&gt;Valid 상태 : 이미 유효한 데이터를 저장하고 있는 상태&lt;/li&gt;
&lt;li&gt;Invalid 상태 : 유효하지 않은 데이터(쓰레기값)를 저장하고 있는 상태&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅&amp;nbsp;플래시 메모리는 하드 디스크와 달리 덮어쓰기가 불가능하다. (invalid 상태가 존재한다.)&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;가비지 컬렉션 (garbage collection)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;플래시 메모리 사용 중에 invalid 페이지가 용량을 차지하므로 공간을 정리하기 위한 기능 (공간을 관리하는 기능)&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;유효한 페이지들만을 새로운 블록으로 복사&lt;/li&gt;
&lt;li&gt;기존의 블록을 삭제&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;481&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBVDw6/btrW4E6PTS3/9WaaqN0xPKbKO4hobkgzXK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBVDw6/btrW4E6PTS3/9WaaqN0xPKbKO4hobkgzXK/img.png&quot; data-alt=&quot;여유 공간이 없으면요...?  &quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBVDw6/btrW4E6PTS3/9WaaqN0xPKbKO4hobkgzXK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBVDw6%2FbtrW4E6PTS3%2F9WaaqN0xPKbKO4hobkgzXK%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;500&quot; height=&quot;256&quot; data-origin-width=&quot;941&quot; data-origin-height=&quot;481&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;여유 공간이 없으면요...?  &lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;a id=&quot;3주차선택&quot;&gt;&lt;/a&gt;07-2 RAID의 정의와 종류&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAID (Redundant Array of Independent Disks)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하드 디스크와 SSD로 사용하는 기술&lt;/li&gt;
&lt;li&gt;데이터의 안전성 혹은 높은 성능을 위해 여러 물리적 보조기억장치를 마치 하나의 논리적 보조기억장치처럼 사용하는 기술&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAID 레벨&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;RAID를 구성하는 기술&lt;/li&gt;
&lt;li&gt;RAID 0, RAID 1, RAID 2, RAID 3, RAID 4, RAID 5, RAID 6&lt;/li&gt;
&lt;li&gt;그로부터 파생된 RAID 10, RAID 50 등이 있다.&lt;/li&gt;
&lt;li&gt;RAID 0, RAID 1, RAID 4, RAID 5, RAID 6 이 대중적으로 사용된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAID 0&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터를 단순히 나누어 저장하는 구성 방식&lt;/li&gt;
&lt;li&gt;각 보조기억장치는 번갈아 가며 데이터를 저장한다.&lt;/li&gt;
&lt;li&gt;저장되는 데이터가 보조기억장치의 갯수만큼 나뉘어 저장된다.&lt;/li&gt;
&lt;li&gt;장점 : 입출력 속도의 향상 (여러개의 보조기억장치로부터 동시에 입출력을 발생시킨다.)&lt;/li&gt;
&lt;li&gt;단점 : 저장된 정보가 안전하지 않음 (하나의 장치만 고장나도 데이터를 사용할 수 없다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;479&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ldn2E/btrWVKUNRNS/LTnicqYwx56AAZBfOhhjO1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ldn2E/btrWVKUNRNS/LTnicqYwx56AAZBfOhhjO1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ldn2E/btrWVKUNRNS/LTnicqYwx56AAZBfOhhjO1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fldn2E%2FbtrWVKUNRNS%2FLTnicqYwx56AAZBfOhhjO1%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;500&quot; height=&quot;256&quot; data-origin-width=&quot;936&quot; data-origin-height=&quot;479&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅&amp;nbsp;스트라입 (stripe) : 마치 줄무늬처럼 분산되어 저장된 데이터&lt;br /&gt;✅&amp;nbsp;스트라이핑 (striping) : 분산하여 저장하는 것&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;RAID1&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;미러링 (mirroring) : 복사본을 만드는 방식&lt;/li&gt;
&lt;li&gt;데이터를 쓸 때 원본과 복사본 두 군데에 씀 (느린 쓰기 속도)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;489&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cDAAJr/btrWXjvQvkF/1vLA0pVe2yIi88yKHccMok/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cDAAJr/btrWXjvQvkF/1vLA0pVe2yIi88yKHccMok/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cDAAJr/btrWXjvQvkF/1vLA0pVe2yIi88yKHccMok/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcDAAJr%2FbtrWXjvQvkF%2F1vLA0pVe2yIi88yKHccMok%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;500&quot; height=&quot;239&quot; data-origin-width=&quot;1025&quot; data-origin-height=&quot;489&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장점 : 백업과 복구가 쉽다. (데이터가 안전하다.)&lt;/li&gt;
&lt;li&gt;단점 : 하드 디스크 개수가 한정되었을 때 사용 가능한 용량이 적어짐&lt;/li&gt;
&lt;li&gt;복사본이 만들어지는 용량만큼 사용 불가 ➡️&amp;nbsp;많은 양의 하드 디스크가 필요 ➡️&amp;nbsp;비용 증가&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAID 4&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(RAID 1처럼 완전한 복사본을 만드는 대신) 오류를 검출하고 복구하기 위한 정보를 저장&lt;/li&gt;
&lt;li&gt;패리티 비트 : 오류를 검출하고 복구하기 위한 정보&lt;/li&gt;
&lt;li&gt;패리티를 저장한 장치를 이용해 다른 장치들의 오류를 검출하고, 오류가 있다면 복구할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;480&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YWNyN/btrW372e6Qy/3Iiy8Fpdi6hKNMVqn7JYck/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YWNyN/btrW372e6Qy/3Iiy8Fpdi6hKNMVqn7JYck/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YWNyN/btrW372e6Qy/3Iiy8Fpdi6hKNMVqn7JYck/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYWNyN%2FbtrW372e6Qy%2F3Iiy8Fpdi6hKNMVqn7JYck%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;500&quot; height=&quot;230&quot; data-origin-width=&quot;1042&quot; data-origin-height=&quot;480&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅&amp;nbsp;원래 패리티 비트는 오류 검출만 가능할 뿐 오류 복구는 불가능하다. RAID에서 사용하는 패리티는 오류 검출 뿐만 아니라 복구도 가능하다.&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단점 : 패리티 디스크의 병목 현상이 발생 할 수 있다. (디스크에 저장될때 마다 패리티 디스크에 저장을 하기 때문에&amp;hellip;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAID 5&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;패리티 정보를 분산하여 저장하는 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;452&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eHZlwI/btrWX30DJTh/eKzLyKzit2Kh3lGgDqqiwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eHZlwI/btrWX30DJTh/eKzLyKzit2Kh3lGgDqqiwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eHZlwI/btrWX30DJTh/eKzLyKzit2Kh3lGgDqqiwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeHZlwI%2FbtrWX30DJTh%2FeKzLyKzit2Kh3lGgDqqiwk%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;500&quot; height=&quot;237&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;452&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAID 6&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;RAID 5 보다 안전하지만 쓰기는 RAID 5보다 느리다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정리&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 RAID 레벨마다 장단점이 있음&lt;/li&gt;
&lt;li&gt;어떤 상황에서 무엇을 최우선으로 원하는지에 따라 최적의 RAID 레벨은 달라질 수 있음&lt;/li&gt;
&lt;li&gt;각 RAID 레벨의 대략적인 구성과 특징을 아는 것이 중요하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style6&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;8️⃣&amp;nbsp;입출력장치&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;08-1 장치 컨트롤러와 장치 드라이버&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입출력장치가 CPU, 메모리보다 다루기 까다로운 이유&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입출력장치는 종류가 너무나도 많다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;장치가 다양하면 장치마다 속도, 데이터 전송 형식 등도 다양하다.&lt;/li&gt;
&lt;li&gt;다양한 입출력장치와 정보를 주고받는 방식을 규격화하기 어렵다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;일반적으로 CPU와 메모리의 데이터 전송률은 높지만 입출력장치의 데이터 전송률은 낮다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전송률 (transfer rate) : 데이터를 얼마나 빨리 교환할 수 있는지를 나타내는 지표&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장치 컨트롤러&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;위와 같은 어려움을 해결하기 위해 입출력장치는 장치 컨트롤러를 통해 컴퓨터와 연결된다.&lt;/li&gt;
&lt;li&gt;입출력 제어기 (I/O controller), 입출력 모듈 (I/O module)이라고 불리기도 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장치 컨트롤러의 역할&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU와 입출력장치 간의 통신중개 : 까다로운 이유 1번을 해결&lt;/li&gt;
&lt;li&gt;오류 검출 : 장치의 오류 상태를 확인&lt;/li&gt;
&lt;li&gt;데이터 버퍼링 : 데이터를 모았다가 조금씩 내보내거나, 한 번에 내보내서 전송률을 맞춰준다. (까다로운 이유 2번)&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅&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;장치 컨트롤러의 구조&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;주고 받는 정보는 크게 3개의 레지스터에 저장된다.&lt;/li&gt;
&lt;li&gt;데이터 레지스터, 상태 레지스터, 제어 레지스터&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bMWF74/btrW0OoFcqN/8VPtPJ7bj3T72AUwaHPD30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bMWF74/btrW0OoFcqN/8VPtPJ7bj3T72AUwaHPD30/img.png&quot; data-alt=&quot;상태/제어 레지스터로 묶기도 한다&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bMWF74/btrW0OoFcqN/8VPtPJ7bj3T72AUwaHPD30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbMWF74%2FbtrW0OoFcqN%2F8VPtPJ7bj3T72AUwaHPD30%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;600&quot; height=&quot;211&quot; data-origin-width=&quot;1127&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;상태/제어 레지스터로 묶기도 한다&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장치 컨트롤러 - 데이터 레지스터&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU와 입출력장치 사이에 주고받을 데이터가 담기는 레지스터 (버퍼)&lt;/li&gt;
&lt;li&gt;최근엔 데이터 양이 많아짐에 따라 RAM을 사용하기도 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장치 컨트롤러 - 상태 레지스터&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상태 정보 저장&lt;/li&gt;
&lt;li&gt;입출력장치가 입출력 작업을 할 준비가 되었는지 상태를 저장&lt;/li&gt;
&lt;li&gt;입출력 작업이 완료되었는지 상태를 저장&lt;/li&gt;
&lt;li&gt;입출력장치에 오류는 없는지 등의 상태 정보를 저장한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장치 컨트롤러 - 제어 레지스터&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입출력장치가 수행할 내용에 대한 제어 정보&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장치 드라이버&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;장치 컨트롤러의 동작을 감지하고 제어하는 프로그램&lt;/li&gt;
&lt;li&gt;장치 컨트롤러는 입출력장치를 연결하기 위한 하드웨어적인 통로&lt;/li&gt;
&lt;li&gt;장치 드라이버는 입출력장치를 연결하기 위한 소프트웨어적인 통로&lt;/li&gt;
&lt;li&gt;컴퓨터(운영체제)가 연결된 장치의 드라이버를 인식하고 실행할 수 있어야 컴퓨터 내부와 정보를 주고 받을 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;08-2 다양한 입출력 방법&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입출력 방식&lt;/p&gt;
&lt;ol 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;DMA 입출력&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램 입출력&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램 속 명령어로 입출력장치를 제어하는 방법&lt;/li&gt;
&lt;li&gt;입출력 명령어로써 장치 컨트롤러와 상호작용&lt;/li&gt;
&lt;li&gt;CPU가 장치 컨트롤러의 레지스터 값을 읽고 씀으로써 이루어진다.&lt;/li&gt;
&lt;li&gt;CPU 내부에 있는 레지스터들과 달리 여러 장치 컨트롤러 속의 레지스터들을 모두 알고 있을 수 없다. (메모리 맵 입출력, 고립형 입출력)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;메모리 맵 입출력 방식&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리에 접근하기 위한 주소 공간과 입출력장치에 접근하기 위한 주소 공간을 하나의 주소 공간으로 간주하는 방법&lt;/li&gt;
&lt;li&gt;주어진 메모리내에 주소공간을 &amp;lsquo;메모리를 위한 주소 공간&amp;rsquo;, &amp;lsquo;입출력장치를 위한 주소 공간&amp;rsquo;으로 나누어서 관리한다.&lt;/li&gt;
&lt;li&gt;메모리 접근 명령어 == 입출력장치 접근 명령어&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;고립형 입출력 방식&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리를 위한 주소 공간과 입출력 장치를 위한 주소 공간을 분리하는 방법&lt;/li&gt;
&lt;li&gt;주어진 메모리내에 모든 공간을 메모리를 위한 공간이나 입출력장치를 위한 주소 공간으로 쓸 수 있다.&lt;/li&gt;
&lt;li&gt;(입출력 읽기/쓰기 선을 활성화 시키는) 입출력 전용 명령어를 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style12&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;메모리 맵 입출력&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;고립형 입출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;메모리와 입출력장치는 같은 주소 공간 사용&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;메모리와 입출력장치는 분리된 주소 공간 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;메모리 주소 공간이 축소됨&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;메모리 주소 공간이 축소되지 않음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;메모리와 입출력장치에 같은 명령어 사용 가능&lt;/td&gt;
&lt;td style=&quot;width: 50%; text-align: center;&quot;&gt;입출력 전용 명령어 사용&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터럽트 기반 입출력&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;하드웨어 인터럽트는 장치 컨트롤러에 의해 발생&lt;/li&gt;
&lt;li&gt;인터럽트 발생전까지 CPU가 다른 작업을 수행할 수 있다 ➡️ 효율적인 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅&amp;nbsp;폴링(polling) : 입출력장치의 상태와 처리할 데이터가 있는지를 주기적으로 확인하는 방식, 인터럽트 보다 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;동시다발적인 인터럽트&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;플래그 레지스터 속 인터럽트 비트를 비활성화한채 요청을 전부 순차적으로 해결할 순 없다. ➡️&amp;nbsp;NMI&lt;/li&gt;
&lt;li&gt;우선순위를 반영해서 다중 인터럽트를 처리해야한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅&amp;nbsp;NMI (Non-Maskable Interrupt) : 중요도가 높아서 비활성화로 무시할 수 없는 인터럽트&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;프로그래머블 인터럽트 컨트롤러(PIC, Programmable Interrupt Controller)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우선순위를 반영하여 다중 인터럽트를 처리하는 하드웨어&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;여러 장치 컨트롤러에 연결&lt;/li&gt;
&lt;li&gt;장치 컨트롤러의 하드웨어 인터럽트의 우선순위를 판단한다.&lt;/li&gt;
&lt;li&gt;CPU에게 지금 처리해야 하는 인터럽트가 무엇인지 판단하여 알려준다.&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;NMI 우선순위까지 판단하지는 않음&lt;/li&gt;
&lt;li&gt;PIC는 여러개를 사용하여 두 개 이상의 계층적으로 구성한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;383&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/OHRU4/btrW1NQw8pM/AFaNrnkbJnkaiwHn7Nrc8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/OHRU4/btrW1NQw8pM/AFaNrnkbJnkaiwHn7Nrc8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/OHRU4/btrW1NQw8pM/AFaNrnkbJnkaiwHn7Nrc8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FOHRU4%2FbtrW1NQw8pM%2FAFaNrnkbJnkaiwHn7Nrc8k%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;600&quot; height=&quot;239&quot; data-origin-width=&quot;962&quot; data-origin-height=&quot;383&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅&amp;nbsp;프로그램 입출력, 인터럽트 기반 입출력의 공통점은 입출력장치와 메모리 간의 데이터 이동은 CPU가 주도하고, 이동하는 데이터도 반드시 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;DMA 입출력 (Direct Memory Access)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입출력장치와 메모리가 CPU를 거치지 않고도 상호작용할 수 있는 입출력 방식&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;411&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bg4ohI/btrWVLe9Amr/Ev0oFVUVxSKf8fnuS6deEk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bg4ohI/btrWVLe9Amr/Ev0oFVUVxSKf8fnuS6deEk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bg4ohI/btrWVLe9Amr/Ev0oFVUVxSKf8fnuS6deEk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbg4ohI%2FbtrWVLe9Amr%2FEv0oFVUVxSKf8fnuS6deEk%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;600&quot; height=&quot;236&quot; data-origin-width=&quot;1047&quot; data-origin-height=&quot;411&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DMA 컨트롤러라는 하드웨어가 필요하다.&lt;/li&gt;
&lt;li&gt;CPU는 시간을 효율적으로 사용하면서 입출력 장치와 상호작용할 수 있다. (다른 작업에 집중할 수 있다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;DMA 입출력 과정&lt;/p&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU는 DMA 컨트롤러에 입출력 작업을 명령&lt;/li&gt;
&lt;li&gt;DMA 컨트롤러는 CPU 대신 장치 컨트롤러와 상호작용하며 입출력 작업을 수행 (DMA 컨트롤러는 필요한 경우 메모리에 직접 접근한다.)&lt;/li&gt;
&lt;li&gt;입출력 작업이 끝나면 DMA 컨트롤러는 인터럽트를 통해 CPU에 작업이 끝났음을 알림&lt;/li&gt;
&lt;/ol&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DMA 입출력 과정에서 시스템 버스를 이용 ➡️&amp;nbsp;시스템 버스는 공용 자원이기에 동시 사용이 불가능&lt;/li&gt;
&lt;li&gt;CPU가 시스템 버스를 이용하지 않을 때마다 조금씩 시스템 버스를 이용하거나&lt;/li&gt;
&lt;li&gt;CPU가 일시적으로 시스템 버스를 이용하지 않도록 허락을 구하고 시스템 버스를 이용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅&amp;nbsp;사이클 스틸링 (cycle stealing) : CPU 입장에선 시스템 버스에 접근하는 주기를 도둑맞은 기분이 들기에, DMA의 시스템 버스 이용을 사이클 스틸링이라고 부르기도 한다.&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;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DMA가 시스템 버스를 불필요하게 점거하는 문제를 해결하기 위해 입출력 버스라는 별도의 버스를 이용한다.&lt;/li&gt;
&lt;li&gt;PCI 버스, PCI express (PCIe) 버스와 입출력 장치를 연결짓는 슬롯&lt;/li&gt;
&lt;li&gt;슬롯 ➡️&amp;nbsp;입출력 버스 ➡️&amp;nbsp;시스템 버스&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1059&quot; data-origin-height=&quot;486&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KLuEO/btrWWrHvwIU/XZMgSNwHnkI4WevO6LF8n1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KLuEO/btrWWrHvwIU/XZMgSNwHnkI4WevO6LF8n1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KLuEO/btrWWrHvwIU/XZMgSNwHnkI4WevO6LF8n1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKLuEO%2FbtrWWrHvwIU%2FXZMgSNwHnkI4WevO6LF8n1%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;600&quot; height=&quot;275&quot; data-origin-width=&quot;1059&quot; data-origin-height=&quot;486&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;✅&amp;nbsp;최근엔 DMA가 더욱 발전해서 입출력 전용 CPU가 만들어지기도 함 ➡️&amp;nbsp;입출력 프로세서 혹은 입출력 채널&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>혼공컴운</category>
      <category>혼공</category>
      <category>혼공컴운</category>
      <category>혼공학습단</category>
      <author>고밍고밍</author>
      <guid isPermaLink="true">https://goming0925.tistory.com/17</guid>
      <comments>https://goming0925.tistory.com/17#entry17comment</comments>
      <pubDate>Tue, 24 Jan 2023 23:26:08 +0900</pubDate>
    </item>
  </channel>
</rss>