<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>눈사람의 해킹공부</title>
    <link>https://hack-snowman.tistory.com/</link>
    <description>보안과 윤리적 해킹, 컴퓨터 과학을 탐험하는 공간. 
초보자부터 전문가까지 여정
Happy coding!  </description>
    <language>ko</language>
    <pubDate>Mon, 24 Aug 2026 07:55:54 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>5n0wman</managingEditor>
    <image>
      <title>눈사람의 해킹공부</title>
      <url>https://tistory1.daumcdn.net/tistory/6696033/attach/e9775d7c45b7449681753e6cb0104c6d</url>
      <link>https://hack-snowman.tistory.com</link>
    </image>
    <item>
      <title>명품 운영체제 연습문제 5장 복합문제</title>
      <link>https://hack-snowman.tistory.com/19</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;operating-system-1995434_1920.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;791&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wN6KP/btsBFK74Z7p/8rsrWBuRSKg1oLjjJvKFZ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wN6KP/btsBFK74Z7p/8rsrWBuRSKg1oLjjJvKFZ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wN6KP/btsBFK74Z7p/8rsrWBuRSKg1oLjjJvKFZ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwN6KP%2FbtsBFK74Z7p%2F8rsrWBuRSKg1oLjjJvKFZ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;669&quot; height=&quot;414&quot; data-filename=&quot;operating-system-1995434_1920.png&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;791&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;안녕하세요 눈사람입니다. 운영체제를 학습하면서 풀어본 연습문제 답을 공유하고자, 포스트합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 포스트는 직접 풀어보면서 작성한 글이므로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;u&gt;정답이 아닐 수 있습니다&lt;/u&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5장 연습문제(복합문제)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. 다음 표와 같이 5개의 스레드가 있다. 스레드들이 모두 0의 시간에 도착하여 T1에서 T5의 순서로 준비 큐에 대기 중이라고 할 때 다음 물음에 답하라. 실행 시간 동안 스레드는 입출력 없이 실행된다고 가정한다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style2&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;스레드&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;실행시간&lt;span&gt;(ms)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;우선순위&lt;span&gt;(&lt;/span&gt;숫자가 클수록 높은순서&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;T1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;T2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;T3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;T4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;T5&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(1) FCFS, SJF, Non-Preemptive Priority 스케줄링 알고리즘 각각에 대해 스레드들이 스케줄링되어 실행되는 과정을 차트로 그리고 5개의 스레드가 모두 실행되는데 걸린 평균 대기 시간을 계산하라.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;412&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/WzTng/btsBGwVQFbH/gBqMYMU2XXBhua7NP84irK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/WzTng/btsBGwVQFbH/gBqMYMU2XXBhua7NP84irK/img.png&quot; data-alt=&quot;FCFS&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/WzTng/btsBGwVQFbH/gBqMYMU2XXBhua7NP84irK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWzTng%2FbtsBGwVQFbH%2FgBqMYMU2XXBhua7NP84irK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1256&quot; height=&quot;412&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;412&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;FCFS&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 style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;각 스레드는 모두 0의 시간에 도착하였기 때문에  자신의 실행 시기 만큼의 대기 시간을 갖는다. 따라서 현재 차트에서 5개 스레드가 모두 실행되는데 걸린&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;평균 대기 시간은 6.8ms이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgrVS7/btsBHRyjZyH/smLNuKSQbwtLxFi9cWl21k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgrVS7/btsBHRyjZyH/smLNuKSQbwtLxFi9cWl21k/img.png&quot; data-alt=&quot;SJF&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgrVS7/btsBHRyjZyH/smLNuKSQbwtLxFi9cWl21k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgrVS7%2FbtsBHRyjZyH%2FsmLNuKSQbwtLxFi9cWl21k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1276&quot; height=&quot;410&quot; data-origin-width=&quot;1276&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SJF&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 style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;모두 같은 0의 시간에 도착한 스레드들이므로 실행시간이 짧은 것부터 실행시켜준다.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이때 평균 대기시간은 4.8ms이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/2YYQQ/btsBGlmElOk/4u4ft4OTXuEK8mj9HOHM5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/2YYQQ/btsBGlmElOk/4u4ft4OTXuEK8mj9HOHM5K/img.png&quot; data-alt=&quot;Non-Preemptive Priority&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/2YYQQ/btsBGlmElOk/4u4ft4OTXuEK8mj9HOHM5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F2YYQQ%2FbtsBGlmElOk%2F4u4ft4OTXuEK8mj9HOHM5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1264&quot; height=&quot;410&quot; data-origin-width=&quot;1264&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Non-Preemptive Priority&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 style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;비선점형 우선순위 스케줄링 알고리즘이므로, 우선순위가 높은 것부터 차례대로 실행시키되 강제 종료시키지 않고 실행한다. 모두가 같은 시간에 도착했으므로 우선순위가 높은 것부터 차례대로 실행하며&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이때 평균 대기 시간은 9.8ms이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(2) RR(타임 슬라이스 = 2ms)으로 스케줄링할 때 실행되는 과정을 차트로 그리고 5개의 스레드가 모두 실행되는데 걸린 평균 대기 시간을 계산하라&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/butyZP/btsBDK8EfGl/ybyKHKkTCr9N8w6z8eAqA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/butyZP/btsBDK8EfGl/ybyKHKkTCr9N8w6z8eAqA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/butyZP/btsBDK8EfGl/ybyKHKkTCr9N8w6z8eAqA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbutyZP%2FbtsBDK8EfGl%2FybyKHKkTCr9N8w6z8eAqA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1274&quot; height=&quot;410&quot; data-origin-width=&quot;1274&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span data-alt=&quot;RR(Round Robin)&quot; data-lightbox=&quot;lightbox&quot; data-url=&quot;https://blog.kakaocdn.net/dn/lQfsR/btsBFI3tUy3/4OBGfuSzqwD28srkmaOWiK/img.png&quot;&gt;&lt;/span&gt;RR(Round Robin)&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;RR 알고리즘은 스레드들에게 공평한 실행 기회를 주기 위해 큐에 대기 중인 스레드들을 타임 슬라이스 주기로 돌아가며 선택한다. 따라서 2ms 간격으로 스레드들을 돌아가며 선택하여 실행한다.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;이때 평균 대기 시간은 6.6ms이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(3)&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;RR(타임 슬라이스 = 2ms)으로 스케줄링할 때 스케줄링 오버헤드(스케줄링 시간 + 컨텍스트 스위칭 시간)가 평균적으로 0.1ms 걸린다고 하면 5개의 스레드가 모두 실행되는데 걸린 시간은 총 얼마인가?&lt;/span&gt;&lt;/b&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;한 스레드에서 다음 스레드로 전환할 때마다 오버헤드를 추가해야 한다. 실행 시작 시나 마지막 스레드가 완료된 후에는 컨텍스트 전환이 필요하지 않으므로 오버헤드가 추가되지 않는다. 따라서 실행 시각 2, 4, 6, 7, 9, 10, 12, 14에 총 8회의 오버헤드가 추가되므로 총 걸린 시간은 스레드 실행 시간인 18ms에 0.8ms를 더한 값인&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;18.8ms&lt;span style=&quot;color: #000000;&quot;&gt;가 된다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;2. 다음 표와 같이 5개의 스레드가 있다. 시간 단위는 밀리초이며 스레드들은 시간에 맞추어 도착한다. 실행 시간 동안 스레드는 입출력 없이 실행된다고 가정한다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style2&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;스레드&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;도착시간&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;실행시간&lt;span&gt;(ms)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;우선순위&lt;span&gt;(&lt;/span&gt;숫자가 클수록 높은순서&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;T1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;T2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;2&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;T3&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;T4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;T5&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;9&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;5&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;td style=&quot;color: #666666; text-align: center;&quot; width=&quot;120&quot;&gt;&lt;span&gt;&lt;span&gt;4&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;(1) FCFS, SJF, Non-Preemptive Priority 스케줄링 알고리즘 각각에 대해 스레드들이 스케줄링되어 실행되는 과정을 그리고 5개의 스레드를 실행하는데 걸린 평균 대기 시간을 계산하라.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1250&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wk2IJ/btsBCwQCFoP/QB6dtk30ua4VuXPNDYvCK1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wk2IJ/btsBCwQCFoP/QB6dtk30ua4VuXPNDYvCK1/img.png&quot; data-alt=&quot;FSFS&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wk2IJ/btsBCwQCFoP/QB6dtk30ua4VuXPNDYvCK1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fwk2IJ%2FbtsBCwQCFoP%2FQB6dtk30ua4VuXPNDYvCK1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1250&quot; height=&quot;398&quot; data-origin-width=&quot;1250&quot; data-origin-height=&quot;398&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;FSFS&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 style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;FCFS 알고리즘은 도착 순서대로 실행하며 선점을 허용하지 않는다.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;평균 대기 시간은 6.4ms이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;396&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvb16f/btsBClBoNlr/ooEvG9Hq2FEysd5YNQKxTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvb16f/btsBClBoNlr/ooEvG9Hq2FEysd5YNQKxTK/img.png&quot; data-alt=&quot;SJF&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvb16f/btsBClBoNlr/ooEvG9Hq2FEysd5YNQKxTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbvb16f%2FbtsBClBoNlr%2FooEvG9Hq2FEysd5YNQKxTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1256&quot; height=&quot;396&quot; data-origin-width=&quot;1256&quot; data-origin-height=&quot;396&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SJF&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 style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;필요한 최단 실행 시간에 따라 스레드를 실행하며 선점은 허용하지 않는다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;평균 대기 시간은 4.2ms이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;402&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPql0K/btsBCw38pCp/1fH60kj9RT7aJ3suhFVUT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPql0K/btsBCw38pCp/1fH60kj9RT7aJ3suhFVUT0/img.png&quot; data-alt=&quot;Non-Preemptive Priority&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPql0K/btsBCw38pCp/1fH60kj9RT7aJ3suhFVUT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPql0K%2FbtsBCw38pCp%2F1fH60kj9RT7aJ3suhFVUT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1260&quot; height=&quot;402&quot; data-origin-width=&quot;1260&quot; data-origin-height=&quot;402&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Non-Preemptive Priority&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 style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;스레드의 우선순위에 따라 실행되며 우선순위 번호가 높을 수록 스레드가 더 일찍 실행된다. 마찬가지로 선점을 허용하지않는다&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;평균 대기 시간은 9.4ms이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(2) SRTF 알고리즘으로 스케줄링되어 실행되는 과정을 그리고 평균 대기 시간을 계산하라.&lt;/span&gt;&lt;/b&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;415&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/HGtpb/btsBDNj1Aqh/hWRooq98ZedPrS6LYpDfj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/HGtpb/btsBDNj1Aqh/hWRooq98ZedPrS6LYpDfj0/img.png&quot; data-alt=&quot;SRTF&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/HGtpb/btsBDNj1Aqh/hWRooq98ZedPrS6LYpDfj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHGtpb%2FbtsBDNj1Aqh%2FhWRooq98ZedPrS6LYpDfj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;415&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;415&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;SRTF&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 style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;실행 시간이 가장 짧은 프로세스를 선택하여 다음 실행을 수행하는 선점형 스케줄링 알고리즘이다. 새로운 프로세스가 도착할 때 실행시간을 비교하여 남은 시간이 가장 짧은 프로세스가 대신하게 된다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;평균 대기 시간은 3.6ms이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(3) Preemptive Priority 알고리즘으로 스케줄링되어 실행되는 과정을 그리고 평균 대기 시간을 계산하라.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1262&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTeapl/btsBC4zvyR5/u4Yrb4FKZ5Cjoj56p529zK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTeapl/btsBC4zvyR5/u4Yrb4FKZ5Cjoj56p529zK/img.png&quot; data-alt=&quot;Preemptive Priority&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTeapl/btsBC4zvyR5/u4Yrb4FKZ5Cjoj56p529zK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTeapl%2FbtsBC4zvyR5%2Fu4Yrb4FKZ5Cjoj56p529zK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1262&quot; height=&quot;406&quot; data-origin-width=&quot;1262&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Preemptive Priority&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 style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;선점형 우선순위 스케줄링 알고리즘은 스레드의 우선순위에 따라 실행되며 새로운 스레드가 도착할 때 우선순위가 높다면 교체되어 실행된다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;평균 대기 시간은 9.8ms이다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>운영체제</category>
      <category>5장 연습문제</category>
      <category>명품 운영체제</category>
      <category>명품 운영체제 5장 복합문제</category>
      <category>복합문제</category>
      <category>생능출판</category>
      <category>연습문제</category>
      <category>연습문제 답</category>
      <category>연습문제 답안</category>
      <category>운영체제</category>
      <author>5n0wman</author>
      <guid isPermaLink="true">https://hack-snowman.tistory.com/19</guid>
      <comments>https://hack-snowman.tistory.com/19#entry19comment</comments>
      <pubDate>Fri, 8 Dec 2023 21:32:23 +0900</pubDate>
    </item>
    <item>
      <title>명품 운영체제 연습문제 9장</title>
      <link>https://hack-snowman.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;1280&quot; data-origin-height=&quot;791&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhaEjq/btsBur9egrf/WYJtKtIBUYiLr36luT5Mg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhaEjq/btsBur9egrf/WYJtKtIBUYiLr36luT5Mg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhaEjq/btsBur9egrf/WYJtKtIBUYiLr36luT5Mg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhaEjq%2FbtsBur9egrf%2FWYJtKtIBUYiLr36luT5Mg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;396&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;791&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;안녕하세요 눈사람입니다. 운영체제를 학습하면서 풀어본 연습문제 답을 공유하고자, 포스트합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 포스트는 직접 풀어보면서 작성한 글이므로&amp;nbsp;&lt;u&gt;정답이 아닐 수 있습니다&lt;/u&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;9장 연습문제(개념체크)&lt;/b&gt;&lt;/span&gt;&lt;b&gt;&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 다음은 페이징 메모리 관리에 대해 기술하는 문장이다. 보기에서 골라 빈칸을 채워라.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;페이징은 프로세스의 주소 공간을 (&lt;/b&gt;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;페이지&lt;/span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;)라는 (&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;고정&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp;&lt;/span&gt;) 크기로 나누고 (&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;물리 메모리&lt;/span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;) 역시 (&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;페이지&lt;/span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;) 크기와 동일한 크기로 나누고 이를 (&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;프레임&lt;/span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;) 이라고&lt;/span&gt; 부르며, 프로세스의 각 (&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;페이지&lt;/span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;) 를&lt;/span&gt; 임의의 빈 (&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;프레임&lt;/span&gt;&lt;b&gt;&lt;span&gt;&amp;nbsp;) 에&lt;/span&gt; 할당하는 메모리 관리 기법이다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 프로세스가 실행될 때 변수의 물리주소를 알아내기 위해 사용하는 것은?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 페이지 테이블&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 32비트의 주소 체계에서 페이지의 크기가 4KB라면, 한 프로세스 당 페이지 테이블의 크기는 얼마인가?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2. 4MB&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-&amp;gt; 32비트 주소 체계 컴퓨터에서 프로세스 주소 공간의 크기는 &lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;2 &amp;sup3;&amp;sup2;바이트=4GB이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 또한, &lt;/span&gt;페이지의 크기가 4KB라면 한 프로세스 당 최대 테이블 개수는 4GB/4KB = 2&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&amp;sup2;⁰개, 약 100만 개다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 따라서, 페이지 테이블 항목에는 물리 프레임 번호가 저장되고 프레임 번호가 32비트로 구성되므로 프로세스 테이블의 크기는&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #666666; text-align: start;&quot;&gt;&amp;sup2;⁰개 x 4바이트(32비트) = 4MB이다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;4. 페이지 테이블에 들어 있는 항목으로 적당한 것은?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 페이지의 물리 주소&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5. 페이지 테이블에 대한 설명으로 틀린 것은?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 스레드마다 고유한 페이지 테이블이 사용된다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;6. 논리 주소를 물리 주소로 바꿀 때 사용되지 않는 것은?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;4.&amp;nbsp;PCB&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;7. 페이지 테이블에 대한 설명 중 틀린 것은?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;4.&amp;nbsp;페이지 테이블은 시스템 전체에 하나 있으며 커널 공간에 저장된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-&amp;gt; 페이지 테이블은 프로세스 당 여러 개 존재할 수 있으며 크기가 작지 않기 때문에 메모리에 저장된다.&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;8. 논리 주소를 물리 주소로 바꿀 때 사용되지 않는 것은?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2.&amp;nbsp;PC 레지스터&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;9. 32비트 주소 체계에서 한 페이지의 크기가 4KB일 때, 논리 주소 0x98761234 번지는 몇 번째 페이지의 몇 번째 바이트에 대한 주소인가(정확한 답 사례 : 0x###페이지의 0x###바이트)&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;0x98761페이지의 0x234바이트&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;10. 페이징 기법과 세그먼테이션 기법을 비교한 것으로 틀린 것은?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;3.&amp;nbsp;세그먼테이션은 단편화가 적기 때문에 메모리 활용 면에서 페이징보다 우수하다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;11. 페이지 테이블은 어디에 존재하는가?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1.&amp;nbsp;메인 메모리&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;12. 페이징에서 프로세스의 논리 주소는?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2. [페이지 번호, 옵셋]&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;13. 32비트 주소 체계에서 한 페이지가 2KB일 때, 다음 32비트의 논리 주소는 몇 번째 페이지의 몇 번째 바이트에 대한 주소인가?&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701877423945&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;0000 0000 0000 0000 0001 1000 0000 1111&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;3 번째 페이지의 15 번째 바이트&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-&amp;gt; 페이지 크기가 2KB(=2 &amp;sup1;&amp;sup1;)라면, 페이지 내 각 바이트 주소(옵셋 주소)를 11비트로 나타낼 수 있다.&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 그러므로 논리 주소에서의 옵셋의 크기는 11비트이다.&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 따라서, 상위 31비트가 페이지 번호, 하위 11비트가 페이지 내 옵셋 주소를 나타내기 때문에&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 0000 0000 0000 0000 0001 1까지가 페이지 번호, 000 0000 1111이 바이트 주소이므로,&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 이를 10진수로 변환하면 3 번째 페이지의 15 번째 바이트이다.&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;14. 32비트 주소 체계에서 한 페이지의 크기가 4KB일 때, 다음 32비트의 논리 주소에 해당하는 물리 주소는(그림에서의 논리 주소와 프레임 번호는 16진수임)?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;0x00022008&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;-&amp;gt; 페이지 크기가 4KB이므로 상위 20비트가 페이지 주소, 하위 12비트가 옵셋을 나타낸다.  따라서, 0x00006번째 페이지의 논리주소를 나타내고 있으며, 물리 주소에서는 6번째 페이지의 물리주소는 22 임을 확인할 수 있다. 그러므로 해당 논리 주소의 물리 주소는 0x00022008이다.&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;15. 페이징 메모리 관리 기법은 페이지 테이블로 인해 2가지 성능 이슈가 있다. 이 둘을 골라라?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 페이지 테이블의 낭비&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;3. CPU의 메모리 액세스 시 2번의 물리 메모리 액세스로 인한 실행 속도 저하&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;16. TLB는 어떤 문제점을 해결하기 위한 것인가?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;3. 물리 메모리의 액세스 횟수&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;17. TLB는 일반적으로 어디에 존재하는가?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. CPU 패키지의 MMU 장치 내에&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;18. TLB의 역할은 무엇인가?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;3.&amp;nbsp;물리 메모리의 빠른 액세스&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;19. TLB는 고가의 장치이므로 TLB 크기는 페이지 테이블의 약 1/1000 수준이다. 이렇게 적은 크기로 논리 주소를 물리주소로 바꾸는데 효율적인 이유는 무엇인가?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;프로그램 안에는 많은 반복문이 존재하므로 같은 페이지 내의 코드나 데이터를 엑세스하게 되고 이 때, TLB 히트가 계속되어 페이지 테이블을 엑세스 하는 횟수가 줄고 프로그램 실행 속도가 개선된다. 이렇게&amp;nbsp;&lt;span style=&quot;text-align: left;&quot;&gt;프로그램이 실행되는 동안 짧은 시간 범위 내에 일정 구간의 메모리 영역을 반복 엑세스 하는 경향을&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #666666; text-align: left;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;참조의 지역성이라고 부른다.&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;20. 역 페이지 테이블과 멀티레벨 페이지 테이블 기법은 페이지 테이블의 어떤 문제를 개선하기 위한 것인가&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2. 페이지 테이블의 낭비 개선&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;21. 역 페이지 테이블을 사용할 때 역 페이지 테이블의 항목은 어떻게 구성되는가?&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;3. [프로세스 번호, 페이지 번호]&lt;/span&gt;&lt;/p&gt;</description>
      <category>운영체제</category>
      <category>9장 연습문제</category>
      <category>명품 운영체제</category>
      <category>명품 운영체제 9장</category>
      <category>생능출판</category>
      <category>연습문제</category>
      <category>연습문제 답</category>
      <category>연습문제 답안</category>
      <category>운영체제</category>
      <author>5n0wman</author>
      <guid isPermaLink="true">https://hack-snowman.tistory.com/18</guid>
      <comments>https://hack-snowman.tistory.com/18#entry18comment</comments>
      <pubDate>Thu, 7 Dec 2023 00:57:13 +0900</pubDate>
    </item>
    <item>
      <title>명품 운영체제 연습문제 8장</title>
      <link>https://hack-snowman.tistory.com/17</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;791&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cqONYf/btsBrO2WYpT/e8VgKuvGAx1ItmzSJmZAX1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cqONYf/btsBrO2WYpT/e8VgKuvGAx1ItmzSJmZAX1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cqONYf/btsBrO2WYpT/e8VgKuvGAx1ItmzSJmZAX1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcqONYf%2FbtsBrO2WYpT%2Fe8VgKuvGAx1ItmzSJmZAX1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;396&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;791&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;안녕하세요 눈사람입니다. 운영체제를 학습하면서 풀어본 연습문제 답을 공유하고자, 포스트합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 포스트는 직접 풀어보면서 작성한 글이므로&amp;nbsp;&lt;u&gt;정답이 아닐 수 있습니다&lt;/u&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; data-ke-type=&quot;horizontalRule&quot; /&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;8장 연습문제(개념체크)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. 컴퓨터 시스템에서 메모리 계층 구조를 이루는 근본 이유는 무엇인가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #006dd7;&quot;&gt;1. CPU의 메모리 엑세스 속도를 높이기 위해&lt;/span&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. 메모리 계층화가 성공적인 이유는?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 참조의 지역성 때문&lt;/span&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. 메모리 계층 구조에서 가장 빠른 메모리는?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #006dd7;&quot;&gt;4. CPU 레지스터&lt;/span&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. 메모리 계층 구조를 구성하는 기억 장치들의 특징으로 틀린 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 용량이 클수록 속도도 빠르다.&amp;nbsp;&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;-&amp;gt; 용량이 적을수록 속도가 빠르다.&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5. 다음 문장의 빈 곳에 보기 중에서 적절한 단어를 삽입하여 문장을 완성하라.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(&lt;/b&gt;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;논리 주소&lt;/span&gt;&lt;b&gt;&amp;nbsp;)는 개발자나 프로그램에서 사용하는 주소로 0번지부터 시작되고 연속된다. CPU는 (&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;논리 주소&lt;/span&gt;&lt;b&gt;&amp;nbsp;)를 (&lt;/b&gt;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;물리 주소&lt;/span&gt;&lt;b&gt;&amp;nbsp;)로 변환하는 (&lt;/b&gt;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;MMU&lt;/span&gt;&lt;b&gt;&amp;nbsp;)를 내장하고 있다. CPU의 PC(Program Counter) 레지스터에 들어 있는 주소는 (&lt;/b&gt;&amp;nbsp;논리 주소&lt;b&gt;&amp;nbsp;)이다. 시스템 버스를 통해 전달되는 주소는 (&lt;/b&gt;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;물리 주소&lt;/span&gt;&lt;b&gt;&amp;nbsp;)이고 그 범위는 CPU (&lt;/b&gt;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;주소버스&lt;/span&gt;&lt;b&gt;&amp;nbsp;)의 크기에 달려있다. 개발자나 응용프로그램에서는 작성된 코드의 (&lt;/b&gt;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;논리 주소&lt;/span&gt;&lt;b&gt;&amp;nbsp;)는 알 수 있으나 (&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp;물리 주소&lt;/span&gt;&lt;b&gt;&amp;nbsp;)는 알 수 없다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701690218555&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt; 논리 주소, MMU, 캐시, 연산장치, 데이터버스, 제어장치, 물리 주소, 제어버스, 주소버스&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;6. 운영체제의 메모리 관리 목표에 해당하지 않는 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 메모리를 연속적으로 할당함으로써 프로세스의 실행 성능 향상&lt;/span&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;7. 논리 주소에 대해 잘못 설명한 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #006dd7;&quot;&gt;3. CPU의 PC 레지스터에는 다음에 엑세스할 명령의 주소가 들어 있는데 이 주소는 물리 주소이다.&lt;/span&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;8. 물리 주소에 대한 설명으로 잘못된 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #006dd7;&quot;&gt;3. 커널 코드는 물리 주소만 사용한다. 왜냐하면 커널 코드의 빠른 실행을 위해 논리 주소를 물리 주소로 바꾸는 시간을 없애기 위해서이다.&lt;/span&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;9. 다음 프로그램은 C 언어에서 100바이트의 메모리를 동적 할당받는 코드이다. 포인터 변수 p에는 동적 할당받은 메모리의 주소가 들어 있다. 포인터 변수 p에 들어 있는 주소는 무슨 주소인가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701689806203&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int *p = (int*) malloc(100);&lt;/code&gt;&lt;/pre&gt;
&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 논리주소&lt;/span&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;10. 다음 중 절대 주소 300번지는?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #006dd7;&quot;&gt;2. CPU 패키지를 통해 출력된 주소 300이 주소 버스를 타고 메모리 장치에 도달하였다.&lt;/span&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;11. 비주얼 스튜디오를 이용하여 C 응용프로그램을 작성하고 컴파일하였다. 응용프로그램 내에 선언된 변수 n의 절대주소를 알 수 있는 존재는?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #006dd7;&quot;&gt;4. 위의 어떤 것도 알 수 없다.&lt;/span&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;12. 연속 메모리 할당이 분할 메모리 할당보다 나은 면은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 논리 주소와 물리 주소 사이의 매핑 과정이 단순하여 상대적으로 빠른 프로세스의 실행&lt;/span&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;13. 분할 메모리 할당은 연속 메모리 할당의 어떤 면을 개선하기 위한 것인가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #006dd7;&quot;&gt;4. 메모리에 빈 영역이 많이 산재되어 있음에도 불구하고 프로세스를 적재할 수 없는 메모리 할당의 경직성을 극복하기 위해&lt;/span&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;14. 다음 중 내부 단편화가 발생하는 것을 모두 골라라?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 페이징 / 3. 고정 크기 연속 메모리 할당&lt;/span&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;15. 세그먼테이션과 페이징에 대해 잘못 설명한 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 세그먼테이션이나 페이징 모두 세그먼트 테이블과 페이지 테이블이 프로세스마다 1개씩 존재한다.&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;br /&gt;&amp;nbsp;-&amp;gt; 프로세스 당 세그먼트 개수가 작기 때문에 시스템 전체에 1개의 테이블을 이용한다.&lt;/span&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;16. 홀 선택 알고리즘 중 요청하는 메모리 크기를 수용하는 홀 (비어 있는 메모리 공간) 중 가장 작은 홀을 선택하는 알고리즘은 무엇인가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #006dd7;&quot;&gt;2. best-fit&lt;/span&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;17. 홀 선택 알고리즘은 메모리의 홀(비어 있는 메모리 공간) 중에서 선택하여 요청된 메모리를 할당한다. 요청 크기와 홀의 크기가 같지 않는 경우 할당된 홀에 새로운 홀이 생기게 된다. 이때 가장 큰 홀을 만들게 되는 알고리즘은 무엇인가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #006dd7;&quot;&gt;3. worst-fit&lt;/span&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;18. 세그먼테이션 메모리 관리 기법에서 세그먼트 테이블의 항목은 어떤 정보로 구성되는가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #006dd7;&quot;&gt;2. 세그먼트의 크기와 세그먼트 물리 주소&lt;/span&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;19. 세그먼테이션 메모리 관리 기법에서 세그먼트 테이블의 항목에는 세그먼트의 크기 정보가 저장된다. 이것은 어떤 목적으로 사용되는가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #006dd7;&quot;&gt;4. CPU에 의해 발생된 논리 주소가 세그먼트가 할당된 물리 메모리의 영역을 넘어섰는지 판단하기 위해&lt;/span&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;20. 현대의 컴퓨터에서 CPU 패키지 안에 들어 있지 않는 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;span style=&quot;color: #006dd7;&quot;&gt;4. SSD&lt;/span&gt;&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;color: #000000; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;reaction-40&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>운영체제</category>
      <category>8장 연습문제</category>
      <category>명품 운영체제</category>
      <category>명품 운영체제 8장</category>
      <category>생능출판</category>
      <category>연습문제</category>
      <category>연습문제 답</category>
      <category>연습문제 답안</category>
      <category>운영체제</category>
      <author>5n0wman</author>
      <guid isPermaLink="true">https://hack-snowman.tistory.com/17</guid>
      <comments>https://hack-snowman.tistory.com/17#entry17comment</comments>
      <pubDate>Mon, 4 Dec 2023 20:44:08 +0900</pubDate>
    </item>
    <item>
      <title>명품 운영체제 연습문제 7장</title>
      <link>https://hack-snowman.tistory.com/16</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;791&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bUoGVF/btsBogLXZrh/Ty9V1GSIrBrpz7NVtt8Ow0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bUoGVF/btsBogLXZrh/Ty9V1GSIrBrpz7NVtt8Ow0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bUoGVF/btsBogLXZrh/Ty9V1GSIrBrpz7NVtt8Ow0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbUoGVF%2FbtsBogLXZrh%2FTy9V1GSIrBrpz7NVtt8Ow0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;396&quot; data-origin-width=&quot;1280&quot; data-origin-height=&quot;791&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;안녕하세요 눈사람입니다. 운영체제를 학습하면서 풀어본 연습문제 답을 공유하고자, 포스트합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 포스트는 직접 풀어보면서 작성한 글이므로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;u&gt;정답이 아닐 수 있습니다&lt;/u&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; 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;style1&quot; /&gt;
&lt;h4 style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;7장 연습문제(개념체크)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. 젓가락과 숟가락이 하나씩만 있는 식탁에서 두 사람이 식사를 한다고 하자. 숟가락과 젓가락을 동시에 들어야 한 입 식사가 가능하며, 숟가락이든 젓가락이든 한 번에 하나씩 들어야 한다. 한 개만 가진 사람은 나머지 한 개가 준비될 때까지 기다려야 한다. 한 입 식사 후 들고 있던 숟가락과 젓가락은 모두 내려놓으며, 둘은 대화할 수 없다고 할 때, 두 사람이 식사하는 동안 교착 상태가 발생하는 상황을 사례를 들어 설명하라.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;u&gt; &lt;/u&gt;-&amp;gt; 한 사람이 숟가락을 드는 것과 동시에 다른 사람이 젓가락을 들면, 두 사람은 상대가 가진 것을 확보할 때까지 무한정 기다리는 교착 상태에 빠진다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. 식사하는 철학자 문제를 잘못 기술한 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 식사하는 철학자 문제는 공유 자원에 대한 멀티스레드의 스케줄링 문제이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. 식사하는 철학자 문제를 해결하는 방법으로 적합한 것을 있는 대로 골라라.&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 철학자가 하나의 포크를 들고 다른 포크를 1분 이상 기다릴 때, 두 포크를 놓고 잠시 생각한 뒤 다시 식사를 하면 해결된다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2. 식당에 지배인을 두고 지배인이 포크를 대기하고 있는 척학자가 있을 때, 기다리는 포크를 가지고 1분 이상 식사하고 있는 옆 철학자의 포크를 뺏어 주면 된다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;3. 포크마다 번호를 매기고 포크가 필요할 때 번호순으로 포크를 들게 하면 해결된다&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. 식사하는 철학자 문제가 단일 CPU에서도 발생할 수 있는가, 없는가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;-&amp;gt; 발생할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5. 다음 문장의 빈 곳에 적절한 단어를 선택하여 문장을 완성하라.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;컴퓨터 시스템에서&lt;/b&gt;&amp;nbsp;&lt;b&gt;(&lt;/b&gt;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;교착상태&lt;/span&gt;&amp;nbsp;&lt;b&gt;)는 deadly embrace라고도 불리는 것으로 (&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;교착상태&lt;/span&gt;&amp;nbsp;&lt;b&gt;)가 유발되는 4가지 필요충분조건은 (&lt;/b&gt;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;코프만&lt;/span&gt;&lt;b&gt;&amp;nbsp;)에 의해 증명되었다. 그럼에도 불구하고 현재 거의 모든 컴퓨터 시스템에서는 이를 무시하는 방법을 사용하고 있는데 이것을 (&lt;/b&gt;&amp;nbsp;&lt;span style=&quot;color: #006dd7;&quot;&gt;타조&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp;&lt;/span&gt;) 알고리즘이라고 부른다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;&amp;nbsp;- 식사하는 철학자, 치킨, 교착상태, 상호배제, 소유하면서 대기, 다익스트라(Dijksra), 폰노이만, 타조, 롤백, 코프만&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;6. 코프만의 4가지 조건에 해당하지 않는 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 우선순위 역전&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;7. 다음 자원할당 그래프에 대한 설명으로 맞는 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;4. 자원할당 그래프는 자원을 할당하는 과정에서 만들어진다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;8. 다음 자원 할당 그래프에 대한 설명으로 틀린 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;3. 현재 이 시스템에서 T4와 T5 사이에 교착상태가 발생하고 있다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp;-&amp;gt; &lt;span style=&quot;text-align: start;&quot;&gt;T4와 T5 사이에는 자원 할당 그래프의 간선들이 환형 고리를 이루고 있지 않기 때문에 교착상태가 아니다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;9. 다음 자원 할당 그래프 중 교착상태를 나타내는 것은 있는 대로 골라라.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;3. &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;text-align: start;&quot;&gt;&amp;nbsp;-&amp;gt; 3번 그래프만 자원 할당 그래프의 간선들이 환형 고리를 이루고 있다.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;10. 코프만 조건은 어떤 문제에 관한 것인가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 교착상태&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;11. 교착상태 무시 전략이 나오게 된 배경이 아닌 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2. 교착상태가 발생한다고 피해가 발생하는 것은 아니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;12. 교착상태 예반 전략의 이론적 배경은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 코프만 조건&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;13. 자원할당 그래프를 전혀 사용할 필요가 없는 교착상태 해결 전략은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;4. 교착상태 무시&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;14. 교착상태 관련 알고리즘 중 타조 알고리즘에 대한 설명을 틀린 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;3. 타조가 머리를 모래에 박은 것처럼 교착상태가 지나가도록 기다리는 방법이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;15. 교착상태 해결 방법 중 타조 알고리즘이 적합한 상황은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 개인용 PC&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;16. 교착상태 감지 및 복구와 관련된 방법이 아닌 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2. 모든 자원에 번호를 붙이고 각 스레드는 자원을 할당받을 때 작은 번호의 자원부터 할당받도록 함&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp;-&amp;gt; 교착상태 예방에 관련된 방법&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;17. 교착상태 감지 및 복구 방법에 대한 설명으로 틀린 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;3. 사용자나 시스템 관리자가 교착상태가 발생하였다고 생각되면 시스템을 재시작시킨다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp;-&amp;gt; 해당 상황에서 스레드 강제 종료(Kill process) 방법을 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;18. 교착상태에 대한 설명으로 옳은 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2. 교착상태는 몇 몇 스레드들 사이에서 발생하므로 이들만의 문제이지 시스템 전체의 문제는 아니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;19. 교착상태는 주로 어디에서 발생하는가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 사용자가 작성한 멀티스레드 응용프로그램의 스레드들 사이에&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp;-&amp;gt; 개발자의 미숙한 멀티스레드 코딩에서 비롯됨&lt;/span&gt;&lt;/p&gt;</description>
      <category>운영체제</category>
      <category>7장 연습문제</category>
      <category>명품 운영체제</category>
      <category>명품 운영체제 7장</category>
      <category>생능출판</category>
      <category>연습문제</category>
      <category>연습문제 답</category>
      <category>연습문제 답안</category>
      <category>운영체제</category>
      <author>5n0wman</author>
      <guid isPermaLink="true">https://hack-snowman.tistory.com/16</guid>
      <comments>https://hack-snowman.tistory.com/16#entry16comment</comments>
      <pubDate>Sun, 3 Dec 2023 21:07:17 +0900</pubDate>
    </item>
    <item>
      <title>명품 운영체제 연습문제 6장</title>
      <link>https://hack-snowman.tistory.com/15</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;791&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dDgXzS/btsBbMy20NE/kp0wo54Ku3KKQ8McOzKtKk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dDgXzS/btsBbMy20NE/kp0wo54Ku3KKQ8McOzKtKk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dDgXzS/btsBbMy20NE/kp0wo54Ku3KKQ8McOzKtKk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdDgXzS%2FbtsBbMy20NE%2Fkp0wo54Ku3KKQ8McOzKtKk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;396&quot; data-origin-width=&quot;1280&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;&lt;span style=&quot;color: #000000;&quot;&gt;안녕하세요 눈사람입니다. 운영체제를 학습하면서 풀어본 연습문제 답을 공유하고자, 포스트합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #555555; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 포스트는 직접 풀어보면서 작성한 글이므로&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;u&gt;정답이 아닐 수 있습니다&lt;/u&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;6장 연습문제(개념체크)&lt;/b&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. 여러 스레드가 공유 변수를 접근하려고 경쟁할 때 공유 변수의 값이 훼손되는 상황이 발생할 수 있다. 공유 변수가 훼손되지 않도록 스레드 사이에 공유 변수에 대한 접근 시간과 방법 등을 조절하는 기법을 무엇이라고 하는가.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 스레드 동기화&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. 멀티스레드가 동시에 공유 데이터를 접근할 때 데이터가 훼손되지 않도록 막는 기법의 핵심 정책은 무엇인가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 상호배제&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. 다음은 무엇에 대한 정의인가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;- 다수의 스레드로부터 공유 데이터의 훼손을 막기 위해 임계구역이 오직 한 스레드만 배타적 독점적으로 사용하도록 관리하는 기술&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 상호배제&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. 원자명령(atomic instruction)이란?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. CPU 명령&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5. Test and Set Lock 혹은 TSL 명령에 대한 설명이 틀린 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;4. 스핀락&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;6. 다음 원자명령에 대한 설명으로 옳은 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- TSL ax, lock&lt;b&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;4. lock 변수 값을 ax에 읽어오고 lock 변수에 1을 저장한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; TSL ax, lock은 mov ax, lock과 mov lock,1을 합친 명령이다.&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;7. 원자명령과 가장 거리가 먼 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;4. 원자명령은 거의 모든 CPU에 있으며 CPU를 막론하고 이름이 동일하다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;8. 임계구역에 대한 설명으로 틀린 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;4. 대부분의 운영체제는 임계구역에 진입할 때 다른 스레드가 진입하지 못하도록 인터럽트를 금지시키고, 나올 때 인터럽트를 허용하는 방법을 사용한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;-&amp;gt; 현재는 하드웨어적 방법을 사용하며 그중에서 '원자명령'을 활용하는 방법을 사용&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;9. 멀티스레드의 동기화 기법 중 멀티코어 CPU를 가진 현대의 시스템에 적합한 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2. 스핀락&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;10. 멀티스레드의 동기화 기법 중 요청한 자원을 사용할 수 있을 때까지 대기하는 큐를 사용하지 않는 방법은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2. 스핀락&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;11. 임계구역의 실행 시간이 매우 짧을 경우에 적합한 멀티스레드의 동기화 기법은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7; text-align: start;&quot;&gt;2. 스핀락&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;12. 커널 코드나 인터럽트 서비스 루틴 등에서 임계 구역에 접근할 때 멀티스레드 동기화를 위해 사용되는 기법은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7; text-align: start;&quot;&gt;2. 스핀락&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;13. 멀티스레드 동기화 기법 중 오랜 시간 동안 공유 자원을 접근하지 못하는 기아가 발생할 수 있는 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7; text-align: start;&quot;&gt;2. 스핀락&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;14. 멀티스레드의 동기화는 왜 필요한가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2. 여러 스레드가 동시에 동일한 변수를 읽고 쓸 때 발생하는 문제를 해결하기 위해&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;15. 다음 중 CPU 사용 시간을 심하게 낭비하는 것이 아닌 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2. sleep-waiting&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;16. 다음 중 동기화가 발생하는 공간에 대한 것 중 옳은 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;3. 사용자 공간과 커널 공간 모두 동기화 필요&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;17. 우선순위 역전에 대한 설명 중 틀린 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;4. 우선순위 역전은 낮은 순위의 스레드가 기아 상태에 빠지는 것을 막기 위한 매우 효율적인 방법이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;18. 공유 자원과 가장 거리가 먼 단어는?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;4. N:1 매핑&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;19. 생산자 소비자 문제에 대해 잘 설명한 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 공유 버퍼를 사이에 두고 공유 버퍼에 데이터를 저장하는 스레드와 공유 버퍼로부터 데이터를 읽어가는 스레드 사이에 공유 버퍼에 대한 동시 접근 문제이다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;20. 생산자 소비자 문제인 것을 모두 골라라.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 마이크로부터 연속하여 들어오는 오디오 샘플을 큐에 넣는 스레드와 큐의 오디오 샘플을 스피커로 출력하는 스레드&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;3. 프린트할 파일이 생길 때마다 큐에 넣은 스레드와 큐에 있는 파일을 프린터로 출력하는 스레드&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;21. pthread 라이브러리를 이용하여 작성된 다음 4개의 보기에 대해 물음에 답하라. 보기에서 worker() 함수는 스레드가 실행하는 코드이다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(1) 보기 (1)에서 임계구역의 코드를 적어라.&amp;nbsp; &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;sum = sum + 10;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(2) worker()를 실행하는 10개의 스레드가 동시에 실행될 때 4개의 보기 중 가장 실행 속도가 느린 코드는?&amp;nbsp; &amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;보기&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;(3)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(3) worker()를 실행하는 10개의 스레드가 동시에 실행될 때 4개의 보기 중 가장 실행 속도가 빠른 코드는?&amp;nbsp; &amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;보기&lt;/span&gt;&lt;b&gt; &lt;/b&gt;&lt;span style=&quot;color: #006dd7; text-align: start;&quot;&gt;(2)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(4) worker()를 10개의 스레드가 동시에 실행될 때 스레드 동기화가 실패할 가능성이 있는 코드는?&amp;nbsp; &lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;4. 보기 (3)&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #9d9d9d;&quot;&gt;-&amp;gt; (3) 코드는 x에 대한 접근은 동기화하고 있지만, sum에 대한 최종 수정에서 동기화가 부족하다. 이는 여러 스레드가 동시에 sum에 접근하여 값을 변경할 때 동기화가 실패할 가능성이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;22. 다음은 비디오 플레이어 응용프로그램의 구조를 간략히 묘사한 것이다. 물음에 답하라.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(1) 이 응용프로그램을 개발하기 위해서는 생산자 소비자 문제를 해결해야 한다. 생산자 소비자 문제는 생산자 스레드, 소비자 스레드, 스리고 공유 버퍼로 구성되는데 이들이 각각 그림의 어느 부분에 해당하는지 밝혀라.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp; &amp;nbsp; 생산자 스레드 : 입력스레드&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp; &amp;nbsp; 소비자 스레드 : 재생스레드&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp; &amp;nbsp; 공유버퍼 : 비디오 버퍼&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(2) 이 응용프로그램에서 입력스레드와 재생스레드가 생산자와 소비자로서 비디오를 재생하는 과정을 간단히 설명하라.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;입력스레드는 네트워크로부터 한 프레임씩 읽어 비디오 버퍼에 저장하는 일을 반복하고, 재생스레드는 비디오 버퍼에 도착하는 프레임을 읽고 디코딩하여 디스플레이에 출력하는 작업을 반복한다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>운영체제</category>
      <category>6장 연습문제</category>
      <category>명품 운영체제</category>
      <category>생능출판</category>
      <category>연습문제</category>
      <category>연습문제 답</category>
      <category>연습문제 답안</category>
      <category>운영체제</category>
      <author>5n0wman</author>
      <guid isPermaLink="true">https://hack-snowman.tistory.com/15</guid>
      <comments>https://hack-snowman.tistory.com/15#entry15comment</comments>
      <pubDate>Fri, 1 Dec 2023 00:46:42 +0900</pubDate>
    </item>
    <item>
      <title>명품 운영체제 연습문제 5장</title>
      <link>https://hack-snowman.tistory.com/14</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;operating-system-1995434_1920.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1187&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bj8ASi/btsBfdidZaN/gCn0LCbJ8OtmnVM3z8LWUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bj8ASi/btsBfdidZaN/gCn0LCbJ8OtmnVM3z8LWUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bj8ASi/btsBfdidZaN/gCn0LCbJ8OtmnVM3z8LWUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbj8ASi%2FbtsBfdidZaN%2FgCn0LCbJ8OtmnVM3z8LWUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;669&quot; height=&quot;414&quot; data-filename=&quot;operating-system-1995434_1920.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1187&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;안녕하세요 눈사람입니다. 운영체제를 학습하면서 풀어본 연습문제 답을 공유하고자, 포스트합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;해당 포스트는 직접 풀어보면서 작성한 글이므로 &lt;u&gt;정답이 아닐 수 있습니다&lt;/u&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style1&quot; /&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5장 연습문제(개념체크)&lt;/b&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;1. 다음 빈 칸에 적절한 단어를 삽입하라.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;프로그램의 실행 과정은 두 가지 상황이 번갈아 진행되는데, 그것은 한동안 CPU 연산이 계속되는 (&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;CPU burst&lt;/span&gt;&lt;b&gt;&amp;nbsp;) 상황과, I/O 작업이 이루어지는 (&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;I/O burst&lt;/span&gt;&lt;b&gt;&amp;nbsp;) 상황이다. CPU 연산이 주를 이룰 때 (&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;CPU 집중&lt;/span&gt;&lt;b&gt;&amp;nbsp;) 프로세스라고 부르고 I/O 작업이 주를 이룰 때 (&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;I/O 집중&lt;/span&gt;&lt;b&gt;&amp;nbsp;) 프로세스라고 한다. CPU 스케줄링은 CPU의 (&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;idle&lt;/span&gt;&lt;b&gt;&amp;nbsp;) 시간을 줄이기 위해 도입되었다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;2. CPU 스케줄링 알고리즘을 평가하는 기준과 거리가 먼 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2. 동시성(concurrency)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;3. CPU 스케줄링의 평가 기준 사이의 관계를 잘못 설명한 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;3. 시스템 정책 우선으로 스케줄링하면 CPU 활용률은 높아진다.&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;4. CPU 스케줄링이 행해지는 상황들을 나열하였다. 비어 있는 상황을 적어라.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫째, 스레드에게 할당된 CPU 타임 슬라이스가 소진되었을 때&lt;br /&gt;둘째, 스레드가 자발적으로 CPU를 반환하는 경우&lt;br /&gt;셋째, 현재 실행중인 스레드보다 더 높은 순위의 스레드로부터 내려진 입출력이 완료되어 I/O 인터럽트가 발생한 경우&lt;br /&gt;넷째, &lt;span style=&quot;color: #006dd7;&quot;&gt;스레드가 블록(blocked) 상태가 되거나, 자원을 기다리는 상태가 되는 경우&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;5. 타임 슬라이스에 대한 설명으로 틀린 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;4.&amp;nbsp; 타임슬라이스가 클수록 컨텍스트 스위칭의 횟수가 증가한다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;6. 선점과 비선점 중 선택하여 빈 칸을 채워라&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;스레드가 CPU를 할당받아 일단 실행을 시작하면 완료되거나 CPU를 더 이상 사용할 수 없는 상황이 될 때까지 스레드를 강제로 중단시키지 않는 방식을 (&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;비선점&lt;/span&gt;&lt;b&gt;&amp;nbsp;) 스케줄링이라고 하며, 커널이 현재 실행 중인 스레드를 강제로 중단시켜 준비 리스트로 이동시키고, 스케줄링을 통해 다른 스레드에게 CPU를 넘겨주는 방식을 (&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;선점&lt;/span&gt;&lt;b&gt;&amp;nbsp;) 스케줄링 이라고 한다. (&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;비선점&lt;/span&gt;&lt;b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&amp;nbsp;&lt;/span&gt;) 스케줄링의 경우, 스레드가 더 이상 CPU를 사용할 수 없는 상황에야 비로소 스케줄링이 이루어 진다. PC와 같은 범용 시스템에서 (&amp;nbsp;&lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;비선점&lt;/span&gt;&lt;b&gt;&amp;nbsp;) 스케줄링은 현재는 거의 사용되고 있지 않다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;7. 다음 스케줄링이 선점 스케줄링인지 비선점 스케줄링인지 표기하라.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(1) 선입 선처리 (FCFS) : &lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;비선점 스케줄링&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(2) 최단 작업 우선 스케줄링 (SJF) : &lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;비선점 스케줄링&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(3) 최소 잔여 시간 우선 스케줄링 (SRTF) : &lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;선점 스케줄링&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(4) 라운드 로빈 스케줄링 (RR) : &lt;/b&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;선점 스케줄링&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;8. 다음 그림은 3개의 프로세스 p1, p2, p3이 실행되는 과정을 보여준다. 선점 스케줄링과 비선점 스케줄링 중 어떤 것이 사용되었는지 판단하고 그 이유를 설명하라.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; 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-origin-width=&quot;1352&quot; data-origin-height=&quot;572&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7UFGz/btsBbLUk3Oj/cUT9AKlVnBI4Q6xKvd1AU0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7UFGz/btsBbLUk3Oj/cUT9AKlVnBI4Q6xKvd1AU0/img.png&quot; data-alt=&quot;황기태, 생능출판사, &amp;amp;lt;명품 운영체제&amp;amp;gt; p.287&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7UFGz/btsBbLUk3Oj/cUT9AKlVnBI4Q6xKvd1AU0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7UFGz%2FbtsBbLUk3Oj%2FcUT9AKlVnBI4Q6xKvd1AU0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;628&quot; height=&quot;266&quot; data-origin-width=&quot;1352&quot; data-origin-height=&quot;572&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;황기태, 생능출판사, &amp;lt;명품 운영체제&amp;gt; p.287&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;비선점 스케줄링이다.&lt;/span&gt;&lt;br /&gt;T1이 시작하면 종료하기 전 까지 스케줄링이 이루어지지 않으며, T1이 종료될때 스케줄링이 이루어져 T2가 실행된다. T2의 실행 중 I/O가 발생하면 T2를 중단시키고 스케줄링을 실행하여 T3를 선택한다. T3이 실행 중 yield()를 호출하면 준비상태인 T2를 스케줄링하고 실행시킨다. T2가 끝날때 다시 스케줄링이 이루어져 T3이 실행된다. 즉, 타임슬라이스마다 강제 종료되는 프로세스가 없기 때문에 비선점 스케줄링이다.&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;9. 다음은 무엇에 대한 설명인가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스케줄링 과정에서 선택되지 못한 채 오랫동안 준비 리스트에 있는 상황&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;4. 기아&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;10. 다음은 무엇에 대한 설명인가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스레드가 준비 리스트에 머무르는 시간에 비례하여 우선수위를 높여주는 기법&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;3. 에이징(aging)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;11. 다음은 무엇에 대한 설명인가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 프로세스나 스레드가 특정 CPU에서 실행되도록 제한하는 스케줄러의 특징&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #99cefa;&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. CPU 친화성(CPU affinity)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;12. 에이징(aging) 기법은 CPU 스케줄링의 어떤 단점을 극복하기 위한 정책인가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;기아 발생&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;13. RR(Round Robin) 스케줄링을 사용할 때 오늘날 합리적인 타임 슬라이스로 적합한 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;3. 50 밀리초&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;(10ms~100ms가 적당하다.)&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;14. 스레드가 종료할 때 비로소 새 스레드를 스케줄한다면 이 운영체제는 선점 스케줄링을 하는가 아니면 비선점 스케줄링을 하는가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;비선점 스케줄링&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;15. 다음은 에이징을 설명하는 문장이다. 빈 칸에 적절한 단어는 무엇인가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;- 스레드가 준비 리스트에 머무르는 시간에 비례하여 스레드의 (&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;)을/를 높이는 기법이다.&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 우선순위&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;16. 다음 CPU 스케줄링 알고리즘 중에서 실현성이 없는 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2. SJF&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;-&amp;gt; 현실적으로 스레드의 실행 시간을 예측하는 것을 어렵다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;17. 다음 중 모든 스레드에게&lt;/b&gt;&amp;nbsp;CPU를&lt;b&gt;&amp;nbsp;가장 공평하게 나누어 주는 스케줄링 기법은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. RR&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;18. 다음 중 기아 발생 가능성이 가장 큰 CPU 스케줄링은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;4. SJF&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;19. 다음 중 기아가 전혀 발생하지 않는 CPU 스케줄링은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. RR&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;20. 어떤 연구소에서 컴퓨터 시스템 사용자들을 책임연구원, 연구원, 연구 보조원의 3 그룹으로 나누어 놓고 각 사용자들이 생성된 프로세스나 스레드의 우선순위를 다르게 매기려고 한다. 가장 적절한 CPU 스케줄링은 무엇인가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;4. MLQ&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;21. RR(Round Robin) 스케줄링에서 스레드에게 할당하는 타임 슬라이스의 크기에 관한 설명 중 틀린 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2. 타임 슬라이스가 클수록 더 균등한 알고리즘이 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;22. MLFQ(Multi-Level Feedback Queue) 스케줄링에 대한 설명으로 옳은 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;2. 스레드의 기아를 막기 위해 큐에 대기하는 시간이 오래되면 위 레벨의 큐로 이동시킨다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;23. 단일 코어 CPU와 달리 멀티 코어 CPU에서 스케줄링할 때 특별히 고려할 사항과 거리가 가장 먼 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 타임 슬라이스&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;24. 코어 친화성 혹은 CPU 친화성과 관계가 깊은 것은?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;1. 캐시&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;25. 멀티 코어 CPU를 가진 시스템에서 CPU 스케줄링 알고리즘은 스레드를 어떤 코어에서 실행시킬 것인지에 따라 컨텍스트 스위칭 후 오버헤드가 달라진다고 한자.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(1) 구체적으로 어떤 오버헤드가 문제인가?&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;CPU 스케줄러에 의해 어떤 코어에 실행되기로 결정된 스레드가 이전에 이 코어에서 실행된 적이 없다면, 새 스레드가 실행된 이후 새 스레드의 코드와 데이터가 캐시에 적재되는 오버헤드.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;(2) 이 오버헤드를 줄일 수 있는 해결책은 무엇인가?&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;한 스레드를 동일한 코어에서만 계속 실행되도록 스케줄 하는 CPU 친화성(CPU affinity)으로 해결된다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;&lt;b&gt;26. 멀티 코어 CPU를 가진 시스템에서 스케줄링이 잘못되면 한 코어에만 스레드가 몰리고 다른 코어는 놀게 되는 현상이 나타난다. 이러한 현상을 무엇이라고 부르고 그 해결책은 무엇인가?&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;코어 부하 불균형 현상.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;해결책 : 푸시 마이그레이션 기법, 폴 마이그레이션 기법 &lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #666666; text-align: start;&quot; data-ke-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>운영체제</category>
      <category>5장 연습문제</category>
      <category>명품 운영체제</category>
      <category>생능출판</category>
      <category>연습문제</category>
      <category>연습문제 답</category>
      <category>연습문제 답안</category>
      <category>운영체제</category>
      <author>5n0wman</author>
      <guid isPermaLink="true">https://hack-snowman.tistory.com/14</guid>
      <comments>https://hack-snowman.tistory.com/14#entry14comment</comments>
      <pubDate>Thu, 30 Nov 2023 21:20:43 +0900</pubDate>
    </item>
    <item>
      <title>[인증 우회] SQL 인젝션 공격 방법에 대하여</title>
      <link>https://hack-snowman.tistory.com/13</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;sql-6060942_1920.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;960&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEMpmt/btsAUKuRTZr/nVcFCAUVYDTbAWYkwt4Va1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEMpmt/btsAUKuRTZr/nVcFCAUVYDTbAWYkwt4Va1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEMpmt/btsAUKuRTZr/nVcFCAUVYDTbAWYkwt4Va1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEMpmt%2FbtsAUKuRTZr%2FnVcFCAUVYDTbAWYkwt4Va1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1920&quot; height=&quot;960&quot; data-filename=&quot;sql-6060942_1920.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 애플리케이션에 대한 보안 공격은 다양한 형태로 나타납니다. 그 중에서도 SQL 인젝션은 데이터베이스에 직접적인 명령을 주입하여 인증을 우회하거나 데이터를 무단으로 조회하는 공격 기법입니다. 이 포스트에서는 SQL 인젝션의 여러 사례와 함께 이를 방지하기 위한 기본적인 전략을 살펴보겠습니다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;SQL 인젝션의 개념&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SQL 인젝션은 공격자가 애플리케이션의 입력 필드를 통해 악의적인 SQL 코드를 데이터베이스 시스템에 주입하는 행위입니다. 이 공격은 주로 데이터베이스와 상호 작용하는 웹 폼을 통해 이루어집니다. 공격자는 데이터베이스 쿼리의 일부로 실행될 수 있는 코드를 입력함으로써, 애플리케이션을 속여 원래의 쿼리 구조를 변경하게 만듭니다.&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;공격 방법&amp;nbsp;&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 서버 측에 준비된 쿼리가 다음과 같다고 설정해봅니다.&lt;/p&gt;
&lt;pre id=&quot;code_1701093065664&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select * from member where id='__' and pw='__';&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이에 ID 입력란에 &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1' or '1'='1' #&lt;/span&gt; 이렇게 입력해보겠습니다. 완성된 쿼리는 다음과 같을 것입니다.&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701093384671&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;select * 
from member 
where id='1' OR '1'='1' #'~~;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;이는 서버 측에 준비된 쿼리에 항상 참인 조건인 &lt;/span&gt;'1'='1'을 주입함으로써, 추가 조건문 없이 모든 사용자 정보를 조회할 수 있습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이러한 방식에는 다음과 같은 다른 구문으로도 가능합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;&amp;nbsp; - &lt;span style=&quot;background-color: #f6e199;&quot;&gt;1' OR 1=true #&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #fcfcfc; color: #666666; text-align: left;&quot;&gt;&amp;nbsp; - &lt;span style=&quot;background-color: #f6e199;&quot;&gt;id' OR true&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;SQL 인젝션 체크&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SQL 인젝션이 가능한지 여부를 체크하는 것은 보안 감사의 중요한 부분입니다. 이를 위해, &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;알고있는 계정이 존재하고 아이디와 패스워드가 id/pw라면, 입력 폼에&lt;/span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;' and '1'='1&lt;/span&gt;과 같은 구문을 입력하여 애플리케이션이 예상치 못한 방식으로 반응하는지 확인할 수 있습니다. 만약 시스템이 이러한 입력에 취약하다면, SQL 인젝션 공격에 대응하기 위한 보안 조치가 필요합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1701093821202&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;ID : id' and '1'='1
PW : pw&lt;/code&gt;&lt;/pre&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;공격 방법 2&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;만약 특정 사이트의 로그인 인증 쿼리가 다음과 같다고 설정해보겠습니다.&lt;/p&gt;
&lt;pre id=&quot;code_1701093902552&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$sql = &quot;select passwd from member where id='$user_id'&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이런 상황에서는, 위의 방법과 달리 &lt;span style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot;&gt;출력되는 passwd 컬럼의 값을 공격자가 로그인 폼에서 입력한 값으로 변조하는 방법이 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어,&lt;span&gt; &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;union&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;연산자를 이용해 &lt;/span&gt;ID 입력폼에 다음과 같이 입력합니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1701093997018&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;x' union select 'admin', '1234&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;그리고 PW 입력폼에 1234라고 입력하게 되면 쿼리가 실행되어 이러한 결과가 출력됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;쿼리에 출력된 비밀번호와 공격자가 입력한 비밀번호가 일치하기 때문에 로그인에 성공합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위 같은 결과가 나오는 까닭은 id가 x인 사용자가 존재하지 않기 때문에 원래 아무 데이터도 출력되지 않아야 하지만 select를 사용할 때 컬럼 부분에 문자열을 넣으면 입력한 문자열이 그대로 출력된다는 점을 이용하여 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;union select를 삽입&lt;/span&gt;해서 'admin', '1234' 라는 결과를 출도출해냅니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;해당 서버 데이터베이스 테이블에 컬럼이 id와 passwd 2개 밖에 없었기 때문에 원하는 결과를 출력할 수 있었지만, 원래 union select 구문을 사용한 sql 인젝션을 사용하려면 서버 데이터베이스와 컬럼의 개수를 맞춰줘야합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;컬럼 개수는 order by절을 이용해 알아낼 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 id=&quot;order-by-를-이용한-컬럼-수-알아내기&quot; style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;order by 를 이용한 컬럼 수 알아내기&lt;/h4&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;ORDER BY 구문은 숫자를 넣어서 정렬 할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;숫자는 해당 순서의 컬럼을 뜻하며 그 순서의 컬럼으로 정렬합니다. 그래서 컬럼의 개수보다 높은 숫자를 넣으면 오류가 발생합니다.&lt;/p&gt;
&lt;p style=&quot;background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;예를 들어, 컬럼의 수가 7 개일 경우 (경우의 수를 줄여가며 탐색해보겠습니다.)&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; background-color: #ffffff; color: #212529; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;order by 3 # (에러 X, 컬럼의 수가 3 이거나 3 보다 큼을 의미합니다.)&lt;/li&gt;
&lt;li&gt;order by 10 # (에러 발생, 컬럼의 수가 10보다 작습니다.)&lt;/li&gt;
&lt;li&gt;order by 5 # (에러 X, 컬럼의 수가 5 이거나 5 보다는 크지만 15 보단 작습니다.)&lt;/li&gt;
&lt;li&gt;order by 7 # (에러 X, 컬럼의 수가 7 이거나 7 보다는 크지만 10 보단 작습니다.)&lt;/li&gt;
&lt;li&gt;order by 8 # (에러 발생, 컬럼의 수는 7개 입니다.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;방어 전략&lt;/h2&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SQL 인젝션으로부터 웹 애플리케이션을 보호하기 위한 방법은 &lt;span style=&quot;background-color: #f6e199;&quot;&gt;여러 가지가 있습니다&lt;/span&gt;.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. 입력값 검증&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사용자로부터 받은 모든 입력값에 대한 검증은 기본적이면서도 중요한 방어 수단입니다. 특수 문자, SQL 키워드 등을 필터링하여 SQL 인젝션 공격을 차단할 수 있습니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. 파라미터화된 쿼리 사용&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;쿼리에 사용자 입력을 직접 삽입하는 대신, 파라미터화된 쿼리(prepared statements)를 사용하면 데이터베이스가 쿼리의 코드와 사용자 데이터를 명확하게 구분합니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. ORM 사용&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;객체 관계 매핑(Object-Relational Mapping, ORM) 프레임워크는 SQL 인젝션 공격에 대한 내장된 방어 기능을 제공합니다. ORM을 사용하면 개발자는 SQL 코드를 직접 작성하는 대신, 객체의 속성과 메서드를 통해 데이터베이스와 상호작용하게 됩니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4. 데이터베이스 사용자 권한 제한&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스의 사용자 권한을 최소화하면, SQL 인젝션 공격을 통해 획득할 수 있는 권한도 제한됩니다. 예를 들어, 웹 애플리케이션의 데이터베이스 계정은 데이터 조회에 필요한 최소한의 권한만 가져야 합니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;5. 오류 메시지 관리&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;애플리케이션의 오류 메시지가 데이터베이스 구조나 내부 정보를 노출하지 않도록 관리하는 것도 중요합니다. 자세한 오류 메시지는 공격자에게 유용한 힌트를 제공할 수 있습니다.&lt;/p&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot;&gt;&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #ffffff; color: #5c5c5c; text-align: start;&quot;&gt;
&lt;div&gt;
&lt;div id=&quot;reaction-12&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;SQL 인젝션은 웹 애플리케이션의 보안을 위협하는 심각한 공격 방법입니다. 개발자와 보안 전문가는 항상 입력값 검증, 파라미터화된 쿼리, ORM 사용, 데이터베이스 사용자 권한 제한, 그리고 오류 메시지의 관리를 통해 이러한 위협으로부터 시스템을 방어해야 합니다. 보안은 결코 등한시될 수 없는 웹 개발의 핵심 요소입니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #000000; text-align: start;&quot;&gt;Happy coding!  &lt;/span&gt;&lt;/p&gt;</description>
      <category>웹/웹 해킹</category>
      <category>DB</category>
      <category>sql injection</category>
      <category>sql 인젝션</category>
      <category>sql 인젝션 공격 방법</category>
      <category>sql 인젝션 방어</category>
      <author>5n0wman</author>
      <guid isPermaLink="true">https://hack-snowman.tistory.com/13</guid>
      <comments>https://hack-snowman.tistory.com/13#entry13comment</comments>
      <pubDate>Mon, 27 Nov 2023 23:30:51 +0900</pubDate>
    </item>
    <item>
      <title>맥북(M1/M2)에서 Colima를 활용한 오라클 설치 및 SQL Developer 설치 가이드</title>
      <link>https://hack-snowman.tistory.com/12</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;database-149760_1920.png&quot; data-origin-width=&quot;1590&quot; data-origin-height=&quot;1920&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3vgEC/btsATX8449O/86SCLqFsNFArj20D734Dwk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3vgEC/btsATX8449O/86SCLqFsNFArj20D734Dwk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3vgEC/btsATX8449O/86SCLqFsNFArj20D734Dwk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3vgEC%2FbtsATX8449O%2F86SCLqFsNFArj20D734Dwk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;354&quot; height=&quot;427&quot; data-filename=&quot;database-149760_1920.png&quot; data-origin-width=&quot;1590&quot; data-origin-height=&quot;1920&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요 이번 포스트에서는 오라클을 활용하여 데이터베이스 공부를 하고자 하였는데, 맥북에 설치가 안 되는 문제가 있었습니다. 이를 해결하기 위해 Apple Silicon Mac 환경에서 Colima를 사용하여 오라클 설치와 SQL Developer를 설치하는 방법을 공유하고자 합니다. 이 과정은 효율적인 개발 환경을 구축하는 데 도움이 될 것입니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;1. Docker 설치&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.docker.com/products/docker-desktop/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;Docker&lt;/a&gt;를 설치합니다. Docker는 컨테이너화된 애플리케이션을 관리하는 데 필수적인 도구입니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위의 링크를 클릭하여 설치합니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;2. Colima 실행하기&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;먼저 터미널을 열고 Colima를 실행합니다. 아래 명령어는 Colima를 x86_64 환경으로 시작합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1701087038794&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;colima start --memory 4 --arch x86_64&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 명령어를 통해 4GB의 메모리를 할당받는 가상환경을 구성할 수 있습니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 과정에서 콜리마가 준비되어 있지 않다면 해당 명령어를 통해 콜리마를 다운로드하여 줍니다.&lt;/p&gt;
&lt;pre id=&quot;code_1701087157486&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;brew install colima&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;3. &lt;span style=&quot;background-color: #f6e199;&quot;&gt;Docker에 Oracle 서버 이미지 다운로드&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;가상환경이 준비되면, 아래와 같은 Docker 명령어를 통해 Oracle 서버 이미지를 다운로드하고 실행합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1701087292173&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker run --restart unless-stopped --name oracle -e ORACLE_PASSWORD=pass -p 1521:1521 -d gvenzl/oracle-xe&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이후&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;docker ps 와 docker ps -a&lt;/span&gt; 명령어를 사용해 실행 중인 및 모든 컨테이너를 확인할 수 있습니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;4. 로그 확인&lt;/h3&gt;
&lt;pre id=&quot;code_1701087327968&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker logs -f oracle&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;위 명령어를 통해 Oracle 컨테이너의 로그를 실시간으로 확인합니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;5. SQL Developer를 통한 접속 테스트&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;a href=&quot;https://www.oracle.com/database/sqldeveloper/technologies/download/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;SQL Developer&lt;/a&gt;에 접속하여 아래 정보를 입력하고 테스트합니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;사전에 준비되어있지 않다면 위의 링크를 클릭하여 다운로드합니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;Host:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;localhost&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;Database:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;xe&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;Port:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;1521&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;Username:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;system&lt;/b&gt;&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;Password:&lt;span&gt;&amp;nbsp;&lt;/span&gt;pass&lt;span&gt;&amp;nbsp;&lt;/span&gt;(앞서 설정한 값)&lt;/li&gt;
&lt;/ul&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;데이터베이스명이 '&lt;span style=&quot;background-color: #f6e199;&quot;&gt;orcl&lt;/span&gt;'로 되어 있다면, 반드시 '&lt;span style=&quot;background-color: #f6e199;&quot;&gt;xe&lt;/span&gt;'로 변경해야 합니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;6. 샘플 계정 생성&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Docker 이미지에는 샘플 계정이 포함되어 있지 않으므로, 수동으로 생성합니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;아래의 과정을 따라 해보겠습니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;1. sqlplus에 접속합니다&lt;/p&gt;
&lt;pre id=&quot;code_1701087411454&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;docker exec -it oracle sqlplus&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp;2. 새 유저를 생성하고 필요한 권한을 부여합니다.&lt;/p&gt;
&lt;pre id=&quot;code_1701087465904&quot; class=&quot;sql&quot; data-ke-language=&quot;sql&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;-- user create
CREATE USER scott identified by tiger; 
-- 권한 부여
GRANT CONNECT, resource, dba to scott;&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;7. SQL Developer를 통한 샘플 계정 접속&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;새로 생성된 계정 정보를 이용해 SQL Developer에 접속합니다.&lt;/p&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;재부팅 후 데이터베이스 접근&lt;/span&gt;&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;시스템을 재부팅한 후 데이터베이스에 다시 접근하려면, 터미널에서 Colima를 실행하고(&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2단계와 같은 명령어&lt;/span&gt;) 필요한 Docker 컨테이너에 접속하면 됩니다.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;이 가이드가 여러분의 개발 환경 구축에 도움이 되기를 바랍니다. 문제가 발생할 경우 아래의 댓글란을 통해 질문해 주세요.&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;Happy coding!  &lt;/p&gt;</description>
      <category>데이터베이스</category>
      <category>colima</category>
      <category>docker</category>
      <category>M1</category>
      <category>M2</category>
      <category>Mac</category>
      <category>MacBook</category>
      <category>oracle</category>
      <category>SQL</category>
      <category>SQL Developer</category>
      <category>맥북</category>
      <author>5n0wman</author>
      <guid isPermaLink="true">https://hack-snowman.tistory.com/12</guid>
      <comments>https://hack-snowman.tistory.com/12#entry12comment</comments>
      <pubDate>Mon, 27 Nov 2023 21:27:55 +0900</pubDate>
    </item>
    <item>
      <title>[PHP/MYSQL] 회원 전용 게시판 만들기 3. 게시글 보기, 작성, 수정, 삭제</title>
      <link>https://hack-snowman.tistory.com/11</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKJnTW/btsAGW9b3YE/hxjo7CbfDd8VzCNFlofglk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKJnTW/btsAGW9b3YE/hxjo7CbfDd8VzCNFlofglk/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKJnTW/btsAGW9b3YE/hxjo7CbfDd8VzCNFlofglk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKJnTW%2FbtsAGW9b3YE%2Fhxjo7CbfDd8VzCNFlofglk%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;404&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;안녕하세요 눈사람입니다. 저번 포스트에 이어 게시판에서 제목을 누르면 게시글을 볼 수 있는 페이지와, 게시글 작성, 수정, 삭제 페이지를 살펴보겠습니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;먼저 게시글을 보는 페이지 view.php 입니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;view.php&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1700550690753&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
include $_SERVER[&quot;DOCUMENT_ROOT&quot;].&quot;/inc/header.php&quot;;

$bid=$_GET[&quot;bid&quot;];
$result = $mysqli-&amp;gt;query(&quot;select * from board where bid=&quot;.$bid) or die(&quot;query error =&amp;gt; &quot;.$mysqli-&amp;gt;error);
$rs = $result-&amp;gt;fetch_object();
?&amp;gt;
      &amp;lt;h3 class=&quot;pb-4 mb-4 fst-italic border-bottom&quot; style=&quot;text-align:center;&quot;&amp;gt;
        - 게시판 보기 -
      &amp;lt;/h3&amp;gt;

      &amp;lt;article class=&quot;blog-post&quot;&amp;gt;
        &amp;lt;h2 class=&quot;blog-post-title&quot;&amp;gt;&amp;lt;?php echo $rs-&amp;gt;subject;?&amp;gt;&amp;lt;/h2&amp;gt;
        &amp;lt;p class=&quot;blog-post-meta&quot;&amp;gt;&amp;lt;?php echo $rs-&amp;gt;regdate;?&amp;gt; by &amp;lt;a href=&quot;#&quot;&amp;gt;&amp;lt;?php echo $rs-&amp;gt;userid;?&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;

        &amp;lt;hr&amp;gt;
        &amp;lt;p&amp;gt;
          &amp;lt;?php echo $rs-&amp;gt;content;?&amp;gt;
        &amp;lt;/p&amp;gt;
        &amp;lt;hr&amp;gt;
      &amp;lt;/article&amp;gt;

      &amp;lt;nav class=&quot;blog-pagination&quot; aria-label=&quot;Pagination&quot;&amp;gt;
        &amp;lt;a class=&quot;btn btn-outline-secondary&quot; href=&quot;/index.php&quot;&amp;gt;목록&amp;lt;/a&amp;gt;
        &amp;lt;a class=&quot;btn btn-outline-secondary&quot; href=&quot;/reply.php?bid=&amp;lt;?php echo $rs-&amp;gt;bid;?&amp;gt;&quot;&amp;gt;답글&amp;lt;/a&amp;gt;
        &amp;lt;a class=&quot;btn btn-outline-secondary&quot; href=&quot;/write.php?bid=&amp;lt;?php echo $rs-&amp;gt;bid;?&amp;gt;&quot;&amp;gt;수정&amp;lt;/a&amp;gt;
        &amp;lt;a class=&quot;btn btn-outline-secondary&quot; href=&quot;/delete.php?bid=&amp;lt;?php echo $rs-&amp;gt;bid;?&amp;gt;&quot;&amp;gt;삭제&amp;lt;/a&amp;gt;
      &amp;lt;/nav&amp;gt;

&amp;lt;?php
include $_SERVER[&quot;DOCUMENT_ROOT&quot;].&quot;/inc/footer.php&quot;;
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0f0f0f; text-align: start;&quot;&gt;view.php는 웹 기반의 게시판 시스템에서 특정 게시글을 보여주는 기능을 구현한 것입니다. 각 부분의 기능을 설명하겠습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. 게시글 데이터 가져오기&lt;/h4&gt;
&lt;pre id=&quot;code_1700551252931&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$bid = $_GET[&quot;bid&quot;]; $result = $mysqli-&amp;gt;query(&quot;select * from board where bid=&quot;.$bid) or die(&quot;query error =&amp;gt; &quot;.$mysqli-&amp;gt;error);
$rs = $result-&amp;gt;fetch_object();&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;사용자로부터 전달받은&lt;span&gt;&amp;nbsp;&lt;/span&gt;bid(게시글 ID) 값을 사용하여 데이터베이스에서 해당 게시글을 조회합니다.&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;조회 결과는&lt;span&gt;&amp;nbsp;&lt;/span&gt;$rs&lt;span&gt;&amp;nbsp;&lt;/span&gt;객체에 저장됩니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. 게시글 표시&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;게시글 제목($rs-&amp;gt;subject), 등록 날짜($rs-&amp;gt;regdate), 작성자 아이디($rs-&amp;gt;userid), 내용($rs-&amp;gt;content) 등을 웹 페이지에 표시합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3. 네비게이션 버튼&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;'목록', '답글', '수정', '삭제' 등의 기능을 수행하는 버튼을 제공합니다. 각 버튼은 해당 기능을 수행하는 다른 PHP 페이지로의 링크를 포함합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;edited_edited_blob&quot; data-origin-width=&quot;2438&quot; data-origin-height=&quot;1760&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dZIlbN/btsAF4s82TZ/Jx9aRfzxcPae0a2Wo2ESMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dZIlbN/btsAF4s82TZ/Jx9aRfzxcPae0a2Wo2ESMk/img.png&quot; data-alt=&quot;view.php&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dZIlbN/btsAF4s82TZ/Jx9aRfzxcPae0a2Wo2ESMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdZIlbN%2FbtsAF4s82TZ%2FJx9aRfzxcPae0a2Wo2ESMk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2438&quot; height=&quot;1760&quot; data-filename=&quot;edited_edited_blob&quot; data-origin-width=&quot;2438&quot; data-origin-height=&quot;1760&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;view.php&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;필자가 만든 계정으로 로그인 한 뒤에 index.php에서 글 제목을 클릭하여 넘어온 view.php 화면입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 index.php에 게시글이 존재해야 view.php로 넘어올 수 있기 때문에 게시글을 작성해봐야겠죠?&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;게시글 작성 로직인 write.php를 알아보겠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;wirte.php&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1700551740901&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php
include $_SERVER[&quot;DOCUMENT_ROOT&quot;].&quot;/inc/header.php&quot;;

if(!isset($_SESSION['UID'])){
    echo &quot;&amp;lt;script&amp;gt;alert('이 게시판은 회원 전용입니다.');history.back();&amp;lt;/script&amp;gt;&quot;;
    exit;
}

$bid = isset($_GET[&quot;bid&quot;]) ? $_GET[&quot;bid&quot;] : null;
$subject = '';
$content = '';

if($bid){
    $result = $mysqli-&amp;gt;query(&quot;select * from board where bid=&quot;.$bid) or die(&quot;query error =&amp;gt; &quot;.$mysqli-&amp;gt;error);
    $rs = $result-&amp;gt;fetch_object();
    if(!$rs || $rs-&amp;gt;userid != $_SESSION['UID']){
        echo &quot;&amp;lt;script&amp;gt;alert('자신의 글이 아니면 편집할 수 없습니다.');history.back();&amp;lt;/script&amp;gt;&quot;;
        exit;
    }
    if ($rs) {
        $subject = $rs-&amp;gt;subject; // 데이터베이스에서 제목 할당
        $content = $rs-&amp;gt;content; // 데이터베이스에서 내용 할당
    }
}
?&amp;gt;
&amp;lt;form method=&quot;post&quot; action=&quot;write_ok.php&quot;&amp;gt;
    &amp;lt;input type=&quot;hidden&quot; name=&quot;bid&quot; value=&quot;&amp;lt;?php echo htmlspecialchars($bid);?&amp;gt;&quot;&amp;gt;
    &amp;lt;div class=&quot;mb-3&quot;&amp;gt;
        &amp;lt;label for=&quot;exampleFormControlInput1&quot; class=&quot;form-label&quot;&amp;gt;제목&amp;lt;/label&amp;gt;
        &amp;lt;input type=&quot;text&quot; name=&quot;subject&quot; class=&quot;form-control&quot; id=&quot;exampleFormControlInput1&quot; placeholder=&quot;제목을 입력하세요.&quot; value=&quot;&amp;lt;?php echo htmlspecialchars($subject); ?&amp;gt;&quot;&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&quot;mb-3&quot;&amp;gt;
        &amp;lt;label for=&quot;exampleFormControlTextarea1&quot; class=&quot;form-label&quot;&amp;gt;내용&amp;lt;/label&amp;gt;
        &amp;lt;textarea class=&quot;form-control&quot; id=&quot;exampleFormControlTextarea1&quot; name=&quot;content&quot; rows=&quot;3&quot;&amp;gt;&amp;lt;?php echo htmlspecialchars($content); ?&amp;gt;&amp;lt;/textarea&amp;gt;
    &amp;lt;/div&amp;gt;
    &amp;lt;button type=&quot;submit&quot; class=&quot;btn btn-primary&quot;&amp;gt;등록&amp;lt;/button&amp;gt;
&amp;lt;/form&amp;gt;
&amp;lt;?php
include $_SERVER[&quot;DOCUMENT_ROOT&quot;].&quot;/inc/footer.php&quot;;
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;write.php는 게시판 글쓰기 및 글 편집 기능을 처리합니다. 또한, &lt;span style=&quot;color: #000000; text-align: start;&quot;&gt;회원 전용 게시판에서 게시글을 작성하거나, 사용자가 작성한 기존의 게시글을 수정할 수 있는 기능을 제공합니다. &lt;span style=&quot;color: #006dd7;&quot;&gt;사용자가 로그인한 상태이며, 작성자 본인의 글만 편집할 수 있도록 검증하는 과정&lt;/span&gt;도 포함되어 있습니다.&lt;/span&gt; 여기에는 몇 가지 주요 기능과 검증 단계가 포함되어 있습니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. 로그인 상태 검증&lt;/h4&gt;
&lt;pre id=&quot;code_1700552205420&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(!isset($_SESSION['UID'])){ 
echo &quot;&amp;lt;script&amp;gt;alert('이 게시판은 회원 전용입니다.');history.back();&amp;lt;/script&amp;gt;&quot;; 
exit; 
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;사용자가 로그인하지 않았다면, 경고 메시지를 표시하고 이전 페이지로 돌아가게 합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. 게시글 정보 가져오기 및 수정 권한 검증&lt;/h4&gt;
&lt;pre id=&quot;code_1700551990359&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$bid = isset($_GET[&quot;bid&quot;]) ? $_GET[&quot;bid&quot;] : null;
...
if($bid){ 
	$result = $mysqli-&amp;gt;query(&quot;select * from board where bid=&quot;.$bid) or die(&quot;query error =&amp;gt; &quot;.$mysqli-&amp;gt;error); 
	$rs = $result-&amp;gt;fetch_object();
	if(!$rs || $rs-&amp;gt;userid != $_SESSION['UID']){ 
	echo &quot;&amp;lt;script&amp;gt;alert('자신의 글이 아니면 편집할 수 없습니다.');history.back();&amp;lt;/script&amp;gt;&quot;;
    	exit; 
	} ... 
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;$_GET[&quot;bid&quot;]를 통해 전달받은 게시글 ID(bid)를 사용하여 데이터베이스에서 해당 게시글을 조회합니다.&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;만약 조회된 게시글이 없거나, 현재 로그인한 사용자가 게시글 작성자가 아닌 경우, 경고 메시지를 표시하고 이전 페이지로 돌아갑니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3. 폼 데이터 채우기&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;조회된 게시글이 있을 경우, 제목($subject)과 내용($content)을 변수에 할당합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;4. 게시글 작성/편집 폼&lt;/h4&gt;
&lt;pre id=&quot;code_1700551965866&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;form method=&quot;post&quot; action=&quot;write_ok.php&quot;&amp;gt; ... &amp;lt;/form&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;게시글 작성 또는 편집을 위한 폼을 표시합니다. 이 폼은 제목과 내용을 입력받아&lt;span&gt;&amp;nbsp;&lt;/span&gt;write_ok.php로 전송합니다.&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;htmlspecialchars&lt;span&gt;&amp;nbsp;&lt;/span&gt;함수를 사용하여 제목과 내용을 HTML 특수 문자로 변환함으로써 XSS(Cross-Site Scripting) 공격을 방지합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 write.php에서 글 작성 폼을 입력받아 write_ok.php로 전송한 후에 write.php에서 어떻게 처리되는지 살펴봅시다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;write_ok.php&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1700552329058&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php session_start();
include $_SERVER[&quot;DOCUMENT_ROOT&quot;].&quot;/inc/dbcon.php&quot;;//dbcon.php 안에는 session_start()가 없기때문에 위에 따로 선언해준다.
if(!$_SESSION['UID']){
    echo &quot;&amp;lt;script&amp;gt;alert('회원 전용 게시판입니다.');location.href='/index.php';&amp;lt;/script&amp;gt;&quot;;
    exit;
}

$subject=$_POST[&quot;subject&quot;];
$content=$_POST[&quot;content&quot;];
$userid=$_SESSION['UID'];//userid는 세션값으로 넣어준다.
$status=1;//status는 1이면 true, 0이면 false이다.

$sql=&quot;insert into board (userid,subject,content) values ('&quot;.$userid.&quot;','&quot;.$subject.&quot;','&quot;.$content.&quot;')&quot;;
$result=$mysqli-&amp;gt;query($sql) or die($mysqli-&amp;gt;error);

if($result){
    echo &quot;&amp;lt;script&amp;gt;location.href='/index.php';&amp;lt;/script&amp;gt;&quot;;
    exit;
}else{
    echo &quot;&amp;lt;script&amp;gt;alert('글등록에 실패했습니다.');history.back();&amp;lt;/script&amp;gt;&quot;;
    exit;
}
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;write_ok.php는 write.php에서 받아온 폼을 데이터베이스에 등록하는 기능을 구현합니다. 스크립트의 각 부분은 다음과 같은 역할을 수행합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. 세션 시작 및 데이터베이스 연결 파일 포함&lt;/h4&gt;
&lt;pre id=&quot;code_1700552576145&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php session_start(); 
include $_SERVER[&quot;DOCUMENT_ROOT&quot;].&quot;/inc/dbcon.php&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;session_start(): 사용자의 세션을 시작합니다. 이는 사용자의 로그인 상태를 추적하는 데 필요합니다.&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;include $_SERVER[&quot;DOCUMENT_ROOT&quot;].&quot;/inc/dbcon.php&quot;;: 서버의 루트 디렉토리에 위치한&lt;span&gt;&amp;nbsp;&lt;/span&gt;dbcon.php&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일을 포함합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. 로그인 상태 검증&lt;/h4&gt;
&lt;pre id=&quot;code_1700552594204&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(!$_SESSION['UID']){ 
	echo &quot;&amp;lt;script&amp;gt;alert('회원 전용 게시판입니다.');location.href='/index.php';&amp;lt;/script&amp;gt;&quot;; 
	exit;
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;사용자가 로그인하지 않은 경우, '회원 전용 게시판입니다.'라는 메시지를 표시하고 메인 페이지(/index.php)로 리디렉션합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3. 게시글 정보 수집&lt;/h4&gt;
&lt;pre id=&quot;code_1700552615339&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$subject = $_POST[&quot;subject&quot;]; 
$content = $_POST[&quot;content&quot;]; 
$userid = $_SESSION['UID'];&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;사용자가 입력한 게시글의 제목(subject)과 내용(content)을 받아옵니다.&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;게시글 작성자의 아이디(userid)는 현재 로그인한 사용자의 세션에서 가져옵니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;4. 데이터베이스에 게시글 등록&lt;/h4&gt;
&lt;pre id=&quot;code_1700552627443&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$sql = &quot;insert into board (userid,subject,content) values ('&quot;.$userid.&quot;','&quot;.$subject.&quot;','&quot;.$content.&quot;')&quot;; 
$result = $mysqli-&amp;gt;query($sql) or die($mysqli-&amp;gt;error);&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;INSERT INTO&lt;span&gt;&amp;nbsp;&lt;/span&gt;SQL 명령을 사용하여&lt;span&gt;&amp;nbsp;&lt;/span&gt;board&lt;span&gt;&amp;nbsp;&lt;/span&gt;테이블에 새로운 게시글을 추가합니다. 이때, 사용자 아이디, 제목, 내용을 데이터베이스에 저장합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;5. 결과 처리 및 사용자 리디렉션&lt;/h4&gt;
&lt;pre id=&quot;code_1700552669959&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if($result){ 
	echo &quot;&amp;lt;script&amp;gt;location.href='/index.php';&amp;lt;/script&amp;gt;&quot;; 
} else { 
	echo &quot;&amp;lt;script&amp;gt;alert('글등록에 실패했습니다.');history.back();&amp;lt;/script&amp;gt;&quot;; 
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;게시글 등록이 성공하면 사용자를 메인 페이지(/index.php)로 리디렉션합니다.&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;등록에 실패한 경우 '글등록에 실패했습니다.'라는 메시지를 표시하고 이전 페이지로 돌아갑니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이제 view.php에서 게시글 삭제 버튼을 누르면 동작하는 delete.php를 같이 살펴보겠습니다.&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;delete.php&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;
&lt;pre id=&quot;code_1700552780547&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php session_start();
include $_SERVER[&quot;DOCUMENT_ROOT&quot;].&quot;/inc/dbcon.php&quot;;

if(!$_SESSION['UID']){
    echo &quot;&amp;lt;script&amp;gt;alert('회원 전용 게시판입니다.');location.href='/index.php';&amp;lt;/script&amp;gt;&quot;;
    exit;
}

$bid=$_POST[&quot;bid&quot;]??$_GET[&quot;bid&quot;];//post가 아니면 get으로 받는다

if($bid){
    $result = $mysqli-&amp;gt;query(&quot;select * from board where bid=&quot;.$bid) or die(&quot;query error =&amp;gt; &quot;.$mysqli-&amp;gt;error);
    $rs = $result-&amp;gt;fetch_object();

    if($rs-&amp;gt;userid!=$_SESSION['UID']){
        echo &quot;&amp;lt;script&amp;gt;alert('본인 글이 아니면 삭제할 수 없습니다.');location.href='/';&amp;lt;/script&amp;gt;&quot;;
        exit;
    }

    $sql=&quot;update board set status=0 where bid=&quot;.$bid;//status값을 바꿔준다.
    $result=$mysqli-&amp;gt;query($sql) or die($mysqli-&amp;gt;error);
}else{
    echo &quot;&amp;lt;script&amp;gt;alert('삭제할 수 없습니다.');history.back();&amp;lt;/script&amp;gt;&quot;;
    exit;
}


if($result){
    echo &quot;&amp;lt;script&amp;gt;alert('삭제했습니다.');location.href='/index.php';&amp;lt;/script&amp;gt;&quot;;
    exit;
}else{
    echo &quot;&amp;lt;script&amp;gt;alert('글삭제에 실패했습니다.');history.back();&amp;lt;/script&amp;gt;&quot;;
    exit;
}
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;delete.php는 웹사이트의 게시판에서 특정 게시글을 삭제하는 기능을 처리합니다. 스크립트의 각 부분은 다음과 같은 역할을 수행합니다.&lt;/p&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;1. 세션 시작 및 데이터베이스 연결 파일 포함&lt;/h4&gt;
&lt;pre id=&quot;code_1700553004629&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;&amp;lt;?php session_start(); include $_SERVER[&quot;DOCUMENT_ROOT&quot;].&quot;/inc/dbcon.php&quot;;&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;session_start(): 사용자의 세션을 시작합니다. 이는 사용자의 로그인 상태를 추적하는 데 필요합니다.&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;include $_SERVER[&quot;DOCUMENT_ROOT&quot;].&quot;/inc/dbcon.php&quot;;: 서버의 루트 디렉토리에 위치한 dbcon.php 파일을 포함합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;2. 로그인 상태 검증&lt;/h4&gt;
&lt;pre id=&quot;code_1700553019016&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if(!$_SESSION['UID']){ 
	echo &quot;&amp;lt;script&amp;gt;alert('회원 전용 게시판입니다.');location.href='/index.php';&amp;lt;/script&amp;gt;&quot;; 
	exit; 
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;사용자가 로그인하지 않은 경우, 경고 메시지를 표시하고 메인 페이지(/index.php)로 리디렉션합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;3. 게시글 ID 처리&lt;/h4&gt;
&lt;pre id=&quot;code_1700553028900&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;$bid = $_POST[&quot;bid&quot;] ?? $_GET[&quot;bid&quot;]; // POST가 아니면 GET으로 받는다&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;게시글 ID(bid)를 $_POST 또는 $_GET 배열에서 가져옵니다. 이는 폼 데이터나 URL 파라미터를 통해 전달될 수 있습니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;4. 게시글 삭제 권한 검증 및 처리&lt;/h4&gt;
&lt;pre id=&quot;code_1700553085812&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if($bid){ 
	... 
    if($rs-&amp;gt;userid != $_SESSION['UID']){ 
    ... 
    } 
    
	$sql = &quot;update board set status=0 where bid=&quot;.$bid; // status값을 바꿔준다. 
    ... 
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;bid가 존재할 경우, 해당 ID의 게시글을 데이터베이스에서 조회합니다.&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;게시글 작성자가 현재 로그인한 사용자와 다른 경우, 경고 메시지를 표시하고 홈페이지(/)로 리디렉션합니다.&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;게시글 작성자가 현재 로그인한 사용자와 같은 경우, board 테이블에서 해당 게시글의 status를 0으로 설정하여 게시글을 &quot;삭제&quot; 처리합니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;5. 결과 처리 및 사용자 리디렉션&lt;/h4&gt;
&lt;pre id=&quot;code_1700553118459&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;if($result){ 
	echo &quot;&amp;lt;script&amp;gt;alert('삭제했습니다.');location.href='/index.php';&amp;lt;/script&amp;gt;&quot;; 
} else { 
	echo &quot;&amp;lt;script&amp;gt;alert('글삭제에 실패했습니다.');history.back();&amp;lt;/script&amp;gt;&quot;; 
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;color: #000000;&quot;&gt;게시글 삭제(업데이트) 작업이 성공하면 사용자에게 알림을 표시하고 메인 페이지(/index.php)로 리디렉션합니다.&lt;/li&gt;
&lt;li style=&quot;color: #000000;&quot;&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;</description>
      <category>웹</category>
      <category>HTML</category>
      <category>MySQL</category>
      <category>php</category>
      <category>php 게시판 만들기</category>
      <category>게시판</category>
      <category>게시판 만들기</category>
      <author>5n0wman</author>
      <guid isPermaLink="true">https://hack-snowman.tistory.com/11</guid>
      <comments>https://hack-snowman.tistory.com/11#entry11comment</comments>
      <pubDate>Tue, 21 Nov 2023 16:53:07 +0900</pubDate>
    </item>
    <item>
      <title>[PHP/MYSQL] 회원 전용 게시판 만들기 2. 회원가입 및 로그인</title>
      <link>https://hack-snowman.tistory.com/9</link>
      <description>&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ehJB9U/btsAFqCze7a/pvQj52lV4Cj63oGRc12yIk/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ehJB9U/btsAFqCze7a/pvQj52lV4Cj63oGRc12yIk/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ehJB9U/btsAFqCze7a/pvQj52lV4Cj63oGRc12yIk/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FehJB9U%2FbtsAFqCze7a%2FpvQj52lV4Cj63oGRc12yIk%2Fimg.webp&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;640&quot; height=&quot;404&quot; data-origin-width=&quot;640&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;저번 포스트에 이어 로그인 및 회원가입 로직을 살펴보겠습니다.&lt;br&gt;먼저 로그인 페이지입니다.&lt;/p&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;login.php&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;html&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;?php
include $_SERVER[&quot;DOCUMENT_ROOT&quot;].&quot;/inc/header.php&quot;;
?&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;form class=&quot;row g-3 needs-validation&quot; method=&quot;post&quot; action=&quot;/members/login_ok.php&quot;&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class=&quot;col-12&quot;&amp;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;lt;label for=&quot;validationCustom02&quot; class=&quot;form-label&quot;&amp;gt;아이디&amp;lt;/label&amp;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;lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;userid&quot; name=&quot;userid&quot; placeholder=&quot;&quot; required&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class=&quot;col-12&quot;&amp;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;lt;label for=&quot;validationCustom02&quot; class=&quot;form-label&quot;&amp;gt;비밀번호&amp;lt;/label&amp;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;lt;input type=&quot;password&quot; class=&quot;form-control&quot; id=&quot;passwd&quot; name=&quot;passwd&quot; placeholder=&quot;&quot; required&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;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;lt;div class=&quot;col-12&quot;&amp;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;lt;button class=&quot;btn btn-primary&quot; type=&quot;submit&quot;&amp;gt;로그인&amp;lt;/button&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/form&amp;gt;
&amp;lt;?php
include $_SERVER[&quot;DOCUMENT_ROOT&quot;].&quot;/inc/footer.php&quot;;
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #0f0f0f;&quot;&gt;웹 페이지에서 로그인 폼을 생성하고 처리하는 과정을 나타냅니다. 코드의 주요 부분들은 다음과 같이 작동합니다.&lt;/span&gt;&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 로그인 폼&lt;/h4&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot;&gt;&lt;code&gt;&amp;lt;form class=&quot;row g-3 needs-validation&quot; method=&quot;post&quot; action=&quot;/members/login_ok.php&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;이&amp;nbsp;&amp;lt;form&amp;gt;&amp;nbsp;태그는 사용자의 아이디와 비밀번호를 입력받기 위한 로그인 폼을 정의합니다.&lt;/li&gt;&lt;li&gt;method=&quot;post&quot;는 폼 데이터를 서버에 제출할 때 HTTP POST 메소드를 사용하겠다는 것을 나타냅니다.&lt;/li&gt;&lt;li&gt;action=&quot;/members/login_ok.php&quot;는 폼 데이터가 제출될 때 처리될 서버 측 스크립트의 위치를 지정합니다.&lt;/li&gt;&lt;/ul&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 입력 필드&lt;/h4&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot;&gt;&lt;code&gt;&amp;lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;userid&quot; name=&quot;userid&quot; placeholder=&quot;&quot; required&amp;gt; 
&amp;lt;input type=&quot;password&quot; class=&quot;form-control&quot; id=&quot;passwd&quot; name=&quot;passwd&quot; placeholder=&quot;&quot; required&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;첫 번째&amp;nbsp;&amp;lt;input&amp;gt;&amp;nbsp;태그는 사용자 아이디를 입력받습니다.&amp;nbsp;type=&quot;text&quot;는 일반 텍스트 입력임을 나타냅니다.&lt;/li&gt;&lt;li&gt;두 번째&amp;nbsp;&amp;lt;input&amp;gt;&amp;nbsp;태그는 사용자의 비밀번호를 입력받습니다.&amp;nbsp;type=&quot;password&quot;는 입력된 내용이 화면에 가려져 보이지 않도록 합니다.&lt;/li&gt;&lt;li&gt;두 입력 필드 모두&amp;nbsp;required&amp;nbsp;속성을 가지고 있어서, 이 필드들이 비어 있으면 폼이 제출되지 않습니다.&lt;/li&gt;&lt;/ul&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 로그인 버튼&lt;/h4&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot;&gt;&lt;code&gt;&amp;lt;button class=&quot;btn btn-primary&quot; type=&quot;submit&quot;&amp;gt;로그인&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;이&amp;nbsp;&amp;lt;button&amp;gt;&amp;nbsp;태그는 폼 제출 버튼으로 사용됩니다.&amp;nbsp;type=&quot;submit&quot;&amp;nbsp;속성은 버튼을 클릭하면 폼이 제출됨을 의미합니다.&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 폼 데이터가 제출되면 login_ok.php로 이동합니다.&lt;br&gt;login_ok.php를 살펴보겠습니다.&lt;/p&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;login_ok.php&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;html&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;?php session_start();//로그인 처리와 로그인 여부를 확인하기 위해 세션을 사용한다.
include $_SERVER[&quot;DOCUMENT_ROOT&quot;].&quot;/inc/dbcon.php&quot;;

$userid=$_POST[&quot;userid&quot;];
$passwd=$_POST[&quot;passwd&quot;];
$passwd=hash('sha512',$passwd);

$query = &quot;select * from members where userid='&quot;.$userid.&quot;' and passwd='&quot;.$passwd.&quot;'&quot;;
$result = $mysqli-&amp;gt;query($query) or die(&quot;query error =&amp;gt; &quot;.$mysqli-&amp;gt;error);
$rs = $result-&amp;gt;fetch_object();

if($rs){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$_SESSION['UID']= $rs-&amp;gt;userid;//세션에 아이디값을 입력
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$_SESSION['UNAME']= $rs-&amp;gt;username;//세션에 사용자 이름을 입력
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo &quot;&amp;lt;script&amp;gt;alert('어서오십시오.');location.href='/index.php';&amp;lt;/script&amp;gt;&quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit;
}else{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo &quot;&amp;lt;script&amp;gt;alert('아이디나 암호가 틀렸습니다. 다시한번 확인해주십시오.');history.back();&amp;lt;/script&amp;gt;&quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit;
}
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;login_ok.php는 사용자의 로그인 과정을 처리합니다. 주요 기능과 각 부분의 역할은 다음과 같습니다.&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 세션 시작 및 데이터베이스 연결 파일 포함&lt;span style=&quot;color: #000000;&quot;&gt;&lt;/span&gt;&lt;/h4&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;html&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;?php session_start(); // 로그인 처리와 로그인 여부 확인을 위해 세션 시작 
include $_SERVER[&quot;DOCUMENT_ROOT&quot;].&quot;/inc/dbcon.php&quot;; // 데이터베이스 연결 설정 포함&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;session_start(): 사용자의 로그인 상태를 추적하기 위해 PHP 세션을 시작합니다.&lt;/li&gt;&lt;li&gt;include $_SERVER[&quot;DOCUMENT_ROOT&quot;].&quot;/inc/dbcon.php&quot;;: 데이터베이스 연결 설정이 포함된&amp;nbsp;dbcon.php&amp;nbsp;파일을 포함합니다.&lt;/li&gt;&lt;/ul&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 사용자 입력 처리&lt;/h4&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot;&gt;&lt;code&gt;$userid = $_POST[&quot;userid&quot;]; 
$passwd = $_POST[&quot;passwd&quot;]; $passwd = hash('sha512', $passwd);&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;사용자가 입력한 아이디(userid)와 비밀번호(passwd)를 받아옵니다.&lt;/li&gt;&lt;li&gt;비밀번호는 SHA-512 해시 알고리즘을 사용하여 해싱합니다. 이는 보안을 강화하기 위한 조치입니다.&lt;/li&gt;&lt;/ul&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 데이터베이스 쿼리&lt;/h4&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot;&gt;&lt;code&gt;$query = &quot;select * from members where userid='&quot;.$userid.&quot;' and passwd='&quot;.$passwd.&quot;'&quot;;
$result = $mysqli-&amp;gt;query($query) or die(&quot;query error =&amp;gt; &quot;.$mysqli-&amp;gt;error);
$rs = $result-&amp;gt;fetch_object();&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;members&amp;nbsp;테이블에서 입력받은 아이디와 해시된 비밀번호를 가진 사용자를 찾는 쿼리를 실행합니다.&lt;/li&gt;&lt;li&gt;쿼리 결과는&amp;nbsp;$rs&amp;nbsp;객체에 저장됩니다.&lt;/li&gt;&lt;/ul&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;4. 로그인 검증 및 세션 처리&lt;/h4&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot;&gt;&lt;code&gt;if($rs){ $_SESSION['UID'] = $rs-&amp;gt;userid; $_SESSION['UNAME'] = $rs-&amp;gt;username; ... }else{ ... }&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;$rs&amp;nbsp;객체가 존재하면, 즉 사용자 정보가 데이터베이스에서 발견되면, 해당 사용자가 성공적으로 로그인한 것으로 간주합니다.&lt;/li&gt;&lt;li&gt;로그인 성공 시, 사용자의 아이디와 이름을 세션 변수에 저장합니다.&lt;/li&gt;&lt;/ul&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;5. 사용자 리디렉션 및 메시지 출력&lt;/h4&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot;&gt;&lt;code&gt;echo &quot;&amp;lt;script&amp;gt;alert('어서오십시오.');location.href='/index.php';&amp;lt;/script&amp;gt;&quot;;
echo &quot;&amp;lt;script&amp;gt;alert('아이디나 암호가 틀렸습니다. 다시한번 확인해주십시오.');history.back();&amp;lt;/script&amp;gt;&quot;;&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;로그인에 성공하면 사용자에게 환영 메시지를 표시하고 메인 페이지(/index.php)로 리디렉션합니다.&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1768&quot; data-origin-height=&quot;510&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cnhFxS/btsACkizA96/EoyWr9wtcrOD1nqFRygdi0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cnhFxS/btsACkizA96/EoyWr9wtcrOD1nqFRygdi0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cnhFxS/btsACkizA96/EoyWr9wtcrOD1nqFRygdi0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcnhFxS%2FbtsACkizA96%2FEoyWr9wtcrOD1nqFRygdi0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1768&quot; height=&quot;510&quot; data-origin-width=&quot;1768&quot; data-origin-height=&quot;510&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;logout.php&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot;&gt;&lt;code&gt;&amp;lt;?php session_start();

session_destroy();

echo &quot;&amp;lt;script&amp;gt;alert('로그아웃 되었습니다.');location.href='/index.php';&amp;lt;/script&amp;gt;&quot;;
exit;
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 세션 파괴&lt;/h4&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot;&gt;&lt;code&gt;session_destroy();&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;session_destroy(): 현재 세션에 저장된 모든 데이터를 제거하고 세션을 파괴합니다. 이는 사용자가 로그아웃했을 때 수행되며, 세션에 저장된 모든 사용자 정보를 제거하여 로그아웃 상태를 만듭니다.&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;이제 로그인 과정을 모두 살펴보았습니다. 이어서 로그인에 사용할 계정을 생성하기 위해 회원가입 페이지를 구현해보도록 하겠습니다.&lt;/p&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;signup.php&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;html&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;?php
include $_SERVER[&quot;DOCUMENT_ROOT&quot;].&quot;/inc/header.php&quot;;
?&amp;gt;

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;form class=&quot;row g-3 needs-validation&quot; method=&quot;post&quot; action=&quot;signup_ok.php&quot;&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class=&quot;col-12&quot;&amp;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;lt;label for=&quot;validationCustom01&quot; class=&quot;form-label&quot;&amp;gt;이름&amp;lt;/label&amp;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;lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;userame&quot; name=&quot;username&quot; placeholder=&quot;&quot; required&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class=&quot;col-12&quot;&amp;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;lt;label for=&quot;validationCustom02&quot; class=&quot;form-label&quot;&amp;gt;아이디&amp;lt;/label&amp;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;lt;input type=&quot;text&quot; class=&quot;form-control&quot; id=&quot;userid&quot; name=&quot;userid&quot; placeholder=&quot;&quot; required&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class=&quot;col-12&quot;&amp;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;lt;label for=&quot;validationCustom02&quot; class=&quot;form-label&quot;&amp;gt;비밀번호&amp;lt;/label&amp;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;lt;input type=&quot;password&quot; class=&quot;form-control&quot; id=&quot;passwd&quot; name=&quot;passwd&quot; placeholder=&quot;&quot; required&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div class=&quot;col-12&quot;&amp;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;lt;label for=&quot;validationCustomUsername&quot; class=&quot;form-label&quot;&amp;gt;이메일&amp;lt;/label&amp;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;lt;div class=&quot;input-group has-validation&quot;&amp;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;lt;span class=&quot;input-group-text&quot; id=&quot;inputGroupPrepend&quot;&amp;gt;@&amp;lt;/span&amp;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;lt;input type=&quot;email&quot; class=&quot;form-control&quot; id=&quot;email&quot; name=&quot;email&quot; placeholder=&quot;&quot; required&amp;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;lt;/div&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;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;lt;div class=&quot;col-12&quot;&amp;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;lt;button class=&quot;btn btn-primary&quot; type=&quot;submit&quot;&amp;gt;가입하기&amp;lt;/button&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/form&amp;gt;
&amp;nbsp;&amp;nbsp; 
&amp;lt;?php
include $_SERVER[&quot;DOCUMENT_ROOT&quot;].&quot;/inc/footer.php&quot;;
?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;signup.php는 웹사이트의 사용자 등록(회원가입) 폼을 생성하고, 사용자 입력을 받는 기능을 구현합니다. 각 부분의 역할은 다음과 같습니다.&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 회원가입 폼&lt;/h4&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;html&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;form class=&quot;row g-3 needs-validation&quot; method=&quot;post&quot; action=&quot;signup_ok.php&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;&amp;lt;form&amp;gt;&amp;nbsp;태그는 사용자 입력을 받기 위한 폼을 정의합니다.&lt;/li&gt;&lt;li&gt;method=&quot;post&quot;는 폼 데이터를 서버에 제출할 때 HTTP POST 메소드를 사용하겠다는 것을 나타냅니다.&lt;/li&gt;&lt;li&gt;action=&quot;signup_ok.php&quot;는 폼 데이터가 제출될 때 처리될 서버 측 스크립트의 위치를 지정합니다.&lt;/li&gt;&lt;/ul&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 입력 필드&lt;/h4&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;사용자 이름, 아이디, 비밀번호, 이메일을 입력받기 위한 여러&amp;nbsp;&amp;lt;input&amp;gt;&amp;nbsp;태그들이 있습니다. 각각&amp;nbsp;required&amp;nbsp;속성을 가지고 있어, 필수 입력 필드임을 나타냅니다.&lt;/li&gt;&lt;li&gt;이메일 입력 필드 앞에는&amp;nbsp;@&amp;nbsp;기호가 있는 입력 그룹이 있어 사용자가 이메일 주소를 입력하는 것임을 명확히 합니다.&lt;/li&gt;&lt;/ul&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 제출 버튼&lt;/h4&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;html&quot; data-ke-language=&quot;html&quot;&gt;&lt;code&gt;&amp;lt;button class=&quot;btn btn-primary&quot; type=&quot;submit&quot;&amp;gt;가입하기&amp;lt;/button&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;이&amp;nbsp;&amp;lt;button&amp;gt;&amp;nbsp;태그는 폼 제출 버튼으로 사용됩니다.&amp;nbsp;type=&quot;submit&quot;&amp;nbsp;속성은 버튼을 클릭하면 폼이 제출됨을 의미합니다.&lt;/li&gt;&lt;/ul&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;회원가입 폼 데이터가 제출되면 signup_ok.php로 이동합니다.&lt;br&gt;signup_ok.php를 살펴보겠습니다.&lt;/p&gt;&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;span style=&quot;color: #006dd7;&quot;&gt;&lt;b&gt;signup_ok.php&lt;/b&gt;&lt;/span&gt;&lt;/h2&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot;&gt;&lt;code&gt;&amp;lt;?php
include $_SERVER[&quot;DOCUMENT_ROOT&quot;].&quot;/inc/dbcon.php&quot;;

$userid=$_POST[&quot;userid&quot;];
$username=$_POST[&quot;username&quot;];
$email=$_POST[&quot;email&quot;];
$passwd=$_POST[&quot;passwd&quot;];
$passwd=hash('sha512',$passwd);

$sql=&quot;INSERT INTO members
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(userid, username, email, passwd)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;VALUES('&quot;.$userid.&quot;', '&quot;.$username.&quot;', '&quot;.$email.&quot;', '&quot;.$passwd.&quot;')&quot;;
$result=$mysqli-&amp;gt;query($sql) or die($mysqli-&amp;gt;error);

if($result){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo &quot;&amp;lt;script&amp;gt;alert('가입을 환영합니다.');location.href='/index.php';&amp;lt;/script&amp;gt;&quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit;
}else{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo &quot;&amp;lt;script&amp;gt;alert('회원가입에 실패했습니다.');history.back();&amp;lt;/script&amp;gt;&quot;;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;exit;
}

?&amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;signup_ok.php는 사용자로부터 입력받은 데이터를 사용하여 새로운 회원가입을 처리하는 코드입니다. 각 부분의 역할은 다음과 같습니다.&lt;/p&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;1. 사용자 입력 처리&lt;/h4&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot;&gt;&lt;code&gt;$userid = $_POST[&quot;userid&quot;];
$username = $_POST[&quot;username&quot;];
$email = $_POST[&quot;email&quot;];
$passwd = $_POST[&quot;passwd&quot;];
$passwd = hash('sha512', $passwd);&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;사용자로부터 입력받은 아이디(userid), 사용자 이름(username), 이메일(email), 비밀번호(passwd)를 변수에 저장합니다.&lt;/li&gt;&lt;li&gt;비밀번호는 SHA-512 해시 함수를 사용하여 해싱합니다. 이는 보안을 강화하는 조치입니다.&lt;/li&gt;&lt;/ul&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;2. 데이터베이스에 데이터 삽입&lt;/h4&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot;&gt;&lt;code&gt;$sql = &quot;INSERT INTO members (userid, username, email, passwd) VALUES('&quot;.$userid.&quot;', '&quot;.$username.&quot;', '&quot;.$email.&quot;', '&quot;.$passwd.&quot;')&quot;;
$result = $mysqli-&amp;gt;query($sql) or die($mysqli-&amp;gt;error);&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;INSERT INTO&amp;nbsp;SQL 명령을 사용하여&amp;nbsp;members&amp;nbsp;테이블에 새로운 사용자 레코드를 추가합니다.&lt;/li&gt;&lt;li&gt;여기서는 사용자 입력을 직접 쿼리 문자열에 포함하고 있습니다.&lt;/li&gt;&lt;/ul&gt;&lt;h4 data-ke-size=&quot;size20&quot;&gt;3. 결과 처리 및 사용자 리디렉션&lt;/h4&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;php&quot; data-ke-language=&quot;php&quot;&gt;&lt;code&gt;if($result){ 
	echo &quot;&amp;lt;script&amp;gt;alert('가입을 환영합니다.');location.href='/index.php';&amp;lt;/script&amp;gt;&quot;; 
} else { 
	echo &quot;&amp;lt;script&amp;gt;alert('회원가입에 실패했습니다.');history.back();&amp;lt;/script&amp;gt;&quot;;
}&lt;/code&gt;&lt;/pre&gt;&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;&lt;li&gt;삽입 작업이 성공하면 사용자에게 '가입을 환영합니다.'라는 메시지를 표시하고 메인 페이지(/index.php)로 리디렉션합니다.&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;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1748&quot; data-origin-height=&quot;846&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NBoJY/btsAzT6h4Q8/ZkWEmMna29Y0trP3Dx9m1k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NBoJY/btsAzT6h4Q8/ZkWEmMna29Y0trP3Dx9m1k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NBoJY/btsAzT6h4Q8/ZkWEmMna29Y0trP3Dx9m1k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNBoJY%2FbtsAzT6h4Q8%2FZkWEmMna29Y0trP3Dx9m1k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1748&quot; height=&quot;846&quot; data-origin-width=&quot;1748&quot; data-origin-height=&quot;846&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;다음 포스트에서는 게시글 보기, 게시글 작성, 수정, 삭제에 대해 포스트하겠습니다.&lt;/p&gt;</description>
      <category>웹</category>
      <category>HTML</category>
      <category>MySQL</category>
      <category>php</category>
      <category>php 게시판 만들기</category>
      <category>게시판</category>
      <category>게시판 만들기</category>
      <author>5n0wman</author>
      <guid isPermaLink="true">https://hack-snowman.tistory.com/9</guid>
      <comments>https://hack-snowman.tistory.com/9#entry9comment</comments>
      <pubDate>Mon, 20 Nov 2023 21:47:29 +0900</pubDate>
    </item>
  </channel>
</rss>