<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>coding scent</title>
    <link>https://asxpyn.tistory.com/</link>
    <description>A Passionate Student Developer  &amp;zwj; </description>
    <language>ko</language>
    <pubDate>Fri, 21 Aug 2026 11:45:15 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Jedi</managingEditor>
    <image>
      <title>coding scent</title>
      <url>https://tistory1.daumcdn.net/tistory/4104164/attach/d95699597c334bb59dcac81a90a2cb37</url>
      <link>https://asxpyn.tistory.com</link>
    </image>
    <item>
      <title>[Swift] self</title>
      <link>https://asxpyn.tistory.com/139</link>
      <description>&lt;pre class=&quot;swift&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;self.프로퍼티명 // 클래스나 구조체 자신의 인스턴스에 속한 프로퍼티&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;self 키워드는 생략이 가능하지만,&lt;/p&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;만약 프로퍼티와 일반 변수의 이름이 같을 경우 구분을 위해서 self를 꼭 써주어야한다.&lt;/p&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #000000; text-align: start;&quot; data-ke-language=&quot;swift&quot;&gt;&lt;code&gt;class A {
    var name: String
    init(name: String) {
        self.name = name
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이니셜라이저&amp;nbsp;내부에&amp;nbsp;있는&amp;nbsp;name&amp;nbsp;은&amp;nbsp;지역변수&amp;nbsp;&amp;gt;&amp;nbsp;매개변수&amp;nbsp;&amp;gt;&amp;nbsp;인스턴스&amp;nbsp;프로퍼티&amp;nbsp;순서로&amp;nbsp;무엇을&amp;nbsp;지칭하는지&amp;nbsp;찾음.&lt;br /&gt;그래서&amp;nbsp;name&amp;nbsp;=&amp;nbsp;name&amp;nbsp;의&amp;nbsp;경우&amp;nbsp;두개&amp;nbsp;다&amp;nbsp;매개변수를&amp;nbsp;지칭하게&amp;nbsp;됨.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때,&amp;nbsp;인스턴스&amp;nbsp;프로퍼티로&amp;nbsp;지칭하기&amp;nbsp;위해서&amp;nbsp;self를&amp;nbsp;사용함.&lt;/p&gt;</description>
      <category>  iOS/Swift</category>
      <author>Jedi</author>
      <guid isPermaLink="true">https://asxpyn.tistory.com/139</guid>
      <comments>https://asxpyn.tistory.com/139#entry139comment</comments>
      <pubDate>Sat, 6 May 2023 11:30:04 +0900</pubDate>
    </item>
    <item>
      <title>[Swift] Guard문과 If문</title>
      <link>https://asxpyn.tistory.com/138</link>
      <description>&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;guard와 if의 차이는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;guard는 항상 else문을 갖는다&lt;/b&gt;는 것이다.&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rArr; else문을 강제하기 때문에 예외처리에 용이하다!&lt;/p&gt;
&lt;pre class=&quot;swift&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;func guardTest(person: [String: String]) {
    guard let name = person[&quot;name&quot;] else { // else 를 안쓰면 compile error
        print(&quot;person is nil&quot;)
        return
    }
    
    print(&quot;Name: \\(name)&quot;)
    
    guard let location = person[&quot;location&quot;] else {
        print(&quot;location is nil&quot;)
        return
    }
    
    print(&quot;Location: \\(location)&quot;)
}

guardTest(person: [&quot;name&quot;: &quot;Jedi&quot;])
print()
guardTest(person: [&quot;location&quot;: &quot;Seoul&quot;])
print()
guardTest(person: [&quot;name&quot;: &quot;test&quot;, &quot;location&quot;: &quot;test&quot;])

/*
Name: Jedi
location is nil

person is nil

Name: test
Location: test
*/
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;if문 대신 guard문을 사용하면 뭐가 좋을까?&lt;/h3&gt;
&lt;p style=&quot;color: #000000; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 가독성이 좋다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;if 문&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;1c&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;if 조건문 {
	// 조건문 만족 시 실행
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;actionscript&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;if 조건문 {
	// 조건문 만족 시 실행
} else {
	// 조건문 불만족 시 실행
}
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc; color: #000000; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;guard 문 &amp;rarr; 메인 로직에 따라 조건문 정의할 때 용이&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;kotlin&quot; style=&quot;color: #000000; text-align: start;&quot;&gt;&lt;code&gt;guard 조건문(메인로직) else {
	// 조건문 불만족 시 실행
	return
} 

// 조건문 만족 시 실행
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  iOS/Swift</category>
      <author>Jedi</author>
      <guid isPermaLink="true">https://asxpyn.tistory.com/138</guid>
      <comments>https://asxpyn.tistory.com/138#entry138comment</comments>
      <pubDate>Sat, 6 May 2023 11:28:33 +0900</pubDate>
    </item>
    <item>
      <title>[운영체제] Process Management | 시스템 콜, CPU burst time</title>
      <link>https://asxpyn.tistory.com/137</link>
      <description>&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;&amp;rarr; 복제 생성&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;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;Copy-on-write(COW)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;write가 발생했을 때(내용에 변화가 있을 때) 부모의 code, data, stack 등을 copy 한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;수행 (Execution)
&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;자식이 종료(terminate)될 때까지 부모가 기다리는(wait - blocked) 모델&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;주소 공간(Address space)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자식은 부모의 공간을 복사함 (binary and OS data)&lt;/li&gt;
&lt;li&gt;자식은 그 공간에 새로운 프로그램을 올림&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ee2323;&quot;&gt;fork()&lt;/span&gt; 시스템 콜이 새로운 프로세스를 생성&lt;/li&gt;
&lt;li&gt;fork() 다음에 이어지는 &lt;span style=&quot;color: #ee2323;&quot;&gt;exec()&lt;/span&gt; 시스템 콜을 통해 새로운 프로그램을 메모리에 올림&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;fork() 시스템 콜 - create a child (copy)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;새로운 프로그램을 메모리에 올림 &amp;rarr; 새 출발&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1661352475347&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int main(){
	int pid;
	pid = fork();
	if (pid==0) /* this is child */
		printf(&quot;\n Hello, I am child! Now I'll run date\n&quot;);
		execlp(&quot;/bin/date&quot;, &quot;/bin/date&quot;, (char *) 0);
	else if (pid &amp;gt; 0) /* this is parent */
		printf(&quot;\n Hello, I am parent!\n&quot;);
}&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;꼭 자식을 만들어서(fork()를 해서) exec()을 해야하는 것은 아님&lt;/li&gt;
&lt;/ul&gt;
&lt;pre id=&quot;code_1661352487966&quot; class=&quot;cpp&quot; data-ke-language=&quot;cpp&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;int main(){
	printf(&quot;1&quot;);
	execlp(&quot;echo&quot;, &quot;echo&quot;, &quot;3&quot;, (char *) 0);
	printf(&quot;2&quot;); /* 영원히 출력 X */
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;exit() 시스템 콜 - frees all the resources, notify parent&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자발적 &amp;rarr; 프로세스가 마지막 명령을 수행한 후 운영체제에게 이를 알려줌 (&lt;span style=&quot;color: #ee2323;&quot;&gt;exit&lt;/span&gt;)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자식이 부모에게 output data를 보냄&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;비자발적 &amp;rarr; 부모 프로세스가 자식의 수행을 종료시킴 (&lt;span style=&quot;color: #ee2323;&quot;&gt;abort&lt;/span&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;부모가 종료(exit)하는 경우
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;단계적인 종료 &amp;rarr; 부모 프로세스가 종료하기 전에 자식들이 먼저 종료됨&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;키보드로 kill, break를 친 경우&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;wait() 시스템 콜 - sleep until child is done&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스 A가 wait() 시스템 콜을 호출하면
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;커널은 child가 종료될 때까지 프로세스 A를 sleep시킴 (block 상태)&lt;/li&gt;
&lt;li&gt;자식 프로세스가 종료 시 커널은 프로세스 A를 깨움 (ready 상태)&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;프로세스 간 협력&lt;/span&gt;&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스 간 협력 메커니즘 - IPC: Interprocess Communication&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;message passing: 커널을 통해 메시지 전달&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;shared memory: 서로 다른 프로세스 간에도 일부 주소 공간을 공유&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;CPU-burst Time의 분포&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;427&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bVgIyi/btrKwbh7HPY/owdqy6pd0HM0qh5fieKAf0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bVgIyi/btrKwbh7HPY/owdqy6pd0HM0qh5fieKAf0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bVgIyi/btrKwbh7HPY/owdqy6pd0HM0qh5fieKAf0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbVgIyi%2FbtrKwbh7HPY%2Fowdqy6pd0HM0qh5fieKAf0%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;682&quot; height=&quot;427&quot; data-origin-width=&quot;682&quot; data-origin-height=&quot;427&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  CS/운영체제</category>
      <author>Jedi</author>
      <guid isPermaLink="true">https://asxpyn.tistory.com/137</guid>
      <comments>https://asxpyn.tistory.com/137#entry137comment</comments>
      <pubDate>Wed, 24 Aug 2022 23:49:51 +0900</pubDate>
    </item>
    <item>
      <title>[운영체제] 프로세스 (2) | 동기/비동기식 입출력, Thread</title>
      <link>https://asxpyn.tistory.com/136</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;동기식 입출력과 비동기식 입출력&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1776&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/o2uE4/btrKrr1dtFI/rRklknchyQNf9xaUqyLgK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/o2uE4/btrKrr1dtFI/rRklknchyQNf9xaUqyLgK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/o2uE4/btrKrr1dtFI/rRklknchyQNf9xaUqyLgK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fo2uE4%2FbtrKrr1dtFI%2FrRklknchyQNf9xaUqyLgK0%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;1776&quot; height=&quot;1000&quot; data-origin-width=&quot;1776&quot; data-origin-height=&quot;1000&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;동기식 입출력(synchronous I/O)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어감&lt;/li&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;I/O가 끝날 때까지 CPU를 낭비시킴&lt;/li&gt;
&lt;li&gt;매시점 하나의 I/O만 일어날 수 있음&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;I/O가 완료될 때까지 해당 프로그램에게서 CPU를 빼앗음&lt;/li&gt;
&lt;li&gt;I/O 처리를 기다리는 줄에 그 프로그램을 줄 세움&lt;/li&gt;
&lt;li&gt;다른 프로그램에게 CPU를 줌&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;비동기식 입출력 (asynchronous I/O)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 두 경우 모두 I/O의 완료는 인터럽트로 알려줌&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Thread&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;A&amp;nbsp;thread(or&amp;nbsp;lightweight process) is a basic unit of CPU utilization&lt;/span&gt;&lt;/blockquote&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;Thread의 구성 (thread 간 별도로 가지고 있는 부분)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Program counter: 코드의 어느 부분을 실행하고 있는가를 가리키는 레지스터&lt;/li&gt;
&lt;li&gt;Register set&lt;/li&gt;
&lt;li&gt;Stack space&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Thread가 동료 thread와&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;공유&lt;/b&gt;하는 부분(=task)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;code section&lt;/li&gt;
&lt;li&gt;data section&lt;/li&gt;
&lt;li&gt;OS resources&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;전통적인 개념의 heavyweight process는 하나의 thread를 가지고 있는 task로 볼 수 있다&lt;/li&gt;
&lt;li&gt;다중 스레드로 구성된 태스크 구조에서는 하나의 서버 스레드가 blocked(waiting) 상태인 동안에도 동일한 task 내의 다른 스레드가 실행(running)되어 빠른 처리를 할 수 있다.&lt;/li&gt;
&lt;li&gt;&amp;rarr; 빠른&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;응답성&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&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;하나의 프로세스 안에서 스레드끼리 binary code, data, resource of the process를 공유&lt;/li&gt;
&lt;li&gt;if 같은 일을 하는 Process를 여러개 띄워놓는다면 각각의 메모리에 올라가야하기 때문에 메모리 낭비 발생&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;동일한 일을 수행하는 다중 스레드가 협력하여 높은 처리율(throughput)과 성능 향상을 얻을 수 있다.&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;</description>
      <category>  CS/운영체제</category>
      <author>Jedi</author>
      <guid isPermaLink="true">https://asxpyn.tistory.com/136</guid>
      <comments>https://asxpyn.tistory.com/136#entry136comment</comments>
      <pubDate>Wed, 24 Aug 2022 21:52:19 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크] Network Layer - Application Layer(1) | HTTP</title>
      <link>https://asxpyn.tistory.com/135</link>
      <description>&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Application Layer
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;HTTP&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Transport Layer
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TCP/UDP&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Network Layer
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IP&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Link Layer
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;WIFI, LTE, Ethernet&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Physical Layer&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2022-08-12 오후 5.10.53.png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;578&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcOmst/btrJABJoFgF/F2g9x1369xHKGNkUHxuzMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcOmst/btrJABJoFgF/F2g9x1369xHKGNkUHxuzMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcOmst/btrJABJoFgF/F2g9x1369xHKGNkUHxuzMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcOmst%2FbtrJABJoFgF%2FF2g9x1369xHKGNkUHxuzMk%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;819&quot; height=&quot;500&quot; data-filename=&quot;스크린샷 2022-08-12 오후 5.10.53.png&quot; data-origin-width=&quot;946&quot; data-origin-height=&quot;578&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;circle&quot;&gt;
&lt;li&gt;라우터는 네트워크 Layer까지만 존재 (Network, Link, Physical)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Process&lt;/b&gt;의 &lt;b&gt;Socket&lt;/b&gt;을 이용하여 다른 컴퓨터끼리 &lt;b&gt;통신&lt;/b&gt;
&lt;ul style=&quot;list-style-type: circle;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;IP주소, Port번호 사용&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;HTTP&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;b&gt;&lt;span style=&quot;color: #000000;&quot;&gt;Hyper Text transfer protocol = Hypertext를 전달하는 프로토콜&lt;/span&gt;&lt;/b&gt;&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Application Layer의 프로토콜 중 하나&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HTTP 특징&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;TCP&lt;/b&gt;가 Connection을 맺으면 이후 HTTP 메시지가 교환
&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;메시지 교환 전 TCP Connection 생성 필요&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;stateless&lt;/b&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;상대방에 대한&lt;b&gt; 이전 상태나 요청을 기억하지 않고&lt;/b&gt; 그 순간의 요구를 처리하기 때문에 &lt;b&gt;간단하고 빠르게 동작&lt;/b&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;HTTP Connections&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;Non-persistent HTTP&lt;/b&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;파일이 10개라면 10번 연결&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;b&gt;persistent HTTP&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;파일이 10개라면 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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>  CS/네트워크</category>
      <category>http</category>
      <author>Jedi</author>
      <guid isPermaLink="true">https://asxpyn.tistory.com/135</guid>
      <comments>https://asxpyn.tistory.com/135#entry135comment</comments>
      <pubDate>Fri, 12 Aug 2022 18:36:22 +0900</pubDate>
    </item>
    <item>
      <title>[운영체제] 프로세스 (1) | Process State, Context Switch, Scheduler</title>
      <link>https://asxpyn.tistory.com/134</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;프로세스의 개념&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rArr; 실행 중인 프로그램&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;프로세스의 구성&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;: 프로그램 코드(text section), 프로그램 카운터, 프로세서 레지스터&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1027&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dctTih/btrJpeVOKJb/s8Qf9Ro0YT41g3hom4U1U1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dctTih/btrJpeVOKJb/s8Qf9Ro0YT41g3hom4U1U1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dctTih/btrJpeVOKJb/s8Qf9Ro0YT41g3hom4U1U1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdctTih%2FbtrJpeVOKJb%2Fs8Qf9Ro0YT41g3hom4U1U1%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;564&quot; height=&quot;549&quot; data-origin-width=&quot;1027&quot; data-origin-height=&quot;1000&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;Stack: 데이터를 일시적으로 저장하는 영역&lt;/li&gt;
&lt;li&gt;Data section: 프로그램의 가상 주소 공간&lt;/li&gt;
&lt;li&gt;Heap: 코드 영역과는 별도로 유지되는 자유 영역&lt;/li&gt;
&lt;li&gt;Code: 실행 명령을 포함하는 메모리이거나 목적 파일에 있는 프로그램 영역&lt;/li&gt;
&lt;li&gt;프로세스의 문맥(context)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;CPU 수행&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&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;Program Counter&lt;/li&gt;
&lt;li&gt;각종 register&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;code, data, stack&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;PCB&lt;/li&gt;
&lt;li&gt;Kernel stack&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;프로세스의 상태 (Process State)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스는 상태(state)가 변경되며 실행된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Running
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU를 잡고 instruction을 수행 중인 상태&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Ready
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU를 기다리는 상태(메모리 등 다른 조건을 모두 만족하고)&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Blocked(wait, sleep)
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU를 주어도 당장 instruction을 수행할 수 없는 상태&lt;/li&gt;
&lt;li&gt;Process 자신이 요청한 event(ex. I/O)가 즉시 만족되지 않아 이를 기다리는 상태&lt;/li&gt;
&lt;li&gt;자신이 요청한 event가 만족되면 Ready&lt;/li&gt;
&lt;/ol&gt;
ex) 디스크에서 file을 읽어와야 하는 경우&lt;/li&gt;
&lt;li&gt;Suspended (stopped)
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;외부적인 이유로 프로세스의 수행이 정지된 상태&lt;/li&gt;
&lt;li&gt;프로세스는 통째로 디스크에 swap out된다.&lt;/li&gt;
&lt;/ol&gt;
ex) 사용자가 프로그램을 일시 정지시킨 경우 (break key)&lt;br /&gt;시스템이 여러 이유로 프로세스를 잠시 중단시킴&lt;br /&gt;(메모리에 너무 많은 프로세스가 올라와 있을 때)&lt;/li&gt;
&lt;li&gt;New
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스가 생성 중인 상태&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;Terminated
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;수행(execution)이 끝난 상태&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;프로세스의 상태도&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1250&quot; data-origin-height=&quot;704&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRrym5/btrJqKe8DMT/kQXzBlaQh9kIKWzFx3eRL1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRrym5/btrJqKe8DMT/kQXzBlaQh9kIKWzFx3eRL1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRrym5/btrJqKe8DMT/kQXzBlaQh9kIKWzFx3eRL1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRrym5%2FbtrJqKe8DMT%2FkQXzBlaQh9kIKWzFx3eRL1%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;695&quot; height=&quot;391&quot; data-origin-width=&quot;1250&quot; data-origin-height=&quot;704&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;375&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bQ1sxC/btrJqmlgA9G/BdCrZMbVKgItaydV976ZsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bQ1sxC/btrJqmlgA9G/BdCrZMbVKgItaydV976ZsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQ1sxC/btrJqmlgA9G/BdCrZMbVKgItaydV976ZsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbQ1sxC%2FbtrJqmlgA9G%2FBdCrZMbVKgItaydV976ZsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;627&quot; height=&quot;218&quot; data-origin-width=&quot;1080&quot; data-origin-height=&quot;375&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Process Control Block(PCB): task control block&lt;/h4&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;각 process는 OS에서 PCB에 의해 표현&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;968&quot; data-origin-height=&quot;1156&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bX6Omi/btrJn7JqJav/5sqIdLdvKsDekjOT7Tv1UK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bX6Omi/btrJn7JqJav/5sqIdLdvKsDekjOT7Tv1UK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bX6Omi/btrJn7JqJav/5sqIdLdvKsDekjOT7Tv1UK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbX6Omi%2FbtrJn7JqJav%2F5sqIdLdvKsDekjOT7Tv1UK%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;324&quot; height=&quot;387&quot; data-origin-width=&quot;968&quot; data-origin-height=&quot;1156&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다음의 구성 요소를 가진다. (구조체로 유지)
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;OS가 관리상 사용하는 정보
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Process state, Process ID&lt;/li&gt;
&lt;li&gt;scheduling information, priority
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;scheduling information: priorites, scheduling queue pointers&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;CPU 수행 관련 하드웨어 값
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Program counter, registers
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;program counter: location of instruction to next execute&lt;/li&gt;
&lt;li&gt;CPU registers: contents of all process - centric registers&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;메모리 관련
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Code, data, stack의 위치 정보&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;파일 관련
&lt;ol style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Open file descriptors&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;문맥 교환(Context Switch)&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: Switching of execution information&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU를 한 프로세스(or 스레드) 에서 다른 프로세스(or 스레드)로 넘겨주는 과정&lt;/li&gt;
&lt;li&gt;하나의 작업 (or 프로세스)에서 다른 작업 (or 프로세스)로 변경하기 위해 컴퓨터의 CPU가 따르는 작업이 충돌하지 않도록 하는 절차&lt;/li&gt;
&lt;li&gt;CPU가 다른 프로세스에게 넘어갈 때 운영체제는 다음을 수행
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU를 내어주는 프로세스의 상태를 그 프로세스의 PCB에 저장&lt;/li&gt;
&lt;li&gt;CPU를 새롭게 얻는 프로세스의 상태를 PCB에서 읽어옴&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b6HXQI/btrJqLyk2LW/kMaX0KA69GnQOduDqKcq31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b6HXQI/btrJqLyk2LW/kMaX0KA69GnQOduDqKcq31/img.png&quot; width=&quot;1046&quot; height=&quot;898&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;999&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;50.02&quot; style=&quot;width: 49.438595618191044%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b6HXQI/btrJqLyk2LW/kMaX0KA69GnQOduDqKcq31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6HXQI%2FbtrJqLyk2LW%2FkMaX0KA69GnQOduDqKcq31%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;1164&quot; height=&quot;999&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/DsOU1/btrJp1hnmzJ/puxU699mzBiUyc7BrNgt3k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/DsOU1/btrJp1hnmzJ/puxU699mzBiUyc7BrNgt3k/img.png&quot; data-origin-width=&quot;794&quot; data-origin-height=&quot;682&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;49.98&quot; style=&quot;width: 49.39861368413455%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/DsOU1/btrJp1hnmzJ/puxU699mzBiUyc7BrNgt3k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FDsOU1%2FbtrJp1hnmzJ%2FpuxU699mzBiUyc7BrNgt3k%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;794&quot; height=&quot;682&quot;/&gt;&lt;/span&gt;&lt;/div&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;System call 이나 interrupt 발생 시 반드시 context switch가 일어나는 것은 아님&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;1684&quot; data-origin-height=&quot;976&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xDrA5/btrJm82TZpV/25VwSkRmtdFEgZFssQNIz1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xDrA5/btrJm82TZpV/25VwSkRmtdFEgZFssQNIz1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xDrA5/btrJm82TZpV/25VwSkRmtdFEgZFssQNIz1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxDrA5%2FbtrJm82TZpV%2F25VwSkRmtdFEgZFssQNIz1%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;684&quot; height=&quot;396&quot; data-origin-width=&quot;1684&quot; data-origin-height=&quot;976&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(1)의 경우에도 CPU 수행 정보 등 context의 일부를 PCB에 save해야 하지만 문맥교환을 하는 (2)의 경우 그 부담이 훨씬 큼 (ex. cache memory flush)&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;프로세스를 스케줄링하기 위한 큐&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Job Queue
&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;Ready queue
&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;Device queues
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;I/O device의 처리를 기다리는 프로세스의 집합&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;프로세스들은 각 큐들을 오가며 수행된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;2224&quot; data-origin-height=&quot;930&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcD7tf/btrJm8BNi8Z/bx7gknZg46W1fb3VJfBk80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcD7tf/btrJm8BNi8Z/bx7gknZg46W1fb3VJfBk80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcD7tf/btrJm8BNi8Z/bx7gknZg46W1fb3VJfBk80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcD7tf%2FbtrJm8BNi8Z%2Fbx7gknZg46W1fb3VJfBk80%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;700&quot; height=&quot;293&quot; data-origin-width=&quot;2224&quot; data-origin-height=&quot;930&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blBnCx/btrJp0pfE1k/TEhKnr0I1Hxqk73UoTszO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blBnCx/btrJp0pfE1k/TEhKnr0I1Hxqk73UoTszO0/img.png&quot; data-origin-width=&quot;984&quot; data-origin-height=&quot;650&quot; data-is-animation=&quot;false&quot; width=&quot;631&quot; height=&quot;417&quot; data-widthpercent=&quot;45.91&quot; style=&quot;width: 45.37329293739685%; margin-right: 10px;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blBnCx/btrJp0pfE1k/TEhKnr0I1Hxqk73UoTszO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblBnCx%2FbtrJp0pfE1k%2FTEhKnr0I1Hxqk73UoTszO0%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;984&quot; height=&quot;650&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cbVdbt/btrJmrBdz8J/UjecGjBq1wTkCPYt4eJYmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cbVdbt/btrJmrBdz8J/UjecGjBq1wTkCPYt4eJYmk/img.png&quot; width=&quot;633&quot; height=&quot;355&quot; data-origin-width=&quot;1716&quot; data-origin-height=&quot;962&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;54.09&quot; style=&quot;width: 53.46391636492871%;&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cbVdbt/btrJmrBdz8J/UjecGjBq1wTkCPYt4eJYmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcbVdbt%2FbtrJmrBdz8J%2FUjecGjBq1wTkCPYt4eJYmk%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;1716&quot; height=&quot;962&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;스케줄러&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1671&quot; data-origin-height=&quot;859&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ckFQGM/btrJsO8VQRG/3x9Q3b4s4ExHEVUrp2LEek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ckFQGM/btrJsO8VQRG/3x9Q3b4s4ExHEVUrp2LEek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ckFQGM/btrJsO8VQRG/3x9Q3b4s4ExHEVUrp2LEek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FckFQGM%2FbtrJsO8VQRG%2F3x9Q3b4s4ExHEVUrp2LEek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;786&quot; height=&quot;404&quot; data-origin-width=&quot;1671&quot; data-origin-height=&quot;859&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;Long-term scheduler (장기 스케줄러 or job scheduler)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시작 프로세스 중 어떤 것들을 ready queue로 보낼지 결정&lt;/li&gt;
&lt;li&gt;프로세스에 memory(및 각종 자원)을 주는 문제&lt;/li&gt;
&lt;li&gt;degree of Multiprogramming을 제어&lt;/li&gt;
&lt;li&gt;time sharing system에는 보통 장기 스케줄러가 없음 (무조건 ready)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Short-term scheduler (단기 스케줄러 or CPU scheduler)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;어떤 프로세스를 다음번에 running 시킬지 결정&lt;/li&gt;
&lt;li&gt;프로세스에 CPU를 주는 문제&lt;/li&gt;
&lt;li&gt;충분히 빨라야함 (millisecond 단위)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Medium-Term scheduler (중기 스케줄러 or Swapper)
&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;프로세스에게서 memory를 뺏는 문제&lt;/li&gt;
&lt;li&gt;degree of Multiprogramming을 제어&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>  CS/운영체제</category>
      <author>Jedi</author>
      <guid isPermaLink="true">https://asxpyn.tistory.com/134</guid>
      <comments>https://asxpyn.tistory.com/134#entry134comment</comments>
      <pubDate>Thu, 11 Aug 2022 01:11:37 +0900</pubDate>
    </item>
    <item>
      <title>[Error] Missing Info.plist value. A value for the Info.plist key 'CFBundleIconName' is missing in the bundle '{bundleid}'.</title>
      <link>https://asxpyn.tistory.com/133</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;App Store Connect에 앱 심사를 올리기 위해 Xcode Project를 Archive 하려고 하였으나 Upload 도중 다음과 같은 에러가 나타났다.&lt;/p&gt;
&lt;pre id=&quot;code_1660113021443&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Missing Info.plist value. A value for the Info.plist key 'CFBundleIconName' is missing in the bundle '{bundleid}'. 
Apps built with iOS 11 or later SDK must supply app icons in an asset catalog and must also provide a value for this Info.plist key. 
For more information see http://help.apple.com/xcode/mac/current/#/dev10510b1f7. 
With error code STATE_ERROR.VALIDATION_ERROR.90713 for id 1c87c5e5-138b-489b-830d-9134661f2978&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;406&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIf4wH/btrJqJ0PHKf/CfOxFbB5f7uirZnLEkZHbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIf4wH/btrJqJ0PHKf/CfOxFbB5f7uirZnLEkZHbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIf4wH/btrJqJ0PHKf/CfOxFbB5f7uirZnLEkZHbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIf4wH%2FbtrJqJ0PHKf%2FCfOxFbB5f7uirZnLEkZHbk%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;784&quot; height=&quot;258&quot; data-origin-width=&quot;1234&quot; data-origin-height=&quot;406&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CFBundleIconName도 설정해주고 이것저것 다 해보았으나 결론적으로 문제는&lt;b&gt; 에셋의 위치&lt;/b&gt;였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;figure contenteditable=&quot;false&quot; data-ke-type=&quot;emoticon&quot; data-ke-align=&quot;alignCenter&quot; data-emoticon-type=&quot;friends1&quot; data-emoticon-name=&quot;031&quot; data-emoticon-isanimation=&quot;false&quot; data-emoticon-src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/031.gif&quot;&gt;&lt;img src=&quot;https://t1.daumcdn.net/keditor/emoticon/friends1/large/031.gif&quot; width=&quot;150&quot; /&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로젝트 시작 전 Asset의 위치를 임의로 폴더를 생성하여 하위로 이동시켰었는데, &lt;b&gt;프로젝트 생성 시에 에셋이 원래 위치했던 자리로 재배열해주니&lt;/b&gt; 프로젝트 Upload에 성공하였다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;개발 중 Asset 이용에 문제가 없었기에 괜찮은 줄 알았는데도 해당 문제가 발생했다. 의문.. 의문.. 급해서 일단 킵고잉함&lt;/p&gt;</description>
      <category>  iOS</category>
      <category>error</category>
      <author>Jedi</author>
      <guid isPermaLink="true">https://asxpyn.tistory.com/133</guid>
      <comments>https://asxpyn.tistory.com/133#entry133comment</comments>
      <pubDate>Wed, 10 Aug 2022 18:39:53 +0900</pubDate>
    </item>
    <item>
      <title>[운영체제] Program Execution | 프로그램 실행</title>
      <link>https://asxpyn.tistory.com/132</link>
      <description>&lt;h4 data-ke-size=&quot;size20&quot;&gt;프로그램의 실행&lt;/h4&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;virtual memory 상에서 다른 영역으로 점프 불가&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;1784&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/KAY7o/btrJlpif8XK/MrtgK2V3Iu8Xkh0AOKDqD0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/KAY7o/btrJlpif8XK/MrtgK2V3Iu8Xkh0AOKDqD0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/KAY7o/btrJlpif8XK/MrtgK2V3Iu8Xkh0AOKDqD0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FKAY7o%2FbtrJlpif8XK%2FMrtgK2V3Iu8Xkh0AOKDqD0%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;630&quot; height=&quot;353&quot; data-origin-width=&quot;1784&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;커널 주소 공간&lt;/h4&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;data: 하드웨어를 관리하기 위한 자료구조들이 들어있음&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;1787&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rnZsO/btrJj5R9D9d/ftyEA3hLZ1KAyGdzPGewzk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rnZsO/btrJj5R9D9d/ftyEA3hLZ1KAyGdzPGewzk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rnZsO/btrJj5R9D9d/ftyEA3hLZ1KAyGdzPGewzk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrnZsO%2FbtrJj5R9D9d%2FftyEA3hLZ1KAyGdzPGewzk%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;688&quot; height=&quot;385&quot; data-origin-width=&quot;1787&quot; data-origin-height=&quot;1000&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;사용자 프로그램이 사용하는 함수&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;함수(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;'code' - 사용자 정의 함수 / 라이브러리 함수&lt;/li&gt;
&lt;li&gt;자신의 프로그램에서 정의한 함수&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;220&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/mNAUm/btrJikB1dDS/ZN33GNLOXxEMBJWUg86PwK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/mNAUm/btrJikB1dDS/ZN33GNLOXxEMBJWUg86PwK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/mNAUm/btrJikB1dDS/ZN33GNLOXxEMBJWUg86PwK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FmNAUm%2FbtrJikB1dDS%2FZN33GNLOXxEMBJWUg86PwK%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;220&quot; height=&quot;210&quot; data-origin-width=&quot;220&quot; data-origin-height=&quot;210&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 style=&quot;list-style-type: none;&quot;&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;'code' - 커널 함수&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;/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;298&quot; data-origin-height=&quot;210&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/nJPOv/btrJmrsMDJJ/KdymWnkmN8jhGj6Ri8enN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/nJPOv/btrJmrsMDJJ/KdymWnkmN8jhGj6Ri8enN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/nJPOv/btrJmrsMDJJ/KdymWnkmN8jhGj6Ri8enN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FnJPOv%2FbtrJmrsMDJJ%2FKdymWnkmN8jhGj6Ri8enN0%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;298&quot; height=&quot;210&quot; data-origin-width=&quot;298&quot; data-origin-height=&quot;210&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;프로그램의 실행&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;A의 프로그램 실행 ~ 종료&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;2682&quot; data-origin-height=&quot;1240&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oQXlE/btrJjL6SdLv/z1ORxR5kNIyzrhYk2WOe80/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oQXlE/btrJjL6SdLv/z1ORxR5kNIyzrhYk2WOe80/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oQXlE/btrJjL6SdLv/z1ORxR5kNIyzrhYk2WOe80/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoQXlE%2FbtrJjL6SdLv%2Fz1ORxR5kNIyzrhYk2WOe80%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1276&quot; height=&quot;589&quot; data-origin-width=&quot;2682&quot; data-origin-height=&quot;1240&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>  CS/운영체제</category>
      <author>Jedi</author>
      <guid isPermaLink="true">https://asxpyn.tistory.com/132</guid>
      <comments>https://asxpyn.tistory.com/132#entry132comment</comments>
      <pubDate>Wed, 10 Aug 2022 00:04:59 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크] Introduction</title>
      <link>https://asxpyn.tistory.com/131</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;The network edge&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;host: 네트워크에서 사용되는 컴퓨터&lt;/li&gt;
&lt;li&gt;client: 서버에게 정보를 요청하거나 받는 컴퓨터&lt;/li&gt;
&lt;li&gt;server: 클라이언트로부터 받은 요청에 따라 정보를 보내주는 컴퓨터&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Network edge: 데이터 전달 방식&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;TCP
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;reliable
&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;데이터의 transfer 순서가 바뀌지 않아 순서가 보장됨&lt;/li&gt;
&lt;li&gt;flow control
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;receiver에 맞춰 속도 조절&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;congestion control
&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;resource high&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;UDP
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;reliable하지 않음&lt;/li&gt;
&lt;li&gt;모든 데이터를 보장하지 않아도 되는 경우에 사용&lt;/li&gt;
&lt;/ul&gt;
ex. real-time voice&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;What&amp;rsquo;s a protocol?&lt;/h3&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로토콜은 둘 이상의 통신 개체 간 교환되는 메시지 포맷과 순서뿐 아니라 메시지의 송수신과 다른 이벤트에서 취하는 행동을 정의&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;같은 프로토콜을 사용해야 소통이 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;The Network Core: 메시지를 전달하는 방식&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Circuit switching: 출발 - 목적지의 길을 예약하여 사용자만을 위해 길을 딱 준비해놓음&lt;/li&gt;
&lt;li&gt;Packet switching: 저장 후 전달 전송
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Nodal processing
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;output link를 결정&lt;/li&gt;
&lt;li&gt;좋은 라우터일 수록 Processing delay가 줄어듦&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Queueing
&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;queue 한도 초과 시 패킷 유실 - loss의 90% 이상이 이 과정에서 발생&lt;/li&gt;
&lt;li&gt;큐에서 기다리는 시간: 큐잉 Delay&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Transmission delay
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;처음부터 마지막 bit까지 나가는 시간&lt;/li&gt;
&lt;li&gt;bandwidth가 길수록 delay가 줄어듦&lt;/li&gt;
&lt;li&gt;delay = L / R&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt; R = link bandwidth (bps)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;L = 패킷 길이 (bits)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;time to send bits into link = L / R&lt;/span&gt;&lt;/blockquote&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li style=&quot;list-style-type: none;&quot;&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Propagation delay
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;마지막 bit가 링크에 올라와서 다음 라우터까지 도달하는 시간&lt;/li&gt;
&lt;li&gt;빛의 속도에 따르기 때문에 신의 영역과 같다(!)&lt;/li&gt;
&lt;li&gt;delay = d/s&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;d = link의 물리적 길이&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;s = propagation speed in medium (~2x10^8 m/sec)&lt;/span&gt;&lt;/blockquote&gt;</description>
      <category>  CS/네트워크</category>
      <category>네트워크</category>
      <author>Jedi</author>
      <guid isPermaLink="true">https://asxpyn.tistory.com/131</guid>
      <comments>https://asxpyn.tistory.com/131#entry131comment</comments>
      <pubDate>Sat, 30 Jul 2022 16:48:30 +0900</pubDate>
    </item>
    <item>
      <title>[운영체제] System Structure</title>
      <link>https://asxpyn.tistory.com/130</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;컴퓨터 시스템 구조&lt;/h2&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1454&quot; data-origin-height=&quot;1322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpFha7/btrItuqAyqC/V5kNOXkwxmd5lKKfjqlOSk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpFha7/btrItuqAyqC/V5kNOXkwxmd5lKKfjqlOSk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpFha7/btrItuqAyqC/V5kNOXkwxmd5lKKfjqlOSk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpFha7%2FbtrItuqAyqC%2FV5kNOXkwxmd5lKKfjqlOSk%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;581&quot; height=&quot;528&quot; data-origin-width=&quot;1454&quot; data-origin-height=&quot;1322&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;CPU&lt;/h4&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;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;인터럽트를 발생시키기 위해 주변 장치는&amp;nbsp;인터럽트 라인을 세팅하고 CPU는 매번 명령을 수행한 후 인터럽트 라인을 체크해 서비스 요청이 있는지 확인한다.&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;사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 절차&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;운영체제가 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;li&gt;i/o device 접근&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&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;사용자 프로그램이 cpu갖고있음&lt;/li&gt;
&lt;li&gt;보안을 위해 제한된(한정된) instruction만 실행할 수 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;보안을 해칠 수 있는 중요한 명령어는 모니터 모드에서만 수행 가능한&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;특권 명령&lt;/b&gt;으로 규정&lt;/li&gt;
&lt;li&gt;Interrupt나 Exception 발생 시 하드웨어가 mode bit &amp;rarr; 0 변경&lt;/li&gt;
&lt;li&gt;사용자 프로그램에게 CPU를 넘기기 전에 mode bit &amp;rarr; 1 셋팅Mode bit&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;메모리&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CPU의 작업 공간&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;DMA (Direct Memory Access)&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용&lt;/li&gt;
&lt;li&gt;CPU의 중재 없이 device controller가 device의 buffer storage의 내용을 메모리에 block 단위로 직접 전송&lt;/li&gt;
&lt;li&gt;바이트 단위가 아니라 block 단위로 인터럽트 발생시킴&lt;/li&gt;
&lt;li&gt;인터럽트를 자주 걸면 문제가 생기니 DMA(=Controller)가 직접 동작&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;타이머&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;정해진 시간이 흐른 뒤 운영체제에게 제어권이 넘어가도록 인터럽트 발생&amp;nbsp;&lt;b&gt;&amp;rArr; 특정 프로그램이 CPU를 독점하는 것을 막기 위함&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;타이머 값이 0이 되면 타이머 인터럽트 발생&lt;/li&gt;
&lt;li&gt;time sharing을 구현하기 위해 널리 이용됨&lt;/li&gt;
&lt;li&gt;현재 시간을 계산하기 위해서도 사용&lt;/li&gt;
&lt;li&gt;사용자 프로그램이 CPU를 계속 사용하면 CPU를 뺏어올 방법이 없기 때문에 타이머를 사용하여 넘겨줌&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;Disk&lt;/h4&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;h4 data-ke-size=&quot;size20&quot;&gt;I/O device&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;Device controller가 각각 I/O 디바이스에 붙어 전담하는 CPU 역할을 함&lt;/li&gt;
&lt;li&gt;Device controller&amp;nbsp;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;해당 I/O 장치 유형을 관리하는 일종의 작은 CPU&lt;/li&gt;
&lt;li&gt;제어 정보를 위해 control register, status register를 가짐&lt;/li&gt;
&lt;li&gt;local buffer를 가짐 (일종의 data register)&lt;/li&gt;
&lt;li&gt;I/O는 실제 device와 local buffer 사이에서 일어남&lt;/li&gt;
&lt;li&gt;Device controller는 I/O가 끝났을 경우 interrupt로 CPU에 그 사실을 알림Device controller&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt; device driver :&amp;nbsp;OS 코드 중 각 장치별 처리 루틴 &amp;rarr; software&lt;/span&gt;&lt;/li&gt;
&lt;li&gt; device controller :&amp;nbsp;각 장치를 통제하는 일종의 작은 CPU &amp;rarr; hardware&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;I/O 의 수행&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 입출력 명령은 특권 명령&lt;/li&gt;
&lt;li&gt;사용자 프로그램이 I/O를 하는 방법
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시스템콜(System call)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;사용자 프로그램이 운영체제에게 I/O 요청&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CPU가 인터럽트가 들어온지 확인&lt;/li&gt;
&lt;li&gt;프로그램이 인터럽트를 사용해 모드빗이 0으로 바뀌고 운영체제에 해당하는 주소로 넘어감&lt;/li&gt;
&lt;li&gt;trap을 사용하여 인터럽트 벡터의 특정 위치로 이동&lt;/li&gt;
&lt;li&gt;제어권이 인터럽트 벡터가 가리키는 인터럽트 서비스 루틴으로 이동&lt;/li&gt;
&lt;li&gt;올바른 I/O 요청인지 확인 후 I/O를 수행&lt;/li&gt;
&lt;li&gt;I/O 완료 시 제어권을 시스템콜 다음 명령으로 옮김&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;인터럽트 당한 시점의 레지스터와 program counter를 save 한 후 CPU의 제어를 인터럽트 처리 루틴에 넘김&lt;/li&gt;
&lt;li&gt;I/O를 하기 위해서 소프트웨어 인터럽트(트랩)를 통해 요청하고 끝나면 하드웨어 인터럽트를 통해서 끝났다고 알림&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Interrupt (하드웨어 인터럽트): 하드웨어가 발생시킨 인터럽트&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- Trap (소프트웨어 인터럽트)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(1) Exception &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;rarr; 프로그램이 오류를 범한 경우 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;rarr; 인터럽트 라인이 자동으로 세팅됨 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;rarr; CPU가 운영체제에게 넘어가고 익셉션 상황에서는 보통 강제 종료로 대응 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #000000;&quot;&gt;(2) System call &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;rarr; 사용자 프로그램이 OS의 서비스를 받기 위해 OS에 요청해 커널 함수를 호출하는 경우 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;rarr; 컴퓨터를 호스트라고 부르기도 함&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;&lt;span style=&quot;color: #000000;&quot;&gt;- 인터럽트 벡터 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;rarr; 해당 인터럽트의 처리 루틴 주소를 가지고 있음 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;rarr; 처리해야하는 함수로 점프하게 해줌 &lt;br /&gt;- 인터럽트 처리 루틴 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;rarr; 해당 인터럽트를 처리하는 커널 함수 &lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;rarr; 실제 해야하는 일&lt;/span&gt;&lt;/blockquote&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;동기식 입출력과 비동기식 입출력&lt;/h4&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1776&quot; data-origin-height=&quot;1000&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cRs7U9/btrIoCb8jqN/pctycGEZj0ZkVMaHJDkkik/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cRs7U9/btrIoCb8jqN/pctycGEZj0ZkVMaHJDkkik/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cRs7U9/btrIoCb8jqN/pctycGEZj0ZkVMaHJDkkik/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRs7U9%2FbtrIoCb8jqN%2FpctycGEZj0ZkVMaHJDkkik%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;1420&quot; height=&quot;799&quot; data-origin-width=&quot;1776&quot; data-origin-height=&quot;1000&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;동기식 입출력(synchronous I/O)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어감&lt;/li&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;I/O가 끝날 때까지 CPU를 낭비시킴&lt;/li&gt;
&lt;li&gt;매 시점 하나의 I/O만 일어날 수 있음&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;I/O가 완료될 때까지 해당 프로그램에게서 CPU를 빼앗음&lt;/li&gt;
&lt;li&gt;I/O 처리를 기다리는 줄에 그 프로그램을 줄 세움&lt;/li&gt;
&lt;li&gt;다른 프로그램에게 CPU를 줌&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;비동기식 입출력(asynchronous I/O)
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감&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;Synchronous: 기다림&lt;/li&gt;
&lt;li&gt;Asynchronous: 안기다림
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;I/O 작업 요청만 해놓고 바로 cpu 얻어서 요청한 작업 수행&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;서로 다른 입출력 명령어&lt;/h4&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;by I/O를 수행하는 special instruction
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;메모리 접근 따로 있고 I/O 따로 있음&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;by Memory Mapped I/O
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;I/O 장치가 메모리 주소에 연장 주소를 붙여 사용&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;span style=&quot;color: #000000;&quot;&gt;저장 장치 계층 구조&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1660&quot; data-origin-height=&quot;1030&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bo3a72/btrIn38UKqG/KKvjkhmgmUfNXags0TITY1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bo3a72/btrIn38UKqG/KKvjkhmgmUfNXags0TITY1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bo3a72/btrIn38UKqG/KKvjkhmgmUfNXags0TITY1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbo3a72%2FbtrIn38UKqG%2FKKvjkhmgmUfNXags0TITY1%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;617&quot; height=&quot;383&quot; data-origin-width=&quot;1660&quot; data-origin-height=&quot;1030&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;CPU 안에 레지스터, 캐시 메모리 ...&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;위의 장치들은 CPU가 직접 접근 가능 (byte단위로 접근 가능)&lt;/li&gt;
&lt;li&gt;디스크는 sector 단위로 접근&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;정보를 보다 빠른 스토리지 시스템에 복사; 메인 메모리는 second storage를 위한 캐시로 간주&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>  CS/운영체제</category>
      <category>운영체제</category>
      <author>Jedi</author>
      <guid isPermaLink="true">https://asxpyn.tistory.com/130</guid>
      <comments>https://asxpyn.tistory.com/130#entry130comment</comments>
      <pubDate>Thu, 28 Jul 2022 22:06:16 +0900</pubDate>
    </item>
  </channel>
</rss>