<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>RYULAB</title>
    <link>https://taeyeokim.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Sun, 5 Apr 2026 15:33:01 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>태역</managingEditor>
    <image>
      <title>RYULAB</title>
      <url>https://tistory1.daumcdn.net/tistory/2923301/attach/2ef6b91a2fd94198a00185687c6bb537</url>
      <link>https://taeyeokim.tistory.com</link>
    </image>
    <item>
      <title>[OSTEP] 7장. 스케줄링: 개요(PPT)</title>
      <link>https://taeyeokim.tistory.com/238</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bN3eSR/btsPym6pcCJ/p2AOKYpXeLkAb7b6GItXQ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bN3eSR/btsPym6pcCJ/p2AOKYpXeLkAb7b6GItXQ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bN3eSR/btsPym6pcCJ/p2AOKYpXeLkAb7b6GItXQ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbN3eSR%2FbtsPym6pcCJ%2Fp2AOKYpXeLkAb7b6GItXQ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;1.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 7. 스케줄링: 개요&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;해당 게시글은 운영체제 스터디 발표 내용을 정리해서 업로드했습니다.&lt;/blockquote&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0OCLe/btsPv4r1MGZ/DnK4QcHvNtoXyWPpJXadr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0OCLe/btsPv4r1MGZ/DnK4QcHvNtoXyWPpJXadr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0OCLe/btsPv4r1MGZ/DnK4QcHvNtoXyWPpJXadr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0OCLe%2FbtsPv4r1MGZ%2FDnK4QcHvNtoXyWPpJXadr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;2.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스케줄링 정책은 CPU가 프로세스를 사용함에 있어서 중요한 영향을 끼친다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;스케줄링 정책(Scheduling Policy)&lt;/b&gt; : CPU를 어떤 프로세스에게 할당할지 결정하는 정책&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;7장은 과거의 스케줄링 정책들을 설명하는 시간을 가진다.&lt;/li&gt;
&lt;li&gt;스케줄링 정책을 효과적으로 설명하기 위해서 &lt;b&gt;비현실적인 5가지의 워크로드(Work)&lt;/b&gt;를 정의한다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;모든 작업은 같은 시간 동안 실행된다.&lt;/li&gt;
&lt;li&gt;모든 작업은 동시 도착한다.&lt;/li&gt;
&lt;li&gt;작업이 시작되면 종료될 때까지 CPU에서 동작한다.&lt;/li&gt;
&lt;li&gt;모든 작업은 CPU만 사용한다.&lt;/li&gt;
&lt;li&gt;각 작업의 실행 시간은 사전에 알려져 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uJDSN/btsPvBcy6wr/xW2jdzgmmdmoKFz5N7BWQ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uJDSN/btsPvBcy6wr/xW2jdzgmmdmoKFz5N7BWQ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uJDSN/btsPvBcy6wr/xW2jdzgmmdmoKFz5N7BWQ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuJDSN%2FbtsPvBcy6wr%2FxW2jdzgmmdmoKFz5N7BWQ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;3.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;추가로 &lt;b&gt;반환 시간(Turnaround Time)&lt;/b&gt;에 대해서도 알아보자.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;반환 시간은 작업이 도착하고 완료까지 걸린 시간을 의미한다.&lt;/li&gt;
&lt;li&gt;Tunaround = Completion - Arrival&lt;/li&gt;
&lt;li&gt;5초에 작업이 도착하고 10초에 작업이 완료되었다면, 반환 시간은 5초다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;5 = 10 - 5&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kEZsF/btsPvjiSWpx/dbbCA7FgRfKoTs1AWxzGdK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kEZsF/btsPvjiSWpx/dbbCA7FgRfKoTs1AWxzGdK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kEZsF/btsPvjiSWpx/dbbCA7FgRfKoTs1AWxzGdK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkEZsF%2FbtsPvjiSWpx%2FdbbCA7FgRfKoTs1AWxzGdK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;4.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1초의 작업 시간을 가지는 작업 A, B, C, D가 동시에 도착했다고 가정하자.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;선입 선출(First In First Out)&lt;/b&gt;은 &lt;b&gt;먼저 도착한 작업을 우선적으로 처리&lt;/b&gt;한다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;평균 반환 시간은 2.5초가 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dBIMjL/btsPwuKBG3f/28DHNzjkyIXitQjk74pKF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dBIMjL/btsPwuKBG3f/28DHNzjkyIXitQjk74pKF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dBIMjL/btsPwuKBG3f/28DHNzjkyIXitQjk74pKF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdBIMjL%2FbtsPwuKBG3f%2F28DHNzjkyIXitQjk74pKF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;5.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;1번 가정을 완화해 보자. 작업은 서로 다른 작업 시간을 가지게 된다.&lt;/li&gt;
&lt;li&gt;작업 시간 5초를 가지는 작업 A가 먼저 실행된다고 하면, 평균 반환 시간은 6.5초로 증가한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2NaGm/btsPv5KVqj2/nYbcoXJTRVkcUOKHpKiP2K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2NaGm/btsPv5KVqj2/nYbcoXJTRVkcUOKHpKiP2K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2NaGm/btsPv5KVqj2/nYbcoXJTRVkcUOKHpKiP2K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2NaGm%2FbtsPv5KVqj2%2FnYbcoXJTRVkcUOKHpKiP2K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;6.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이전과 같이 작업 시간이 긴 프로세스를 기다리게 되는 상황을 &lt;b&gt;콘보이 현상(Convoy Effect)&lt;/b&gt;이라고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;7.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eHGDEV/btsPvruw3Sd/HqPVn2cwl6heusYYEg8NS0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eHGDEV/btsPvruw3Sd/HqPVn2cwl6heusYYEg8NS0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eHGDEV/btsPvruw3Sd/HqPVn2cwl6heusYYEg8NS0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeHGDEV%2FbtsPvruw3Sd%2FHqPVn2cwl6heusYYEg8NS0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;7.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 번째는 &lt;b&gt;최단 작업 우선(Shortest Job First)&lt;/b&gt;이다. 짧은 실행 시간을 가진 작업을 먼저 처리하게 된다.&lt;/li&gt;
&lt;li&gt;이러면 콘보이 현상을 완화할 수 있을 것 같다. 하지만 2번 가정을 완화해 보자.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;8.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIhTGe/btsPv2uhcea/5ntLQprspmcLcyfDB9lkE0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIhTGe/btsPv2uhcea/5ntLQprspmcLcyfDB9lkE0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIhTGe/btsPv2uhcea/5ntLQprspmcLcyfDB9lkE0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIhTGe%2FbtsPv2uhcea%2F5ntLQprspmcLcyfDB9lkE0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;8.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업 A가 먼저 도착하고 이후에 B, C, D가 도착하게 된다면 다시 콘보이 현상이 발생한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;9.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cOxCW2/btsPu8aPUgA/8Rgw2adMM13B9gGTOZUxt1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cOxCW2/btsPu8aPUgA/8Rgw2adMM13B9gGTOZUxt1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cOxCW2/btsPu8aPUgA/8Rgw2adMM13B9gGTOZUxt1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcOxCW2%2FbtsPu8aPUgA%2F8Rgw2adMM13B9gGTOZUxt1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;9.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이번에는 &lt;b&gt;최소 잔여시간 우선(Shortest Time-to-Completion First)&lt;/b&gt;이 기법은 짧은 작업 시간을 가진 작업을 최우선적으로 처리한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이러한 작업이 되기 위해서 3번 가정도 완화하자.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;작업 A가 CPU를 점유하고 있는 상황에서 작업 B, C, D가 들어온다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;10.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cD6RnL/btsPwWGwAMB/ayqfqWikrzuxjL3ukZuRYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cD6RnL/btsPwWGwAMB/ayqfqWikrzuxjL3ukZuRYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cD6RnL/btsPwWGwAMB/ayqfqWikrzuxjL3ukZuRYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcD6RnL%2FbtsPwWGwAMB%2FayqfqWikrzuxjL3ukZuRYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;10.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그러면 CPU는 작업 A를 중단하고 작업 B, C, D를 모두 수행한 후에 다시 작업 A를 수행한다.&lt;/li&gt;
&lt;li&gt;평균 반환 시간은 3.75로 준수한 성능을 보이게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;11.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcWpzX/btsPu7iJxCN/pNyPlUmxCklZYynmXidSX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcWpzX/btsPu7iJxCN/pNyPlUmxCklZYynmXidSX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcWpzX/btsPu7iJxCN/pNyPlUmxCklZYynmXidSX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcWpzX%2FbtsPu7iJxCN%2FpNyPlUmxCklZYynmXidSX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;11.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 시점에서 새로운 평가 기준을 추가하고 살펴보자.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;응답 시간(Response Time)&lt;/b&gt;은 작업이 도착하고 처음으로 작업이 처리될 때까지 걸린 시간을 의미한다.&lt;/li&gt;
&lt;li&gt;최단 잔여시간 우선은 평균 응답 시간 1.5초가 걸리게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;12.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/J7MHo/btsPwYqQa2S/wQWUvUt9ww9YnqpUEw4VSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/J7MHo/btsPwYqQa2S/wQWUvUt9ww9YnqpUEw4VSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/J7MHo/btsPwYqQa2S/wQWUvUt9ww9YnqpUEw4VSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJ7MHo%2FbtsPwYqQa2S%2FwQWUvUt9ww9YnqpUEw4VSk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;12.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;라운드 로빈(Round Robin)&lt;/b&gt;은 일정 시간 N초마다 작업을 전환하면서 실행하는 공정한 정책이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A 실행하고 B 실행하고 C 실행하고... 작업이 종료될 때까지 계속 반복한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이때, 일정 시간 N초를 &lt;b&gt;타임 슬라이스(Time Slice)&lt;/b&gt; 혹은 &lt;b&gt;스케줄링 퀀텀(Scheduling Quantum)&lt;/b&gt;이라고 부른다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;포스팅에선 타임 슬라이스로 통일해서 지칭한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;13.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ly4Ks/btsPwXMesBS/cKZk34pOsQjcoFICJPp4Yk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ly4Ks/btsPwXMesBS/cKZk34pOsQjcoFICJPp4Yk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ly4Ks/btsPwXMesBS/cKZk34pOsQjcoFICJPp4Yk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fly4Ks%2FbtsPwXMesBS%2FcKZk34pOsQjcoFICJPp4Yk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;13.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타임 슬라이스의 균형적인 설계는 매우 중요하다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타임 슬라이스의 시간이 긴 경우 : 프로세스의 응답 시간이 오래 걸리게 된다.&lt;/li&gt;
&lt;li&gt;타임 슬라이스의 시간이 적은 경우 : 성능에서 오버헤드가 발생한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업의 변환에는 컨텍스트 스위칭이 일어나기 때문이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;14.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ZBlmt/btsPxgdHet7/w25VP45q8woGmpan4IHqZ1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ZBlmt/btsPxgdHet7/w25VP45q8woGmpan4IHqZ1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ZBlmt/btsPxgdHet7/w25VP45q8woGmpan4IHqZ1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FZBlmt%2FbtsPxgdHet7%2Fw25VP45q8woGmpan4IHqZ1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;14.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;컨텍스트 스위칭(Context Switching)&lt;/b&gt;은 CPU가 실행 중이던 프로세스 혹은 스레드의 상태를 저장하고 다른 프로세스, 스레드로 전환하는 과정을 의미한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이때, 프로세스는 다시 실행될 수 있기 때문에 중단 정보를 백업하고 새로운 프로세스, 스레드의 정보도 복원해야 한다.&lt;/li&gt;
&lt;li&gt;또 컨텍스트 스위칭을 실시하면 기존 작업에서 유효하던 캐시 데이터가 무효화가 되기 때문에 일시적 성능 저하가 발생한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;그렇기 때문에 타임 슬라이스를 적절하게 설계하는 것은 무척이나 중요한 요소다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;15.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blamIo/btsPwWmgtCu/0TvBOJRYKm73DZGzfhoeVk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blamIo/btsPwWmgtCu/0TvBOJRYKm73DZGzfhoeVk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blamIo/btsPwWmgtCu/0TvBOJRYKm73DZGzfhoeVk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblamIo%2FbtsPwWmgtCu%2F0TvBOJRYKm73DZGzfhoeVk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;15.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;라운드 로빈은 응답 시간 부분에서는 굉장히 우수한 성능을 가지지만, 반환 시간에서는 처참한 성능을 보여준다.&lt;/li&gt;
&lt;li&gt;그렇다면 라운드 로빈은 좋지 않은 스케줄링 기법인가?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;그것은 아니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;16.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/uZTRB/btsPw028YyH/DtbdhiQP0VIopk8Y6zmrUK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/uZTRB/btsPw028YyH/DtbdhiQP0VIopk8Y6zmrUK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/uZTRB/btsPw028YyH/DtbdhiQP0VIopk8Y6zmrUK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FuZTRB%2FbtsPw028YyH%2FDtbdhiQP0VIopk8Y6zmrUK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;16.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우리는 응답 시간과 반환 시간 사이의&amp;nbsp;&lt;b&gt;트레이드 오프(Trade-Off)&lt;/b&gt;를 고민해야 한다.&lt;/li&gt;
&lt;li&gt;하나의 가치를 얻기 위해서 다른 가치를 포기하는 상황은 프로그래밍에서 자주 발생하는 일이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;17.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdZxyu/btsPuRUGmIc/5WqotpE4zqgYZxbZz7EkI0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdZxyu/btsPuRUGmIc/5WqotpE4zqgYZxbZz7EkI0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdZxyu/btsPuRUGmIc/5WqotpE4zqgYZxbZz7EkI0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbdZxyu%2FbtsPuRUGmIc%2F5WqotpE4zqgYZxbZz7EkI0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;17.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상황에 맞춰서 트레이드 오프 전략을 사용하자.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;18.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clk9B7/btsPwXk9Hfk/DW9ZCfcPGFZruLv7krXc8k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clk9B7/btsPwXk9Hfk/DW9ZCfcPGFZruLv7krXc8k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clk9B7/btsPwXk9Hfk/DW9ZCfcPGFZruLv7krXc8k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fclk9B7%2FbtsPwXk9Hfk%2FDW9ZCfcPGFZruLv7krXc8k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;18.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다시 기법으로 넘어와서 4번 가정을 완화해 본다.&lt;/li&gt;
&lt;li&gt;모든 작업은 CPU만 사용하지 않는다. 앞으로는 입/출력 작업도 같이 병행된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;19.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tQVYh/btsPu6D8diu/InjfUUVdm9b4JdQZfkuGj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tQVYh/btsPu6D8diu/InjfUUVdm9b4JdQZfkuGj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tQVYh/btsPu6D8diu/InjfUUVdm9b4JdQZfkuGj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FtQVYh%2FbtsPu6D8diu%2FInjfUUVdm9b4JdQZfkuGj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;19.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입/출력을 받는 사이에 CPU는 비게 된다. CPU가 쉬는 시간을 가진다면 얼마나 비효율적인가.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;20.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bpXQIV/btsPwdWBpO9/DKSDkt9ipvmdkmCJhdoE91/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bpXQIV/btsPwdWBpO9/DKSDkt9ipvmdkmCJhdoE91/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bpXQIV/btsPwdWBpO9/DKSDkt9ipvmdkmCJhdoE91/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbpXQIV%2FbtsPwdWBpO9%2FDKSDkt9ipvmdkmCJhdoE91%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;20.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;라운드 로빈과 최소 잔여시간 우선을 동시에 사용해 보자.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;작업 A가 프로세스 입/출력을 받는 시간에는 작업 B가 실행되도록 해보자.&lt;/li&gt;
&lt;li&gt;그렇다면 B 프로세스의 종료 시간을 기존 10초에서 8초까지 단축할 수 있게 된다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;작업 B의 작업 시간은 5초이나, PPT에서는 2초를 누락함.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;21.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSZzsM/btsPwZQNJks/A5hzAGcpdzIAx4vEalubjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSZzsM/btsPwZQNJks/A5hzAGcpdzIAx4vEalubjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSZzsM/btsPwZQNJks/A5hzAGcpdzIAx4vEalubjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSZzsM%2FbtsPwZQNJks%2FA5hzAGcpdzIAx4vEalubjK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;21.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이제 마지막 가정 5번에 대해서 생각해 보자.&lt;/li&gt;
&lt;li&gt;이 모든 가정들이 비현실적임을 알려주는 가장 큰 내용이다.&lt;/li&gt;
&lt;li&gt;각 작업의 실행 시간은 프로그래머도, 사용자도 알 수 없다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;예측의 영역에서만 어렴풋이 짐작할 뿐이다.&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;3.42717초 걸리는 작업이 있다는 것을 우리가 어떻게 알 수 있을까.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;그렇기 때문에 우리가 세웠던 가정들을 무의미하고 비현실적이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;22.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q3hwg/btsPw0oDkVe/hh9optLpY8e3HKrh4707f0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q3hwg/btsPw0oDkVe/hh9optLpY8e3HKrh4707f0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q3hwg/btsPw0oDkVe/hh9optLpY8e3HKrh4707f0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ3hwg%2FbtsPw0oDkVe%2Fhh9optLpY8e3HKrh4707f0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/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;1080&quot; data-filename=&quot;22.png&quot; data-origin-width=&quot;1920&quot; data-origin-height=&quot;1080&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OSTEP의 8장은 &lt;b&gt;멀티 레벨 피드백 큐(Multi-Level Feedback Queue)&lt;/b&gt;를 이야기한다.&lt;/li&gt;
&lt;li&gt;멀티 레벨 피드백 큐는 작업의 실행 시간을 예측한다는 특징과 여러 정책을 혼합해서 사용한단 특징을 가진다.&lt;/li&gt;
&lt;li&gt;이 내용은 다음 8장에서 알아보도록 하자.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>독서/OSTEP</category>
      <author>태역</author>
      <guid isPermaLink="true">https://taeyeokim.tistory.com/238</guid>
      <comments>https://taeyeokim.tistory.com/238#entry238comment</comments>
      <pubDate>Thu, 24 Jul 2025 17:42:44 +0900</pubDate>
    </item>
    <item>
      <title>[OSTEP] 6장. 제한적 직접 실행 원리(Limited Direct Execution)</title>
      <link>https://taeyeokim.tistory.com/237</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;OSTEP 6장.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1047&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ctHaGf/btsPtjPr7Is/2aPbIPXjI2dDovqyOc1OQK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ctHaGf/btsPtjPr7Is/2aPbIPXjI2dDovqyOc1OQK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ctHaGf/btsPtjPr7Is/2aPbIPXjI2dDovqyOc1OQK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FctHaGf%2FbtsPtjPr7Is%2F2aPbIPXjI2dDovqyOc1OQK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1047&quot; data-filename=&quot;OSTEP 6장.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1047&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 6. 제한적 직접 실행 원리(Limited Direct Execution)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제는 CPU 가상화를 위해서 여러 프로세스가 동시에 실행되는 것처럼 보이도록 물리적인 CPU를 공유한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 프로세스를 잠시 실행하고 다른 프로세스를 또 잠시 실행한다. 이러한 기법을 &lt;b&gt;시분할(Time-Sharing)&lt;/b&gt;이라고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이러한 가상화 기법은 몇 가지 문제를 해결해야 한다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;b&gt;성능 저하 :&lt;/b&gt; 시스템에 과중한 오버헤드를 주지 않아야 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;제어 문제 :&lt;/b&gt; CPU에 대한 통제를 유지하면서 프로세스를 효율적으로 실행해야 한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 6.1. 기본 원리 : 제한적 직접 실행&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제 개발자들은 프로그램을 빠르게 실행하기 위해서 제한적 직접 실행(Limited Direct Execution) 기법을 개발했다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;제한적 직접 실행은 프로그램을 CPU 상에서 직접 실행시키는 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;제한적 직접 실행에서 &quot;제한적&quot;을 제외한 &quot;직접 실행&quot;은 간단하다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;프로세스 목록에 실행하고자 하는 프로세스를 추가한다.&lt;/li&gt;
&lt;li&gt;메모리 할당 후, 프로그램 코드를 찾아 메모리에 탑재한다.&lt;/li&gt;
&lt;li&gt;Entry-Point로 진입하여 코드를 실행한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;&quot;직접 실행&quot;의 경우는 다음과 같은 문제를 고려해볼 수 있다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;프로그램이 악의적이지 않다는 것을 보장할 수 있는가?&lt;/li&gt;
&lt;li&gt;운영체제는 어떻게 프로그램의 실행을 종료하고 다른 프로그램(프로세스)을 실행할 수 있는가?&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;위의 내용들을 고민하고 해당 기법을 개발하면서 &quot;제한적&quot;이라는 명칭이 붙은 이유를 알 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 6.2. 문제점 1: 제한된 연산&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;직접 실행의 장점은 CPU에서 실행하기 때문에 빠르게 실행된다는 점이다.&lt;/li&gt;
&lt;li&gt;그렇지만, 프로세스가 특수한 종류의 연산을 수행하기를 원한다면?
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새로운 시스템 자원 할당이 필요로 하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프로세스가 원하는 것을 할 수 있도록 할 수 있으나, 바람직하지 못한 시스템을 만든다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일 접근을 검사하는 파일 시스템을 만들었을 때, 프로세스가 전체 디스크를 읽고 사용할 수 있다면, 만든 파일 시스템은 필요 없어진다.&lt;/li&gt;
&lt;li&gt;이러한 문제를 해소하기 위해서 &lt;b&gt;유저 모드(User Mode)&lt;/b&gt;란 개념이 도입되었다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유저 모드에서 실행되는 코드는 할 수 있는 역할이 제한된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;유저 모드와 대비되는 &lt;b&gt;커널 모드(Kernel Mode)&lt;/b&gt;는 운영체제의 중요한 코드를 실행할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;유저 모드에서 특수한 종류의 연산이 필요하다면 커널 모드로 변경하고 작업을 수행한 후, 다시 유저 모드로 변환한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이러한 작업은 &lt;b&gt;시스템 콜(System Call)&lt;/b&gt;을 통해서 수행할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;시스템 콜 수행 까지의 과정
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;프로그램은 Trap 특수 명령어를 실행한다.&lt;/li&gt;
&lt;li&gt;운영체제가 사용 가능한 특권 모드를 커널 모드로 변경한다.&lt;/li&gt;
&lt;li&gt;프로세스가 요청한 작업을 수행한다.&lt;/li&gt;
&lt;li&gt;return-from-trap 특수 명령어를 호출하여 다시 사용자 모드로 변경한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;하드웨어는 Trap 특수 명령어를 수행할 때 주의가 필요하다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;호출한 프로세스의 필요한 레지스터 정보를 저장해야 한다.&lt;/li&gt;
&lt;li&gt;return-from-trap를 실행했을 경우, 프로세스가 정확하게 리턴할 수 있도록 하기 위해서다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;운영체제는 Trap 특수 명령어 안전하게 사용 가능할 수 있도록 아래와 같은 작업 과정을 거치게 된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커널이 컴퓨터 부팅 시, &lt;b&gt;트랩 테이블(Trap Table)&lt;/b&gt;을 생성한다.&lt;/li&gt;
&lt;li&gt;트랩 테이블은 하드웨어에게 예외 사건이 발생했을 때, 어떤 코드를 참조해야 하는지 알려주는 행동 보관소다.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 코드가 행동을 요청하면 트랩 테이블을 확인 후에 상황에 맞는 &lt;b&gt;트랩 핸들러(Trap Handler)&lt;/b&gt;를 제공 받는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;모든 시스템 콜은 자신의 고유한 번호를 부여 받는다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 프로그램은 원하는 시스템 콜을 호출하기 위해서 고유한 번호를 레지스터 혹은 스택의 지정된 위치에 저장한다.&lt;/li&gt;
&lt;li&gt;이후 Trap 명령어를 실행하면 명령어에 맞는 트랩 핸들러가 실행된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 때, 운영체제가 고유한 번호가 유효한 지 확인하고 제공하게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;시스템 콜 코드의 정확한 위치는 운영체제만 알고 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;만약, 사용자 프로그램이 알게 된다면 자유롭게 커널 코드를 실행 가능하기 때문이다.&lt;/li&gt;
&lt;li&gt;시스템 콜 번호를 사용하는 것은 이러한 문제를 막기 위한 일종의 보안 기법이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 6.3. 문제점 2: 프로세스 간 전환&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;직접 실행의 두번째 문제점은 프로세스 전환이 가능해야 한다는 점이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스가 실행중이라는 것은 운영체제가 실행 중이지 않다는 것이다. 이런 상황에선 어떻게 프로세스를 전환할 수 있을까?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 협조 방식: 시스템 콜 호출시 까지 대기&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;협조(Cooperative) 방식&lt;/b&gt;은&amp;nbsp;CPU를 장기간 사용해야 하는 프로세스들은 다른 프로세스들이 CPU를 사용 할 수 있도록 다시 CPU 사용권을 반환할 것이라고 믿는다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제로 예전 시스템에서 사용되었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이 방식은 매우 수동적이며, CPU 제어권 흭득을 위해서 운영체제는 반환을 대기하는 상황이 발생한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 비협조 방식: 운영체제가 제어권 확보&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스가 CPU 제어권을 넘기지 않는 경우, 하드웨어의 도움을 받아 회수할 수 있다. 이러한 방법을 비협조 방식으로 칭한다.&lt;/li&gt;
&lt;li&gt;CPU 제어권을 반환하는 시스템 콜 호출 없이도 &lt;b&gt;타이머 인터럽트(Timer Interrupt)&lt;/b&gt;를 이용해서 CPU 제어권을 반환 받을 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;타이머는 수 밀리 초마다 인터럽트라 불리는 하드웨어 신호를 발생시키도록 프로그램 가능하다.&lt;/li&gt;
&lt;li&gt;인터럽트가 발생하면 이를 처리하는 것은 운영체제의 가장 중요한 역할 중 하나다.&lt;/li&gt;
&lt;li&gt;운영체제는 인터럽트 발생 시, 수행 중인 프로세스를 중단시키고 해당 인터럽트에 대한 &lt;b&gt;인터럽트 핸들러(Interrupt Handler)&lt;/b&gt;를 실행한다.&lt;/li&gt;
&lt;li&gt;이때, 인터럽트 처리 과정에서 제어권은 다시 운영체제로 넘어가게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;운영체제는 타이머 인터럽트가 발생 시 실행해야 할 코드의 주소를 기록해야 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴퓨티 부팅 시, 운영체제는 정의된 인터럽트에 대해서 관련 인터럽트 핸들러의 위치를 테이블 형태로 메모리에 초기화 시킨다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 문맥의 저장과 복원&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제가 제어권을 흭득하면 중요한 결정을 해야 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 실행 중인 프로세스를 계속 실행시키는가?&lt;/li&gt;
&lt;li&gt;다른 프로세스로 전환을 하는가?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이 결정은 운영체제의 &lt;b&gt;스케줄러(Scheduler)&lt;/b&gt;에 의해서 내려진다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;스케줄러의 작동 방식을 정하는 것은 &lt;b&gt;스케줄링 정책(Scheduling Policy)&lt;/b&gt;이라고 하는데, 이는 7장에서 배운다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프로세스 전환을 결정하면, 운영체제는 &lt;b&gt;컨텍스트 스위칭(Context Switching)&lt;/b&gt;을 시도한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;현재 실행 중인 프로세스의 레지스터 값들을 커널 스택 같은 곳에 저장하고 새로운 프로세스의 커널 스택으로부터 레지스터 값을 복원하는 것이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;컨텍스트 스위칭은 빠른 속도를 위해서 주로 어셈블리 코드를 사용해서 작성되고 아래의 일을 수행한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제는 실행 중인 프로세스의 범용 레지스터, PC 등의 데이터를 커널 스택에 저장하고 새로운 프로세스의 값은 CPU로 읽어 들인다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 6.4. 병행실행으로 인한 문제&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템 콜 처리 과정에서 타이머 인터럽트가 발생하거나, 인터럽트 처리 과정에서 또 인터럽트가 발생하는 문제들이 생길 수 있다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이러한 문제들의 간단한 해법은 인터럽트를 처리하는 동안에는 &lt;b&gt;인터럽트를 불능화&lt;/b&gt; 시키는 것이다.&lt;/li&gt;
&lt;li&gt;이러한 기법은 손실되는 인터럽트가 발생하기 때문에 신중하게 사용해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;자세한 내용은 &lt;b&gt;병행성 파트&lt;/b&gt;에서 다시 소개한다.&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>독서/OSTEP</category>
      <author>태역</author>
      <guid isPermaLink="true">https://taeyeokim.tistory.com/237</guid>
      <comments>https://taeyeokim.tistory.com/237#entry237comment</comments>
      <pubDate>Tue, 22 Jul 2025 15:28:59 +0900</pubDate>
    </item>
    <item>
      <title>[OSTEP] 5장. 막간: 프로세스 API</title>
      <link>https://taeyeokim.tistory.com/236</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;OSTEP 5장.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1047&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cax2rx/btsPraSRWp1/PDeuvoK0IrggBQt5B2MCa0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cax2rx/btsPraSRWp1/PDeuvoK0IrggBQt5B2MCa0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cax2rx/btsPraSRWp1/PDeuvoK0IrggBQt5B2MCa0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcax2rx%2FbtsPraSRWp1%2FPDeuvoK0IrggBQt5B2MCa0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1047&quot; data-filename=&quot;OSTEP 5장.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1047&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 5. 막간: 프로세스 API&lt;/h2&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;이번 장은 운영체제 API와 사용법을 포함해서 시스템의 흐름을 이야기한다.&amp;nbsp;&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 5.1. fork() 시스템 콜&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;fork() 시스템 콜은 프로세스 생성에서 사용되는 시스템 콜이다.&lt;/li&gt;
&lt;li&gt;시스템 콜을 통해서 프로세스를 생성하게 된다면, 일반적으로 새로 생성한 프로세스는 자식 프로세스, 자식&amp;nbsp; 프로세스를 생성한 프로세스는 부모 프로세스라고 불린다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자식 프로세스와 부모 프로세스는 서로 다르다. -&amp;gt; 서로 고유한 주소 공간, 레지스터, PC 등의 값을 가진다.&lt;/li&gt;
&lt;li&gt;이때, 자식 프로세스와 부모 프로세스에서 fork() 시스템 콜로 반환 받는 값이 서로 다르다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;부모 프로세스는 자식 프로세스의 PID.&lt;/li&gt;
&lt;li&gt;자식 프로세스는 0 정수 값을 가진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CPU 스케줄러의 영향으로 프로세스 실행 순서에 있어서는 &lt;b&gt;비결정성(Nondeterminism)&lt;/b&gt;을 가지게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 5.2. wait() 시스템 콜&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;wait() 시스템 콜은 자식 프로세스의 종료를 기다릴 때 부모 프로세스가 사용한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자식 프로세스가 종료되면 wait() 시스템 콜은 리턴한다.&lt;/li&gt;
&lt;li&gt;이로 인해서 프로그램은 동일한 결과를 출력할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자식이 종료되고 부모가 실행되기 때문.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 5.3. 마지막으로, exec() 시스템 콜&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;exec() 시스템 콜은 자기 자신이 아닌 다른 프로그램을 실행할 때 사용한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행 파일의 이름과 인자가 주어지면, 실행 파일의 코드와 정적 데이터를 읽고 현재 실행 중인 프로세스의 코드 세그먼트와 정적 데이터 부분을 덮어씌운다.&lt;/li&gt;
&lt;li&gt;힙과 스택 및 프로그램 다른 주소 공간들로 새로운 프로그램의 실행을 위해 다시 초기화한다.&lt;/li&gt;
&lt;li&gt;새로운 프로세스를 생성하지 않고 현재 실행 중인 프로세스를 대체하는 것.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 5.4. 왜, 이런 API를?&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UNIX 쉘 구현을 위해서 fork()와 exec()를 분리했다.&lt;/li&gt;
&lt;li&gt;쉘은 파일 시스템에서 실행 파일의 위치를 찾고 명령어 실행을 위해 fork()를 호출하고 새로운 자식 프로세스를 만든다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이후 exec()의 변형 중 하나를 호출하고 wait()를 사용하여 명령어가 끝나기를 기다린다.&lt;/li&gt;
&lt;li&gt;자식 프로세스가 종료되면, wait()는 리턴하게 되고 프롬프트로 전환하게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 5.5. 프로세스 제어와 사용자&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;UNIX 시스템에는 다양한 시스템 콜이 존재한다. 그 중 kill() 시스템 콜은 프로세스에게 멈추거나 끝내기와 같은 신호(Signal)를 보내는 데 사용된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대부분 UNIX 쉘은 특정 신호를 보내는 단축키가 설정되어 있다. ( ctrl+c, ctrl+z 등 )&lt;/li&gt;
&lt;li&gt;현대 운영체제에서 신호를 보내는 제어 권한은 사용자(User)에서 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>독서/OSTEP</category>
      <author>태역</author>
      <guid isPermaLink="true">https://taeyeokim.tistory.com/236</guid>
      <comments>https://taeyeokim.tistory.com/236#entry236comment</comments>
      <pubDate>Mon, 21 Jul 2025 06:39:42 +0900</pubDate>
    </item>
    <item>
      <title>[OSTEP] 4장. 프로세스의 개념</title>
      <link>https://taeyeokim.tistory.com/235</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;OSTEP 4장.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1047&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/wxYYX/btsPmiJDQh3/jqVm6HAC1zztdLAOv6T3Tk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/wxYYX/btsPmiJDQh3/jqVm6HAC1zztdLAOv6T3Tk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/wxYYX/btsPmiJDQh3/jqVm6HAC1zztdLAOv6T3Tk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FwxYYX%2FbtsPmiJDQh3%2FjqVm6HAC1zztdLAOv6T3Tk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1047&quot; data-filename=&quot;OSTEP 4장.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1047&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 4. 프로세스의 개념 (1)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;일반적으로 프로세스는 &lt;b&gt;실행 중인 프로그램&lt;/b&gt;으로 정의한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램은 디스크 상에 존재하며 실행을 위한 명령어와 정적 데이터 묶음이다.&lt;/li&gt;
&lt;li&gt;이 명령어와 정적 데이터를 읽고 실행함으로서 프로그램을 동작시키는 것이 운영체제다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;운영체제는 CPU의 가상화를 통해서 여러 개의 프로그램이 동작할 수 있는 환경을 만든다.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시분할(Time-Sharing) 기법을 사용해서 원하는 수 만큼의 프로세스를 동시에 실행할 수 있게 한다.&lt;/li&gt;
&lt;li&gt;시분할 기법은 CPU를 공유하기 때문에 각 프로세스의 성능은 낮아진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CPU의 가상화를 효율적으로 구현하기 위해서는 &lt;b&gt;도구와 지능&lt;/b&gt;이 필요하다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;도구는 &lt;b&gt;메커니즘(Mechanism)&lt;/b&gt;이라고 하고 필요한 기능을 구현하는 방법을 의미한다.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;나중에 배우는 &lt;b&gt;문맥 교환(Context-Switching)&lt;/b&gt;의 구현에서 알 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;지능은 정책(Policy) 형태로 표현하고 운영체제에서 어떤 결정을 내리는 데 사용하는 알고리즘을 의미한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제의 &lt;b&gt;스케줄링 정책(Scheduling Policy)&lt;/b&gt;이 이러한 결정을 내린다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 4.1. 프로세스의 개념 (2)&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제는 실행 중인 프로그램의 개념을 제공하는데, 이를 프로세스라고 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스는 실행 중인 프로그램이다.&lt;/li&gt;
&lt;li&gt;특정한 순간의 프로세스를 간단하게 표현하려면 실행되는 동안 접근했거나 영향을 받은 자원의 목록을 작성하면 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프로세스의 구성 요소를 이해하기 위해서는 하드웨어 상태를 알아야 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스의 하드웨어 상태 중 중요한 구성 요소는 메모리다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;명령어가 메모리에 저장되고 실행 프로그램이 읽고 쓰는 데이터도 메모리에 저장되기 때문.&lt;/li&gt;
&lt;li&gt;프로세스가 접근할 수 있는 메모리(주소 공간)는 프로세스 구성 요소다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;레지스터도 프로세스의 하드웨어 상태를 구성 요소다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;많은 명령어들이 레지스터를 직접 읽거나 갱신한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;레지스터는 목적에 따라서 이름이 붙었으며, PC, IP, SP, FP 등의 레지스터가 존재한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프로그램은 영구 저장 장치에 접근하기도 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입출력 정보는 프로세스가 현재 열어 놓은 파일 목록을 가진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 4.2. 프로세스 API&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제에 따라 다르게 제공되고 있는 중요한 API를 우선적으로 살펴본다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;생성(Create) : 새로운 프로세스를 생성한다.&lt;/li&gt;
&lt;li&gt;제거(Destroy) : 프로세스를 강제로 제거할 수 있는 기능도 제공해야 한다.&lt;/li&gt;
&lt;li&gt;대기(Wait) : 모종의 이유로 실행 중지를 기다릴 필요가 있다.&lt;/li&gt;
&lt;li&gt;각종 제어(Miscellaneous Control) : 생성, 제거, 대기 이외로 여러 가지 제어 기능이 제공된다.&lt;/li&gt;
&lt;li&gt;상태(Status) : 프로세스의 상태 정보를 얻는다. 실행 시간과 프로세스의 상태 등이 주어진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;☑️ 4.3. 프로세스 생성 : 좀 더 자세하게&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램을 위해 실행되는 첫 단계는 프로그램 코드와 정적 데이터를 메모리, 프로세스의 주소 공간에 탑재(Load)하는 것이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;탑재된 후, 특정 크기의 메모리 공간이 프로그램에 스택 용도로 할당되어야 한다.&lt;/li&gt;
&lt;li&gt;이후에는 힙 용도로 사용될 메모리 영역을 할당한다.&lt;/li&gt;
&lt;li&gt;그 다음에는 입출력과 관계된 초기화 작업을 수행한다.&lt;/li&gt;
&lt;li&gt;표준 입력(STDIN), 표준 출력(STDOUT), 표준 에러(STDERR) 장치에 해당하는 세 개의 파일 디스크립터(File Descriptor)를 가진다.&lt;/li&gt;
&lt;li&gt;최종적으로 프로그램의 Entry Point, 즉 Main 함수에 도달하고 프로그램을 실행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;☑️ 4.4. 프로세스 상태&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스의 상태는 간단하게 아래와 같이 구분할 수 있다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;실행(Running) : 실행 상태에서 프로세스는 CPU에 의해서 실행중이다.&lt;/li&gt;
&lt;li&gt;준비(Ready) : 프로세스는 실행 준비가 되었으나, CPU에는 다른 작업을 진행하고 있어서 실행을 대기 중이다.&lt;/li&gt;
&lt;li&gt;대기(Blockde) : 프로세스가 다른 작업을 기다리는 동안 수행을 중단시키는 연산이다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;☑️ 4.5. 자료 구조&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제도 일종의 프로그램이다. 다양한 정보를 가지기 위한 자료 구조를 가진다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스 상태를 파악하기 위해 &lt;b&gt;프로세스 리스트(Process List)&lt;/b&gt;와 같은 자료 구조를 가진다.&lt;/li&gt;
&lt;li&gt;다른 부가적인 자료 구조도 가지고 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;레지스터 문맥(Register Context)&lt;/b&gt; 자료 구조는 프로세스가 중단되었을 때, 프로세스의 레지스터 값을 저장한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;문맥 교환에 관련된 내용으로 추후에 다시 나온다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>독서/OSTEP</category>
      <author>태역</author>
      <guid isPermaLink="true">https://taeyeokim.tistory.com/235</guid>
      <comments>https://taeyeokim.tistory.com/235#entry235comment</comments>
      <pubDate>Wed, 16 Jul 2025 17:17:37 +0900</pubDate>
    </item>
    <item>
      <title>[OSTEP] 2장. 운영체제 개요</title>
      <link>https://taeyeokim.tistory.com/234</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;OSTEP 2장.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1047&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dw7Z6c/btsPkwuKzRA/LTzWUq2ym8a7cX0cAV2eTK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dw7Z6c/btsPkwuKzRA/LTzWUq2ym8a7cX0cAV2eTK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dw7Z6c/btsPkwuKzRA/LTzWUq2ym8a7cX0cAV2eTK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdw7Z6c%2FbtsPkwuKzRA%2FLTzWUq2ym8a7cX0cAV2eTK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1047&quot; data-filename=&quot;OSTEP 2장.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1047&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 2. 운영체제 개요&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램이 실행되면 매우 단순한 일을 한다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;명령어를 실행한다.&lt;/li&gt;
&lt;li&gt;CPU는 명령어를 초당 수백만 번 반입(Fetch)하고 해석(Decode)하고 실행(Execute)한다.&lt;/li&gt;
&lt;li&gt;명령어 작업을 완료 후, CPU는 프로그램 종료 전까지 다음 명령어를 지속해서 처리한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;우리는 이 책을 통해서 시스템을 사용하기 쉽게하기 위해 프로그램 실행 시 발생하는 일들을 배운다.&lt;/li&gt;
&lt;li&gt;프로그램을 쉽게 실행시키고, 프로그램 간의 메모리 공유를 가능하게 하고, 장치와 상호작용을 가능하게 하는 등의 일을 수행하는 소프트웨어가 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템을 사용하기 편리하면서 정확하고 올바르게 동작시킬 책임이 있기 때문에 이를 &lt;b&gt;운영체제(OS, Operating System)&lt;/b&gt;이라고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이 책에서는 운영체제를 3가지(가상화, 병행성, 영속성)로 구분해서 설명한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;가상화(Virtualization) &lt;/b&gt;개념 : 물리적 형태의 자원(CPU, RAM, DISK 등)을 이용해서 가상의 형태로 이용하는 방법들을 배운다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;병행성(Concurrency)&lt;/b&gt; 개념 : 프로그램이 동시에 많은 일들을 수행하려고 할 때, 발생하는 문제들과 해결 방법을 배운다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;영속성(Persistence) &lt;/b&gt;개념 : 컴퓨터의 일부 장치는 휘발성 방식으로 저장한다. 이로 인해서 발생하는 문제들과 해결 방법을 배운다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 2.1. CPU 가상화&lt;/h2&gt;
&lt;pre id=&quot;code_1752568691316&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &amp;lt;sys/time.h&amp;gt;
#include &amp;lt;assert.h&amp;gt;
#include &quot;common.h&quot;

int main(int argc, char *argv[]) {
	if (argc != 2) {
		fprintf(stderr, &amp;ldquo;usage: cpu &amp;lt;string&amp;gt;\n &amp;rdquo;);
		exit(1);
    }
	
    char *str = argv[1];
	
    while (1) {
		Spin(1);
		printf(&amp;ldquo;%s\n &amp;rdquo;, str);
	}
    
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;코드 동작 설명 : &lt;/b&gt;1초 동안 실행된 후, Return하는 Spin(1) 함수를 실행한다. 이후에는 사용자가 명령어 라인으로 전달한 문자열을 반복해서 출력한다.&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 코드를 cpu.c로 저장하고 단일 CPU 시스템에서 컴파일하고 실행한다고 가정하자.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행 시 작성한 문자열을 1초에 걸쳐서 반환한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;같은 작업을 하는 프로그램을 여러개 실행하고 각자 A, B, C, D의 문자열을 반환하도록 해보자.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A, B, C, D가 반복되어 출력된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;결과를 두고 봤을 때, CPU는 단 하나 뿐이지만 여러 개의 CPU가 존재하는 환상이 만들어진다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이러한 것을 CPU 가상화(Virtualizing the CPU)라고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 2.2. 메모리 가상화&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;물리 메모리(Physical memory)는 매우 단순한 바이트의 배열로 이루어져 있다.&lt;/li&gt;
&lt;li&gt;메모리를 읽기 위해서는 데이터에 주소(Address)를 명시해야 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리에 Wirte, Read 작업을 위해서는 주소와 데이터가 명시되어야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;메모리는 프로그램이 실행되는 동안 계속 접근되고 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실행되고 있는 프로그램은 자신의 데이터를 유지하고자 메모리에 적재한다.&lt;/li&gt;
&lt;li&gt;메모리 접근 명령어(Load, Store 등)을 통해서 메모리에 접근한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1752569303750&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include&amp;ldquo;common.h &amp;rdquo;

int main(int argc, char *argv[]) {
	int *p = malloc(sizeof(int)); // a1
	assert(p != NULL);
    
	printf(&amp;ldquo;(%d) memory address of p: %08x\n &amp;rdquo;,	getpid() , (unsigned) p); // a2
	*p = 0; // a3
    
	while (1) {
		Spin(1);
		*p = *p + 1;
		printf(&amp;ldquo;(%d) p: %d\n &amp;rdquo;, getpid() , *p); // a4
	}
    
	return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;코드 동작 설명 : &lt;/b&gt;메모리를 할당받고 메모리의 주소를 출력한다. 새로 할당받은 메모리의 첫 슬롯에 0을 저장하고 While문에 진입하면서 1초 대기 후, 변수 P가 가리키는 주소에 저장되어 있는 값을 1 증가시킨다.&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램은 PID를 통해서 프로세스 고유 ID를 출력하고 이후에는 숫자를 출력한다.&lt;/li&gt;
&lt;li&gt;프로그램을 2개 이상 실행하면 동일한 주소 값을 가지고 똑같이 출력된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대체 코드로 Window 11에서 확인했을 때는 각자 다른 주소가 나온다. 가상 메모리 주소도 동일한 값을 뱉어내진 않기 때문에 책의 예시에 대해서는 잘 모르겠으나, 이 내용에서 중요한 대목은 아니다.&lt;/li&gt;
&lt;li&gt;핵심은 프로그램이 각자 자신의 메모리를 가지는 것처럼 보인다는 점.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;운영체제는 메모리 가상화를 하기 때문에 위와 같은 상황들이 발생한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 프로세스는 본인들의 가상 주소 공간을 가지게 된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가상 주소 공간을 컴퓨터의 물리 메모리로 매핑(mapping)한다.&lt;/li&gt;
&lt;li&gt;하나의 프로그램이 수행하는 메모리 연산은 다른 프로그램의 주소 공간에 영향을 주지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;실제로 물리 메모리는 공유 자원이고 운영체제에 의해서 관리된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 2.3. 병행성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로그램이 한 번에 많은 일을 하려고 할 때, 이 용어를 가리킨다.&lt;/li&gt;
&lt;li&gt;병행성 문제는 운영체제 자체에서 발생한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제는 프로세스 실행, 다음 프로세스 실행, 또 다음 프로세스 실행 등 여러 프로세스를 실행시키면서 많은 일들을 한다.&lt;/li&gt;
&lt;li&gt;이런 행동으로 인해서 심각하거나 흥미로운 문제가 발생한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;병행성 문제는 운영체제에서만 발생하는 문제가 아니고 멀티 스레드 프로그램에서도 발생한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1752570468547&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;stdlib.h&amp;gt;
#include &quot;common.h&quot;

volatile int counter = 0;
int loops;

void *worker(void *arg) {
    int i;
    for (i = 0; i &amp;lt; loops; i++) {
        counter++;
    }
    return NULL;
}

int main(int argc, char *argv[]) {
    if (argc != 2) {
        fprintf(stderr, &quot;usage: threads &amp;lt;value&amp;gt;\n&quot;);
        exit(1);
    }

    loops = atoi(argv[1]);
    pthread_t p1, p2;

    printf(&quot;Initial value : %d\n&quot;, counter);

    Pthread_create(&amp;amp;p1, NULL, worker, NULL);
    Pthread_create(&amp;amp;p2, NULL, worker, NULL);
    Pthread_join(p1, NULL);
    Pthread_join(p2, NULL);

    printf(&quot;Final value : %d\n&quot;, counter);

    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt; 코드 동작 설명 :&lt;/b&gt;&amp;nbsp;메인 프로그램은 Pthread_create()를 사용해서 두 개의 스레드를 생성한다. 각 스레드는 worker() 루틴을 실행한다. worker() 루틴은 loops번 만큼 루프를 반복하면서 counter 변수의 값을 증가시킨다.&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;loops 값을 1,000으로 설정하면 Final Value는 2,000이 된다.&lt;/li&gt;
&lt;li&gt;loops 값을 100,000으로 설정하면 Final Value는 우리가 예측하지 못한 다른 값이 나온다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;참고 :&lt;/b&gt; 다시 실행해도 마찬가지로 나타난다. 경쟁 상태(Race Condition)에 관련된 내용이며, 이후에 책에서 설명한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;예측하지 못한 다른 값이 나오는 원인은 명령어가 한 번에 하나씩만 실행되는 것과 관련있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;counter 변수를 증가시키는 부분은 세 개의 명령어로 이루어진다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;counter 값을 메모리에서 레지스터로 탑재하는 명령어&lt;/li&gt;
&lt;li&gt;레지스터를 1 증가시키는 명령어&lt;/li&gt;
&lt;li&gt;레지스터의 값을 다시 메모리에 저장하는 명령어&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;이 세 개의 명령어가 묶여서 실행되지 않기 때문에 발생하게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;☑️ 2.4. 영속성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;DRAM과 같은 장치는 데이터를 휘발성(volatile) 방식으로 저장하기 때문에 데이터는 쉽게 손실될 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전원이 꺼지거나, 시스템이 갑자기 고장나면 메모리의 모든 데이터는 사라진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;데이터를 영속적으로 저장할 수 있는 H/W와 S/W가 필요하다.&lt;/li&gt;
&lt;li&gt;H/W 장치는 입력과 출력, I/O 장치 형태로 제공된다.&lt;/li&gt;
&lt;li&gt;디스크를 관리하는 운영체제에 속한 소프트웨어를 파일 시스템(File System)이라고 부른다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;파일 시스템은 사용자가 생성한 파일(File)을 시스템의 디스크에 안전하고 효율적으로 저장할 책임을 가진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;운영체제는 다른 것과는 다르게 H/W 장치는 가상 H/W 장치를 만들지 않는다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오히려 사용자가 파일은 다른 파일에서 공유하기 원한다고 가정한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Visual Studio 프로그램에서 C 파일을 생성하고 편집한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴파일이 완료되면 새로 생성된 파일을 실행할 수 있다.&lt;/li&gt;
&lt;li&gt;Visual Studio는 입력 파일을 생성하면, 컴파일러는 입력 파일을 바탕으로 실행 파일을 생성한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1752571365221&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;
#include &amp;lt;unistd.h&amp;gt;
#include &amp;lt;assert.h&amp;gt;
#include &amp;lt;fcntl.h&amp;gt;
#include &amp;lt;sys/types.h&amp;gt;

int main(int argc, char *argv[]) {
    int fd = open(&quot;/tmp/file&quot;, O_WRONLY | O_CREAT | O_TRUNC, S_IRWXU);
    assert(fd &amp;gt; -1);

    int rc = write(fd, &quot;hello world\n&quot;, 13);
    assert(rc == 13);

    close(fd);
    return 0;
}&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;b&gt;코드 동작 설명 :&lt;/b&gt; 프로그램은 운영체제를 호출해서 파일을 열고 &quot;hello world&quot;를 작성한다. 그리고 파일을 닫는다.&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데이터를 디스크에 작성하기 위해서 운영체제가 하는 일은 단순하지 않다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새 데이터가 디스크의 어디에 저장될 지 결정한다.&lt;/li&gt;
&lt;li&gt;파일 시스템이 관리하는 다양한 자료 구조를 통하여 데이터의 상태를 추적해야 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 작업은 저장 장치부터 기존 자료 구조를 읽거나 갱신해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;복잡한 작업은 운영체제에서 &lt;b&gt;시스템 콜(System Call)&lt;/b&gt;이란 표준 방법을 제공함으로서 장치들을 손쉽게 접근할 수 있게 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이런 점으로 인해서 운영체제는 표준 라이브러리처럼 보이기도 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;장치 접근 방법과 파일 시스템이 데이터를 영속적으로 관리하는 방법은 좀 더 복잡하다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;대부분의 파일 시스템은 성능 향상을 위해서 응용 프로그램이 요청한 쓰기를 모아서 한 번에 처리한다.&lt;/li&gt;
&lt;li&gt;응용 프로그램 입장에서는 요청한 쓰기 내용이 저장 장치에 기록될 때까지 일정시간 지연이 발생하는 것이다.&lt;/li&gt;
&lt;li&gt;쓰기 요청 발생 후, 정전이 발생한다면 기록 요청 내용 중 일부가 손실 될 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;혹은 불안정해지므로, 기록 순서를 보장 받을 수 없을지도 모른다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;저널링(Journaling), 카피-온-라이트(Copy-On-Write)&lt;/b&gt; : 시스템의 갑작스러운 다운에 대비하여 복구할 수 있는 기법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이 기법들은 쓰기 명령 간에 기록 순서를 강제로 보장한다.&lt;/li&gt;
&lt;li&gt;효율적인 디스크 작업을 위해 단순한 LinkedList부터 B-Tree까지 다양한 종류의 자료 구조를 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 2.5. 설계 목표&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제는 CPU, 메모리, 디스크 등의 자원을 가상화(Virtualize)한다.&lt;/li&gt;
&lt;li&gt;운영체제는 복잡한 병행성 문제를 처리한다.&lt;/li&gt;
&lt;li&gt;운영체제는 파일을 영속적으로 저장하여 오랜 시간 동안 안전한 상태에 있게 한다.&lt;/li&gt;
&lt;li&gt;이 모든 것들을 구현하려면 설계와 구현에 집중하고 필요한 경우, 절충안을 찾는 것이 필수적이다.&lt;/li&gt;
&lt;li&gt;기본적인 목표는 시스템을 편리하고 사용하기 쉽게 만드는 개념들을 정의하는 것이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;컴퓨터 과학에서 추상화는 모든 일의 근간이다.&lt;/li&gt;
&lt;li&gt;추상화를 통해 이해할 수 있는 큰 무언가의 덩이를 이해할 수 있는 작은 덩이로 만들 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;운영체제의 설계와 구현에 중요한 목표는 성능이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;오버헤드를 최소화하는 것이 중요하다.&lt;/li&gt;
&lt;li&gt;가상화, 사용하기 쉬운 시스템을 만드는 것은 의미가 있으나, 반드시 해야하는 것은 아니다.&lt;/li&gt;
&lt;li&gt;기능들을 과도한 오버헤드 없이 제공하는 것이 중요하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;또 다른 목표는 응용 프로그램 간의 보호, 그리고 운영체제와 응용 프로그램 간의 보호다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다수 프로그램이 실행되기 때문에, 운영체제는 악의적인 혹은 의도치 않은 행위가 다른 프로그램에 영향을 주지 않는다는 것을 보장해야 한다.&lt;/li&gt;
&lt;li&gt;보호는 운영체제의 원칙 중 하나인 &lt;b&gt;고립(isolation)&lt;/b&gt; 원칙의 핵심이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;운영체제는 지속되어 실행되어야 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제가 실패하면 위에서 동작하는 모든 응용 프로그램도 실패한다.&lt;/li&gt;
&lt;li&gt;운영체제는 높은 신뢰성(reliability)을 제공해야 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제가 복잡해질수록 신뢰성 있는 운영체제를 구현하는 일은 매우 어려워진다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;에너지 효율성(Energy-Efficiency)와 같은 목표도 녹색 세상을 위해서 중요하다.&lt;/li&gt;
&lt;li&gt;악의적인 응용 프로그램에 대한 보안(Security)은 지금 시대의 네트워크 환경에서 중요하다.&lt;/li&gt;
&lt;li&gt;이동성(Mobility)는 운영체제가 작은 장치에서 사용될수록 중요해지고 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 2.6. 배경 소개&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;초창기 운영체제는 많은 일을 하지 않았다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기본적으로 자주 사용되는 함수들을 모은 라이브러리에 불과했다.&lt;/li&gt;
&lt;li&gt;옛날에는 컴퓨터를 조작하는 사람이 프로그램을 한 번에 하나씩 실행했다.&lt;/li&gt;
&lt;li&gt;작업이 준비되면 컴퓨터 관리자가 일괄적으로 처리했으며, 이러한 방식의 컴퓨팅을 일괄 처리(Batch)라고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;이후, 운영체제는 단순한 라이브러리를 넘어서 중요한 역할을 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;운영체제 코드는 하드웨어 장치의 제어를 담당하기에, 다른 응용 프로그램과는 다른 취급을 받아야 한다.&lt;/li&gt;
&lt;li&gt;모든 응용 프로그램이 원하는 디스크의 파일들을 자유롭게 읽을 수 있다면 개인 정보를 보호하는 것은 불가능하다.&lt;/li&gt;
&lt;li&gt;파일 시스템과 같은 프로그램들을 일반적인 라이브러리 형태로 구현하면 자료의 기록과 보호가 어려웠다.&lt;/li&gt;
&lt;li&gt;Atlas 컴퓨팅 시스템에 의해 &lt;b&gt;시스템 콜&lt;/b&gt;이라는 아이디어가 발명되었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;운영체제 코드를 실행하기 위해서 정해진 규칙에 따라 제어 가능한 과정을 거치도록 만들었다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템 콜과 함수 호출의 결정적인 차이는 제어를 운영체제에 넘길 때, &lt;b&gt;하드웨어 특권 수준(Hardware Privilege Level)&lt;/b&gt;을 상향 조정하는 것이다.&lt;/li&gt;
&lt;li&gt;응용 프로그램은 유저 모드(User Mode)에서 실행이 된다. 이 상태에서는 응용 프로그램이 할 수 있는 일을 하드웨어적으로 제한한다.&lt;/li&gt;
&lt;li&gt;시스템 콜은 트랩(Trap)이라고 불리는 특별한 매커니즘을 이용하여 호출된다. 지정된 트랩 핸들러(Trap Handler) 함수에 제어권을 넘기고 특권 수준을 커널 모드(Kernel Mode)로 격상시킨다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;트랩 핸들러 함수는 운영체제에서 미리 구현되어 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;운영체제가 서비스를 완료하면 Return-From-Trap 특수 명령어를 사용해서 제어권을 다시 응용 프로그램에게 넘긴다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;다음 운영체제의 발전은 멀티 프로그래밍에서 달라졌다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 번에 하나의 프로그램을 실행시키는 대신 운영체제는 여러 작업을 메모리에 탑재하고 빠르게 전환하며 CPU 사용률을 향상시킨다.&lt;/li&gt;
&lt;li&gt;입출력 장치가 느리기 때문에 전환(Switching) 능력이 중요했다.&lt;/li&gt;
&lt;li&gt;CPU에서 입출력 시간을 기다리는 것 보다 다르게 활용하는 것이 좋지 않을까란 생각으로 인터럽트를 통한 입출력 작업 처리 등의 기법들이 운영체제에 도입되었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;현대 시대에 넘어와서는 잠시 과도기가 있었다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;개인용 컴퓨터(Personal Computer)가 많아지면서 다양한 운영체제가 생겨났고 이전에서 생긴 실수들을 반복했다.&lt;/li&gt;
&lt;li&gt;시간이 지나면서 이전 실수들을 다시 하나씩 수정해나갔고 지금의 운영체제가 생기게 되었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>독서/OSTEP</category>
      <author>태역</author>
      <guid isPermaLink="true">https://taeyeokim.tistory.com/234</guid>
      <comments>https://taeyeokim.tistory.com/234#entry234comment</comments>
      <pubDate>Tue, 15 Jul 2025 21:43:29 +0900</pubDate>
    </item>
    <item>
      <title>[게임 수학] 5장. 행렬 : 가상 세계의 변환 도구</title>
      <link>https://taeyeokim.tistory.com/233</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;5장.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1047&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvGEpf/btsPiz6nXRA/evNKRrm2Qrx8ovgJsrpQr0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvGEpf/btsPiz6nXRA/evNKRrm2Qrx8ovgJsrpQr0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvGEpf/btsPiz6nXRA/evNKRrm2Qrx8ovgJsrpQr0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvGEpf%2FbtsPiz6nXRA%2FevNKRrm2Qrx8ovgJsrpQr0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1047&quot; data-filename=&quot;5장.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1047&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 5장. 행렬 : 가상 세계의 변환 도구&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;행렬은 가상공간에서 체계적으로 공간 변환을 수행해 주는 수학적 토대다. 이번 장에서는 선형성, 행렬의 원리 및 활용 방법, 2차원 공간 위에서 사용 가능한 유용한 행렬 변환, 가상 세계 물체 변환, 변환을 원 상태로 복구하는 등의 원리를 학습해 보자.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;☑️ 5.1. 선형성: 예측 가능한 비례 관계&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;선형성(Linearity) : 직선의 형태를 띠는 성질이면서 두 집합의 순수한 비로 구성된 대응 관계를 의미한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수학에서는 가법성과 1차 동차성을 모두 만족하는 함수의 성질로 정의한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가법성 공식 : \[f(x_1 + x_2) = f(x_1) + f(x_2)\]&lt;/li&gt;
&lt;li&gt;1차 동차성 공식 : \[ &lt;br /&gt;f(k&amp;nbsp;\cdot&amp;nbsp;x)&amp;nbsp;=&amp;nbsp;k&amp;nbsp;\cdot&amp;nbsp;f(x) &lt;br /&gt;\]&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 5.1.1. 선형 함수&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가법성과 1차 동차성을 통해서 선형 함수임을 나타내는 과정을 증명한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;\(f(x) = ax\)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가법성 : \(a(x_1+x_2) = ax_1 + ax_2\)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원소가 체의 구조를 가졌을 때, 분배법칙으로 인해 성립된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;1차 동시성 : \( a(kx) = k(ax) \)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원소가 체의 구조를 가졌을 때, 곱셈에 대해서 결합법칙과 교환법칙이 성립된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;\( f(x) = x^2 \)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가법성 : \( (x_1)^2 + (x_2)^2 + 2x_1 x_2 != (x_1)^2 + (x_2)^2 \)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가법성을 만족하지 못하므로 선형성을 만족하는 함수가 아니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;\( f(x) = ax+b \)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가법성 : \( a(x_1+x_2) + b != ax_1 + ax_2 + 2b \)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;가법성을 만족하지 못하므로 선형성을 만족하는 함수가 아니다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;출력값에 역함수를 적용하면, 입력값을 계산하는 것이 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 5.1.2. 벡터 공간의 선형 변환&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;입력과 출력을 2차원 벡터 공간으로 설정하고 선형성을 가지는 함수를 알아보자.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정의역 벡터 공간 : V&lt;/li&gt;
&lt;li&gt;정의역 벡터 공간의 원소 : \( \vec{v} \)&lt;/li&gt;
&lt;li&gt;공역 벡터 공간 : W&lt;/li&gt;
&lt;li&gt;공역 벡터 공간의 원소 : \( \vec{w} \)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;2차원 벡터를 입출력으로 사용하는 선형성을 가지는 함수
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;\( f(\vec{v}) = f(x, y) = (ax+by, cx+dy) \)&lt;/li&gt;
&lt;li&gt;수식이 길어서 생략. 가법성과 1차 동차성을 만족한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;표준기저벡터의 선형 결합으로 형성된 벡터 공간은 선형성을 지닌다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 벡터 공간을 선형 함수로 변화시킨 새로운 공간도 기저벡터의 선형 결합으로 이루어지기 때문에 선형성을 가진다.&lt;/li&gt;
&lt;li&gt;이런 대응 관계를 변환(Transformation)이라고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;벡터 공간에서 발생하는 선형 변환의 원리는 크기 변환 및 회전 변환과 관련 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 5.2. 행렬&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;행렬(Matrix) : 수를 사각형 형태로 행과 열을 맞춰 배열한 테이블
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;열벡터 : \( \begin{bmatrix} a_1 \\ a_2 \\ a_3 \end{bmatrix} \)&lt;/li&gt;
&lt;li&gt;행벡터 : \( \begin{bmatrix} a_1 &amp;amp; a_2 &amp;amp; a_3 \end{bmatrix} \)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;정방행렬(Square Matrix) : 행과 열이 같은 크기인 행렬
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;선형 변환을 표현할 때 사용한다.&lt;/li&gt;
&lt;li&gt;정방행렬의 크기가 2일 때, 2개의 행벡터 혹은 2개의 열벡터로 구성되었다고 이야기 할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 5.2.1. 행렬의 기본 연산&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;책에서 알아야 하는 행렬의 연산은 4가지가 있다.&lt;/li&gt;
&lt;li&gt;행렬과 행렬의 덧셈
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;피연산자는 서로 같은 크기를 가져야 한다.&lt;/li&gt;
&lt;li&gt;두 행렬 간의 덧셈은 같은 위치의 원소끼리 더한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[ &lt;br /&gt;\begin{bmatrix} &lt;br /&gt;1&amp;nbsp;&amp;amp;&amp;nbsp;2&amp;nbsp;\\ &lt;br /&gt;3&amp;nbsp;&amp;amp;&amp;nbsp;4 &lt;br /&gt;\end{bmatrix} &lt;br /&gt;+ &lt;br /&gt;\begin{bmatrix} &lt;br /&gt;5&amp;nbsp;&amp;amp;&amp;nbsp;6&amp;nbsp;\\ &lt;br /&gt;7&amp;nbsp;&amp;amp;&amp;nbsp;8 &lt;br /&gt;\end{bmatrix} &lt;br /&gt;= &lt;br /&gt;\begin{bmatrix} &lt;br /&gt;1+5&amp;nbsp;&amp;amp;&amp;nbsp;2+6&amp;nbsp;\\ &lt;br /&gt;3+7&amp;nbsp;&amp;amp;&amp;nbsp;4+8 &lt;br /&gt;\end{bmatrix} &lt;br /&gt;= &lt;br /&gt;\begin{bmatrix} &lt;br /&gt;6&amp;nbsp;&amp;amp;&amp;nbsp;8&amp;nbsp;\\ &lt;br /&gt;10&amp;nbsp;&amp;amp;&amp;nbsp;12 &lt;br /&gt;\end{bmatrix} &lt;br /&gt;\]&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;행렬과 스칼라의 곱셈
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;행렬을 구성하는 모든 원소에 스칼라를 곱한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[&lt;br /&gt;3&amp;nbsp;\cdot&amp;nbsp; &lt;br /&gt;\begin{bmatrix} &lt;br /&gt;1&amp;nbsp;&amp;amp;&amp;nbsp;2&amp;nbsp;\\ &lt;br /&gt;3&amp;nbsp;&amp;amp;&amp;nbsp;4 &lt;br /&gt;\end{bmatrix} &lt;br /&gt;= &lt;br /&gt;\begin{bmatrix} &lt;br /&gt;3\cdot1&amp;nbsp;&amp;amp;&amp;nbsp;3\cdot2&amp;nbsp;\\ &lt;br /&gt;3\cdot3&amp;nbsp;&amp;amp;&amp;nbsp;3\cdot4 &lt;br /&gt;\end{bmatrix} &lt;br /&gt;= &lt;br /&gt;\begin{bmatrix} &lt;br /&gt;3&amp;nbsp;&amp;amp;&amp;nbsp;6&amp;nbsp;\\ &lt;br /&gt;9&amp;nbsp;&amp;amp;&amp;nbsp;12 &lt;br /&gt;\end{bmatrix} &lt;br /&gt;\]&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;행렬의 전치&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;행렬의 전치 연산은 행과 열을 바꾸는 작업을 수행한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[&lt;br /&gt;\begin{bmatrix} &lt;br /&gt;1&amp;nbsp;&amp;amp;&amp;nbsp;2&amp;nbsp;&amp;amp;&amp;nbsp;3&amp;nbsp;\\ &lt;br /&gt;4&amp;nbsp;&amp;amp;&amp;nbsp;5&amp;nbsp;&amp;amp;&amp;nbsp;6 &lt;br /&gt;\end{bmatrix}^{T} &lt;br /&gt;= &lt;br /&gt;\begin{bmatrix} &lt;br /&gt;1&amp;nbsp;&amp;amp;&amp;nbsp;4&amp;nbsp;\\ &lt;br /&gt;2&amp;nbsp;&amp;amp;&amp;nbsp;5&amp;nbsp;\\ &lt;br /&gt;3&amp;nbsp;&amp;amp;&amp;nbsp;6 &lt;br /&gt;\end{bmatrix} &lt;br /&gt;\]&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;행렬과 행렬의 곱셈&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 5.2.2. 행렬의 곱셈&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;행렬의 곱셈은 앞에 위치한 행렬의 행 벡터와 뒤에 위치한 행렬의 열 벡터를 각각 곱하는 방식으로 다음과 같이 진행된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[&lt;br /&gt;\begin{bmatrix} &lt;br /&gt;1&amp;nbsp;&amp;amp;&amp;nbsp;2&amp;nbsp;\\ &lt;br /&gt;3&amp;nbsp;&amp;amp;&amp;nbsp;4 &lt;br /&gt;\end{bmatrix} &lt;br /&gt;\cdot &lt;br /&gt;\begin{bmatrix} &lt;br /&gt;5&amp;nbsp;&amp;amp;&amp;nbsp;6&amp;nbsp;\\ &lt;br /&gt;7&amp;nbsp;&amp;amp;&amp;nbsp;8 &lt;br /&gt;\end{bmatrix} &lt;br /&gt;= &lt;br /&gt;\begin{bmatrix} &lt;br /&gt;1\cdot5&amp;nbsp;+&amp;nbsp;2\cdot7&amp;nbsp;&amp;amp;&amp;nbsp;1\cdot6&amp;nbsp;+&amp;nbsp;2\cdot8&amp;nbsp;\\ &lt;br /&gt;3\cdot5&amp;nbsp;+&amp;nbsp;4\cdot7&amp;nbsp;&amp;amp;&amp;nbsp;3\cdot6&amp;nbsp;+&amp;nbsp;4\cdot8 &lt;br /&gt;\end{bmatrix} &lt;br /&gt;= &lt;br /&gt;\begin{bmatrix} &lt;br /&gt;19&amp;nbsp;&amp;amp;&amp;nbsp;22&amp;nbsp;\\ &lt;br /&gt;43&amp;nbsp;&amp;amp;&amp;nbsp;50 &lt;br /&gt;\end{bmatrix} &lt;br /&gt;\]&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;행렬 곱셈의 주요 성질 중 하나는 교환 법칙이 성립하지 않는다는 점이다.&lt;/li&gt;
&lt;li&gt;행렬 곱셈의 특징은 다음과 같다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;결합 법칙을 만족한다.&lt;/li&gt;
&lt;li&gt;행렬 곱을 전치한 결과는 순서를 바꾼 후 각각 전치해 곱한 결과와 동일하다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전치 : 행과 열을 바꾸는 작업&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;행렬 곱셈의 결과는 2차원 벡터 공간의 선형 변환과 동일하다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2x2 정방행렬 A는 2차원 공간의 선형 변환에 대응되는 함수를 의미한다.&lt;/li&gt;
&lt;li&gt;수식은 선형 변환을 적용해 새로운 벡터를 생성하는 작업으로 해석할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 5.2.3. 정방행렬의 곱셈&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2x2 정방행렬 간의 곱셈은 합성함수에 대응되는 연산이다.&lt;/li&gt;
&lt;li&gt;벡터 \( \vec{v}\)에 2x2 정방행렬 A, B를 곱하는 연산을 생각해 보자.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;벡터 공간 V에 속한 벡터 \( \vec{v}\)가 벡터 공간 W의 벡터로 대응하는 관계로 해석 가능하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;합성함수는 결합법칙을 만족하고, 합성함수에 대응하는 행렬의 곱셈도 결합법칙을 만족한다.&lt;/li&gt;
&lt;li&gt;결합법칙이 성립하는 행렬 곱의 성질은 CG 연산에서 유용하다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;100개의 점으로 구성된 물체가 화면으로 출력되기까지 5번의 선형 변환이 발생한다 가정하자.&lt;/li&gt;
&lt;li&gt;각 점마다 5번의 행렬 곱이 수행되므로, 총횟수는 500이 된다.&lt;/li&gt;
&lt;li&gt;결합법칙이 성립하는 행렬 연산의 특징을 사용하면 계산량을 줄이면서 동일 결과를 얻을 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;행렬 곱을 4번 수행해서 합성함수에 해당하는 행렬 F를 만든다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;각 점에 미리 계산된 행렬 F만 곱하면 동일한 결과가 나오게 된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최초 합성 변환을 만들기 위한 4번의 행렬 곱&lt;/li&gt;
&lt;li&gt;벡터마다 1번의 행렬 곱이 수행(점은 100개다)&lt;/li&gt;
&lt;li&gt;최종적으로 연산은 104번 수행되었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 5.3. 행렬의 설계&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;평면 상의 물체를 우리가 원하는 형태로 변환하기 위해 2x2 행렬을 설계하는 방법을 보자&lt;/li&gt;
&lt;li&gt;벡터 공간 V를 구성하는 두 표준기저벡터를 선형 변환을 통해 벡터 공간 W의 벡터 (a, c), (b, d)와 대응된다고 생각해 보자.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;벡터 공간 V의 \( \vec{v}&amp;nbsp; = (x, y) \) 는 표준기저벡터의 선형 결합으로 생성된다.&lt;/li&gt;
&lt;li&gt;벡터 \( \vec{v}\)가 선형 변환되는 경우, 동일한 선형 결합식을 사용해 벡터 \( \vec{w} \) 가 계산된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 5.3.1. 크기 변환행렬&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;크기 변환행렬(Scale Transformation Matrix) : 물체의 크기를 변경하는 행렬.&lt;/li&gt;
&lt;li&gt;크기 변환 : 각 표준기저벡터를 동일한 방향으로 지정한 크기만큼 늘리는 변환&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[&lt;br /&gt;S&amp;nbsp;=&lt;br /&gt;\begin{vmatrix}&lt;br /&gt;a&amp;nbsp;&amp;amp;&amp;nbsp;0&amp;nbsp;\\&lt;br /&gt;0&amp;nbsp;&amp;amp;&amp;nbsp;b&lt;br /&gt;\end{vmatrix}&lt;br /&gt;\]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 5.3.2. 회전 변환행렬&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회전 변환행렬(Rotation Transformation Matrix) : 주어진 각 \(\theta \)로 벡터 공간을 회전시키는 행렬.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[&lt;br /&gt;R(\theta)&amp;nbsp;=&lt;br /&gt;\begin{bmatrix}&lt;br /&gt;\cos&amp;nbsp;\theta&amp;nbsp;&amp;amp;&amp;nbsp;-\sin&amp;nbsp;\theta&amp;nbsp;\\&lt;br /&gt;\sin&amp;nbsp;\theta&amp;nbsp;&amp;amp;&amp;nbsp;\cos&amp;nbsp;\theta&lt;br /&gt;\end{bmatrix}&lt;br /&gt;\]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 5.3.3. 전단 변환행렬&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전단 변환행렬(Shear Transformation Matrix) : 물체의 형태를 평행하게 기울이는 행렬.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 축 방향만 평행 이동이 일어나고 나머지 축은 유지된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[&lt;br /&gt;S&amp;nbsp;=&lt;br /&gt;\begin{vmatrix}&lt;br /&gt;1 &amp;amp; a \\&lt;br /&gt;0 &amp;amp; 1&lt;br /&gt;\end{vmatrix}&lt;br /&gt;\]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 5.3.4. 삼각함수의 덧셈 정리&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;삼각함수 응용에 유용하게 사용되는 공식에는 삼각함수의 덧셈 정리가 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[ &amp;nbsp;\sin(a + b) = \sin a \cos b + \cos a \sin b \]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[ &amp;nbsp;\cos(a + b) = \cos a \cos b - \sin a \sin b \]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 5.4. 역행렬&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;선형 변환을 수행하는 행렬은 함수의 성질을 지니기 때문에 항등행렬과 역행렬이 존재한다.&lt;/li&gt;
&lt;li&gt;항등행렬(Identity Matrix) : 원 공간의 변화 없이 동일한 공간으로 유지하는 변환.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 대각 성분이 1이고, 나머지는 0이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[ &lt;br /&gt;I&amp;nbsp;= &lt;br /&gt;\begin{bmatrix} &lt;br /&gt;1&amp;nbsp;&amp;amp;&amp;nbsp;0&amp;nbsp;\\ &lt;br /&gt;0&amp;nbsp;&amp;amp;&amp;nbsp;1 &lt;br /&gt;\end{bmatrix} &lt;br /&gt;\]&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;역행렬(Inverse Matrix) : 행렬 곱의 결과가 항등행렬이 나오는 특별한 행렬.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[ &lt;br /&gt;A&amp;nbsp;\cdot&amp;nbsp;A^{-1}&amp;nbsp;=&amp;nbsp;A^{-1}&amp;nbsp;\cdot&amp;nbsp;A&amp;nbsp;=&amp;nbsp;I &lt;br /&gt;\]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 5.4.1. 역행렬의 존재를 판별하는 행렬식&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수가 역함수를 가지기 위해서는 전단사함수여야 한다.&lt;/li&gt;
&lt;li&gt;행렬도 마찬가지이므로, 역행렬이 존재하는지 파악하는 수식, 행렬식(Determinant)을 사용해서 판별한다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;행렬식은 det() 기호로 표기한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[ &lt;br /&gt;\det(A)&amp;nbsp;=&amp;nbsp; &lt;br /&gt;\begin{vmatrix} &lt;br /&gt;a&amp;nbsp;&amp;amp;&amp;nbsp;b&amp;nbsp;\\ &lt;br /&gt;c&amp;nbsp;&amp;amp;&amp;nbsp;d &lt;br /&gt;\end{vmatrix} &lt;br /&gt;=&amp;nbsp;ad&amp;nbsp;-&amp;nbsp;bc &lt;br /&gt;\]&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;행렬식의 값이 0인 선형 변환은 전단사 대응이 성립하지 않는다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;역행렬이 존재하지 않음.&lt;/li&gt;
&lt;li&gt;2차원 평면의 넓이가 소멸되면서 평면의 모든 요소는 1차원 선 위에 놓이게 된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;2차원으로 돌아갈 수 없음.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 5.4.2. 크기 변환행렬의 역행렬&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;변환행렬의 역행렬은 늘어난 크기를 원래 크기로 변화시킨다.&lt;/li&gt;
&lt;li&gt;크기 변환행렬 S는 다음과 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[ &lt;br /&gt;S&amp;nbsp;= &lt;br /&gt;\begin{vmatrix} &lt;br /&gt;a&amp;nbsp;&amp;amp;&amp;nbsp;0&amp;nbsp;\\ &lt;br /&gt;0&amp;nbsp;&amp;amp;&amp;nbsp;b &lt;br /&gt;\end{vmatrix} &lt;br /&gt;\]&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;크기 변환행렬의 역행렬은 다음과 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[ &lt;br /&gt;A^{-1}&amp;nbsp;= &lt;br /&gt;\begin{bmatrix} &lt;br /&gt;\frac{1}{a}&amp;nbsp;&amp;amp;&amp;nbsp;0&amp;nbsp;\\ &lt;br /&gt;0&amp;nbsp;&amp;amp;&amp;nbsp;\frac{1}{b} &lt;br /&gt;\end{bmatrix} &lt;br /&gt;\]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 5.4.3. 전단 변환행렬의 역행렬&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전단 변환행렬 S는 다음과 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[ &lt;br /&gt;S&amp;nbsp;=&lt;br /&gt;\begin{vmatrix}&lt;br /&gt;1 &amp;amp; a \\&lt;br /&gt;0 &amp;amp; 1&lt;br /&gt;\end{vmatrix}&lt;br /&gt;\]&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전단 변환행렬의 역행렬은 다음과 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[ &lt;br /&gt;S&amp;nbsp;=&lt;br /&gt;\begin{vmatrix}&lt;br /&gt;1 &amp;amp; -a \\&lt;br /&gt;0 &amp;amp; 1&lt;br /&gt;\end{vmatrix}&lt;br /&gt;\]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 5.4.4. 회전 변환행렬의 역행렬&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회전 변환행렬 S는 다음과 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[ &lt;br /&gt;R(\theta)&amp;nbsp;= &lt;br /&gt;\begin{bmatrix} &lt;br /&gt;\cos&amp;nbsp;\theta&amp;nbsp;&amp;amp;&amp;nbsp;-\sin&amp;nbsp;\theta&amp;nbsp;\\ &lt;br /&gt;\sin&amp;nbsp;\theta&amp;nbsp;&amp;amp;&amp;nbsp;\cos&amp;nbsp;\theta &lt;br /&gt;\end{bmatrix} &lt;br /&gt;\]&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회전 변환행렬의 역행렬은 다음과 같다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[ &lt;br /&gt;R^{-1}(\theta)&amp;nbsp;=&amp;nbsp;R(-\theta)&amp;nbsp;= &lt;br /&gt;\begin{bmatrix} &lt;br /&gt;\cos&amp;nbsp;\theta&amp;nbsp;&amp;amp;&amp;nbsp;\sin&amp;nbsp;\theta&amp;nbsp;\\ &lt;br /&gt;-\sin&amp;nbsp;\theta&amp;nbsp;&amp;amp;&amp;nbsp;\cos&amp;nbsp;\theta &lt;br /&gt;\end{bmatrix} &lt;br /&gt;\]&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;역행렬에서 부호가 변하지 않는 cos 함수는 대각선 영역에만 존재한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;회전행렬과 역행렬은 서로 전치 관계에 있다.&lt;/li&gt;
&lt;li&gt;역행렬을 따로 구하지 않고 기존 행렬에 전치 연산을 적용하는 방법으로 구할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 5.4.5. 행렬 곱의 역행렬&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;합성함수의 역함수에 대해 아래의 수식이 성립됨에 따라서 합성함수에 해당하는 두 행렬의 곱의 역행렬도 성립된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[&lt;br /&gt;(f&amp;nbsp;\circ&amp;nbsp;g)^{-1}&amp;nbsp;=&amp;nbsp;g^{-1}&amp;nbsp;\circ&amp;nbsp;f^{-1} &lt;br /&gt;\]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[ &lt;br /&gt;(AB)^{-1}&amp;nbsp;=&amp;nbsp;B^{-1}&amp;nbsp;A^{-1} &lt;br /&gt;\]&lt;/p&gt;</description>
      <category>독서/이득우의 게임 수학</category>
      <author>태역</author>
      <guid isPermaLink="true">https://taeyeokim.tistory.com/233</guid>
      <comments>https://taeyeokim.tistory.com/233#entry233comment</comments>
      <pubDate>Tue, 15 Jul 2025 16:33:20 +0900</pubDate>
    </item>
    <item>
      <title>[게임 수학] 4장. 삼각함수 : 회전을 위한 수학</title>
      <link>https://taeyeokim.tistory.com/232</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;4장.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1047&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JO9Ai/btsO6bebcFn/EOoblb4AkwD1yrPimgZTc1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JO9Ai/btsO6bebcFn/EOoblb4AkwD1yrPimgZTc1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JO9Ai/btsO6bebcFn/EOoblb4AkwD1yrPimgZTc1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJO9Ai%2FbtsO6bebcFn%2FEOoblb4AkwD1yrPimgZTc1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1047&quot; data-filename=&quot;4장.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1047&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 4장. 삼각함수 : 회전을 위한 수학&lt;/h2&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;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 4.1. 삼각함수&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 각이 직각(90도)인 삼각형을 직각삼각형이라고 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 각이 직각이므로, 두 각의 합이 90도가 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;삼각비(Trigonometric Ratio) : 직각삼각형의 세 변 중 두 변의 비례 관계를 나타내는 것&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;570&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cvfEm2/btsO7AcPRtS/XutviJnBbEYAKZ6QnJEdb0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cvfEm2/btsO7AcPRtS/XutviJnBbEYAKZ6QnJEdb0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cvfEm2/btsO7AcPRtS/XutviJnBbEYAKZ6QnJEdb0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcvfEm2%2FbtsO7AcPRtS%2FXutviJnBbEYAKZ6QnJEdb0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;639&quot; height=&quot;570&quot; data-origin-width=&quot;639&quot; data-origin-height=&quot;570&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;6가지의 비례 관계 중에서 코사인, 사인, 탄젠트이 대표적이다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$ \sin(\theta) = \frac{\text{높이}}{\text{빗변}} $&lt;/li&gt;
&lt;li&gt;$ \cos(\theta) = \frac{\text{밑변}}{\text{빗변}} $&lt;/li&gt;
&lt;li&gt;$ \tan(\theta) = \frac{\text{높이}}{\text{밑변}} $&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;삼각함수(Trigonometric Function) : 직각삼각형에서 두 변의 비로 정의되며, 개념을 단위원 위의 점과 각도로 확장하면서 각의 범위를 실수 전체로 확장한 것.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;반지름이 1인 단위 원(Unit Circle)을 사용해서 나타내면 삼각함수를 쉽게 파악할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Algeomath_snapshot_2025-7-6_195455_469.png&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;439&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bOYwVi/btsO5VWOPwe/Z8R4k4IZNQ4lj1UZjhx9Ak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bOYwVi/btsO5VWOPwe/Z8R4k4IZNQ4lj1UZjhx9Ak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bOYwVi/btsO5VWOPwe/Z8R4k4IZNQ4lj1UZjhx9Ak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbOYwVi%2FbtsO5VWOPwe%2FZ8R4k4IZNQ4lj1UZjhx9Ak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;479&quot; height=&quot;439&quot; data-filename=&quot;Algeomath_snapshot_2025-7-6_195455_469.png&quot; data-origin-width=&quot;479&quot; data-origin-height=&quot;439&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빗변의 길이가 1이 되기 때문에 $\sin$과 $\cos$의 값은 각각 밑변과 높이의 길이가 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;\[&lt;br /&gt;\begin{align*}&lt;br /&gt;\sin(\theta)&amp;nbsp;&amp;amp;=&amp;nbsp;\frac{\text{높이}}{\text{빗변}}&amp;nbsp;=&amp;nbsp;\frac{\text{높이}}{1}&amp;nbsp;=&amp;nbsp;\text{높이}&amp;nbsp;\\&lt;br /&gt;\cos(\theta)&amp;nbsp;&amp;amp;=&amp;nbsp;\frac{\text{밑변}}{\text{빗변}}&amp;nbsp;=&amp;nbsp;\frac{\text{밑변}}{1}&amp;nbsp;=&amp;nbsp;\text{밑변}&lt;br /&gt;\end{align*}&lt;br /&gt;\]&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단위 원에서 r배 증가한 벡터의 좌표는 스칼라 곱셈을 통해서 다음과 같이 구한다.&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;Algeomath_snapshot_2025-7-6_20443_45.png&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;468&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nYw1k/btsO5CcdoqW/ILMjK1hsQEMsovUaEM3Zg1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nYw1k/btsO5CcdoqW/ILMjK1hsQEMsovUaEM3Zg1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nYw1k/btsO5CcdoqW/ILMjK1hsQEMsovUaEM3Zg1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnYw1k%2FbtsO5CcdoqW%2FILMjK1hsQEMsovUaEM3Zg1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;570&quot; height=&quot;468&quot; data-filename=&quot;Algeomath_snapshot_2025-7-6_20443_45.png&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;468&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;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 4.1.1. 삼각함수의 성질&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데카르트 좌표계에서 각도는 x축에서 원의 궤적을 따라 반시계 방향으로 회전한 크기를 의미한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단위 원에서 벡터 $\vec{v} = (1, 0)$의 $\sin, \cos$ 값은 $0, 1$이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;각도를 $0^\circ ~ 90^\circ$까지 증가하면서 회전시켜보자.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;벡터의 $x$값은 감소하고 $y$값은 증가한다.&lt;/li&gt;
&lt;li&gt;각도가 $90^\circ$를 넘어서면 벡터의 $x$값은 $0$을 지나서 음수가 되고 $y$값은 $0$을 향해 감소한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;325&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bYyAfw/btsO7wIjjdP/tjQp05AbTK5StPtXQyY2ck/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bYyAfw/btsO7wIjjdP/tjQp05AbTK5StPtXQyY2ck/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bYyAfw/btsO7wIjjdP/tjQp05AbTK5StPtXQyY2ck/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/bYyAfw/btsO7wIjjdP/tjQp05AbTK5StPtXQyY2ck/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;500&quot; height=&quot;325&quot; data-origin-width=&quot;500&quot; data-origin-height=&quot;325&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;GIF에서 보이듯이 [-1,. 1] 범위 안에서 $360^\circ$마다 반복한다.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;진폭(Amplitude) : 변화 값의 범위&lt;/li&gt;
&lt;li&gt;주기(Period) : 반복되는 각도&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;$Y$축을 접어 좌우를 포갰을 때, 형태를 가지고 함수의 성질을 구분할 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;짝함수(우함수, Even Function) : 좌우 대칭의 성질을 가진 함수&lt;/li&gt;
&lt;li&gt;홀함수(기함수, Odd Function) : 원점 대칭의 성질을 가진 함수&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;$\tan$ 함수는 빗변과 무관하게 밑변과 높이의 관계를 나타낸다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공식 : $ \tan&amp;nbsp;\theta&amp;nbsp;=&amp;nbsp;\frac{\sin&amp;nbsp;\theta}{\cos&amp;nbsp;\theta}$&lt;/li&gt;
&lt;li&gt;분모의 값은 0이 될 수 없다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$\cos$ 함수의 값이 0이 되는 $90^\circ, 270^\circ, -90^\circ , -270 ^\circ$에선 $\tan$ 함수의 정의역에 포함되지 않는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;390&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tPSgZ/btsO5BEALoF/hy798E6gn1ApqaoipV3UH1/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tPSgZ/btsO5BEALoF/hy798E6gn1ApqaoipV3UH1/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tPSgZ/btsO5BEALoF/hy798E6gn1ApqaoipV3UH1/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/tPSgZ/btsO5BEALoF/hy798E6gn1ApqaoipV3UH1/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;570&quot; height=&quot;390&quot; data-origin-width=&quot;570&quot; data-origin-height=&quot;390&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;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 4.1.2. 각의 측정법&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각도법(Degree) : 원 한 바퀴를 360도로 나눈 방식
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;360이란 수는 약수가 많아 원을 나누기에 편리하다.&lt;/li&gt;
&lt;li&gt;하지만, 수학적으로는 단위로 삼기에 값이 커서 불편하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;호도법(Radian) : 호의 길이를 기준으로 각을 측정하는 방법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;반지름이 1인 단위에서, 길이 1만큼의 호를 갖는 중심각을 1 라디안(Radian)이라고 한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;반원에 해당하는 호의 길이는 3.14, 즉 $\pi$다.&lt;br /&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$\pi = 180^\circ$의 관계가 성립한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;221&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6j8bK/btsO6oqXsyk/MyfmOREruP0jRAkKxZC6UK/img.gif&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6j8bK/btsO6oqXsyk/MyfmOREruP0jRAkKxZC6UK/img.gif&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6j8bK/btsO6oqXsyk/MyfmOREruP0jRAkKxZC6UK/img.gif&quot; srcset=&quot;https://blog.kakaocdn.net/dn/c6j8bK/btsO6oqXsyk/MyfmOREruP0jRAkKxZC6UK/img.gif&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;397&quot; height=&quot;221&quot; data-origin-width=&quot;397&quot; data-origin-height=&quot;221&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 4.2. 삼각함수를 활용한 물체의 회전&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;물체의 이동과 크기 조정은 서로 수직인 X축과 Y축의 방향으로 독립적으로 적용된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;각 축을 계산하고 결합해도 최종 결과는 동일하다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;회전은 X, Y 값이 함께 영향을 미치게 되어 분리 후 결합을 통해서 계산할 수 없다.&lt;/li&gt;
&lt;li&gt;벡터 공간은 두 표준기저벡터 $e_1, e_2$를 기저로 두고 둘의 선형 결합으로 표현한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 표준기저벡터를 $\theta$ 만큼 회전시키면 반시계 방향으로 회전시키면 아래와 같이 바뀐다.&lt;/li&gt;
&lt;li&gt;$e_1' = ( \cos \theta, \sin \theta)$&lt;/li&gt;
&lt;li&gt;$e_2' = ( -\sin \theta, \cos \theta)$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;어떤 벡터 $\vec{v} = (1, 1)$에 대해서 회전된 좌표계에서의 좌표는 아래와 같이 계산 가능하다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$\vec{v}' = ( \cos \theta - \sin \theta, \sin \theta + \cos \theta )$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;☑️ 4.3. 삼각함수의 역함수&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;지금까지 삼각함수를 사용해 주어진 각에 대응하는 벡터 좌표를 얻는 방법을 배웠다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;게임 개발에서는 벡터의 좌표로부터 대응하는 각도를 얻는 작업도 필요하다.&lt;/li&gt;
&lt;li&gt;그렇기 때문에 삼각함수의 역함수와 이에 대한 성질을 알아야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;$sin$ 함수의 대응 관계를 살펴보면 정의역의 여러 요소가 공역의 한 요소에 대응한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공역의 범위를 [-1, 1] 구간으로 한정해 정의하면, $\sin$ 함수는 전사함수의 성질을 지닌다.&lt;/li&gt;
&lt;li&gt;정의역 범위를 좁혀 정의역의 한 요소가 공역의 한 요소에 대응되도록 하면 전단사 함수를 만들 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;어떤 함수를 전단사함수로 만들면 $sin$ 값이 주어졌을 때, 각도를 구할 수 있는 역함수가 존재하게 된다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정의역과 공역의 범위를 제한시켜 얻은 $sin$ 함수의 역함수를 $arcsin$(아크사인) 함수라고 부른다.&lt;/li&gt;
&lt;li&gt;$cos$ 함수도 정의역과 공역을 제한하면 전단사함수를 만들 수 있고 역함수는 $arccos$(아크코사인)이라고 부른다.&lt;/li&gt;
&lt;li&gt;$tan$ 함수는 $-90^\circ$와 $90^\circ$일 때, y 값이 존재하지 않는다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;$-90^\circ, 90^\circ$을 제외한 $(-90^\circ, 90^\circ)$ 범위가 되어야 한다.&lt;/li&gt;
&lt;li&gt;$arctan$(아크탄젠트) 함수라고 부른다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;$arctan$ 함수는 벡터의 각도를 구하는 곳에 유용하게 사용된다.&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$\vec{v} = (x, y)$일 때, $\frac{y}{x}$를 계산하면 벡터로부터 $tan$ 함수 값을 얻을 수 있다.&lt;/li&gt;
&lt;li&gt;얻은 값을 $arctan$ 함수에 넣으면 해당 벡터가 X축과 이루는 사잇각을 얻을 수 있다.&lt;/li&gt;
&lt;li&gt;$arctan$ 함수의 치역은 $(-90^\circ, 90^\circ)$ 구간이므로, 각의 범위에 제한이 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$arcsin, arccos$ 함수도 동일한 상황이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;$arctan$ 함수는 인자에 분수 값을 넣지 않고, $x, y$를 분리해 전달하면 4분면 전체에 이르는 각도를 얻을 수 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;분리해서 전달하면 부호를 파악해서 벡터의 분면을 제대로 파악할 수 없다.&lt;/li&gt;
&lt;li&gt;$arctan$ 함수는 분수 값을 인자로 받는 함수와 분리해서 전달하는 함수가 구분되어 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$atan2$ 함수 : 인자로 X, Y를 분리해서 전달하는 함수 (모든 분면에 대응 가능)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;☑️ 4.4. 극좌표계&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;극좌표계(Polar Coordinate System) : 회전 동작을 기반으로 설계된 좌표계
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;원점으로부터의 거리 $r$과 각 $\theta$로 구성되어 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좌표 표기 : $(r,&amp;nbsp; \theta)$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;시간에 따른 회전, 회전 효과 연출 시 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;벡터 $(x, y)$는 크기와 $arctan$ 함수를 사용해서 극좌표계로 표현 가능하다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$r = \sqrt{x^2+y^2}$&lt;/li&gt;
&lt;li&gt;$\theta = atan2(y, x)$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;반대의 경우는 다음과 같다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$x = r \cdot \cos \theta$&lt;/li&gt;
&lt;li&gt;$y = r \cdot \ sin \theta$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>독서/이득우의 게임 수학</category>
      <author>태역</author>
      <guid isPermaLink="true">https://taeyeokim.tistory.com/232</guid>
      <comments>https://taeyeokim.tistory.com/232#entry232comment</comments>
      <pubDate>Sun, 6 Jul 2025 22:50:08 +0900</pubDate>
    </item>
    <item>
      <title>[게임 수학] 3장. 벡터 : 가상 공간의 탄생</title>
      <link>https://taeyeokim.tistory.com/231</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;3장.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1047&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/buIbbn/btsO16doGjg/y0w1kRWMcJ3NX39UaiJuMK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/buIbbn/btsO16doGjg/y0w1kRWMcJ3NX39UaiJuMK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/buIbbn/btsO16doGjg/y0w1kRWMcJ3NX39UaiJuMK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbuIbbn%2FbtsO16doGjg%2Fy0w1kRWMcJ3NX39UaiJuMK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1047&quot; data-filename=&quot;3장.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1047&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 3장. 벡터 : 가상 공간의 탄생&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1차원 직선의 한계는 명확하다. 좁은 직선을 벗어나서 넓은 평면에서 시각적으로 의미 있는 물체를 생성하기 위한 개념들을 소개한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 3.1. 데카르트 좌표계&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데카르트 좌표계(Cartesian Coordinate System) : 직선의 수 집합을 수직으로 배치해 평면을 표기하는 방식.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수평으로 배치한 첫 번째 실수 집합의 미지수를 x로 표기&lt;/li&gt;
&lt;li&gt;수직으로 배치한 두 번째 실수 집합의 미지수를 y로 표기&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;평면의 영역은 총 4개의 분면으로 나뉘게 된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Algeomath_snapshot_2025-7-3_164438_914.png&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c6f22s/btsO3OCqPpk/bKqkKFZYFzkMj2dnkxGQFK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c6f22s/btsO3OCqPpk/bKqkKFZYFzkMj2dnkxGQFK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c6f22s/btsO3OCqPpk/bKqkKFZYFzkMj2dnkxGQFK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc6f22s%2FbtsO3OCqPpk%2FbKqkKFZYFzkMj2dnkxGQFK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;364&quot; height=&quot;364&quot; data-filename=&quot;Algeomath_snapshot_2025-7-3_164438_914.png&quot; data-origin-width=&quot;364&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;데카르트 좌표계의 원소는 곱집합과 동일하게 순서쌍으로 표기한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;(x, y) : 좌표&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;☑️ 3.2. 벡터 공간과 벡터&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 3.2.1. 스칼라와 벡터&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;벡터 공간(Vector Space) : 공리적 집합론의 관점에서 두 개의 실수를 곱집합으로 묶고 새로운 공리를 덧붙여서 만들어진 공간
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;벡터 공간을 표기 할 때에는 V를 주로 사용한다.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;벡터(Vector) : 벡터 공간의 원소
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;벡터 원소는 $\vec{v}$를 사용한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;벡터 공간은 공리적 집합론의 관점에서 생각해야 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;벡터는 실수 집합이 곱집합으로 묶인 상태지만, 공리적 집합론의 관점으로 실수 집합에 속하지 않는다.&lt;/li&gt;
&lt;li&gt;체의 구조를 지니는 집합, 체 집합 원소로 규정하고 스칼라(Scalr)라고 한다.&lt;/li&gt;
&lt;li&gt;좌표로 사용하는 x와 y도 스칼라다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 3.2.3. 벡터의 크기와 이동&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;벡터의 크기 : 원점으로부터의 최단 거리
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;피타고라스 정리를 통해서 구한다.&lt;/li&gt;
&lt;li&gt;노름(Norm)이라는 용어로 부르기도 한다.&lt;/li&gt;
&lt;li&gt;공식 : $\|\vec{v}\| = \sqrt{x^2 + y^2}$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;단위 벡터(Unit Vector) : 크기가 1인 벡터
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;벡터의 크기를 측정하는 기준이 된다.&lt;/li&gt;
&lt;li&gt;정규화(Normalize) : 벡터를 단위 벡터로 만드는 작업&lt;/li&gt;
&lt;li&gt;공식 : $\hat{v} = \frac{\vec{v}}{\|\vec{v}\|}$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;☑️ 3.3. 벡터의 결합과 생성&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;선형 결합(Linear Combination) : N개의 벡터와 N개의 스칼라를 조합해서 새로운 벡터를 만드는 연산&lt;/li&gt;
&lt;li&gt;선형 종속의 관계 : 선형 결합에서 스칼라가 0이 아닌 경우에도 결과로 영벡터를 가지는 관계
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;선형 종속의 관계는 두 벡터가 같은 원점으로부터 동일한 선상에 위치한 상태를 의미한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;선형 독립의 관계 : 선형 결합에서 영벡터가 나오기 위해서 스칼라가 0(Zero)이어야 하는 관계
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;선형 독립의 관계인 경우, 두 벡터에 스칼라를 결합하면서 벡터 공간의 모든 원소를 표현할 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;기저(Basis) : 선형 독립 관계를 가지는 벡터의 집합
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;기저에 속한 원소를 기저 벡터(Basis Vector)라고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;표준 기저(Standard Basis) : 기저 중에서 한 축만 사용하는 단위 벡터로 구성된 집합
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;표준 기저 벡터(Standard Basis Vector) : 표준 기저에 속하는 원소&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>독서/이득우의 게임 수학</category>
      <author>태역</author>
      <guid isPermaLink="true">https://taeyeokim.tistory.com/231</guid>
      <comments>https://taeyeokim.tistory.com/231#entry231comment</comments>
      <pubDate>Thu, 3 Jul 2025 20:21:09 +0900</pubDate>
    </item>
    <item>
      <title>[게임 수학] 2장. 수 : 가상 세계를 구성하는 가장 작은 단위</title>
      <link>https://taeyeokim.tistory.com/230</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;2장.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1047&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNIqPK/btsO2brc2tw/gsXvjuTNV1VgAahfPM9X9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNIqPK/btsO2brc2tw/gsXvjuTNV1VgAahfPM9X9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNIqPK/btsO2brc2tw/gsXvjuTNV1VgAahfPM9X9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNIqPK%2FbtsO2brc2tw%2FgsXvjuTNV1VgAahfPM9X9k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;2000&quot; height=&quot;1047&quot; data-filename=&quot;2장.png&quot; data-origin-width=&quot;2000&quot; data-origin-height=&quot;1047&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;☑️ 2장. 수 : 가상 세계를 구성하는 가장 작은 단위&lt;/b&gt;&lt;/h2&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;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;☑️ 2.1. 수와 집합&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;소박한 집합론 : 자연수, 정수, 유리수, 무리수, 실수, 복소수, 사원수 등 같은 원소로 묶인 집합을 의미한다.&lt;/li&gt;
&lt;li&gt;소박한 집합론은 일상 생활에서는 불편함 없이 사용 가능하지만, 컴퓨터 세상에서는 구성이 불가능하다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;공리를 기반으로 수를 구분하는 집합론인 공리적 집합론(Axiomatic set theory)를 사용해야 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;▶️ 2.1.1. 연산과 수의 구조&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이항 연산(Binary Operation) : 두 원소를 통해서 새로운 원소를 만들어내는 연산&lt;/li&gt;
&lt;li&gt;이항 연산은 다음과 같은 성질을 가진다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;닫혀 있다(Closure) : 연산 결과가 투입한 두 원소의 집합에 항상 속해있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$2 + 3 = 5$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;교환 법칙(Commutative Law) : 두 수를 연산할 때, 수의 순서와 상관 없이 값이 일정하다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$3&amp;nbsp;\cdot&amp;nbsp;4&amp;nbsp;=&amp;nbsp;4&amp;nbsp;\cdot&amp;nbsp;3$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;결합 법칙(Associative Law) : 연산이 두 번 이상 연속될 때, 앞선 연산을 먼저 계산한 결과와 뒤의 연산을 먼저 연산한 결과가 동일하다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;$(2&amp;nbsp;\cdot&amp;nbsp;3)&amp;nbsp;\cdot&amp;nbsp;4&amp;nbsp;=&amp;nbsp;2&amp;nbsp;\cdot&amp;nbsp;(3&amp;nbsp;\cdot&amp;nbsp;4)$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;분배법칙(Distributive Law) : 서로 다른 2가지 연산에 대해서 아래의 규칙이 성립해야 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;좌분배 법칙 : $a&amp;nbsp;\cdot&amp;nbsp;(b&amp;nbsp;+&amp;nbsp;c)&amp;nbsp;=&amp;nbsp;a&amp;nbsp;\cdot&amp;nbsp;b&amp;nbsp;+&amp;nbsp;a&amp;nbsp;\cdot&amp;nbsp;c$&lt;/li&gt;
&lt;li&gt;우분배 법칙 : $(a + b) \cdot c = a \cdot c + b \cdot c$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;항등원(Identity) : 임의의 원소와 연산을 했을 때, 결과로 원소 자신이 나오는 특별한 수
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;덧셈의 항등원 : $a + 0 = a$&lt;/li&gt;
&lt;li&gt;곱셈의 항등원 : $a \cdot 1 = a$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;역원(Inverse) : 연산 결과를 항등원을 가지는 수
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;덧셈의 역원 : $5 + (-5) = 0$&lt;/li&gt;
&lt;li&gt;곱셈의 역원 : $3 \cdot \frac{1}{3} = 1$&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;▶️ 2.1.2. 수의 구조&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아래 11가지 성질을 만족하는 수 집합은 체의 구조를 지니고 있다고 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;덧셈 연산에서 아래 5가지 성질을 만족해야 한다.&amp;nbsp;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;닫혀 있다&lt;/li&gt;
&lt;li&gt;교환 법칙이 성립한다.&lt;/li&gt;
&lt;li&gt;결합 법칙이 성립한다.&lt;/li&gt;
&lt;li&gt;항등원이 존재한다.&lt;/li&gt;
&lt;li&gt;역원이 존재한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;곱셈 연산에서 아래 5가지 성질을 만족해야 한다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;닫혀 있다.&lt;/li&gt;
&lt;li&gt;교환 법칙이 성립한다.&lt;/li&gt;
&lt;li&gt;결합 법칙이 성립한다.&lt;/li&gt;
&lt;li&gt;항등원이 존재한다.&lt;/li&gt;
&lt;li&gt;역원이 존재한다&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;연산에 대해 아래 1가지 성질을 만족해야 한다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;분배 법칙이 성립해야 한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;유리수, 실수는 11가지 성질을 만족하기 때문에 체의 구조를 지닌다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;체의 구조를 지니는 집합은 덧셈과 곱셈을 통해서 뺄셈, 나눗셈 연산을 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;수학과 첨언 : 뺄셈과 나눗셈은 없다. 애초에 이게 Def다.&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&lt;b&gt;☑️ 2.2. 함수&lt;/b&gt;&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수(Function) : 두 집합에서 첫 번째 집합의 모든 원소가 두 번째 집합의 원소에 대응하는 관계&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;▶️ 2.2.1. 함수의 개념과 종류&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;두 집합을 $X, Y$ 기호로 지정하고 각자의 원소를 $x, y$라고 할 때 대응되는 함수를 $y=f(x)$로 표기한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;함수.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;765&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kCgMr/btsO0xCmdJo/B8LZkreP886PXEtDuQMvl1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kCgMr/btsO0xCmdJo/B8LZkreP886PXEtDuQMvl1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kCgMr/btsO0xCmdJo/B8LZkreP886PXEtDuQMvl1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkCgMr%2FbtsO0xCmdJo%2FB8LZkreP886PXEtDuQMvl1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;996&quot; height=&quot;765&quot; data-filename=&quot;함수.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;765&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;아래의 두 규칙을 성립하면 함수로 정의할 수 있다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;첫 번째 집합의 모든 원소에 대한 대응 관계가 존재해야 한다.&lt;/li&gt;
&lt;li&gt;첫 번째 집합의 원소는 두 번째 집합의 한 원소에만 대응되어야 한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;함수에서 첫 번째 집합은 정의역(Domain)이라고 하고 두 번째 집합을 공역(Codomain)이라고 한다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정의역에 대응되는 공역의 원소만 모아서 부분 집합을 만든 것을 치역(Range)라고 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;함수는 다음과 같은 종류가 있다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전사함수(Surjection) : 공역의 모든 요소가 정의역에 대응되는 함수&lt;/li&gt;
&lt;li&gt;단사함수(Injection) : 정의역과 공역의 요소가 일대일로 대응되는 함수&lt;/li&gt;
&lt;li&gt;전단사함수(Bijection) : 전사함수와 단사함수의 성질을 가지고 있는 함수
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정의역과 공역의 모든 요소가 빠짐없이 일대일 대응한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;▶️ 2.2.2. 합성함수&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수의 합성 : 2개의 함수를 연쇄적으로 이어서 하나의 함수로 만드는 연산&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;합성함수.png&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;765&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/M0abs/btsO0TZzmak/SrNWQmyukERoaJOwdKIl61/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/M0abs/btsO0TZzmak/SrNWQmyukERoaJOwdKIl61/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/M0abs/btsO0TZzmak/SrNWQmyukERoaJOwdKIl61/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FM0abs%2FbtsO0TZzmak%2FSrNWQmyukERoaJOwdKIl61%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1508&quot; height=&quot;765&quot; data-filename=&quot;합성함수.png&quot; data-origin-width=&quot;1508&quot; data-origin-height=&quot;765&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;▶️ 2.2.3. 항등함수와 역함수&lt;/b&gt;&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;항등함수와 역함수는 항등원, 역원과 동일한 개념을 가진다.&lt;/li&gt;
&lt;li&gt;항등 함수(Identity Function) : 정의역과 공역이 동일한 값으로 대응되는 함수&lt;/li&gt;
&lt;li&gt;역 함수(Inverse Function) : 연산 결과로 항등 함수를 가지는 함수
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 함수가 역함수를 가지지는 않는다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;전사함수는 하나의 원소가 두 개의 원소에 대응된다.&lt;/li&gt;
&lt;li&gt;단사함수는 정의역의 모든 원소가 대응되지 않기 때문에 역함수는 함수의 조건을 만족할 수 없다.
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수 성립 규칙 중 2번 충족 미달.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>독서/이득우의 게임 수학</category>
      <author>태역</author>
      <guid isPermaLink="true">https://taeyeokim.tistory.com/230</guid>
      <comments>https://taeyeokim.tistory.com/230#entry230comment</comments>
      <pubDate>Wed, 2 Jul 2025 18:28:24 +0900</pubDate>
    </item>
    <item>
      <title>[알고리즘] C++로 이해하는 다익스트라(Dijkstra)</title>
      <link>https://taeyeokim.tistory.com/229</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;다익스트라.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;804&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kPbnM/btsOLcLxf6C/TBk1P9Nih209HpjwhMwhy1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kPbnM/btsOLcLxf6C/TBk1P9Nih209HpjwhMwhy1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kPbnM/btsOLcLxf6C/TBk1P9Nih209HpjwhMwhy1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkPbnM%2FbtsOLcLxf6C%2FTBk1P9Nih209HpjwhMwhy1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;804&quot; data-filename=&quot;다익스트라.png&quot; data-origin-width=&quot;1536&quot; data-origin-height=&quot;804&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr contenteditable=&quot;false&quot; data-ke-type=&quot;horizontalRule&quot; data-ke-style=&quot;style5&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ C++로 이해하는 다익스트라(Dijkstra)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다익스트라 알고리즘은 최단 경로를 구하는 알고리즘이다.&lt;b&gt; 한 정점에서 모든 정점까지의 최단 경로를 구하면서 각 정점까지의 최단 경로를 모두 찾는다&lt;/b&gt;. 오래된 알고리즘이라서 이를 개선하거나 영향을 받은 알고리즘도 많은데, 각각 A* 알고리즘, 벨만-포드 알고리즘, 플로이드-워셜 알고리즘 등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;☑️ 다익스트라 알고리즘 프로세스&lt;/h2&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;각 노드의 거리를 무한대로 초기화한다.&lt;/li&gt;
&lt;li&gt;시작노드의 거리는 0으로 설정한다.&lt;/li&gt;
&lt;li&gt;이전 노드를 저장할 공간을 Null로 설정한다.&lt;/li&gt;
&lt;li&gt;방문하지 않은 노드 집합 Q에 모든 노드를 추가한다.&lt;/li&gt;
&lt;li&gt;노드 집합 Q가 비어있지 않다면 반복한다
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Q에서 Dist가 가장 작은 노드를 선택한다.&lt;/li&gt;
&lt;li&gt;Q에서 선택한 노드를 제거한다.&lt;/li&gt;
&lt;li&gt;선택 노드의 인접 노드를 순회한다.
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;새로운 거리를 확인하고 인접 노드 거리보다 작으면 갱신한다&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;☑️ 다익스트라 알고리즘의 장단점&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;▶️ 장점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;최단 거리를 보장한다.&lt;/li&gt;
&lt;li&gt;우선순위 큐와 함께 사용할 시에 효율적으로 작동한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;▶️ 단점&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;음수 가중치가 있는 그래프에서는 사용이 불가능하다.&lt;/li&gt;
&lt;li&gt;모든 정점에 대해서 계산하게 된다.&lt;/li&gt;
&lt;li&gt;밀집된 그래프에서는 느려질 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;☑️ 시간 복잡도&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다익스트라 알고리즘은 그래프 표현 방식과 구현 방식에 따라서 달라질 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;우선순위 큐 사용 : O(V+E log)&lt;/li&gt;
&lt;li&gt;선형 검색 : O(V^2)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;☑️ 다익스트라 알고리즘 구현(C++)&lt;/h2&gt;
&lt;pre id=&quot;code_1750522700611&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;#include &amp;lt;iostream&amp;gt;
#include &amp;lt;vector&amp;gt;
#include &amp;lt;queue&amp;gt;
#include &amp;lt;limits&amp;gt;

using namespace std;

using pii = pair&amp;lt;int, int&amp;gt;;

const int INF = numeric_limits&amp;lt;int&amp;gt;::max();

vector&amp;lt;int&amp;gt; dijkstra(int start, const vector&amp;lt;vector&amp;lt;pii&amp;gt;&amp;gt;&amp;amp; graph) {
    int n = graph.size();
    vector&amp;lt;int&amp;gt; dist(n, INF);
    priority_queue&amp;lt;pii, vector&amp;lt;pii&amp;gt;, greater&amp;lt;&amp;gt;&amp;gt; pq;

    dist[start] = 0;
    pq.push({0, start});

    while (!pq.empty()) {
        int cost = pq.top().first;
        int now = pq.top().second;
        pq.pop();

        if (cost &amp;gt; dist[now]) continue;

        for (const auto&amp;amp; [next_cost, next] : graph[now]) {
            int total_cost = cost + next_cost;
            if (total_cost &amp;lt; dist[next]) {
                dist[next] = total_cost;
                pq.push({total_cost, next});
            }
        }
    }

    return dist;
}

int main() {
    vector&amp;lt;vector&amp;lt;pii&amp;gt;&amp;gt; graph(4);
    graph[0].push_back({2, 1});
    graph[0].push_back({1, 2});
    graph[1].push_back({3, 3});
    graph[2].push_back({1, 3});

    int start = 0;
    vector&amp;lt;int&amp;gt; distances = dijkstra(start, graph);

    for (int i = 0; i &amp;lt; distances.size(); ++i) {
        if (distances[i] == INF)
            cout &amp;lt;&amp;lt; &quot;노드 &quot; &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &quot;: 도달 불가&quot; &amp;lt;&amp;lt; endl;
        else
            cout &amp;lt;&amp;lt; &quot;노드 &quot; &amp;lt;&amp;lt; i &amp;lt;&amp;lt; &quot;: &quot; &amp;lt;&amp;lt; distances[i] &amp;lt;&amp;lt; endl;
    }

    return 0;
}&lt;/code&gt;&lt;/pre&gt;</description>
      <category>공부/알고리즘</category>
      <author>태역</author>
      <guid isPermaLink="true">https://taeyeokim.tistory.com/229</guid>
      <comments>https://taeyeokim.tistory.com/229#entry229comment</comments>
      <pubDate>Sun, 22 Jun 2025 01:18:27 +0900</pubDate>
    </item>
  </channel>
</rss>