<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>코딩 대장</title>
    <link>https://codingzzangmimi.tistory.com/</link>
    <description>문제 요청 해주시면 풀이 해드립니다~</description>
    <language>ko</language>
    <pubDate>Mon, 6 Jul 2026 05:07:51 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>mimizzang</managingEditor>
    <image>
      <title>코딩 대장</title>
      <url>https://tistory1.daumcdn.net/tistory/3080971/attach/f2e8ab4781f947dc94d9776af8950b17</url>
      <link>https://codingzzangmimi.tistory.com</link>
    </image>
    <item>
      <title>CS377: Threads</title>
      <link>https://codingzzangmimi.tistory.com/81</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;이번 시간에는 스레드에 대해서 알아보자. 스레드가 무엇인지, 어디에서 구현하는지, 어떻게 스케줄링을 해야하는지에 대해서 알아볼 예정이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;우선 &lt;b&gt;스레드&lt;/b&gt;와 &lt;b&gt;프로세스&lt;/b&gt;를 비교해보자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;&amp;nbsp;프로세스&lt;/b&gt;는 &lt;u&gt;컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램&lt;/u&gt;이라면 &lt;b&gt;스레드&lt;/b&gt;의 경우 &lt;u&gt;프로세스 내에서 연속적으로 실행되고 있는 흐름&lt;/u&gt;을 말한다. 스레드는 하나의 프로세스 내부로 제한되어 있고, 프로세스는 여러 개의 스레드를 가지고 있을 수 있다. 하나의 프로세스 내부에 위치한 여러 개의 프로세스는 서로 자원을 공유하기도 하고, stack이나 register의 경우, 독립적으로 사용하기도 한다. 따라서 응답성과 효율성이 향상된다는 장점이 있지만, 자원을 공유하기 때문에 하나의 스레드에 문제가 발생하는 경우 전체 프로세스에 영향을 미칠 수 있다는 문제점이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz4ILD/btqCz5SQno3/QXY8PZZltVevRA424ES1aK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz4ILD/btqCz5SQno3/QXY8PZZltVevRA424ES1aK/img.jpg&quot; data-alt=&quot;Thread&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz4ILD/btqCz5SQno3/QXY8PZZltVevRA424ES1aK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz4ILD%2FbtqCz5SQno3%2FQXY8PZZltVevRA424ES1aK%2Fimg.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Thread&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;스레드를 여러 개 사용하는 것을 멀티스레드라고 하는데, 이 멀티스레드에도 여러 개의 모델이 존재한다. 각각에 대해서 구체적으로 살펴보면 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: square;&quot; data-ke-list-type=&quot;square&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;커널 레벨 스레드&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;커널 레벨 스레드란 스레드의 존재를 커널이 알고 있는 경우이다. 따라서, 커널 스레드 간의 switching은 작은 context switch를 필요로 하게 되고, 커널이 스레드를 관리하고 스케줄링한다. 커널이 제공하는 보안 서비스를 받을 수 있지만 상대적으로 커널의 비중이 커지기 때문에 시스템의 성능이 떨어질 수 있다는 단점이 존재한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: square;&quot; data-ke-list-type=&quot;square&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;유저 레벨 스레드&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&amp;nbsp;유저 레벨 스레드란 운영체제가 스레드의 존재를 모르는 경우이다. 따라서 OS는 스레드를 직접 스케줄링하지 않게 된다. 프로그래머는 스레드 라이브러리를 통해 스레드를 관리할 수 있다. 따라서 context switch가 필요 없게 되고, 처리 속도가 빨라지게 된다. 그러나 OS는 유저 레벨 스레드의 존재를 알지 못하므로 좋지 않은 스케줄링 결정을 내리게 될 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>study/CS377 (2014)</category>
      <author>mimizzang</author>
      <guid isPermaLink="true">https://codingzzangmimi.tistory.com/81</guid>
      <comments>https://codingzzangmimi.tistory.com/81#entry81comment</comments>
      <pubDate>Wed, 11 Mar 2020 19:19:48 +0900</pubDate>
    </item>
    <item>
      <title>CS377: Scheduling Algorithms</title>
      <link>https://codingzzangmimi.tistory.com/80</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이번 시간에는 스케줄링에 대해서 공부해보도록 하겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;하나 이상의 프로세스를 동시에 운영하고자 할 때, CPU와 I/O에서는 &lt;u&gt;오버랩&lt;/u&gt;이 발생할 수 있다. 따라서, 모든 프로세스는 OS에 의해서 관리되어야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;커널은 &lt;u&gt;인터럽트가 발생할 때, 프로세스가 생성 또는 종료될 때, 프로세스가 실행에서 대기 상태로 돌아갈 때&lt;/u&gt; &lt;b&gt;스케줄러&lt;/b&gt;를 동작한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;이 때, &lt;b&gt;Non-preemtive System&lt;/b&gt;의 경우 스케줄러는 해당 이벤트가 종료될 때까지 기다렸다가 동작하게 되고,&lt;b&gt; Preemtive System&lt;/b&gt;의 경우 스케줄러가 실행중인 프로세스를 일시 정지하고 동작하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;스케줄링에는 다양한 알고리즘이 존재하고 이를 비교하기 위한 비교자는 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;CPU Utilization&lt;/b&gt; (CPU 사용률) : 시스템 동작 시간 중 CPU가 사용된 시간을 측정하는 방법&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Throughput (&lt;/b&gt;처리량) : 단위 시간 당 작업을 마친 프로세스의 수&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Turnaround time&lt;/b&gt; (반환 시간) : 프로세스가 생성된 후 종료되어 사용하던 자원을 모두 반환하는데 걸리는 시간&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Waiting time&lt;/b&gt; (대기 시간) : 프로세스가 CPU를 할당 받아 실행되기 전 대기 상태의 시간&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Response time&lt;/b&gt; (응답시간) : 대기 상태에 들어와 CPU를 최초로 얻기까지 걸리는 시간&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span&gt;이상적으로 CPU 스케줄러는 모든 조건이 최적인 경우가 가장 좋겠지만, 실제로는 가능하지 않다. 따라서 스케줄링 알고리즘은 스케줄링 정책에 부합하는 알고리즘으로 선택하도록 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;스케줄링 알고리즘의 종류는 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;FCFS&lt;/b&gt; (First Come, First Served): State Queue에 &lt;b&gt;먼저 도달한 프로세스에게 CPU를 할당&lt;/b&gt;하는 비선점형 방식이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Round Robin&lt;/b&gt; : 프로세스에게 각각 &lt;b&gt;동일한 time slice를 할당&lt;/b&gt;하여 이 시간 동안만 CPU를 이용하게 한다. 만약 할당 시간동안 처리를 다 하지 못하면 CPU는 다음 차례의 프로세스에게 넘어가게 된다. 이 알고리즘의 경우 모든 프로세스가 최초 응답 시간을 빠르게 보장받을 수 있다는 장점을 가진다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;SJF&lt;/b&gt; (Shortest Job First) : &lt;b&gt;실행 시간이 가장 짧은 작업&lt;/b&gt;부터 CPU를 할당한다. 앞 순서에 실행 시간이 긴 프로세스가 있다면 오래 기다려야 하는 문제를 완화했지만, 시간이 짧은 프로세스가 계속해서 들어온다면 State Queue에서 영영 기다리게 되는 Starvation 문제가 발생한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Multilevel Feedback Queue&lt;/b&gt; : Multilevel Queue의 경우 우선순위에 따라 여러 개의 Queue를 사용하는 방식으로 우선 순위가 높은 Queue에 먼저 CPU가 할당되는 방식이다. 각 Queue 내에서는 독립적인 알고리즘을 사용할 수 있다. 그러나 Multilevel Queue에서도 역시 공평성과 Starvation 문제가 발생하게 되는데 이를 해결한 것이 해당 알고리즘이다. 이와 같은 경우에는 한 번 &lt;b&gt;CPU를 할당받은 프로세스는 우선 순위가 낮아지게 되고&lt;/b&gt;, 우선 순위가 낮은 큐로 이동하게 된다. 또한 &lt;b&gt;우선 순위가 낮은 Queue에 time slice가 더 길게 주어지게 되는데&lt;/b&gt; 이는 공평성 문제를 해결하기 위함이다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;337&quot; height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqQWbv/btqCDkuPUJR/i9IkliivIBkDE1WkxrS3t1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqQWbv/btqCDkuPUJR/i9IkliivIBkDE1WkxrS3t1/img.png&quot; data-alt=&quot;Multilevel Feedback Queue&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqQWbv/btqCDkuPUJR/i9IkliivIBkDE1WkxrS3t1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbqQWbv%2FbtqCDkuPUJR%2Fi9IkliivIBkDE1WkxrS3t1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;337&quot; height=&quot;252&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Multilevel Feedback Queue&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>study/CS377 (2014)</category>
      <author>mimizzang</author>
      <guid isPermaLink="true">https://codingzzangmimi.tistory.com/80</guid>
      <comments>https://codingzzangmimi.tistory.com/80#entry80comment</comments>
      <pubDate>Wed, 11 Mar 2020 18:32:31 +0900</pubDate>
    </item>
    <item>
      <title>CS 377: Processes</title>
      <link>https://codingzzangmimi.tistory.com/79</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;지난 시간에 이어, 이번 시간에는 &lt;b&gt;프로세스&lt;/b&gt;에 대해 다뤄 볼 계획이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;OS는 &lt;u&gt;User의 프로그램, Command Script, System 프로그램&lt;/u&gt; 등 다양한 활동을 관리한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;각각의 활동은 프로세스 내부에 캡슐화되어 있고 &lt;span style=&quot;color: #333333;&quot;&gt;프로세스&lt;/span&gt;는 실행에 필요한 모든 정보와 execution context를 포함한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;프로세스&lt;/span&gt;는 프로그램이 아니다.&lt;/b&gt; &lt;span style=&quot;color: #333333;&quot;&gt;프로세스&lt;/span&gt;는 실행 중인 &lt;u&gt;프로그램의 한 인스턴스&lt;/u&gt;로 여러 &lt;span style=&quot;color: #333333;&quot;&gt;프로세스&lt;/span&gt;가 하나의 프로그램을 실행할 수 있으며, &lt;span style=&quot;color: #333333;&quot;&gt;프로세스&lt;/span&gt;는 독립적인 entitiy다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;OS&lt;/b&gt;와 &lt;b&gt;프로세스&lt;/b&gt;의 &lt;u&gt;관계&lt;/u&gt;는 어떻게 될까?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;OS는 프로세스를 생성/삭제하고, 중단/재개할 수 있다. 프로세스를 관리하고 스케줄링하며 프로세스 내부의 통신과 동기화에 관여하며 자원을 할당하는 것도 OS의 몫이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;프로세스를 한 마디로 정리하면 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;실행 중인 프로그램의 dynamic execution context&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;여러 개의 프로세스&lt;/b&gt;가 &lt;b&gt;동일한 프로그램&lt;/b&gt;을 실행할 수 있지만, 각각은 &lt;u&gt;개별적인 다른 프로세스&lt;/u&gt;이며 &lt;u&gt;개별적인 state&lt;/u&gt;를 가진다. 예를 들어 &lt;b&gt;Word&lt;/b&gt; 프로그램을 동작시킨다고 가정해보면, 여러 개의 문서를 작성할 수 있지만 각각이 다른 state를 가지는 것을 알 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;그렇다면 프로세스의 state에는 어떤 것들을 포함할 수 있는지 알아보자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;프로세스의 state에는 &lt;u&gt;최소한 다음과 같은 정보&lt;/u&gt;가 포함되어야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;실행 중인 프로그램의 코드&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;실행 중인 프로그램의 static data&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;동적 데이터를 위한 공간(heap)과 heap pointer&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;프로그램 카운터 (PC) (다음 instruction을 가르킴)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;프로그램의 call chain을 가진 execution stack과 stack pointer&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;CPU 레지스터 값&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;사용 중인 OS resource set&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;프로세스 execution state&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;다른 것들보다 &lt;u&gt;프로세스 execution state&lt;/u&gt;는 잘 와닿지 않을 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;프로세스는 다음과 같은 state를 가진다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cTODHY/btqCBytfBTD/hLMvh8eSdZVPY9LGAYWxp0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cTODHY/btqCBytfBTD/hLMvh8eSdZVPY9LGAYWxp0/img.jpg&quot; data-alt=&quot;process execution state&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cTODHY/btqCBytfBTD/hLMvh8eSdZVPY9LGAYWxp0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcTODHY%2FbtqCBytfBTD%2FhLMvh8eSdZVPY9LGAYWxp0%2Fimg.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;process execution state&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;각각의 state에 대한 자세한 설명은 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;new&lt;/b&gt; : OS가 프로세스의 state를 settting up한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;running&lt;/b&gt; : instruction을 실행한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;ready&lt;/b&gt; : 실행할 준비가 되었지만 CPU를 기다린다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;waiting&lt;/b&gt; : event가 완료될 때까지 기다린다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;terminated&lt;/b&gt; : 프로세스를 종료시킨다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;실행된 프로그램은 프로그램 action(system call 등), OS action(scheduling) 또는 external action(interrupt)의 결과로 state와 state 사이를 이동하게 된다. 또한 여러 프로세스를 제어할 때는 state queue를 활용하여 제어한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;또한 프로세서를 제어하기 위해서 사용되는 OS의 자료 구조를 Process Control Block이라고 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;PCB는 프로세스의 현재 execution state를 추적한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;OS는 프로세스가 생성될 때 PCB를 할당하고, 프로세스가 종료될 때 PCB를 해제한다. PCB에 반드시 포함되어야하는 데이터는 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;프로세스 state&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;프로세스 번호&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;PC&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Stack Pointer&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Memory Magagement Information&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;State queue의 Queue pointers&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;...&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;프로세스를 시작하고 종료하는 것을&lt;b&gt; Context Switch&lt;/b&gt;라고 한다. 즉 &lt;u&gt;새로운 프로세스를 시작하기 위해서 현재 진행 중인 상태를 저장하고, 새로운 프로세스를 적재하는 것을&lt;/u&gt; 말한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;OS는 PCB에서 하드웨어 레지스터를 로드하여 프로세스를 준비하고 시작한다. &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;프로세스가 진행될 때 CPU는 SP, PC, 레지스터 등을 변경하고, 프로세스가 종료될 때 현재 상태를 다시 해당 프로세스의 PCB에 저장한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이러한 프로세스의 switching이 바로 Context Switch이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;또한 프로세스는 새로운 프로세스가 동작하도록 만들 수도 있다. 이러한 관계를 Parents와 Child라고 한다. 또한 Parents는 Child 프로세스를 종료시킬 수 있고, 공유 메모리를 통해 통신이 가능하다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>study/CS377 (2014)</category>
      <author>mimizzang</author>
      <guid isPermaLink="true">https://codingzzangmimi.tistory.com/79</guid>
      <comments>https://codingzzangmimi.tistory.com/79#entry79comment</comments>
      <pubDate>Wed, 11 Mar 2020 13:39:45 +0900</pubDate>
    </item>
    <item>
      <title>CS377: Operating System Structures</title>
      <link>https://codingzzangmimi.tistory.com/78</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;오늘 다룰 내용은 특히 System Call에 대한 내용이다. 또한, OS의 Structure, component와 organization에 대해서 언급하도록 하겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;System Call이란 지난 시간에 언급했던 것 처럼, 다음과 같이 정의할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;OS에 의해 제공되는 서비스에 대한 요청에 따라 커널에 접근하기 위한 인터페이스&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;주로 C나 C++ 같은 고급 언어에 의해 사용되며, 직접적인 system call보다는 high-level API를 사용해서 접근하게 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;583&quot; height=&quot;355&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ujuj0/btqCFxmbk8u/GNl9fzbZC13dKl5f9Joiu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ujuj0/btqCFxmbk8u/GNl9fzbZC13dKl5f9Joiu1/img.png&quot; data-alt=&quot;System Call&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ujuj0/btqCFxmbk8u/GNl9fzbZC13dKl5f9Joiu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fujuj0%2FbtqCFxmbk8u%2FGNl9fzbZC13dKl5f9Joiu1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;583&quot; height=&quot;355&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;System Call&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;각각의 System call에는 주로 번호가 부여된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;사용자는 실제로 System Call이 어떻게 동작하는지에 대해 알 필요가 없다. 많은 OS의 detail이 숨겨져 있으며, 사용자는 어떤 값이 return되는지만 정확히 알면 된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;System Call이 parameter를 전달할 때는 총 세 가지 방법이 사용된다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;가장 단순한 방법으로 register를 통해 전달한다. 다수의 parameter가 필요하다면 register의 크기는 매우 작기 때문에, 이러한 방법은 유용하지 않다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;memory 내부의 block에 parameter를 저장하고, 이 block의 주소를 register를 통해 전달한다. 주로 Linux에서 사용되는 방식이다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Stack을 통해 전달한다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;다음으로, OS의 Structure에 대해 알아보자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;기본적인 OS Structure는 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; height=&quot;365&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/w3buT/btqCENv0D01/2ykSh0w73jNQcU6zoZwqd0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/w3buT/btqCENv0D01/2ykSh0w73jNQcU6zoZwqd0/img.jpg&quot; data-alt=&quot;OS Structure: UNIX&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/w3buT/btqCENv0D01/2ykSh0w73jNQcU6zoZwqd0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fw3buT%2FbtqCENv0D01%2F2ykSh0w73jNQcU6zoZwqd0%2Fimg.jpg&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;600&quot; height=&quot;365&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;OS Structure: UNIX&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;커널은 컴퓨터 하드웨어와 프로세스의 보안을 책임지는 부분이다. 커널이 주로 담당하는 기능은 프로세스 관리, 메모리 관리, 시스템 관리, 입출력 관리, 프로세스간 통신 관리 등이다. 커널의 기능은 복잡하게 얽혀있으므로, &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;커널이 기능적으로 어떻게 구성되어야 하느냐에 따라 종류가 다양하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;종류에 대해서 알아보기 전에 Layered OS design에 대해서 먼저 언급하겠다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Layered OS design에서 N번째 Layer는 N-1번째 Layer를 사용하게 되고, N+1번째 Layer에 새로운 기능을 제공한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;230&quot; height=&quot;354&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/L22Nd/btqCzBKQuZd/bsmlPaloPS6lampkQpsnDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/L22Nd/btqCzBKQuZd/bsmlPaloPS6lampkQpsnDk/img.png&quot; data-alt=&quot;Layered OS design&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/L22Nd/btqCzBKQuZd/bsmlPaloPS6lampkQpsnDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FL22Nd%2FbtqCzBKQuZd%2FbsmlPaloPS6lampkQpsnDk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;230&quot; height=&quot;354&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Layered OS design&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;해당 design의 장점과 단점은 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;장점 : 디자인하기 쉽고, 디버깅이 편리하다. 모듈성이 높고, 단순하며 이식성이 높다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;단점 : layer 차가 많이 나는 경우, communication이 어렵고 과도하게 데이터가 복사될 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;다시 돌아와서 커널의 종류에 대해 알아보자. 커널에 추가되는 feature의 양에 따라 다음과 같은 분류가 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;단일형 커널(monolithic kernel) : 초창기의 운영체제 구조로, 핵심 기능을 구현하는 모듈들이 별도의 구분 없이 하나로 구성되어 있다. 초기 Unix 운영체제, Linux&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;에서 사용되는 커널로, Application을 제외한 모든 기능들을 커널이 관리한다. 모듈 간의 통신 비용이 절감 된다는 장점이 있지만, 모든 모듈이 하나로 묶여 있기 때문에 버그를 처리하기 어렵고 각 기능이 서로 연결되어 상호 의존성이 높기 때문에 작은 결함 하나가 시스템 전체에 영향을 미칠 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;마이크로 커널(microkernel) : Scheduling, Memory 관리 등의 주요 기능만을 커널에 담아 가볍게 만든 기능이다. 기존의 시스템 기능은 유저 프로세스에 존재한다. 장점은 시스템이 견고하고, customization이 쉽다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이렇듯 OS 디자인에는 simplicity와 performance 사이에 tradeoff가 존재하고, 일반적으로는 simplicity에 집중하면 된다고 한다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>study/CS377 (2014)</category>
      <category>마이크로 커널</category>
      <category>모눌리식 커널</category>
      <category>시스템콜</category>
      <category>커널</category>
      <author>mimizzang</author>
      <guid isPermaLink="true">https://codingzzangmimi.tistory.com/78</guid>
      <comments>https://codingzzangmimi.tistory.com/78#entry78comment</comments>
      <pubDate>Wed, 11 Mar 2020 12:23:13 +0900</pubDate>
    </item>
    <item>
      <title>CS377: OS and Architecture</title>
      <link>https://codingzzangmimi.tistory.com/77</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;지난 시간&lt;/b&gt;, Introduction과 더불어 운영체제의 정의와 역사에 대해 알아보았다. 운영체제를 한마디로 정의한다면 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&quot;운영체제란 user와 architecture 사이의 interface다.&quot;&lt;br /&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;이번 시간&lt;/b&gt;에는 운영체제와 컴퓨터 구조에 대해서 살펴보자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;단순하게 나타낸 &lt;b&gt;컴퓨터 구조&lt;/b&gt;는 다음과 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxx2Vg/btqCz5LBW74/UbsH9xmp39jWNkuliWBfG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxx2Vg/btqCz5LBW74/UbsH9xmp39jWNkuliWBfG1/img.png&quot; data-alt=&quot;Computer Architecture&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxx2Vg/btqCz5LBW74/UbsH9xmp39jWNkuliWBfG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbxx2Vg%2FbtqCz5LBW74%2FUbsH9xmp39jWNkuliWBfG1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Computer Architecture&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;컴퓨터는 &lt;u&gt;CPU, Memory, I/O 장치, bus&lt;/u&gt;로 이루어져 있다. 각각에 대한 자세한 설명은 아래와 같다.&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;CPU&lt;/b&gt; : 실제로 &lt;i&gt;연산&lt;/i&gt;이 일어나는 &lt;i&gt;프로세서&lt;/i&gt; (최근에는 이 코어가 여러 개 있는 것이 대부분이다.)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;I/O device&lt;/b&gt; : terminal, disk, video board, printer, Network card와 같이 &lt;i&gt;입력&lt;/i&gt;과 &lt;i&gt;출력&lt;/i&gt;을 담당하는 장치&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;Memory&lt;/b&gt; : CPU가 사용하는 프로그램과 데이터가 담긴 &lt;b&gt;RAM&lt;/b&gt; (Random Access Memory; 임의의 영역에서 읽고 쓰기가 가능한 주기억 장치. 휘발성 메모리로 컴퓨터의 체감 속도를 좌우한다.)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;System bus&lt;/b&gt; : CPU, Memory, 주변기기들과 &lt;i&gt;통신&lt;/i&gt;하는 매체&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;또한, 최근의 운영 체제는 다음과 같은 기능성을 가진다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;Process&lt;/b&gt;와 &lt;b&gt;Thread&lt;/b&gt;에 의해서 manage된다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;Concurrency&lt;/b&gt; (동시성) : 동시에 다양한 업무를 수행할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;I/O device : &lt;u&gt;I/O device가 작동 중&lt;/u&gt;일 때, CPU의 작업 속도는 &lt;b&gt;느려진다&lt;/b&gt;.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Memory management : &lt;b&gt;OS&lt;/b&gt;는 메모리를 &lt;u&gt;위치&lt;/u&gt;시키고, 주기억 장치와 디스크 사이에서 &lt;u&gt;데이터를 이동&lt;/u&gt;시킨다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Distributed Systems &amp;amp; Networks : &lt;u&gt;분산된 하드웨어&lt;/u&gt;에서 &lt;b&gt;함께&lt;/b&gt; 업무를 처리할 수 있다.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;OS service에서 동기 부여된 &lt;b&gt;Architectural Feature&lt;/b&gt;는 다음과 같은데, 하나씩 자세하게 살펴보자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: square;&quot; data-ke-list-type=&quot;square&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;Protection&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;어떤 명령어들은 민감하기 때문에 &lt;b&gt;권한&lt;/b&gt;이 필요하다. 이 때 두 가지 모드가 존재하는데, 바로 &lt;b&gt;커널 모드&lt;/b&gt;와 &lt;b&gt;유저 모드&lt;/b&gt;이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;유저&lt;/b&gt;는 I/O를 직접 처리할 수 없다. / Memory 상태를 직접 조작할 수 없다. / interupt를 활성화하거나 비활성화 할 수 없다. / 기계를 중지시킬 수 없다. / 유저 모드와 커널 모드를 판별하는 mode bits를 설정할 수 없다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;i&gt;그러나 커널모드에서는?&lt;/i&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;u&gt;모두 가능하다&lt;/u&gt;. 위와 같이 보호된 명령어들이 커널모드에서는 모두 수행 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이 커널 모드와 유저 모드 사이에서 인터페이스 역할을 하는 것을 'System Call'이라고 부른다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Joy6k/btqCBx1Vo0m/M37jiRvh8FCpdqtxR2TzV0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Joy6k/btqCBx1Vo0m/M37jiRvh8FCpdqtxR2TzV0/img.png&quot; data-alt=&quot;System Call&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Joy6k/btqCBx1Vo0m/M37jiRvh8FCpdqtxR2TzV0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJoy6k%2FbtqCBx1Vo0m%2FM37jiRvh8FCpdqtxR2TzV0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;System Call&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;또한 메모리도 보호할 수 있어야 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;메모리 보호는 &lt;u&gt;컴퓨터 메모리의 사용을 제어하는 방법&lt;/u&gt;으로 실행하고 있는 프로세스가 자신에게 &lt;b&gt;할당되지 않은 영역의 메모리에 접근하는 것을 막음&lt;/b&gt;으로써 보호가 가능하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: square;&quot; data-ke-list-type=&quot;square&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Register&lt;/span&gt;&lt;/b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Register는 일반적으로 현재 계산 중인 값을 저장하는 데 사용된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;특히 Stack Pointer, Frame Pointer, Program Couter 등 특수 목적 Register의 경우, 프로그램의 상태를 저장한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Memory Hierarchy 상에서, Rigister는 최상위에 존재한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dlJeOm/btqCBwu6IZ6/IFr4RRZhvG8CxPTddPER7K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dlJeOm/btqCBwu6IZ6/IFr4RRZhvG8CxPTddPER7K/img.png&quot; data-alt=&quot;Memory Hierarchy&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dlJeOm/btqCBwu6IZ6/IFr4RRZhvG8CxPTddPER7K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdlJeOm%2FbtqCBwu6IZ6%2FIFr4RRZhvG8CxPTddPER7K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Memory Hierarchy&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: square;&quot; data-ke-list-type=&quot;square&quot;&gt;
&lt;li&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;Traps&lt;/b&gt; (a.k.a exception or fault)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Trap이란 &lt;b&gt;예외 상태&lt;/b&gt;(page fault, read-only memory에 write, overflow, system call etc.)에 의한 &lt;u&gt;비동기식 interrupt&lt;/u&gt;의 한 종류이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: square;&quot; data-ke-list-type=&quot;square&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;I/O Control&lt;/span&gt;&lt;/b&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;I/O Method에는 3가지 방식이 있다.&lt;/span&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Synchronous I/O&lt;/b&gt; : 데이터가 전송될 때까지 &lt;u&gt;기다려야&lt;/u&gt; 하는 방식&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Asynchronous I/O&lt;/b&gt; : 데이터의 전송을 마치기 전에, 프로세스가 &lt;u&gt;계속&lt;/u&gt;하도록 허가하는 방식&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span&gt;&lt;b&gt;Memory-mapped I/O&lt;/b&gt; : CPU가 입출력 장치에 접근할 때, 입출력과 메모리의 주소 공간을 분리하지 않고, &lt;u&gt;하나의 메모리 공간에 취급&lt;/u&gt;하여 배치하는 방식&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: square;&quot; data-ke-list-type=&quot;square&quot;&gt;
&lt;li&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Virtual Memory&lt;/span&gt;&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Virtual Memory는 &lt;u&gt;RAM을 관리하는 방법&lt;/u&gt; 중 하나로, 각 프로그램에 실제 메모리의 주소가 아닌 &lt;b&gt;가상의 메모리 주소를 할당하는 방식&lt;/b&gt;을 말한다. 가상 주소 공간은 MMU(Memory Management Unit)에 의해서 물리 주소로 변환된다. Virtual Memory를 통해 프로그래머는 프로그램이나 데이터가 주메모리에서 어떻게 동작하는지 의식할 필요가 사라졌다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;270&quot; height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c5F2hx/btqCBx8GFrj/k4X9G4Onk9mJN8aemfJikK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c5F2hx/btqCBx8GFrj/k4X9G4Onk9mJN8aemfJikK/img.png&quot; data-alt=&quot;Virtual Memory&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c5F2hx/btqCBx8GFrj/k4X9G4Onk9mJN8aemfJikK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc5F2hx%2FbtqCBx8GFrj%2Fk4X9G4Onk9mJN8aemfJikK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; width=&quot;270&quot; height=&quot;427&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;Virtual Memory&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>study/CS377 (2014)</category>
      <author>mimizzang</author>
      <guid isPermaLink="true">https://codingzzangmimi.tistory.com/77</guid>
      <comments>https://codingzzangmimi.tistory.com/77#entry77comment</comments>
      <pubDate>Tue, 10 Mar 2020 23:00:23 +0900</pubDate>
    </item>
    <item>
      <title>Ubuntu에서 darknet을 이용한 yolov3 custom object 학습하는 법</title>
      <link>https://codingzzangmimi.tistory.com/76</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;AlexeyAB/darknet&lt;/b&gt;을 사용하였습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;Custom object 학습하는 법 (&lt;a href=&quot;yolov3-tiny.ver)&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;yolov3-tiny.ver)&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;1. 우선 &lt;b&gt;cfg파일&lt;/b&gt;(&lt;span style=&quot;color: #333333;&quot;&gt;cfg/&lt;/span&gt;&lt;a href=&quot;yolov3-tiny_obj.cfg&quot;&gt;yolov3-tiny_obj.cfg&lt;/a&gt;)을 수정해줍니다. test 부분이 주석처리 되어있지 않다면 우선 test 부분을 주석처리 해줍니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;1-1.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;첫번째로&amp;nbsp;&lt;b&gt;train&amp;nbsp;부분&lt;/b&gt;을&amp;nbsp;수정합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;batch&amp;nbsp;=&amp;nbsp;64,&amp;nbsp;subdivision&amp;nbsp;=&amp;nbsp;16으로&amp;nbsp;변경합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;max_batches는&amp;nbsp;class의&amp;nbsp;갯수&amp;nbsp;*&amp;nbsp;2000으로&amp;nbsp;변경합니다.&amp;nbsp;저의&amp;nbsp;경우에는&amp;nbsp;class의&amp;nbsp;갯수가&amp;nbsp;2개였기&amp;nbsp;때문에,&amp;nbsp;4000으로&amp;nbsp;변경하였습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;steps는&amp;nbsp;max_batches의&amp;nbsp;80%와&amp;nbsp;90%로&amp;nbsp;변경합니다.&amp;nbsp;저는&amp;nbsp;3200,&amp;nbsp;3600으로&amp;nbsp;변경하였습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;network의&amp;nbsp;사이즈는&amp;nbsp;width&amp;nbsp;=&amp;nbsp;416,&amp;nbsp;height&amp;nbsp;=&amp;nbsp;416이&amp;nbsp;default이나,&amp;nbsp;32의&amp;nbsp;배수는&amp;nbsp;모두&amp;nbsp;가능합니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;1-2.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;다음으로&amp;nbsp;&lt;b&gt;yolo&amp;nbsp;layer&lt;/b&gt;를&amp;nbsp;변경해줍니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;classes를&amp;nbsp;본인이&amp;nbsp;원하는&amp;nbsp;class의&amp;nbsp;갯수로&amp;nbsp;변경합니다.&amp;nbsp;저는&amp;nbsp;2로&amp;nbsp;변경했습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;1-3.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;yolo&amp;nbsp;layer&amp;nbsp;바로&amp;nbsp;위의&amp;nbsp;&lt;b&gt;convolutional&amp;nbsp;layer&lt;/b&gt;에서&lt;b&gt;&amp;nbsp;filters&lt;/b&gt;를&amp;nbsp;변경해줍니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;초기값은&amp;nbsp;filters&amp;nbsp;=&amp;nbsp;255이지만,&amp;nbsp;filters&amp;nbsp;=&amp;nbsp;(classes+5)*3&amp;nbsp;으로&amp;nbsp;변경합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;정확한&amp;nbsp;공식은&amp;nbsp;(classes+1+coords)*mask입니다.&amp;nbsp;만약&amp;nbsp;v2&amp;nbsp;버전을&amp;nbsp;사용하시게&amp;nbsp;되면&amp;nbsp;mask가&amp;nbsp;없는데&amp;nbsp;이때는&amp;nbsp;mask&amp;nbsp;대신&amp;nbsp;num을&amp;nbsp;사용해주시면&amp;nbsp;됩니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;class가&amp;nbsp;2이므로&amp;nbsp;21로&amp;nbsp;바꿔주었습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;2.&amp;nbsp;&lt;b&gt;&lt;a href=&quot;obj.names&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;obj.names&lt;/a&gt;&amp;nbsp;파일&lt;/b&gt;을&amp;nbsp;생성해줍니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;directory는&amp;nbsp;항상&amp;nbsp;&lt;a href=&quot;darknet.exe를&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;darknet.exe를&lt;/a&gt;&amp;nbsp;기준으로&amp;nbsp;생각하면&amp;nbsp;됩니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;저는&amp;nbsp;이미지를&amp;nbsp;data/obj&amp;nbsp;폴더&amp;nbsp;안에&amp;nbsp;넣을&amp;nbsp;것이므로,&amp;nbsp;data/&amp;nbsp;안에&amp;nbsp;&lt;a href=&quot;obj.names를&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;obj.names를&lt;/a&gt;&amp;nbsp;만들었습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;내용은&amp;nbsp;다음과&amp;nbsp;같습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;class name 1&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;class name 2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;annotation&amp;nbsp;tool을&amp;nbsp;사용해서&amp;nbsp;class에&amp;nbsp;해당하는&amp;nbsp;번호를&amp;nbsp;부여했을&amp;nbsp;때,&amp;nbsp;해당&amp;nbsp;클래스의&amp;nbsp;이름을&amp;nbsp;지정해주는&amp;nbsp;파일입니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;3.&amp;nbsp;&lt;b&gt;&lt;a href=&quot;obj.data&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;obj.data&lt;/a&gt;&amp;nbsp;파일&lt;/b&gt;을&amp;nbsp;생성해줍니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;해당&amp;nbsp;파일&amp;nbsp;또한&amp;nbsp;data/&amp;nbsp;안에&amp;nbsp;&lt;a href=&quot;obj.data를&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;obj.data를&lt;/a&gt;&amp;nbsp;만들었습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;내용은&amp;nbsp;다음과&amp;nbsp;같습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;classes=&amp;nbsp;2&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;train&amp;nbsp;&amp;nbsp;=&amp;nbsp;data/&lt;a href=&quot;train.txt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;train.txt&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;valid&amp;nbsp;&amp;nbsp;=&amp;nbsp;data/&lt;a href=&quot;test.txt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;test.txt&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;names&amp;nbsp;=&amp;nbsp;data/&lt;a href=&quot;obj.names&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;obj.names&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;backup&amp;nbsp;=&amp;nbsp;backup/&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이&amp;nbsp;때,&amp;nbsp;저는&amp;nbsp;validation&amp;nbsp;set을&amp;nbsp;사용해서&amp;nbsp;mAP를&amp;nbsp;계산할&amp;nbsp;예정이므로,&amp;nbsp;따로&amp;nbsp;validation의&amp;nbsp;경로를&amp;nbsp;추가하였으나,&amp;nbsp;필요하지&amp;nbsp;않다면&amp;nbsp;valid&amp;nbsp;부분은&amp;nbsp;사용하지&amp;nbsp;않아도&amp;nbsp;무방합니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;4.&amp;nbsp;train에&amp;nbsp;사용할&amp;nbsp;&lt;b&gt;이미지&amp;nbsp;파일&lt;/b&gt;을&amp;nbsp;넣어줍니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;저의&amp;nbsp;경우에는&amp;nbsp;data/obj&amp;nbsp;안에&amp;nbsp;넣어주었고,&amp;nbsp;이미지와&amp;nbsp;annotation&amp;nbsp;tool을&amp;nbsp;통해&amp;nbsp;생성한&amp;nbsp;txt&amp;nbsp;파일이&amp;nbsp;함께&amp;nbsp;들어가야&amp;nbsp;합니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;4-1&amp;nbsp;이미지를&amp;nbsp;labeling&amp;nbsp;하는&amp;nbsp;방법은&amp;nbsp;다음과&amp;nbsp;같습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;a href=&quot;https://github.com/AlexeyAB/Yolo_mark&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://github.com/AlexeyAB/Yolo_mark&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;해당&amp;nbsp;주소를&amp;nbsp;clone합니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이&amp;nbsp;후,&amp;nbsp;원하는&amp;nbsp;경로에&amp;nbsp;이미지를&amp;nbsp;넣고&amp;nbsp;실행&amp;nbsp;파일&amp;nbsp;내의&amp;nbsp;이미지&amp;nbsp;경로를&amp;nbsp;변경해줍니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;저의&amp;nbsp;경우&amp;nbsp;ubuntu를&amp;nbsp;사용하였기&amp;nbsp;때문에&amp;nbsp;&lt;a href=&quot;linux_mark.sh&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;linux_mark.sh&lt;/a&gt;&amp;nbsp;파일에서&amp;nbsp;이미지의&amp;nbsp;경로를&amp;nbsp;변경해주었고,&amp;nbsp;이미지는&amp;nbsp;data/obj&amp;nbsp;에&amp;nbsp;넣을&amp;nbsp;것이었으므로&amp;nbsp;Yolo_mark&amp;nbsp;폴더&amp;nbsp;내부에&amp;nbsp;data/obj&amp;nbsp;폴더를&amp;nbsp;생성하여&amp;nbsp;그&amp;nbsp;안에&amp;nbsp;넣어주었습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이후&amp;nbsp;bash&amp;nbsp;&lt;a href=&quot;linux_mark.sh&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;linux_mark.sh&lt;/a&gt;&amp;nbsp;명령어를&amp;nbsp;터미널&amp;nbsp;창에서&amp;nbsp;실행하면&amp;nbsp;자동으로&amp;nbsp;&lt;a href=&quot;train.txt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;train.txt&lt;/a&gt;&amp;nbsp;파일이&amp;nbsp;생성됩니다.&amp;nbsp;해당&amp;nbsp;파일을&amp;nbsp;darknet&amp;nbsp;폴더&amp;nbsp;안의&amp;nbsp;data/&amp;nbsp;안에&amp;nbsp;넣어줍니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;5.&amp;nbsp;&lt;b&gt;pretrained&amp;nbsp;모델&lt;/b&gt;을&amp;nbsp;다운로드&amp;nbsp;받아줍니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;저의 경우에는 미리 학습된 데이터를 fine tuning하는 방식을 사용하기 위해서&amp;nbsp; &lt;a href=&quot;yolov3-tiny.conv.11&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;yolov3-tiny.conv.11&lt;/a&gt;&amp;nbsp;파일을&amp;nbsp;다운로드&amp;nbsp;받았습니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;경로는&amp;nbsp;다음과&amp;nbsp;같습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;a href=&quot;https://drive.google.com/file/d/18v36esoXCh-PsOKwyP2GWrpYDptDY8Zf/view?usp=sharing&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;https://drive.google.com/file/d/18v36esoXCh-PsOKwyP2GWrpYDptDY8Zf/view?usp=sharing&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;6.&amp;nbsp;&lt;b&gt;training&lt;/b&gt;을&amp;nbsp;시작합니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;우분투에서의&amp;nbsp;명령어는&amp;nbsp;다음과&amp;nbsp;같습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;./darknet&amp;nbsp;detector&amp;nbsp;train&amp;nbsp;data/&lt;a href=&quot;obj.data&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;obj.data&lt;/a&gt;&amp;nbsp;cfg/&lt;a href=&quot;yolov3-tiny_obj.cfg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;yolov3-tiny_obj.cfg&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;yolov3-tiny.conv.11&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;yolov3-tiny.conv.11&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이&amp;nbsp;때,&amp;nbsp;&lt;u&gt;mAP&lt;/u&gt;를&amp;nbsp;계산하고&amp;nbsp;싶다면&amp;nbsp;명령어는&amp;nbsp;다음과&amp;nbsp;같습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;./darknet&amp;nbsp;detector&amp;nbsp;train&amp;nbsp;data/&lt;a href=&quot;obj.data&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;obj.data&lt;/a&gt;&amp;nbsp;cfg/&lt;a href=&quot;yolov3-tiny_obj.cfg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;yolov3-tiny_obj.cfg&lt;/a&gt;&amp;nbsp;&lt;a href=&quot;yolov3-tiny.conv.11&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;yolov3-tiny.conv.11&lt;/a&gt;&amp;nbsp;-map&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;darknet&amp;nbsp;실행&amp;nbsp;파일의&amp;nbsp;경로에&amp;nbsp;backup/&amp;nbsp;폴더가&amp;nbsp;있어야&amp;nbsp;weight가&amp;nbsp;저장됩니다.&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;weight는&amp;nbsp;100&amp;nbsp;iteration&amp;nbsp;마다&amp;nbsp;yolov3-tiny_obj_last.weights&amp;nbsp;파일&amp;nbsp;저장이&amp;nbsp;되고,&amp;nbsp;1000&amp;nbsp;iteration이&amp;nbsp;되면&amp;nbsp;yolov3-tiny_obj_X000.weights&amp;nbsp;파일이&amp;nbsp;저장되게&amp;nbsp;됩니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;7.&amp;nbsp;이&amp;nbsp;후&amp;nbsp;해당&amp;nbsp;weight로&amp;nbsp;&lt;b&gt;test&lt;/b&gt;를&amp;nbsp;하는&amp;nbsp;경우,&amp;nbsp;명령어는&amp;nbsp;다음과&amp;nbsp;같습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;./darknet&amp;nbsp;detector&amp;nbsp;test&amp;nbsp;data/&lt;a href=&quot;obj.data&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;obj.data&lt;/a&gt;&amp;nbsp;cfg/&lt;a href=&quot;yolov3-tiny_obj.cfg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;yolov3-tiny_obj.cfg&lt;/a&gt;&amp;nbsp;yolov3-tiny_obj_4000.weights&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;또는&amp;nbsp;영상을&amp;nbsp;test&amp;nbsp;하시고&amp;nbsp;싶은&amp;nbsp;경우,&amp;nbsp;다음&amp;nbsp;명령어로&amp;nbsp;가능합니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;./darknet&amp;nbsp;detector&amp;nbsp;demo&amp;nbsp;data/&lt;a href=&quot;obj.data&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;obj.data&lt;/a&gt;&amp;nbsp;cfg/&lt;a href=&quot;yolov3-tiny_obj.cfg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;yolov3-tiny_obj.cfg&lt;/a&gt;&amp;nbsp;yolov3-tiny_obj_4000.weights&amp;nbsp;-ext_output&amp;nbsp;test.mp4&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;웹캠 버전은 다음과 같습니다.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;./darknet&amp;nbsp;detector&amp;nbsp;demo&amp;nbsp;data/&lt;a href=&quot;obj.data&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;obj.data&lt;/a&gt;&amp;nbsp;cfg/&lt;a href=&quot;yolov3-tiny_obj.cfg&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;yolov3-tiny_obj.cfg&lt;/a&gt;&amp;nbsp;yolov3-tiny_obj_4000.weights&amp;nbsp;-c&amp;nbsp;0&lt;/span&gt;&lt;/p&gt;</description>
      <category>/DeepLearning</category>
      <category>alexeyAB</category>
      <category>Darknet</category>
      <category>YOLOv3</category>
      <author>mimizzang</author>
      <guid isPermaLink="true">https://codingzzangmimi.tistory.com/76</guid>
      <comments>https://codingzzangmimi.tistory.com/76#entry76comment</comments>
      <pubDate>Thu, 27 Feb 2020 17:05:16 +0900</pubDate>
    </item>
    <item>
      <title>[Blockchain] #3. Typescript를 위한 첫번째 스텝!</title>
      <link>https://codingzzangmimi.tistory.com/75</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;블로그에 기록을 제때제때해야하는데...)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;아무튼, 타입스크립트는 앞에서 말한 것처럼 타입을 language에게 알려줘야하는 언어다. 예를 들어 함수를 하나 만들어도 return할 타입을 알려주거나 해야한다. 물론 평범한 자바스크립트 언어로 작성해도 잘 돌아가긴 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;예를 들어서 &lt;span style=&quot;color: #333333;&quot;&gt;다음과 같이 선언했다고 가정하자.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bvnSzj/btqCioKKboD/ci9oMTcJIHKOvymCJ4ZmjK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bvnSzj/btqCioKKboD/ci9oMTcJIHKOvymCJ4ZmjK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bvnSzj/btqCioKKboD/ci9oMTcJIHKOvymCJ4ZmjK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbvnSzj%2FbtqCioKKboD%2Fci9oMTcJIHKOvymCJ4ZmjK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span&gt;(이 때, 선언할 때는 무조건 마지막 줄을 적어줘야한다. 타입스크립트의 문법 중 하나로, 이 파일이 하나의 모듈이 된다는 것을 알린다.)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;평범한 자바스크립트 언어로 함수를 하나 만들어 보자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dEMcRF/btqCjdPJpqL/c9G6Kbbwh1aYlKNGT8M5qk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dEMcRF/btqCjdPJpqL/c9G6Kbbwh1aYlKNGT8M5qk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dEMcRF/btqCjdPJpqL/c9G6Kbbwh1aYlKNGT8M5qk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdEMcRF%2FbtqCjdPJpqL%2Fc9G6Kbbwh1aYlKNGT8M5qk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;여전히 잘 동작함.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lSq9o/btqCjeA5SEw/L6XoWtzStjtjIlOor98Hak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lSq9o/btqCjeA5SEw/L6XoWtzStjtjIlOor98Hak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lSq9o/btqCjeA5SEw/L6XoWtzStjtjIlOor98Hak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlSq9o%2FbtqCjeA5SEw%2FL6XoWtzStjtjIlOor98Hak%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;근데, 만약 함수에서 세 개의 argument가 아니라 두 개의 argument를 전달한다거나 하는 실수가 발생한다면 자바스크립트에서는 빨간 줄이 뜨지 않았지만 타입스크립트에서는 이걸 알려준다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;또 한 가지! 만약 이렇게 바꾼다면?&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EWbSo/btqCgnsguTG/dMCslkrzLrVpkqTOP6mDn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EWbSo/btqCgnsguTG/dMCslkrzLrVpkqTOP6mDn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EWbSo/btqCgnsguTG/dMCslkrzLrVpkqTOP6mDn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEWbSo%2FbtqCgnsguTG%2FdMCslkrzLrVpkqTOP6mDn0%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이렇게 출력된다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/clUJHN/btqCjRTci3V/Mv5Yd9ZH3OkWEKyHshWs8K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/clUJHN/btqCjRTci3V/Mv5Yd9ZH3OkWEKyHshWs8K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/clUJHN/btqCjRTci3V/Mv5Yd9ZH3OkWEKyHshWs8K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FclUJHN%2FbtqCjRTci3V%2FMv5Yd9ZH3OkWEKyHshWs8K%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;타입스크립트의 강력한 기능 중 하나가 바로 이거다. 함수를 보자마자 &lt;u&gt;어떤 argument가 반드시 필요하고, 또 반드시 필요하지 않은지 알 수 있다&lt;/u&gt;!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;C나 C++에 익숙한 사람들이라면 아마 타입스크립트를 배우는데 크게 어려움이 없을거라는 생각이 들었다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;강의링크:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PL7jH19IHhOLNM5mePXxbpnPefi6PiiNCX&quot;&gt;https://www.youtube.com/playlist?list=PL7jH19IHhOLNM5mePXxbpnPefi6PiiNCX&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1582716691561&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Build a blockchain with Typescript - YouTube&quot; data-og-description=&quot;https://academy.nomadcoders.co/p/build-a-blockchain-with-typescript&quot; data-og-host=&quot;www.youtube.com&quot; data-og-source-url=&quot;https://www.youtube.com/playlist?list=PL7jH19IHhOLNM5mePXxbpnPefi6PiiNCX&quot; data-og-url=&quot;http://www.youtube.com/playlist?list=PL7jH19IHhOLNM5mePXxbpnPefi6PiiNCX&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jzs0F/hyE5ddCgNj/5h9Apr1z6Hol6ECef5lhBk/img.jpg?width=168&amp;amp;height=94&amp;amp;face=0_0_168_94,https://scrap.kakaocdn.net/dn/OtVEk/hyE5c6RimC/LMD81vNcL5e7aswXdEbHu1/img.jpg?width=196&amp;amp;height=110&amp;amp;face=0_0_196_110,https://scrap.kakaocdn.net/dn/mQm3E/hyE5gg6G5i/CehdrJdoHbzvXHLgBUMLQk/img.jpg?width=246&amp;amp;height=138&amp;amp;face=0_0_246_138,https://scrap.kakaocdn.net/dn/baRGf0/hyE3072Q4n/Q5Wc1ZUNwidfshvr5CB2ek/img.jpg?width=336&amp;amp;height=188&amp;amp;face=0_0_336_188&quot;&gt;&lt;a href=&quot;http://www.youtube.com/playlist?list=PL7jH19IHhOLNM5mePXxbpnPefi6PiiNCX&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.youtube.com/playlist?list=PL7jH19IHhOLNM5mePXxbpnPefi6PiiNCX&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jzs0F/hyE5ddCgNj/5h9Apr1z6Hol6ECef5lhBk/img.jpg?width=168&amp;amp;height=94&amp;amp;face=0_0_168_94,https://scrap.kakaocdn.net/dn/OtVEk/hyE5c6RimC/LMD81vNcL5e7aswXdEbHu1/img.jpg?width=196&amp;amp;height=110&amp;amp;face=0_0_196_110,https://scrap.kakaocdn.net/dn/mQm3E/hyE5gg6G5i/CehdrJdoHbzvXHLgBUMLQk/img.jpg?width=246&amp;amp;height=138&amp;amp;face=0_0_246_138,https://scrap.kakaocdn.net/dn/baRGf0/hyE3072Q4n/Q5Wc1ZUNwidfshvr5CB2ek/img.jpg?width=336&amp;amp;height=188&amp;amp;face=0_0_336_188');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Build a blockchain with Typescript - YouTube&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;https://academy.nomadcoders.co/p/build-a-blockchain-with-typescript&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.youtube.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>study/Typescript</category>
      <author>mimizzang</author>
      <guid isPermaLink="true">https://codingzzangmimi.tistory.com/75</guid>
      <comments>https://codingzzangmimi.tistory.com/75#entry75comment</comments>
      <pubDate>Wed, 26 Feb 2020 20:31:35 +0900</pubDate>
    </item>
    <item>
      <title>[Blockchain] #2. Typescript 세팅하기</title>
      <link>https://codingzzangmimi.tistory.com/74</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;타입스크립트를 추가해보자! 프로젝트를 열고, 터미널 창에 다음과 같은 명령어를 입력한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;yarn global add typescript&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;그럼 해당 경로에 tsconfig.json 파일이 생성되는 것을 확인할 수 있다. 내부에 다음과 같이 입력해주자.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yfWkE/btqCioKJZSK/u7fiUNVup0swbnyUrGnkz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yfWkE/btqCioKJZSK/u7fiUNVup0swbnyUrGnkz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yfWkE/btqCioKJZSK/u7fiUNVup0swbnyUrGnkz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyfWkE%2FbtqCioKJZSK%2Fu7fiUNVup0swbnyUrGnkz1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;index.ts 파일을 하나 만든다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgAeeW/btqCjffI8fE/w3tl1IfkfQ0kQR6akrNDfk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgAeeW/btqCjffI8fE/w3tl1IfkfQ0kQR6akrNDfk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgAeeW/btqCjffI8fE/w3tl1IfkfQ0kQR6akrNDfk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgAeeW%2FbtqCjffI8fE%2Fw3tl1IfkfQ0kQR6akrNDfk%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;터미널에서 tsc를 입력하고 node index.js를 실행하면 hello가 출력되는 것을 볼 수 있을 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이 때, 터미널에서 입력하는 tsc는 java에서 javac를 입력하는 것과 같은 기능을 수행한다. 즉 ts 파일에 있는 코드를 컴파일해서 index.js와 index.js.map을 만들어 주는 것 이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;만약 tsc가 아니라 yarn start를 입력했을 때, package.json에 다음과 같이 추가한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/tyz7j/btqChGdNDq7/cdATeK709EpGjkeiMN3vAK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/tyz7j/btqChGdNDq7/cdATeK709EpGjkeiMN3vAK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/tyz7j/btqChGdNDq7/cdATeK709EpGjkeiMN3vAK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ftyz7j%2FbtqChGdNDq7%2FcdATeK709EpGjkeiMN3vAK%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;그러면, index.js를 만들고 곧바로 node index.js를 실행하는 것을 볼 수 있을 것이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qVOf4/btqClxfD4Es/V3XOzc9pdpDtAkeiqg5Gz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qVOf4/btqClxfD4Es/V3XOzc9pdpDtAkeiqg5Gz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qVOf4/btqClxfD4Es/V3XOzc9pdpDtAkeiqg5Gz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqVOf4%2FbtqClxfD4Es%2FV3XOzc9pdpDtAkeiqg5Gz1%2Fimg.png&quot; data-origin-width=&quot;0&quot; data-origin-height=&quot;0&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;node js는 타입스크립트를 이해하지 못하기 때문에, 일반적으로 자바스크립트로 컴파일 하는 작업이 필요하다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;강의링크:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PL7jH19IHhOLNM5mePXxbpnPefi6PiiNCX&quot;&gt;https://www.youtube.com/playlist?list=PL7jH19IHhOLNM5mePXxbpnPefi6PiiNCX&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1582715909935&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Build a blockchain with Typescript - YouTube&quot; data-og-description=&quot;https://academy.nomadcoders.co/p/build-a-blockchain-with-typescript&quot; data-og-host=&quot;www.youtube.com&quot; data-og-source-url=&quot;https://www.youtube.com/playlist?list=PL7jH19IHhOLNM5mePXxbpnPefi6PiiNCX&quot; data-og-url=&quot;http://www.youtube.com/playlist?list=PL7jH19IHhOLNM5mePXxbpnPefi6PiiNCX&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jzs0F/hyE5ddCgNj/5h9Apr1z6Hol6ECef5lhBk/img.jpg?width=168&amp;amp;height=94&amp;amp;face=0_0_168_94,https://scrap.kakaocdn.net/dn/OtVEk/hyE5c6RimC/LMD81vNcL5e7aswXdEbHu1/img.jpg?width=196&amp;amp;height=110&amp;amp;face=0_0_196_110,https://scrap.kakaocdn.net/dn/mQm3E/hyE5gg6G5i/CehdrJdoHbzvXHLgBUMLQk/img.jpg?width=246&amp;amp;height=138&amp;amp;face=0_0_246_138,https://scrap.kakaocdn.net/dn/baRGf0/hyE3072Q4n/Q5Wc1ZUNwidfshvr5CB2ek/img.jpg?width=336&amp;amp;height=188&amp;amp;face=0_0_336_188&quot;&gt;&lt;a href=&quot;http://www.youtube.com/playlist?list=PL7jH19IHhOLNM5mePXxbpnPefi6PiiNCX&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.youtube.com/playlist?list=PL7jH19IHhOLNM5mePXxbpnPefi6PiiNCX&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jzs0F/hyE5ddCgNj/5h9Apr1z6Hol6ECef5lhBk/img.jpg?width=168&amp;amp;height=94&amp;amp;face=0_0_168_94,https://scrap.kakaocdn.net/dn/OtVEk/hyE5c6RimC/LMD81vNcL5e7aswXdEbHu1/img.jpg?width=196&amp;amp;height=110&amp;amp;face=0_0_196_110,https://scrap.kakaocdn.net/dn/mQm3E/hyE5gg6G5i/CehdrJdoHbzvXHLgBUMLQk/img.jpg?width=246&amp;amp;height=138&amp;amp;face=0_0_246_138,https://scrap.kakaocdn.net/dn/baRGf0/hyE3072Q4n/Q5Wc1ZUNwidfshvr5CB2ek/img.jpg?width=336&amp;amp;height=188&amp;amp;face=0_0_336_188');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Build a blockchain with Typescript - YouTube&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;https://academy.nomadcoders.co/p/build-a-blockchain-with-typescript&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.youtube.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>study/Typescript</category>
      <category>노마드코더</category>
      <category>블록체인</category>
      <category>타입스크립트</category>
      <author>mimizzang</author>
      <guid isPermaLink="true">https://codingzzangmimi.tistory.com/74</guid>
      <comments>https://codingzzangmimi.tistory.com/74#entry74comment</comments>
      <pubDate>Wed, 26 Feb 2020 20:18:51 +0900</pubDate>
    </item>
    <item>
      <title>[Blockchain] #1. 무엇을 만들 것인가?</title>
      <link>https://codingzzangmimi.tistory.com/73</link>
      <description>&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;평소 노마드코더의 강의를 즐겨보는데 블록체인을 타입스크립트로 만드는 강의가 재미있어 보여서 따라하면서 포스팅 할 예정!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;항상 볼 때 마다 느끼는 거지만 어려운 개념을 쉽게 설명해주는 것 같아서 완전 재밌게 배울 수 있는거 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;우선 &lt;b&gt;타입스크립트&lt;/b&gt;란 ? (출처: 위키백과)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;b&gt;타입스크립트&lt;/b&gt;(TypeScript)는 &lt;u&gt;자바스크립트의 슈퍼셋&lt;/u&gt;인&amp;nbsp;오픈소스&amp;nbsp;프로그래밍 언어이다.&amp;nbsp;마이크로소프트에서 개발, 유지하고 있으며 &lt;u&gt;엄격한 문법&lt;/u&gt;을 지원한다.&amp;nbsp;C#의 리드 아키텍트이자&amp;nbsp;델파이, 터보 파스칼의 창시자인 Anders Hejlsberg가 개발에 참여한다. 클라이언트 사이드와&amp;nbsp;서버 사이드를 위한 개발에 사용할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;타입스크립트는 &lt;b&gt;자바스크립트 엔진을 사용하면서 커다란 애플리케이션을 개발할 수 있게 설계된 언어&lt;/b&gt;이다.&amp;nbsp;자바스크립트의 슈퍼셋이기 때문에 자바스크립트로 작성된 프로그램이 타입스크립트 프로그램으로도 동작한다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;타입스크립트에서 자신이 원하는 타입을 정의하고&amp;nbsp;프로그래밍을 하면&amp;nbsp;&lt;b&gt;자바스크립트로 컴파일&lt;/b&gt;되어 실행할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;따라서, 자바스크립트가 가지고 있지 않은 '규칙'들을 가지고 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;자바스크립트의 경우 높은 자유도를 가지고 있지만, 큰 프로젝트나 팀으로 일할 때, 버그를 최소화하고 싶을 때 이러한 장점들은 장점이 된다. &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;타입스크립트의 경우 타입을 지정할 수 있고, 언어가 예측 가능하기 때문에 이런 자바스크립트의 단점을 보완한 언어라고 할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이 &lt;u&gt;타입스크립트의 예시&lt;/u&gt;와 이걸 가지고 &lt;u&gt;블록체인&lt;/u&gt;을 만들어 보는게 해당 강의의 주 목적이다.&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;우선 초기화부터 시작하자!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;사용한 IDE는 VS Code이다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;프로젝트 하나를 생성해서 git repository에 연동하고, 터미널 창에 다음과 같은 명령어를 입력하면, 프로젝트 경로에 package.json이 생성된다. &lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;(yarn은 npm과 유사한 패키지 매니저, npm보다 빠르고 보안성이 좋아서 yarn을 사용하였다.)&lt;/span&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;yarn init&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;그리고 추가로 node.js까지 설치해주면 준비 끝!&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;이제 본격적으로 타입스크립트에 대해서 배워본다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;강의링크:&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;font-family: 'Noto Sans Light';&quot;&gt;&lt;a href=&quot;https://www.youtube.com/playlist?list=PL7jH19IHhOLNM5mePXxbpnPefi6PiiNCX&quot;&gt;https://www.youtube.com/playlist?list=PL7jH19IHhOLNM5mePXxbpnPefi6PiiNCX&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1582715339781&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-og-type=&quot;website&quot; data-og-title=&quot;Build a blockchain with Typescript - YouTube&quot; data-og-description=&quot;https://academy.nomadcoders.co/p/build-a-blockchain-with-typescript&quot; data-og-host=&quot;www.youtube.com&quot; data-og-source-url=&quot;https://www.youtube.com/playlist?list=PL7jH19IHhOLNM5mePXxbpnPefi6PiiNCX&quot; data-og-url=&quot;http://www.youtube.com/playlist?list=PL7jH19IHhOLNM5mePXxbpnPefi6PiiNCX&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/jzs0F/hyE5ddCgNj/5h9Apr1z6Hol6ECef5lhBk/img.jpg?width=168&amp;amp;height=94&amp;amp;face=0_0_168_94,https://scrap.kakaocdn.net/dn/OtVEk/hyE5c6RimC/LMD81vNcL5e7aswXdEbHu1/img.jpg?width=196&amp;amp;height=110&amp;amp;face=0_0_196_110,https://scrap.kakaocdn.net/dn/mQm3E/hyE5gg6G5i/CehdrJdoHbzvXHLgBUMLQk/img.jpg?width=246&amp;amp;height=138&amp;amp;face=0_0_246_138,https://scrap.kakaocdn.net/dn/baRGf0/hyE3072Q4n/Q5Wc1ZUNwidfshvr5CB2ek/img.jpg?width=336&amp;amp;height=188&amp;amp;face=0_0_336_188&quot;&gt;&lt;a href=&quot;http://www.youtube.com/playlist?list=PL7jH19IHhOLNM5mePXxbpnPefi6PiiNCX&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.youtube.com/playlist?list=PL7jH19IHhOLNM5mePXxbpnPefi6PiiNCX&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/jzs0F/hyE5ddCgNj/5h9Apr1z6Hol6ECef5lhBk/img.jpg?width=168&amp;amp;height=94&amp;amp;face=0_0_168_94,https://scrap.kakaocdn.net/dn/OtVEk/hyE5c6RimC/LMD81vNcL5e7aswXdEbHu1/img.jpg?width=196&amp;amp;height=110&amp;amp;face=0_0_196_110,https://scrap.kakaocdn.net/dn/mQm3E/hyE5gg6G5i/CehdrJdoHbzvXHLgBUMLQk/img.jpg?width=246&amp;amp;height=138&amp;amp;face=0_0_246_138,https://scrap.kakaocdn.net/dn/baRGf0/hyE3072Q4n/Q5Wc1ZUNwidfshvr5CB2ek/img.jpg?width=336&amp;amp;height=188&amp;amp;face=0_0_336_188');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot;&gt;Build a blockchain with Typescript - YouTube&lt;/p&gt;
&lt;p class=&quot;og-desc&quot;&gt;https://academy.nomadcoders.co/p/build-a-blockchain-with-typescript&lt;/p&gt;
&lt;p class=&quot;og-host&quot;&gt;www.youtube.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>study/Typescript</category>
      <category>노마드코더</category>
      <category>블록체인</category>
      <category>타입스크립트</category>
      <author>mimizzang</author>
      <guid isPermaLink="true">https://codingzzangmimi.tistory.com/73</guid>
      <comments>https://codingzzangmimi.tistory.com/73#entry73comment</comments>
      <pubDate>Wed, 26 Feb 2020 20:09:17 +0900</pubDate>
    </item>
    <item>
      <title>CS 50: Data Structures</title>
      <link>https://codingzzangmimi.tistory.com/72</link>
      <description>&lt;figure class=&quot;imageblock alignCenter&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/cwOgwE/btqCgSyIZuU/aHrYUuKcAsL2mYqIKT8Sk1/img.jpg&quot; data-origin-width=&quot;2182&quot; data-origin-height=&quot;3087&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cwOgwE/btqCgSyIZuU/aHrYUuKcAsL2mYqIKT8Sk1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cwOgwE/btqCgSyIZuU/aHrYUuKcAsL2mYqIKT8Sk1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cwOgwE/btqCgSyIZuU/aHrYUuKcAsL2mYqIKT8Sk1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcwOgwE%2FbtqCgSyIZuU%2FaHrYUuKcAsL2mYqIKT8Sk1%2Fimg.jpg&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/cwOgwE/btqCgSyIZuU/aHrYUuKcAsL2mYqIKT8Sk1/img.jpg&quot; data-origin-width=&quot;2182&quot; data-origin-height=&quot;3087&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/d8iDP9/btqCjd3heTN/yOmTr9YBZQCyIOKhcKNvd1/img.jpg&quot; data-origin-width=&quot;2182&quot; data-origin-height=&quot;3087&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/d8iDP9/btqCjd3heTN/yOmTr9YBZQCyIOKhcKNvd1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/d8iDP9/btqCjd3heTN/yOmTr9YBZQCyIOKhcKNvd1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/d8iDP9/btqCjd3heTN/yOmTr9YBZQCyIOKhcKNvd1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fd8iDP9%2FbtqCjd3heTN%2FyOmTr9YBZQCyIOKhcKNvd1%2Fimg.jpg&quot; data-image-src=&quot;https://k.kakaocdn.net/dn/d8iDP9/btqCjd3heTN/yOmTr9YBZQCyIOKhcKNvd1/img.jpg&quot; data-origin-width=&quot;2182&quot; data-origin-height=&quot;3087&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot; style=&quot;text-align: left;&quot;&gt;&lt;span style=&quot;font-family: AppleSDGothicNeo-Regular, Malgun Gothic, 맑은 고딕, dotum, 돋움, sans-serif;&quot;&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>study/CS50 (2019)</category>
      <author>mimizzang</author>
      <guid isPermaLink="true">https://codingzzangmimi.tistory.com/72</guid>
      <comments>https://codingzzangmimi.tistory.com/72#entry72comment</comments>
      <pubDate>Wed, 26 Feb 2020 19:50:25 +0900</pubDate>
    </item>
  </channel>
</rss>