<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>무제1</title>
    <link>https://responsibility.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Wed, 19 Aug 2026 23:53:22 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>무제1351</managingEditor>
    <item>
      <title>Flutter 01. 기본</title>
      <link>https://responsibility.tistory.com/199</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;enum&amp;nbsp;Status{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;approved,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;pending,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;rejected,&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void&amp;nbsp;main()&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;Status&amp;nbsp;status&amp;nbsp;=&amp;nbsp;Status.pending;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;if(status&amp;nbsp;==&amp;nbsp;Status.approved){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;final&amp;nbsp;DateTime&amp;nbsp;now&amp;nbsp;=&amp;nbsp;DateTime.now();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;print(now);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;const&amp;nbsp;DateTime&amp;nbsp;now2&amp;nbsp;=&amp;nbsp;DateTime.now();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;//const&amp;nbsp;는&amp;nbsp;빌드&amp;nbsp;타임의&amp;nbsp;값을&amp;nbsp;알아야한다&lt;br /&gt;&amp;nbsp;&amp;nbsp;//final&amp;nbsp;은&amp;nbsp;빌드&amp;nbsp;타임&amp;nbsp;값&amp;nbsp;몰라도&amp;nbsp;된다.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;build&amp;nbsp;할때&amp;nbsp;010101&amp;nbsp;이진수로&amp;nbsp;변환이&amp;nbsp;되는데&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*Run을&amp;nbsp;누를때&amp;nbsp;빌드가&amp;nbsp;된다.&amp;nbsp;이것이&amp;nbsp;빌드타임.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;*작성하고있을때의&amp;nbsp;코드값을&amp;nbsp;알고있어야&amp;nbsp;한다.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;*그래서&amp;nbsp;const는&amp;nbsp;언제&amp;nbsp;선언될지&amp;nbsp;모르니까&amp;nbsp;date&amp;nbsp;값에&amp;nbsp;const를&lt;br /&gt;&amp;nbsp;&amp;nbsp;붙이면&amp;nbsp;오류가&amp;nbsp;난다는것.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;*/&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;number&amp;nbsp;??=&amp;nbsp;3.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;nbsp;??=&amp;nbsp;넘버가&amp;nbsp;만약&amp;nbsp;null&amp;nbsp;이라면&amp;nbsp;오른쪽&amp;nbsp;값으로&amp;nbsp;바꿔라&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;int&amp;nbsp;number1&amp;nbsp;=&amp;nbsp;1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;print(number1&amp;nbsp;is&amp;nbsp;int);&lt;br /&gt;&amp;nbsp;&amp;nbsp;print(number1&amp;nbsp;is&amp;nbsp;String);&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;is&amp;nbsp;는&amp;nbsp;==&amp;nbsp;boolean&amp;nbsp;값&amp;nbsp;나옴.&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;is!&amp;nbsp;는&amp;nbsp;!=&amp;nbsp;boolean&amp;nbsp;값&amp;nbsp;나옴.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;bool&amp;nbsp;result&amp;nbsp;=&amp;nbsp;12&amp;nbsp;&amp;gt;&amp;nbsp;10;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;는&amp;nbsp;and&amp;nbsp;의&amp;nbsp;의미.&amp;nbsp;두&amp;nbsp;조건&amp;nbsp;다&amp;nbsp;true&amp;nbsp;여야&amp;nbsp;true.&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;||&amp;nbsp;는&amp;nbsp;or&amp;nbsp;의&amp;nbsp;의미.&amp;nbsp;둘&amp;nbsp;중&amp;nbsp;하나라도&amp;nbsp;true면&amp;nbsp;true.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;//list&lt;br /&gt;&amp;nbsp;&amp;nbsp;//리스트&amp;nbsp;타입&lt;br /&gt;&amp;nbsp;&amp;nbsp;List&amp;lt;String&amp;gt;&amp;nbsp;blackpink&amp;nbsp;=&amp;nbsp;['제니',&amp;nbsp;'지수',&amp;nbsp;'리사',&amp;nbsp;'로제'];&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;List&amp;lt;String&amp;gt;타입의&amp;nbsp;리스트.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;print(blackpink);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;idnex&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;순서&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;print(blackpink[0]);&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;0번째&amp;nbsp;배열인&amp;nbsp;제니&amp;nbsp;소환&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;blackpink.add('김갑수');&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;블랙핑크&amp;nbsp;배열에&amp;nbsp;'김갑수'&amp;nbsp;추가&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;blackpink.remove('김갑수');&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;블랙핑크&amp;nbsp;배열에&amp;nbsp;'김갑수'&amp;nbsp;빼기&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;print(blackpink.indexOf('로제'));&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;로제의&amp;nbsp;배열&amp;nbsp;순번&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;//Map&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;key&amp;nbsp;/&amp;nbsp;Value&amp;nbsp;값으로&amp;nbsp;짝을&amp;nbsp;이룬다.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Map&amp;lt;String,String&amp;gt;&amp;nbsp;dictionary&amp;nbsp;=&amp;nbsp;{&amp;nbsp;//&amp;nbsp;키타입,&amp;nbsp;밸류&amp;nbsp;타입&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Harry&amp;nbsp;porter'&amp;nbsp;:&amp;nbsp;'해리포터',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Ron&amp;nbsp;Weasley'&amp;nbsp;:&amp;nbsp;'론&amp;nbsp;위즐리',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Hermione&amp;nbsp;Granger'&amp;nbsp;:&amp;nbsp;'헐마이니'&lt;br /&gt;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;print(dictionary);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;Map&amp;lt;String,&amp;nbsp;bool&amp;gt;&amp;nbsp;isHarryPotter={&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Harry&amp;nbsp;porter'&amp;nbsp;:&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Ron&amp;nbsp;Weasley'&amp;nbsp;:&amp;nbsp;&amp;nbsp;true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Ironman'&amp;nbsp;:&amp;nbsp;&amp;nbsp;false&lt;br /&gt;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;print(isHarryPotter);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;isHarryPotter.addAll({&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Spiderman'&amp;nbsp;:&amp;nbsp;false&lt;br /&gt;&amp;nbsp;&amp;nbsp;});&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;isHarryPotter&amp;nbsp;변수에&amp;nbsp;Spiderman&amp;nbsp;추가&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;print(isHarryPotter['Ironman']);&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;원하는&amp;nbsp;key의&amp;nbsp;값을&amp;nbsp;가져올수&amp;nbsp;있음&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;key&amp;nbsp;Ironman의&amp;nbsp;value인&amp;nbsp;false가&amp;nbsp;나옴.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;isHarryPotter['Hulk']&amp;nbsp;=&amp;nbsp;false;&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;isHarryPotter.addAll&amp;nbsp;({&amp;nbsp;'Hulk':&amp;nbsp;false});&amp;nbsp;와&amp;nbsp;같음.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;isHarryPotter['Spiderman']&amp;nbsp;=&amp;nbsp;true;&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;false&amp;nbsp;였던&amp;nbsp;값을&amp;nbsp;true로&amp;nbsp;바꿀수&amp;nbsp;있음.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;isHarryPotter.remove('Harry&amp;nbsp;Ptter');&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;해리포터가&amp;nbsp;지워짐.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;print(isHarryPotter.keys);&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;key값만&amp;nbsp;모두&amp;nbsp;가져오는&amp;nbsp;것.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;print(isHarryPotter.values);&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;value값만&amp;nbsp;모두&amp;nbsp;가져오는&amp;nbsp;것&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;//Set&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Key와&amp;nbsp;Value의&amp;nbsp;짝이&amp;nbsp;아니라&amp;nbsp;리스트처럼&amp;nbsp;나열됨&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;하지만&amp;nbsp;List는&amp;nbsp;중복값&amp;nbsp;들어가지만&amp;nbsp;Set에는&amp;nbsp;안들어감&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;final&amp;nbsp;Set&amp;lt;String&amp;gt;&amp;nbsp;names&amp;nbsp;=&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Code&amp;nbsp;Factory',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Flutter',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Blackpink',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'Flutter'&lt;br /&gt;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;print(names);&lt;br /&gt;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Flutter&amp;nbsp;가&amp;nbsp;두개&amp;nbsp;들어갔으니&amp;nbsp;하나만&amp;nbsp;나옴.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;names.add('Jenny');&lt;br /&gt;&amp;nbsp;&amp;nbsp;//제니&amp;nbsp;추가&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;names.remove('Jenny');&lt;br /&gt;&amp;nbsp;&amp;nbsp;//제니&amp;nbsp;빼기&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;print(names.contains('Flutter'));&lt;br /&gt;&amp;nbsp;&amp;nbsp;//Flutter가&amp;nbsp;들어가있으면&amp;nbsp;true,&amp;nbsp;없으면&amp;nbsp;False&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;//if&amp;nbsp;문&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;int&amp;nbsp;total&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;List&amp;lt;int&amp;gt;&amp;nbsp;numbers&amp;nbsp;=&amp;nbsp;[1,2,3,4,5,6];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;for(int&amp;nbsp;i&amp;nbsp;=0;&amp;nbsp;i&amp;lt;&amp;nbsp;numbers.length;&amp;nbsp;i++){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total&amp;nbsp;+=&amp;nbsp;numbers[i];&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;//&amp;nbsp;21&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;print(total);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;for&amp;nbsp;(int&amp;nbsp;number&amp;nbsp;in&amp;nbsp;numbers){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total&amp;nbsp;+=&amp;nbsp;number;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;//&amp;nbsp;21&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;//while&amp;nbsp;loop&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;while(total&amp;nbsp;&amp;lt;&amp;nbsp;10){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;total&amp;nbsp;+=&amp;nbsp;1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//named&amp;nbsp;parameter&amp;nbsp;-&amp;nbsp;이름이&amp;nbsp;있는&amp;nbsp;파라미터&amp;nbsp;(순서가&amp;nbsp;중요하지&amp;nbsp;않다.)&lt;br /&gt;&lt;br /&gt;void&amp;nbsp;addNumbers({&amp;nbsp;//int로&amp;nbsp;값을&amp;nbsp;돌려준다&amp;nbsp;//void는&amp;nbsp;값을&amp;nbsp;돌려주지&amp;nbsp;않는다.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;x&amp;nbsp;=&amp;nbsp;10,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;y&amp;nbsp;=&amp;nbsp;20,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;int&amp;nbsp;z&amp;nbsp;=&amp;nbsp;30&lt;br /&gt;})&amp;nbsp;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;int&amp;nbsp;sum&amp;nbsp;=&amp;nbsp;x&amp;nbsp;+&amp;nbsp;y&amp;nbsp;+&amp;nbsp;z;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;print('x&amp;nbsp;:&amp;nbsp;$x');&lt;br /&gt;&amp;nbsp;&amp;nbsp;print('x&amp;nbsp;:&amp;nbsp;$y');&lt;br /&gt;&amp;nbsp;&amp;nbsp;print('x&amp;nbsp;:&amp;nbsp;$z');&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;if&amp;nbsp;(sum&amp;nbsp;%&amp;nbsp;2&amp;nbsp;==&amp;nbsp;0){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(&quot;짝수입니다.&quot;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;else{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print('홀수입니다.');&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;//arrow&amp;nbsp;함수&lt;br /&gt;//&amp;nbsp;=&amp;gt;&lt;br /&gt;&lt;br /&gt;void&amp;nbsp;main(){&lt;br /&gt;Operation&amp;nbsp;operation&amp;nbsp;=&amp;nbsp;add;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;int&amp;nbsp;result&amp;nbsp;=&amp;nbsp;operation(10,20,30);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;print(result);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;operation&amp;nbsp;=&amp;nbsp;subtract;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;int&amp;nbsp;result2&amp;nbsp;=&amp;nbsp;operation(10,20,30);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;print(result2);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;}&lt;br /&gt;int&amp;nbsp;result3&amp;nbsp;=&amp;nbsp;calculate(30,40,50,&amp;nbsp;add);&lt;br /&gt;&lt;br /&gt;print(result3);&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;signature&lt;br /&gt;typedef&amp;nbsp;Operation&amp;nbsp;=&amp;nbsp;int&amp;nbsp;Function(int&amp;nbsp;x,&amp;nbsp;int&amp;nbsp;y,&amp;nbsp;int&amp;nbsp;z);&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;더하기&lt;br /&gt;int&amp;nbsp;add&amp;nbsp;(int&amp;nbsp;x,&amp;nbsp;int&amp;nbsp;y,&amp;nbsp;int&amp;nbsp;z)&amp;nbsp;=&amp;gt;&amp;nbsp;x&amp;nbsp;+&amp;nbsp;y&amp;nbsp;+&amp;nbsp;z;&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;빼기&lt;br /&gt;int&amp;nbsp;subtract(int&amp;nbsp;x,&amp;nbsp;int&amp;nbsp;y,&amp;nbsp;int&amp;nbsp;z)&amp;nbsp;=&amp;gt;&amp;nbsp;x&amp;nbsp;-y&amp;nbsp;-z;&lt;br /&gt;&lt;br /&gt;//&amp;nbsp;계산&lt;br /&gt;int&amp;nbsp;calcultate&amp;nbsp;(int&amp;nbsp;x,&amp;nbsp;int&amp;nbsp;y,&amp;nbsp;int&amp;nbsp;z,&amp;nbsp;Operation&amp;nbsp;operation){&lt;br /&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;operation(x,y,z);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>개인공부/Flutter</category>
      <author>무제1351</author>
      <guid isPermaLink="true">https://responsibility.tistory.com/199</guid>
      <comments>https://responsibility.tistory.com/199#entry199comment</comments>
      <pubDate>Wed, 28 Sep 2022 19:59:16 +0900</pubDate>
    </item>
    <item>
      <title>운영체제 공룡책 - Chapter 5. CPU 스케줄링</title>
      <link>https://responsibility.tistory.com/194</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 5. CPU 스케줄링&lt;/h3&gt;
&lt;ol data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;기본 개념&lt;/li&gt;
&lt;li&gt;스케줄링 기준&lt;/li&gt;
&lt;li&gt;스케줄링 알고리즘&lt;/li&gt;
&lt;li&gt;스레드 스케줄링&lt;/li&gt;
&lt;li&gt;다중 처리기 스케줄링&lt;/li&gt;
&lt;li&gt;실시간 CPU 스케줄링&lt;/li&gt;
&lt;li&gt;운영체제 사례들&lt;/li&gt;
&lt;li&gt;알고리즘의 평가&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Chapter 5. CPU 스케줄링&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;최신 운영체제에서는 실질적으로 운영체제는 프로세스가 아니라 커널 수준 스레드를 스케줄 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;5.1 기본 개념 -p220&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;어느 한 순간에 다수의 프로세스를 메모리 내에 유지한다. 어떤 프로세스가 대기해야 할 경우, 운영체제는 CPU를 그 프로세스로부터 회수해 다른 프로세스에 할당한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;5.1.1 CPU-I/O 버스트 사이클 -p220&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;프로세스 실행은 CPU 실행과 I/O 대기의 사이클로 구성된다. 프로세스 실행은 CPU 버스트(burst)로 시작된다. 뒤이어 I/O 버스트가 발생한다. 결국 마지막 CPU 버스트는 또 다른 I/O 버스트가 뒤따르는 대신, 실행을 종료하기 위한 요청과 함께 끝난다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;5.1.2 CPU 스케줄러 -p220&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;CPU가 유휴 상태가 될 때마다, 운영체제는 준비 큐에 있는 프로세스 중에서 하나를 선택해 실행해야 한다. 선택 절차는 CPU 스케줄러에 의해 수행된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;5.1.3 선점 및 비선점 스케줄링 -p221&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;CPU 스케줄링 결정은 다음의 네 가지 상황에서 발생할 수 있다.&lt;/p&gt;
&lt;p&gt;1. 한 프로세스가 실행 상태에서 대기 상태로 전환될 때 (예를 들어, I/O 요청이나 자식 프로세스가 종료되기를 기다리기 위해 wait()를 호출할 때)&lt;/p&gt;
&lt;p&gt;2. 프로세스가 실행 상태에서 준비 완료 상태로 전환될 때 ( 예를 들어, 인터럽트가 발생할 때)&lt;/p&gt;
&lt;p&gt;3. 프로세스가 대기 상태에서 준비 완료 상태로 전환될 때 (예를 들어, I/O의 종료시 )&lt;/p&gt;
&lt;p&gt;4. 프로세스가 종료할 때.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;상황 1과 4의 경우, 스케줄링 면에서는 선택의 여지가 없다. 실행을 의해 새로운 프로세스 (준비 큐에 하나라도 존재할 경우) 가 반드시 선택되어야 한다. 그러나 상황2와 3을위해서는 선택의 여지가 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;상황 1과 4에서만 스케줄링이 발생할 경우, 우리는 이러한 스케줄링 방법을&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;비선점 ( nonpreemptive) 또는 협조적(cooperative&lt;/b&gt;) 이라고 한다. 그렇지 않으면, 그것은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;선점(preemptive)&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;라고 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;5.1.4 디스패치 -p223&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;CPU 스케줄링 기능에 포함된 또 하나의 요소는 디스패처 ( dispatcher ) 이다. 디스패처는 CPU 코어의 제어를 CPU 스케줄러가 선택한 프로세스에 주는 모듈이며 다음과 같은 작업을 포함한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 프로세스에서 다른 프로세스로 문맥을 교환하는 일&lt;/li&gt;
&lt;li&gt;사용자 모드로 전환하는 일&lt;/li&gt;
&lt;li&gt;프로그램을 다시 시작하기 위해 사용자 프로그램의 적절한 위치로 이동 (jump) 하는 일&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;디스패처는 모든 프로세스의 문맥 교환 시 호출 되므로, 가능한 한 최고로 빨리 수행되어야 한다. 디스패처가 하나의 프로세스를 정지하고 다른 프로세스의 수행을 시작하는데까지 소요되는 시간을 디스패치 지연 ( dispatch latency ) 이라고 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;5.2 스케줄링 기준 -p225&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;CPU 스케줄링 알고리즘을 비교하기 위한 여러 기준이 제시되었다. 비교하는 데 사용되는 특성에 따라서 최선의 알고리즘을 결정하는 데 큰 차이가 발생한다. 사용되는 기준은 다음을 포함한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1. CPU 이용률 ( utilization ):&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;실제 시스템에서는 40% 에서 (부하가 적은 시스템의 경우) 90%까지의 (부하가 큰 시스템의 경우) 범위를 가져야한다. (Linux, maxOS 및 UNIX 시스템에서 top 명령을 사용하여 CPU 이용률을 얻을 수 있다.)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2. 처리량 ( throughput ):&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;작업량 측정의 한 방법은 단위 시간당 완료된 프로세스의 개수다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3. 총처리 시간 ( turnaround time) :&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;대기 시간은 준비 큐에서 대기하면서 보낸 시간의 합이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;4. 응답 시간 ( response time ):&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;대화식 시스템 ( interactice system) 에서, 총처리 시간은 최선의 기준이 아닐 수도 있다. 프로세스가 어떤 출력을 매우 일찍 생성하고, 앞서의 결과가 사용자에게 출력되는 사이에 새로운 결과를 얻으려고 연산을 계속 하는 경우가 종종 있다.&lt;/p&gt;
&lt;p&gt;따라서 또 다른 기준은 하나의 요구를 제출한 후 첫 번째 응답이 나올 때까지의 시간이다. 응답 시간이라고 하는 이 기준은 응답이 시작되는 데까지 걸리는 시간이지, 그 응답을 출력하는데 걸리는 시간은 아니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;CPU 이용률과 처리량을 최대화하고 총처리 시간, 대기 시간, 응답 시간을 최소화 하는 것이 바람직하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;5.3 스케줄링 알고리즘 -p226&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;대부분의 최신 CPU 아키텍처에는 여러 개의 처리 코어가 있지만 이러한 스케줄링 알고리즘을 처리 코어가 하나뿐이라고 가정하고 설명한다. 즉, 한 개의 처리 코어를 가진 CPU가 한 개인 시스템이므로 한 번에 하나의 프로세스만 실행할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;5.3.1 선입 선처리 스케줄링 -p226&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;가장 간단한 CPU 스케줄링 알고리즘은 선입 선처리(FCFS) 스케줄링 알고리즘이다. CPU를 먼저 요청하는 프로세스가 CPU를 먼저 할당받는다. 프로세스가 준비 큐에 진이하면, 이 프로세스의 프로세스 제어 블록(PCB)을 큐의 끝에 연결한다. CPU가 가용상태가 되면, 준비 큐의 앞부분에 있는 프로세스에 할당된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;선입 선처리 스케줄링 알고리즘은 비선점형 이라는 것을 주의하자. 일단 CPU가 한 프로세스에 할당되면, 그 프로세스가 종료하든지 또는 I/O 처리를 요구하든지 하여 CPU를 방출할 때까지 CPU를 점유한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;5.3.2 최단 작업 우선 스케줄링 Shortest Job First Scheduling-p228&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;CPU가 이용 가능해지면, 가장 작은 다음 CPU 버스트를 가진 프로세스에 할당한다. SJF 스케줄링 알고리즘은 주어진 프로세스 집합에 대해 최소의 평균대기 시간을 가진다는 점에서 최적임을 증명할 수 있다.&lt;/p&gt;
&lt;p&gt;SJF 알고리즘은 선점형이거나 또는 비선점형일 수 있다. 새로운 프로세스가 현재 실행되고 있는 프로세스의 남은 시간보다도 더 짧은 CPU 버스트를 가질 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;5.3.3 라운드 로빈 스케줄링 Round-Robin Scheduling -p230&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;라운드 로빈 스케줄링 알고리즘은 선입 선처리 스케줄링과 유사하지만 시스템이 프로세스들 사이를 옮겨 다닐 수 있도록 선점이 추가된다.&lt;/p&gt;
&lt;p&gt;시간할당량 또는 타임슬라이스라고 하는 작은 단위의 시간을 정의한다.&lt;/p&gt;
&lt;p&gt;준비 큐는 원형 큐( circular queue ) 로 동작한다. CPU스케줄러는 준비큐를 돌면서 한 번에 한 프로세스에 한 번의 시간 할당량 동안 CPU를 할당한다. 새로운 프로세스들은 준비 큐의 꼬리에 추가된다. CPU 스케줄러는 준비 큐에서 첫 번째 프로세스를 선택해 한 번의 시간 할당량 이후에 인터럽트를 걸도록 타이머를 설정한 후, 프로세스를 디스패치 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;라운드 로빈 스케줄링 알고리즘에서는, 유일하게 실행 가능한 프로세스가 아니라면 연속적으로 두 번 이상의 시간 할당량을 할당받는 프로세스는 없다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;라운드 로빈 알고리즘의 성능은 시간 할당량의 크기에 매우 많은영향을 받는다. 극단적으로 시간 할당량이 매우 크면 선입선처리(FCFS) 정책과 같다.&lt;/p&gt;
&lt;p&gt;반대로 매우 작으면(ex 1마이크로초) 라운드 로빈 정책은 매우 많은 문맥 교환을 야기 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;경험상 CPU 버스트의 80% 는 시간 할당량보다 짧아야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;5.3.4 우선순위 스케줄링 Priority Scheduling -p233&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;우선순위가 각 프로세스들에 연관되어 있으며, CPU는 가장 높은 우선순위를 가진 프로세스에 할당된다. 우선순위가 같은 프로세스들은 선입 선처리 순서로 스케줄된다. SJF 알고리즘은 우선순위가 다음 CPU 버스트의 역인 단순한 우선순위 알고리즘 이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;우선순위는 내부적 또는 외부적으로 정의될 수 있다. 내부적으로 정의된 우선순위는 프로세스의 우선순위를 계산하기 위해 어떤 측정 갖능한 양들을 사용한다. 예를 들어,&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;시간 제한,&lt;/li&gt;
&lt;li&gt;메모리 요구,&lt;/li&gt;
&lt;li&gt;열린 파일의 수,&lt;/li&gt;
&lt;li&gt;평균 I/O 버스트의 평균 CPU 버스트&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;에 대한 비율 등이 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;외부적 우선순위는 프로세스의 중요성, 컴퓨터 사용을 위해 지불되는 비용의 유형과 양, 그 작업을 후원하는 부서 그리고 정치적인 요인 등이 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;우선순위 스케줄링은 선점형이거나 또는 비선점형이 될 수 있다. 프로세스가 준비 큐에 도착하면, 새로 도착한 프로세스의 우선순위를 현재 실행 중인 프로세스의 우선 순위와 비교한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;선점형 우선순위 스케줄링 알고리즘은 새로 도착한 프로세스의 우선순위가 현재 실행되는 프로세스의 우선순위보다 높다면 CPU를 선점한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;비선점형 우선순위 스케줄링 알고리즘은 단순히 준비완료 큐의 머리 부분에 새로운 프로세스를 넣는다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;우선순위 스케줄링 알고리즘의 주요 문제는 무한 봉쇄 (indefinite blocking) 또는 기아 상태 ( starvation )이다.&lt;/p&gt;
&lt;p&gt;낮은 우선순위의 프로세스들이 무한히 봉쇄되는 문제에 대한 한 가지 해결 방안은 노화(aging)이다. 노화는 오랫동안 시스템에서 대기하는 프로세스들의 우선순위를 점진적으로 증가 시킨다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;5.3.5 다단계 큐 스케줄링&amp;nbsp; -p235&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;우선순위 스케줄링은 우선순위가 가장 높은 큐에서 프로세스를 스케줄 한다. 다단계 큐 라고 하는 이 방법은 우선순위 스케줄링이 라운드 로빈과 결합한 경우에도 효과적이다. 우선순위가 가장 높은 큐에 여러 프로세스가 있는 경우 라운드 로빈 순서로 실행된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;5.3.6 다단계 피드백 큐 스케줄링 -p237&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;다단계 피드백 큐 스케줄링 알고리즘에서는 프로세스가 큐들 사이를 이동하는 것을 허용한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;일반적으로, 다단계 피드백 큐 스케줄러는 다음의 매개변수에 의해 정의된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;큐의 개수&lt;/li&gt;
&lt;li&gt;각 큐를 위한 스케줄링 알고리즘&lt;/li&gt;
&lt;li&gt;한 프로세스를 높은 우선순위 큐로 올려주는 시기를 결정하는 방법&lt;/li&gt;
&lt;li&gt;한 프로세스를 낮은 우선순위 큐로 강등시키는 시기를 결정하는 방법&lt;/li&gt;
&lt;li&gt;프로세스에 서비스가 필요할 때 프로세스가 들어갈 큐를 결정하는 방법&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;unnamed.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;339&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/swG8u/btqPRAry0jI/dyhQuAOZp0IDkq56KMsD31/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/swG8u/btqPRAry0jI/dyhQuAOZp0IDkq56KMsD31/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/swG8u/btqPRAry0jI/dyhQuAOZp0IDkq56KMsD31/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FswG8u%2FbtqPRAry0jI%2FdyhQuAOZp0IDkq56KMsD31%2Fimg.png&quot; data-filename=&quot;unnamed.png&quot; data-origin-width=&quot;512&quot; data-origin-height=&quot;339&quot; data-ke-mobilestyle=&quot;widthContent&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;5.4 스레드 스케줄링 Thread Scheduling -p239&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;대부분의 최신 운영체제에서는 스케줄 되는 대상은 프로세스가 아니라 커널 수준 스레드이다. 이 절에서는 사용자 수준과 커널 수준 스레드의 스케줄링에 관한 쟁점을 탐구하고 Pthread의 스케줄링 사례를 제공한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;5.4.1 경쟁 범위 Contention Scope -p239&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;다대일과 다대다 모델을 구현하는 시스템에서는 스레드 라이브러리는 사용자 수준 스레드를 가용한 LWP 상에서 스케줄한다. 이러한 기법은 동일한 프로세스에 속한 스레드들 사이에서 CPU를 경쟁하기 때문에 &lt;b&gt;프로세스-경쟁-범위(process-contention scope, PCS)&lt;/b&gt;로 알려져 있다.&lt;/p&gt;
&lt;p&gt;CPU상에 어느 커널 스레드를 스케줄 할 것인지 결정하기 위해서 커널은 &lt;b&gt;시스템-경쟁-범위(system-contention scope, SCS)&lt;/b&gt;를 사용한다.&lt;/p&gt;
&lt;p&gt;Windows와 Linux 같은 일대일 모델을 사용하는 시스템은 오직 SCS만을 사용하여 스케줄한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;전형적으로 PCS는 우선순위에 따라 행해진다. 즉 스케줄러는 가장 높은 우선순위를 가진 실행 가능한 프로세스를 선택한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;5.4.2 Pthread 스케줄링 -p240&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;Pthreads는 다음과 같은 범위의 값을 구분한다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;PTHREAD SCOPE PROCESS 는 PCS 스케줄링을 사용하여 스레드를 스케줄한다.&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;PTHREAD SCOPE SYSTEM 는 SCS 스케줄링을 사용하여 스레드를 스케줄한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;5.5 다중 처리기 스케줄링 Multiple-Processor Scheduling -p242&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;다중 처리기라는 용어는 여러 개의 물리적 프로세서를 제공하는 시스템을 말하며, 각 프로세서에는 하나의 단일 코어 CPU가 포함되어 있다.&lt;/p&gt;
&lt;p&gt;다중 처리기는 다음 시스템 아키텍처들에 사용할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;다중 코어 CPU&lt;/li&gt;
&lt;li&gt;다중 스레드 코어&lt;/li&gt;
&lt;li&gt;NUMA 시스템&lt;/li&gt;
&lt;li&gt;이기종 다중처리&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;5.5.1 다중처리기 스케줄리에 대한 접근 방법 -p242&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;비대칭 다중 처리기 (asymmetric multiprocessing )&lt;/b&gt;는 오직 하나의 코어만 시스템 자료구조에 접근하여 자료 공유의 필요성을 배제하기 때문에 간단하다. 이 접근의 단점은 마스터 서버가 전체 시스템 성능을 저하할 수 있는 병목이 된다는 것이다.&lt;/p&gt;
&lt;p&gt;다중 처리기를 지원하기 위한 표준 접근 방식은&lt;b&gt; 대칭 다중 처리(symmetric multi-processing, SMP)&lt;/b&gt;이며 각 프로세서는 스스로 스케줄링 할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;스케줄 대상이 되는 스레드를 관리하기 위한 두 가지 전략&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;모든 스레드가 공통 준비 큐에 있을 수 있다.&lt;/li&gt;
&lt;li&gt;각 프로세서는 자신만의 스레드 큐를 가질 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;organization_of_ready_queues.png&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;357&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cyvKWq/btqPWZK8TJ9/IdqoWsdiMKpwOwKDVodhK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cyvKWq/btqPWZK8TJ9/IdqoWsdiMKpwOwKDVodhK0/img.png&quot; data-alt=&quot;준비 큐의 구조&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cyvKWq/btqPWZK8TJ9/IdqoWsdiMKpwOwKDVodhK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcyvKWq%2FbtqPWZK8TJ9%2FIdqoWsdiMKpwOwKDVodhK0%2Fimg.png&quot; data-filename=&quot;organization_of_ready_queues.png&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;357&quot; data-ke-mobilestyle=&quot;widthContent&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;준비 큐의 구조&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;5.5.2 다중 코어 프로세서 Multicore Processor -p243&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;현대 컴퓨터 하드웨어는 동일한 물리적인 칩 안에 여러 개의 처리 코어를 장착하여 &lt;b&gt;다중 코어 프로세서 (multicore processor)&lt;/b&gt; 가 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;프로세서가 메모리에 접근할 때 데이터가 가용해지기를 기다리면서 많은 시간을 소비하는 &lt;b&gt;메모리 스톨(memory stall)&lt;/b&gt;이라고 하는 이 상황은 최신 프로세서가 메모리보다 훨씬 빠른 속도로 작동하기 때문에 주로 발생한다. 이러한 상황을 해결하기 위해 최근의 많은 하드웨어 설계는 다중 스레드 처리 코어를 구현하였다. 메모리를 기다리는 동안 하나의 &lt;b&gt;하드웨어 스레드&lt;/b&gt;가 중단되면 코어가 다른 스레드로 전환할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;운영체제 관점에서 각 하드웨어 스레드는 명령어 포인터 및 레지스터 집합과 같은 구조적 상태를 유지하므로 소프트웨어 스레드를 실행할 수 있는 논리적 CPU로 보인다. 칩 다중 스레딩 (chip multi-threading, CMT) 로 알려져있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;5.5.3 부하 균등화 Load Balacing - p247&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;부하 균등화(load balacing)는 SMP 시스템의 모든 처리기 사이에 부하가 고르게 배분되도록 시도한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;부하균등화는 통상 각 처리기가 실행할 스레드를 위한 자기 자신만의 준비 큐를 가지고 있는 시스템에서만 필요한 기능이라는 것을 주의해야 한다. 공통의 실행 큐만 있는 시스템에서는 한 처리기가 쉬게 되면 곧바로 공통큐에서 새로운 프로세스를 선택하여&amp;nbsp; 실행하기 때문에 부하 균등화는 필요하지 않다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;5.5.4 처리기 선호도 Processor Affinity-p247&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;스레드에 의해 가장 최근에 접근된 데이터가 그 처리기의 캐시를 채우게 된다. 그 결과 스레드에 의한 잇따른 메모리 접근은 캐시 메모리에서 만족한다. (warm cache 라고 함). 이제 스레드가 다른 처리기로 이주한다면 어떤 일이 일어날까. 첫 번째 프로세서의 캐시 메모리의 내용은 무효화 되어야 하며 두번째 프로세서의 캐시는 다시 채워져야 한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;캐시 무효화 및 다시 채우는 비용이 많이 들기 때문에 SMP를 지원하는 대부분의 운영체제는 스레드를 한 프로세서에서 다른 프로세서로 이주시키지 않고 대신 같은 프로세서에서 계속 실행시키면서 warm cache 를 이용하려고 한다. 이를 프로세서 선호도 라고 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;시스템의 메인 메모리 아키텍처는 프로세서 선호도 문제에도 영향을 줄 수 있다. 시스템 연결망을 통해 NUMA 시스템의 모든 CPU가 하나의 물리적 주소 공간을 공유할 수 있지만 CPU는 다른 CPU의 로컬 메모리 보다 자신의 로컬 메모리에 더 빠르게 액세스 할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;흥미롭게도 부하 균등은 종종 프로세서 선호도의 이점을 상쇄한다. 즉, 동일한 프로세서에서 스레드를 계쏙 실행하면 스레드가 해당 프로세서의 캐시 메모리에 있는 데이터를 활용할 수 있다는 이점이 있다. 스레드를 한 프로세서에서 다른 프로세서로 이동히야 부하를 균등하게 조정하면 이러한 이점이 사라진다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;5.5.5 이기종 다중 처리 Heterogeneous Multiprocessing -p249&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;모바일 시스템에는 현재 다중 코어 아키텍처가 채택되어 있지만 일부 시스템은 동일한 명령어 집합을 실행하지만 전력 소비를 유휴 수준으로 조정하는 기능을 포함하여 클록 속도 및 전력 관리 측면에서 차이가 나는 코어를 사용하여 설계되었다. 이러한 시스템을 이기종 다중 처리 (heterogeneous multiprocessing, HMP)라고 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개인공부/운영체제 공룡책 10판</category>
      <category>CPU</category>
      <category>CPU스케줄링</category>
      <category>공룡책</category>
      <category>스케줄링</category>
      <category>운영체제</category>
      <author>무제1351</author>
      <guid isPermaLink="true">https://responsibility.tistory.com/194</guid>
      <comments>https://responsibility.tistory.com/194#entry194comment</comments>
      <pubDate>Thu, 10 Dec 2020 09:41:08 +0900</pubDate>
    </item>
    <item>
      <title>운영체제 - chapter 4. 스레드와 병행성</title>
      <link>https://responsibility.tistory.com/183</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 4. 스레드와 병행성&lt;/h3&gt;
&lt;ol data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;개요&lt;/li&gt;
&lt;li&gt;다중 코어 프로그래밍&lt;/li&gt;
&lt;li&gt;다중 스레드 모델&lt;/li&gt;
&lt;li&gt;스레드 라이브러리&lt;/li&gt;
&lt;li&gt;암묵적 스레딩&lt;/li&gt;
&lt;li&gt;스레드와 관련된 문제들&lt;/li&gt;
&lt;li&gt;운영체제 사례&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;4.1 개요 -p176&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;스레드는 CPU 이용의 기본 단위이다. 스레드는 스레드 ID, 프로그램 카운터 (PC), 레지스터 집합, 그리고 스택으로 구성된다. 스레드는 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션, 그리고 열린 파일이나 신호와 같은 운영체제 자원들을 공유 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4.1.1 동기 Motivation-p176&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;하나의 응용은 몇 개의 실행 흐름을 가진 독립적인 프로세스로 구현된다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;-다중 스레드 응용 프로그램의 몇 가지 예&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;이미지 모음에서 사진 축소판을 만드는 응용 프로그램은 별도의 스레드를 사용하여 개별 이미지에서 축소판을 생성할 수 있다.&lt;/li&gt;
&lt;li&gt;웹 브라우저는 하나의 스레드가 이미지 또는 텍스트를 표시하고 다른 스레드는 네트워크에서 데이터를 검색하도록 할 수 있다.&lt;/li&gt;
&lt;li&gt;워드 프로세서에는 그래픽을 표시하는 스레드, 사용자의 키 입력에 응답하는 또 다른 스레드 및 백그라운드에서 맞춤법 및 문법 검사를 검사를 수행하는 세 번째 스레드가 있을 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;img1.daumcdn.jpg&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;406&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bqa29N/btqOKXn4KZ2/KthJJKe2bVKDXsuidRX6o0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bqa29N/btqOKXn4KZ2/KthJJKe2bVKDXsuidRX6o0/img.jpg&quot; data-alt=&quot;싱글 스레드와 멀티 스레드 차이&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bqa29N/btqOKXn4KZ2/KthJJKe2bVKDXsuidRX6o0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbqa29N%2FbtqOKXn4KZ2%2FKthJJKe2bVKDXsuidRX6o0%2Fimg.jpg&quot; data-filename=&quot;img1.daumcdn.jpg&quot; data-origin-width=&quot;704&quot; data-origin-height=&quot;406&quot; data-ke-mobilestyle=&quot;widthContent&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;싱글 스레드와 멀티 스레드 차이&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;img1.daumcdn-1.jpg&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;227&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cuqZJ1/btqOMpEz8Vj/QRJozW1DUg5J2z0LU7pLD1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cuqZJ1/btqOMpEz8Vj/QRJozW1DUg5J2z0LU7pLD1/img.jpg&quot; data-alt=&quot;웹 서버가 다중 스레드화 되면, 서버는 클라이언트의 요청을 listen 하는 별도의 스레드를 생성한다. 요청이 들어오면 다른 프로세스를 생성하는 것이 아니라, 요청을 서비스할 새로운 스레드를 생성하고 추가적인 요청을 listen 하기 위한 작업을 재개한다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cuqZJ1/btqOMpEz8Vj/QRJozW1DUg5J2z0LU7pLD1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcuqZJ1%2FbtqOMpEz8Vj%2FQRJozW1DUg5J2z0LU7pLD1%2Fimg.jpg&quot; data-filename=&quot;img1.daumcdn-1.jpg&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;227&quot; data-ke-mobilestyle=&quot;widthContent&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;웹 서버가 다중 스레드화 되면, 서버는 클라이언트의 요청을 listen 하는 별도의 스레드를 생성한다. 요청이 들어오면 다른 프로세스를 생성하는 것이 아니라, 요청을 서비스할 새로운 스레드를 생성하고 추가적인 요청을 listen 하기 위한 작업을 재개한다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;대부분의 운영체제 커널도 일반적으로 다중 스레드이다. 예를 들어 Linux 시스템에서 시스템을 부트하는 동안 여러 커널 스레드가 생성된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4.1.2 장점 -p178&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;1. 응답성&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;대화형 응용을 다중 스레드화하면 응용 프로그램의 일부분이 봉쇄되거나, 응용 프로그램이 긴 작업을 수행하더라도 프로그램의 수행이 계속되는 것을 허용함으로써, 사용자에 대한 응답성을 증가시킨다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;2. 자원 공유&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;프로세스는 공유 메모리와 메시지 전달 기법을 통해서만 자원을 공유할 수 있다. 스레드는 자동으로 그들이 속한 프로세스의 자원들과 메모리를 공유한다. 코드와 데이터 공유의 이점은 한 응용 프로그램이 같은 주소 공간 내에 여러 개의 다른 작업을 하는 스레드를 가질 수 있다는 점이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;3. 경제성&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;스레드는 자신이 속한 프로세스의 자원들을 공유하기 때문에, 스레드를 생성하고 문맥 교환하는 것이 더욱더 경제적이다. 오버헤드의 차이를 경험적으로 측정하는 것은 어려울수 있지만, 문맥교환은 일반적으로 프로세스 사이보다 스레드 사이에서 더 빠르다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;4. 규모 적응성&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;다중 스레드의 이점은 다중 처리기 구조에서 더욱 증가 할 수 있다. 다중 처리기 구조에서는 각각의 스레드가 다른 처리기에서 &lt;b&gt;병렬&lt;/b&gt;로 수행 될 수 있기 때문이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;4.2 다중 코어 프로그래밍 -p178&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;각 코어는 운영체제에 별도의 CPU로 보인다. 이러한 시스템을 다중 코어라고 하며 다중 스레드 프로그래밍은 이러한 여러 컴퓨팅 코어를 효율적으로 사용하고 병행성을 향상시키는 기법을 제공한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;병행 시스템:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;모든 작업이 진행되게 하여 둘 이상의 작업을 지원한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;병렬 시스템:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;둘 이상의 작업을 동시에 수행할 수 있다. 따라서 병렬성 없이 병행성을 가질 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock widthContent&quot; data-filename=&quot;thread-6-638.jpg&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;479&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/s5oyv/btqON8vAY77/nLPRrwCr7Qbo0zgGFi0B40/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/s5oyv/btqON8vAY77/nLPRrwCr7Qbo0zgGFi0B40/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/s5oyv/btqON8vAY77/nLPRrwCr7Qbo0zgGFi0B40/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fs5oyv%2FbtqON8vAY77%2FnLPRrwCr7Qbo0zgGFi0B40%2Fimg.jpg&quot; data-filename=&quot;thread-6-638.jpg&quot; data-origin-width=&quot;638&quot; data-origin-height=&quot;479&quot; data-ke-mobilestyle=&quot;widthContent&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4.2.1 프로그래밍 도전과제 -p179&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;응용 프로그래머는 기존 프로그램을 다중 스레드를 사용하도록 수정해야 하고 새로운 다중스레드 프로그램을 설계해야 하는 도전에 당면해 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;1. 태스크 인식 ( indentifying tasks )&lt;/p&gt;
&lt;p&gt;응용을 분석하여 독립된 병행 가능 태스크로 나눌 수 있는 영역을 찾는 작업이 필요하다. 이상적으로는 태스크는 서로 독립적이고 따라서 개별 코어에서 병렬 실행될 수 있어야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;2. 균형&lt;/p&gt;
&lt;p&gt;병렬로 실행될 수 있는 태스크를 찾아내는 것도 중요하지만 찾아진 부분들이 전체 작업에 균등한 기여도를 가지도록 태스크로 나누는 것도 매우 중요하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;3. 데이터 분리&lt;/p&gt;
&lt;p&gt;응용이 독립된 태스크로 나누어지는 것처럼, 태스크가 접근하고 조작하는 데이터 또한 개별 코어에서 사용할 수 있도록 나누어져야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;4. 데이터 종속성&lt;/p&gt;
&lt;p&gt;태스크가 접근하는 데이터는 둘 이상의 태스크 사이에 종속성이 없는지 검토되어야 한다. 한 태스크가 다른 태스크로 부터 오는 데이터에 종속적인 경우에는 프로그래머가 데이터 종속성을 수용할 수 있도록 태스크의 수행을 잘 동기화 해야한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;5. 시험 및 디버깅&amp;nbsp;&lt;/p&gt;
&lt;p&gt;프로그램이 다중 코어에서 병렬로 실행될 때, 다양한 시랳ㅇ 경로가 존재할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4.2.2 병렬 실행의 유형 -p181&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;일반적으로 데이터 병렬 실행과 태스크 병렬 실행의 두 가지 유형이 존재한다. &lt;b&gt;데이터 병렬 실행&lt;/b&gt;은 동일한 데이터의 부분집합을 다수의 계산 코어에 부냅한 뒤 각 코어에서 동일한 연산을 실행하는 데 초점을 맞춘다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;태스크 병렬 실행&lt;/b&gt;은 데이터가 아니라 태스크(스레드)를 다수의 코어에 분배한다. 각 스레드는 고유의 연산을 실행한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;기본적으로 데이터 병렬 처리에는 여러 코어에 데이터를 분배하는 것이 포함되고, 태스크 병렬 처리에는 여러 코어에 태스크를 분배하는 것이 포함된다. 그러나 데이터와 태스크 병렬 처리는 상호 배타적이지 않으며 실제로 응용 프로그램은 이 두가지 전략을 혼합하여 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;4.3 다중 스레드 모델 -p182&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;스레드를 위한 지원은 &lt;b&gt;사용자 스레드(user threads)&lt;/b&gt;를 위해서는 사용자 수준에서, 또는 &lt;b&gt;커널 스레드(kernel threads)&lt;/b&gt;를 위해서는 커널 수준에서 제공된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;사용자 스레드와 커널 스레드는 어떤 연관 관계가 존재해야한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;연관 관계를 확립하는 세 가지 일반적인 방ㄷ법인 다대일, 일대일, 다대다 모델을 살펴본다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4.3.1 다대일 모델 Many-to-One Model -p183&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;다대일(many to one) 모델은 많은 사용자 수준 스레드를 하나의 커널 스레드로 사상한다. 스레드 관리는 사용자 공간의 스레드 라이브러리에 의해 행해진다. 한 스레드가 봉쇄형 시스템을 콜을 할 경우, 전체 프로세스가 붕쇄된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다중 처리 코어의 이점을 살릴 수 없기 때문에 이 모델을 사용 중인 시스템은 거의 존재하지 않는다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4.3.2 일대일 모델 One-to-One Model&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;일대일(one-to-one) 모델은 각 사용자 스레드를 각각 하나의 커널 스레드로 사상한다. 이 모델은 하나의 스레드가 붕쇄적 시스템 콜을 호출하더라도 다른 스레드가 실행될 수 있기 때문에 다대일 모델보다 더 많은 병렬성을 제공한다. 또한 이 모델은 다중 처리기에서 다중 스레드가 병렬로 수행되는 것을 허용한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;유일한 단점&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;사용자 스레드를 만들려면 해당 커널 스레드를 만들어야 하며 많은 수의 커널 스레드가 시스템 성능에 부담을 줄 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4.3.3 다대다 모델 Many-toMany Model&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;다대다(many-to-many) 모델은 여러 개의 사용자 수준 스레드를 그보다 작은 수, 혹은 같은 수의 커널 스레드로 멀티 플렉스 한다. 커널 스레드의 수는 응용 프로그램이나 특정 기계에 따라 결정된다 ( 응용 프로그램은 4개의 코어 시스템보다 8개의 코어 시스템에서 더 ㅁ낳은 커널 스레드를 할당 받을 수 있다.)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;개발자는 필요한 만큼 많은 사용자 수준 스레드를 생성할 수 있다. 또한, 스레드가 봉쇄형 시스템 콜을 발생시켰을 때, 커널이 다른 스레드의 수행을 스케줄 할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;다대다 모델의 변형은 여전히 많은 사용자 스레드를 적거나 같은 수의 커널 스레드로 멀티플렉스 시키지만 또한 한 사용자 스레드가 하나의 커널 스레드에만 연관되는 것을 허용한다. 이 변형은 때로 &lt;b&gt;두 수준 모델(two-level model)&lt;/b&gt;이라고 불리며 다대다 모델이 논의된 모델중 가장 융통성 있는 것으로 보이지만 실제로는 구현하기가 어렵다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;대부분의 시스템에서 처리 코어 수가 증가함에 따라 커널 스레드 수를 제한하는 것의 중요성이 줄어들었다. 결과적으로 대부분의 운영체제는 이제 일대일 모델을 사용한다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1173&quot; data-origin-height=&quot;554&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BU1Op/btqOP5k5Xkf/9Aj1u2Na7Bw8No3gd8Jg90/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BU1Op/btqOP5k5Xkf/9Aj1u2Na7Bw8No3gd8Jg90/img.png&quot; data-alt=&quot;Many to One, One to One, Many to Many&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BU1Op/btqOP5k5Xkf/9Aj1u2Na7Bw8No3gd8Jg90/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBU1Op%2FbtqOP5k5Xkf%2F9Aj1u2Na7Bw8No3gd8Jg90%2Fimg.png&quot; data-filename=&quot;img.png&quot; data-origin-width=&quot;1173&quot; data-origin-height=&quot;554&quot; data-ke-mobilestyle=&quot;widthContent&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;Many to One, One to One, Many to Many&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;4.4 스레드 라이브러리 -p185&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;스레드 라이브러리(thread library)는 프로그래머에게 스레드를 생서하고 관리하기 위한 API를 제공한다.&lt;/p&gt;
&lt;p&gt;라이브러리를 위한 모든 코드와 자료구조는 사용자 공간에 존재한다. 라이브러리의 함수를 호출하는 것은 시스템 콜이 아니라 사용자 공간의 지역 함수를 호출하게 된다는 것을 의미한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;비동기 스레딩&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;부모가 자식 스레드를 생헝한 후 부모는 자신의 실행을 재개하여 부모와 자식 스레드가 서로 독립적으로 병행하게 실행된다. 스레드가 독립적이기 때문에 스레드 사이의 데이터 공유는 거의 없다. 비동기 스레딩은 다중 스레드 서버에서 사용되는 전략이고 반응형 사용자 인터페이스를 설계하는데에도 흔히 사용된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;동기 스레딩&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;부모 스레드가 하나 이상의 자식 스레드를 생성하고 자식 스레드 모두가 종료할 때까지 기다렸다가 자신의 실행을 재개하는 방식을 말한다. 부모가 생성한 스레드는 병행하게 실행되지만 부모는 자식들의 작업이 끝날 때까지 실행을 계속할 수 없다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4.4.1 Pthread -p186&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;Pthreads는 POSIX가 스레드 생성과 동기화를 위한 제정한 표준 API다. 이것은 스레드의 동작에 관한 명세일 뿐이지 그것 자체를 구현한 것은 아니다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4.4.2 Windows 스레드 -p188&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;Windows 스레드 라이브러리를 이용하여 스레드를 생성하는 기술은 많은 점에서 Pthreads 기법과 유사하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4.4.3 Java 스레드 -p190&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;스레드는 Java 프로그램 실행의 근본적인 모델이고, Java 언어와 API는 스레드의 생성과 관리를 지원하는 풍부한 특성을 제공한다. 모든 Java 프로그램은 적어도 하나의 단일 제어 스레드를 포함하고 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;단지 main() 함수로만 이루어진 단순한 Java 프로그램 조차 JVM 내의 하나의 단일 스레드로 수행된다. Java 스레드는 JVM을 제공 하는 어떤 시스템에서도 사용할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Java 프로그램에서 스레드를 명시적으로 생성하는 데에는 두 가지 기법이 있다.&lt;/p&gt;
&lt;p&gt;1. Thread 클래스에서 파생된 새 클래스를 만들고 run() 메소드를 재정의 하는 것이다.&lt;/p&gt;
&lt;p&gt;2.&amp;nbsp; Runnable 인터페이스를 구현하는 클래스를 정의하는것. 이 인터페이스는 public void run()의 서명을 가진 단일 추상 메소드를 정의한다. Runnable을 구현하는 클래스의 run()&amp;nbsp; 메소드 코드는 별도의 스레드에서 실행된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;예시)&lt;/p&gt;
&lt;pre id=&quot;code_1606814245888&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;class Task implements Runnable{
	
    public void run(){
    	System.out.println(&quot;I am a thread.&quot;);
    }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;아래와 같이 Java 1.8부터 람다식으로 표현할 수 있다. ( Runnable을 구현하는 별도의 클래스를 정의하지 않아도 된다.!)&lt;/p&gt;
&lt;pre id=&quot;code_1606814707552&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Runnable task = () -&amp;gt; {
	System.out.println(&quot;I am a thread.&quot;);
};

Thread worker = new Thread(task);
worker.start();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Java에서 스레드를 생성하려면 &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;1.Thread 객체를 생성하고&lt;/p&gt;
&lt;p&gt;2.Runnable 을 구현하는 클래스의 인스턴스를 전달한 다음&lt;/p&gt;
&lt;p&gt;3.Thread 객체의 start() 메소드를 호출해야 한다. &lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1606814346722&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;Thread worker = new Thread (new Task());
worker.start();&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;새 Thread 객체에 대해 start() 메소드를 호출하면 두 가지 작업이 수행된다.&lt;/p&gt;
&lt;p&gt;1. 메모리가 할당되고, JVM 내에 새로운 스레드가 초기화 된다.&lt;/p&gt;
&lt;p&gt;2. run() 메소드를 호출하면 스레드가 JVM에 의해 수행될 자격을 갖게 한다. ( run() 메소드를 직접 호출하지 말것, 그 대신 start() 메소드를 호출하고 이 메소드가 사용자 대신 run() 메소드를 호출한다.)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Pthreads 및 Windows 라이브러리의 부모 스레드는 pthread_join() 및 Wait-forSingleObject()를 사용하여 각 스레드가 완료되기를 기다렸다가 계속 진행한다. Java의 join() 메소드는 유사한 기능을 제공한다. ( join()은 우리가 무시하기로 선택한 InterruptedException을 던질 수 있다.)&lt;/p&gt;
&lt;pre id=&quot;code_1606814638485&quot; class=&quot;html xml&quot; data-ke-language=&quot;html&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;try{
	worker.join();
}
catch (InterruptedException ie){}&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;부모가 여러 스레드가 완료되기를 기다려야 하는 경우 Join() 메소드는 Pthread 보인 것과 비슷한 for 루프로 묶을 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;4.4.3.1 Java Executor 프레임 워크 -p192&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java는 개발자에게 스레드 생성 및 통신에 대한 제어 기능을 크게 향상시키는 몇 가지 새로운 병행 처리 기능을 도입하였다. 이 도구는 java.util.currunt 패키지에서 사용할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Executor 프레임워크는 생산자-소비자 모델을 기반으로 한다. Runnable 인터페이스를 구현하는 작업이 생성되고 이러한 작업을 실행하는 스레드가 이를 소비한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;4.5 암묵적 스레딩 Implicit Threading -p194&lt;/span&gt;&lt;/h3&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4.5.1 스레드 풀 -p195&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스레드를 무한정 만들면 언젠가는 CPU시간, 메모리 공간 같은 시스템 자원이 고갈된다. 이러한 문제들을 해결해 줄 수 있는 방법의 하나가 스레드 풀(pool)이다.&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;&lt;b&gt;스레드 풀의 장점&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 새 스레드를 만들어 주기보다 기존 스레드로 서비스 해주는 것이 종종 더 빠르다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 스레드 풀은 임의 시각에 존재할 스레드 개수에 제한을 둔다. 이러한 제한은 많은 수의 스레드를 병렬 처리할 수 없는 시스템에 도움이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 태스크를 생성하는 방법을 태스크로부터 분리하면 태스크를 실행을 다르게 할 수 있다.&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;스레드 풀에 있는 스레드의 개수는 CPU수, 물리 메모리 용량, 동시 요청 클라이언트 최대 개수 등을 고려하여 정해질 수 있다.&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;size18&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;4.5.1.1 Java 스레드 풀 Java Thread Pools-p196&amp;nbsp;&lt;/span&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;java.util.cuncurrent 패키지에는 여러 종류의 스레드 풀 구조에 대한 API가 포함되어 있다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4.5.2 Fork Join -p197&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스레드 생성 전략은 종종 fork-join 모델로 알려져 있다. 이 메소드를 사용하면 메인 부모 스레드가 하나 이상의 자식 스레드를 생성(fork) 한 다음 자식의 종료를 기다린 후 join하고 그 시점부터 자식의 결과를 확인하고 결합할 수 있다. ( 동기식 모델)&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;fork-join 모델은 라이브러리가 생성할 실제 스레드 수를 결정하는 동기 버전의 스레드 풀이다.&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;size18&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;4.5.2.1 Java 에서의 Fork Join -p198&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Java는 Quicksort 및 Mergesort와 같은 재귀분할 - 정복 알고리즘과 함께 사용되도록 설계된 버전 1.7 API에 fork join 라이브러리를 도입하였다. 이 라이브러리를 사용하여 분할-정복 알고리즘을 구현할 때 분할 단계 동안 별도의 작업이 fork 되고 원래 문제의 작은 부분집합이 할당된다.&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;
&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-filename=&quot;1806px-Fork-join_computation.svg.png&quot; data-origin-width=&quot;1806&quot; data-origin-height=&quot;200&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzqN8D/btqONat2JDq/QIXAningd1igN2hK2d1h9k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzqN8D/btqONat2JDq/QIXAningd1igN2hK2d1h9k/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzqN8D/btqONat2JDq/QIXAningd1igN2hK2d1h9k/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbzqN8D%2FbtqONat2JDq%2FQIXAningd1igN2hK2d1h9k%2Fimg.png&quot; data-filename=&quot;1806px-Fork-join_computation.svg.png&quot; data-origin-width=&quot;1806&quot; data-origin-height=&quot;200&quot; data-ke-mobilestyle=&quot;widthContent&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 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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;image_1318256421488176652659.jpg&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;273&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/NEo2F/btqOVJ9wlj2/9QJDvkF9hIkpxENjogaKj0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/NEo2F/btqOVJ9wlj2/9QJDvkF9hIkpxENjogaKj0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/NEo2F/btqOVJ9wlj2/9QJDvkF9hIkpxENjogaKj0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FNEo2F%2FbtqOVJ9wlj2%2F9QJDvkF9hIkpxENjogaKj0%2Fimg.jpg&quot; data-filename=&quot;image_1318256421488176652659.jpg&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;273&quot; data-ke-mobilestyle=&quot;widthContent&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 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;background-color: #f6e199;&quot;&gt;4.5.3 OpenMP -p201&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;OpenMP는 C,C++, 또는 FORTRAN으로 작성된 API와 컴파일러 디렉티브의 집합이다. OpenMP는 공유 메모리 환경에서 병렬 프로그래밍을 할 수 있도록 도움을 준다. OpenMP는 병렬로 실행될 수 있는 블록을 찾아 병렬 영역 ( parallel regions )이라고 부른다.&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;OpenMP가 #pragma omp parallel 과 같은 컴파일러 디렉티브를 만나게 되면 시스템의 코어 개수만큼 스레드를 생성한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;듀얼 코어는 2개, 쿼드 코어는 4개 이런 식으로 생성된다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4.5.4 Grand Central Dispatch -p203&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;macOS 및 iOS 운영체제를 위해 Apple에서 개발한 기술이다. 개발자가 병렬로 실행될 코드 섹션(태스크)을 식별할 수 있도록 하는 런타임 라이브러리, API 및 언어 확장의 조합이다. OpenMP와 마찬가지로 GCD는 스레딩에 대한 대부분의 세부 사항을 관리한다.&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;GCD는 실행시간 수행을 위해 태스크를 &lt;b&gt;디스패치 큐&lt;/b&gt;에 넣어서 스케줄 한다. GCD는 직렬(serial)과 병렬(concurrent) 두 가지 유형의 디스패치 큐를 유지한다. 직렬 큐에 넣어진 태스크는 FIFO 순서대로 제거된다. 태스크는 큐에서 제거되면 다른 태스크가 제거되기 전에 실행을 반드시 완료해야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각 프로세스에는 고유한 직렬 큐(메인 큐)가 있으며 개발자는 특정 프로세스에 로컬인 추가 직렬 큐를 만들 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4.5.5 Intel 스레드 빌딩 블록 -p204&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Intel TBB (treading building block)는 C++에서 병렬 응용 프로그램 설계를 지원하는 템플릿 라이브러리이다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;4.6 스레드와 관련된 문제들 -p206&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4.6.1 Fork() 및 Exec() 시스템 콜 -p206&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 스레드가 exec() 시스템 콜을 부르면 exec()의 매개변수로 지정된 프로그램이 모든 스레드를 포함한 전체 프로세스를 대체 시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;fork()를 부르자마자 다시 exec을 부른다면 모든 스레드를 다 복제해서 만들어주는 것은 불필요하다. 왜냐하면 exec에서 지정한 프로그램이곧 모든 것을 다시 대체할 것이기 때문이다. 이 경우에는 fork() 시스템 콜을 호출한 스레드만 복사해주는 것이 적절하다. 그러나 새 프로세스가 fork() 후 exec을 하지 않는다면 새 프로세스는 모든 스레드들을 복제해야 한다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4.6.2 신호처리 -p206&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;신호는 UNIX에서 프로세스에 어떤 이벤트가 일어 났음을 알려주기 위해 사용된다. 신호는 알려줄 이벤트의 근원지나 이유에 따라 동기식 또는 비동기식으로 전달될 수 있다.&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;amp; 비동기식 모두 아래와 같은 형태로 전달된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 신호는 특정 이벤트가 일어나야 생성된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 생성된 신호가 프로세스에 전달된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. 신호가 전달되면 반드시 처리되어야 한다.&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;동기식 신호의 예로는 불법적인 메모리접근, 0으로 나누기 등이 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모든 신호는 둘 중 하나의 처리기에 의해 처리된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 디폴트 신호 처리기 - 모든 신호마다 커널이 실행시킴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 사용자 정의 신호 처리기 - 디폴트 신호 처리기를 대체할수 있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동기식 신호는 그 신호를 야기한 스레드에 전달되어야 하고 다른 스레드에 전달되면 안 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비동기식 신호는 명확하지 않다. &amp;lt;Control + C&amp;gt; 같은 키를 쳐서 그 프로세스를 강제 종료하는 신호와 같은 어떤 비동기식 신호는 그 프로세스 내 모든 스레드에 전달되어야 한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4.6.3 스레드 취소 p208&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스레드 취소는 스레드가 끝나기 전에 그것을 강제 종료시키는 작업을 일컫는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예를 들어 여러 스레드가 DB를 병렬로 검색하고 있다가 그 중 한 스레드가 결과를 찾았다면 나머지 스레드는 취소되어도 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이처럼 취소되어야 할 스레드를 &lt;b&gt;목적 스레드&lt;/b&gt;라고 부른다. 목적 스레드의 취소는 다음과 같은 두 가지 방식으로 발생할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. &lt;b&gt;비동기식 취소(asynchoronous cancellation)&lt;/b&gt; : 한 스레드가 즉시 목적 스레드를 강제 종료시킨다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2.&lt;b&gt; 지연 취소 ( deferred cancellation)&lt;/b&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;스레드는 API를 사용하여 취소 상태 및 유형을 설정할 수 있다.&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-style=&quot;style1&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;모드&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;상태&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;유형&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;Off&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;사용 불가능&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;지연 ( deferred )&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;사용 가능&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;지연 ( deferred )&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;비동기식(asynchronous)&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;사용 가능&lt;/td&gt;
&lt;td style=&quot;width: 33.3333%; text-align: center;&quot;&gt;비동기식( asynchronous )&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Pthreads는 스레드가 취소될 때 정리 핸들러 ( cleanup handler )라고 하는 함수가 호출되게 할 수 있다.&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4.6.4 스레드-로컬 저장장치 -p210&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 프로세스에 속한 스레드들은 그 프로세스의 데이터를 모두 공유한다. 이와 같은 데이터 공유는 다중 스레드 프로그래밍의 큰 장점 중 하나이다. 그러나 상황에 따라서는 각 스레드가 자기만 액세스 할 수 있는 데이터를 가져야 할 필요도 있다. 그러한 데이터를 &lt;b&gt;스레드-로컬 저장장치(thread0local storage, TLS)&lt;/b&gt;라고 부른다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4.6.5 스케줄러 액티베이션 -p211&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;사용자 스레드 라이브러리와 커널 스레드 간의 통신 방법의 하나는 스케줄러 액티베이션이라고 알려진 방법이다. 커널은 응용에 가상 처리기(LWP)의 집합을 제공하고 응용은 사용자 스레드를 가용한 가상 처리기로 스케줄 한다.&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;4.7 운영체제 사례 -p213&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;4.7.1 Windows 스레드 -p213&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Windows 응용들은 프로세스 형태로 실행되며 이들 각 프로세스는 한 개 또는 그 이상의 스레드를 가질 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;스레드의 일반적인 구성요소&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;각 스레드를 유일하게 지목하는 스레드ID&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;처리기의 상태를 나타내는 레지스터 집합&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;프로그램 카운터&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;사용자 모드에서 실행될 때 필요한 사용자 스택, 커널모드에서 실행될 때 필요한 커널 스택&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;실행 시간 라이브러리와 동적 링크 라이브러리(DLL) 등이 사용하는 개별 데이터 저장 영역&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;레지스터 집합,스택,개별 데이터 저장 영역들은 그 스레드의 문맥으로 불린다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;스레드의 주요 자료구조&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ETHREAD - 실행 스레드 블록 ( executive thread block )&lt;/li&gt;
&lt;li&gt;KTHREAD - 커널 스레드 블록 ( kernel thread block )&lt;/li&gt;
&lt;li&gt;TEB - 스레드 환경 블록 ( thread environment block )&lt;/li&gt;
&lt;/ul&gt;
&lt;p&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&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;Windows+Threads+Data+Structures.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bisW1o/btqPKuqtKv5/HrBNEqNklu63VchUEEk7D1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bisW1o/btqPKuqtKv5/HrBNEqNklu63VchUEEk7D1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bisW1o/btqPKuqtKv5/HrBNEqNklu63VchUEEk7D1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbisW1o%2FbtqPKuqtKv5%2FHrBNEqNklu63VchUEEk7D1%2Fimg.jpg&quot; data-filename=&quot;Windows+Threads+Data+Structures.jpg&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;768&quot; data-ke-mobilestyle=&quot;widthContent&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 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;background-color: #f6e199;&quot;&gt;4.7.2 Linux 스레드 - p214&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로세스를 복제하는 기능을 가진 fork() 시스템 콜을 제공한다. Linux는 clone() 시스템 콜을 이용하여 스레드를 생성할 수 있는 기능도 제공한다. 그러나 Linux는 프로세스와 스레드를 구별하지 않는다. 사실 Linux는 프로그램 내의 제어 흐름을 나타내기 위하여 프로세스나 스레드보다 태스크라는 용어를 사용한다.&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;Linux 커널이 태스크를 표현하는 방식 때문에 다양한 공유 수준이 가능하다. 시스템의 태스크마다 고유한 커널 자료구조가 존재한다. 이 자료구조는 태스크의 데이터를 저장하는 것이 아니라 데이터가 저장된 다른 자료구조를 가리키는 포인터를 포함한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;4.8 요약 -p215&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;1. 스레드는 CPU 사용의 기본 단위를 나타내며 동일한 프로세스에 속하는 스레드는 코드 및 데이터를 포함하여 많은 프로세스 자원을 공유한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. 다중 스레드 응용 프로그램에는 (1) 응답성, (2) 자원 공유, (3) 경제성 및 (4) 확장성 이라는 4자기 주요 이점이 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. 여러 스레드가 진행 중인 경우 병행성이 존재하는 반면에 여러 스레드가 동시에 진행 중인 경우 병렬성이 존재한다. 단일 CPU가 있는 시스템에서는 오로지 병행성만 가능하고, 병렬성은 여러 CPU를 제공하는 다중 코어 시스템이 필요하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4. 다중 스레드 응용 프로그램을 설계하는 데 몇 가지 도전과제가 있다. 작업 분할 및 균형 조정, 서로 다른 스레드 간에 데이터 분할 및 데이터 종속성 식별이 포함된다. 마지막으로 다중 스레드 프로그램은 테스트 및 디버깅에 특히 어려움이 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;5. 데이터 병렬 처리는 동일한 데이터의 부분 집합을 다른 컴퓨팅 코어에 분산시키고 각 코어에서 동일한 연산을 수행한다. 작업 병렬 처리는 여러 코어에 데이터가 아니라 작업을 분산시킨다. 각 작업은 고유한 연산을 실행한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;6. 사용자 응용 프로그램은 사용자 수준 스레드를 생성하며, 이 스레드는 궁극적으로 CPU에서 실행되도록 커널 스레드에 매핑 되어야 한다. 다대일 모델은 많은 사용자 수준 스레드를 하나의 커널 스레드에 매핑한다. 다른 접근 법으로는 일대일 및 다대다 모델이 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;7. 스레드 라이브러리는 스레드를 만들고 관리하기 위한 API를 제공한다. 세 가지 일반적인 스레드 라이브러리에는 Windows, Pthreads 및 Java 스레딩이 있다. Windows는 Windows 시스템 전용이며 Pthreads는 UNIX, Linux 및 macOS와 같은 POSIX 호환 시스템에서 사용할 수 있다. Java 스레드는 Java 가상 머신을 지원하는 모든 시스템에서 실행된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;8. 암묵적 스레딩에는 스레드가 아니라 작업을 식별하고 언어 또는 API 프레임워크가 스레드를 만들고 관리할 수 있게 한다 스레드 풀, fork join 프레임워크 및 Grands Central Dispatch를 포함하여 암묵적 스레딩에 대한 몇 가지 접근 방식이 있다. 암묵적 스레딩은 프로그래머가 병행 및 병렬 응용 프로그램을 개발할 때 점점 더 보편적인 기술이 되고 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;9. 스레드는 비동기 또는 지연 취소를 사용하여 종료될 수 있다. 비동기 취소는 스레드가 업데이트를 수행하는 중이라도 스레드를 즉시 중지한다. 지연 취소는 스레드에 종료해야 한다고 통지하지만 스레드는 질서 정연하게 종료된다. 대부분의 경우 비동기 종료보다 지연 취소가 선호된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;10. 다른 많은 운영체제와 달리 Linux는 프로세스와 스레드를 구분하지 않는다. 대신, 각각을 태스크라고 한다. Linux clone() 시스템 콜을 사용하여 프로세스와 더 비슷하거나 스레드와 더 비슷한 태스크를 만들 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개인공부/운영체제 공룡책 10판</category>
      <category>OS</category>
      <category>공룡책</category>
      <category>스레드</category>
      <category>운영체제</category>
      <author>무제1351</author>
      <guid isPermaLink="true">https://responsibility.tistory.com/183</guid>
      <comments>https://responsibility.tistory.com/183#entry183comment</comments>
      <pubDate>Tue, 1 Dec 2020 18:28:44 +0900</pubDate>
    </item>
    <item>
      <title>운영체제 - Chapter 3. 프로세스</title>
      <link>https://responsibility.tistory.com/176</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 3. 프로세스&lt;/h3&gt;
&lt;ol data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;프로세스 개념&lt;/li&gt;
&lt;li&gt;프로세스 스케줄링&lt;/li&gt;
&lt;li&gt;프로세스에 대한 연산&lt;/li&gt;
&lt;li&gt;프로세스 간 통신&lt;/li&gt;
&lt;li&gt;공유 메모리 시스템에서의 프로세스 간 통신&lt;/li&gt;
&lt;li&gt;메시지 전달 시스템에서의 프로세스 간 통신&lt;/li&gt;
&lt;li&gt;IPC 시스템의 사례&lt;/li&gt;
&lt;li&gt;클라이언트 서버 환경에서 통신&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Chapter 3. 프로세스&lt;/h2&gt;
&lt;p&gt;프로세스란 실행 중인 프로그램을 말한다. 프로세스는 현대의 컴퓨팅 시스템에서 작업의 단위이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;3.1 프로세스 개념 -p118&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3.1.1 프로세스 -p118&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;프로세스의 현재 활동의 상태는 &lt;b&gt;프로그램 카운터&amp;nbsp;&lt;/b&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;721&quot; data-origin-height=&quot;618&quot; data-filename=&quot;제목 없음.jpg&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Gz9O6/btqN9MVeWem/gVjBvLL8W863qlEc2MC431/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Gz9O6/btqN9MVeWem/gVjBvLL8W863qlEc2MC431/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Gz9O6/btqN9MVeWem/gVjBvLL8W863qlEc2MC431/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGz9O6%2FbtqN9MVeWem%2FgVjBvLL8W863qlEc2MC431%2Fimg.jpg&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;618&quot; data-filename=&quot;제목 없음.jpg&quot; data-ke-mobilestyle=&quot;widthContent&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;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;텍스트 섹션 - 실행코드&lt;/li&gt;
&lt;li&gt;데이터 섹션 - 전역 변수&lt;/li&gt;
&lt;li&gt;힙 섹션 - 프로그램 실행 중에 동적으로 할당되는 메모리&lt;/li&gt;
&lt;li&gt;스택 섹션 - 함수를 호출할 때 임시 데이터 저장장소 ( 예: 함수 매개변수, 복귀 주소 및 지역 변수)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;텍스트 및 데이터 섹션 크기는 고정되기 때문에 프로그램 실행 시간 동안 크기가 변하지 않는다&lt;/p&gt;
&lt;p&gt;스택 및 힙 센셕은 프로그램 실행 중에 동적으로 줄어들거나 커질 수 있다.&lt;/p&gt;
&lt;p&gt;함수가 호출될 때마다 함수 매개변수, 지역 변수 및 복귀 주소를 포함하는 활성화 레코드가 스택에 푸시 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3.1 프로세스 상태 process state - p121&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;프로세스는 실행되면서 그 상태가 변한다. 프로세스의 상태는 현재의 활동에 따라 정의된다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;new - 프로세스가 생성중이다.&lt;/li&gt;
&lt;li&gt;running - 명령어들이 실행되고 있다.&lt;/li&gt;
&lt;li&gt;waiting - 프로세스가 어떤 이벤트 ( 입출력 완료 또는 신호의 수신같은)가 일어나기를 기다린다.&lt;/li&gt;
&lt;li&gt;ready - 프로세스가 처리기에 할당되기를 기다린다.&lt;/li&gt;
&lt;li&gt;terminated - 프로세스의 실행이 종료되었다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;3_02_ProcessState.jpg&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;254&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bY891B/btqObY186c8/I0NlfMyKldKbD8qtWSDgBK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bY891B/btqObY186c8/I0NlfMyKldKbD8qtWSDgBK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bY891B/btqObY186c8/I0NlfMyKldKbD8qtWSDgBK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbY891B%2FbtqObY186c8%2FI0NlfMyKldKbD8qtWSDgBK%2Fimg.jpg&quot; data-filename=&quot;3_02_ProcessState.jpg&quot; data-origin-width=&quot;652&quot; data-origin-height=&quot;254&quot; data-ke-mobilestyle=&quot;widthContent&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;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3.1.3 프로세스 제어 블록 Process Control Block -p121&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;각 프로세스는 운영체제에서 프로세스 제어 블록 (process control block, PCB)에 의해 표현된다.&lt;/p&gt;
&lt;p&gt;PCB는 특정 프로세스와 연관된 여러 정보를 수록하며, 다음과 같은 것들을 포함한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1. 프로세스 상태 :&lt;/b&gt; 상태는 new, ready, running, waiting, halted(정지) 등이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;2. 프로그램 카운터 :&lt;/b&gt; 프로그램 카운터는 이 프로세스가 다음에 실행할 명령어의 주소를 가리킨다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;3. CPU 레지스터들:&amp;nbsp;&lt;/b&gt;컴퓨터의 구조에 따라 다양한 수와 유형을 가진다. 레지스터에는 누산기, 인덱스 레지스터, 스택 레지스터 범용 레지스터들과 상태코드 정보가 포함된다. 프로그램 카운터와 함께 이 상태 정보는, 나중에 프로세스가 다시 스케줄 될 때 계속 올바르게 실행되도록 하기 위해서 인터럽트 발생 시 저장되어야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;4. CPU-스케줄링 정보:&amp;nbsp;&lt;/b&gt;프로세스 우선순위, 스케줄 큐에 대한 포인터와 다른 스케줄 매개변수를 포함&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;5. 메모리 관리 정보:&amp;nbsp;&lt;/b&gt;운영체제에 의해 사용되는 메모리 시스템에 따라 기준(base) 레지스터와 한계(limit) 레지스터의 값, 운영체제가 사용하는 메모리 시스템에 따라 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함한다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;6. 회계 정보 :&amp;nbsp;&lt;/b&gt;CPU 사용 시간과 경과된 실시간, 시간 제한, 계정 번호, 잡 또는 프로세스 번호 등을 포함한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;7. 입출력 상태 정보:&amp;nbsp;&lt;/b&gt;이 정보는 이 프로세스에 할당된 입출력 장치들과 열린 파일의 목록 등을 포함한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;요약하면 프로세스 제어 블록은 약간의 회계 데이터와 함께 프로세스를 시작시키거나 다시 시작시키는데 필요한 모든 데이터를 위한 저장소의 역할을 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3.1.4 스레드 -p122&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;이제까지 논의한 프로세스 모델은 프로세스가 &lt;b&gt;단일의 실행 스레드&lt;/b&gt;를 실행하는 프로그램임을 암시했다.&lt;/p&gt;
&lt;p&gt;다중 처리기 시스템에서는 여러 스레드가 병렬로 실행될 수 있다. 스레드를 지원하는 시스템에서는 PCB가 각 스레드에 관한 정보를 포함하도록 확장된다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;3.2 프로세스 스케줄링 Process Scheduling - p123&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;프로세스 스케줄러는 코어에서 실행 가능한 여러 프로세스 중에서 하나의 프로세스를 선택한다.&lt;/p&gt;
&lt;p&gt;단일 CPU 코어 -&amp;gt; 한 번에 2개 이상의 프로세스가 실행될 수 없다.&lt;/p&gt;
&lt;p&gt;다중 코어 시스템 -&amp;gt; 한번에 여러개의 프로세스를 실행 가능.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;코어보다 많은 프로세스가 있는 경우 초과 프로세스는 코어가 사용 가능해지고 다시 스케줄 될 때 까지 기다려야함.&lt;/p&gt;
&lt;p&gt;현재 메모리에 있는 프로세스 수를 &lt;b&gt;다중 프로그래밍 정도&lt;/b&gt; 라고 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3.2.1 스케줄링 큐 Scheduling Queue - p123&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;프로세스가 시스템에 들어가면 &lt;b&gt;준비 큐&lt;/b&gt;에 들어가서 준비 상태가 되어 CPU 코어에서 실행되기를 기다린다. 이 큐는 일반적으로 연결 리스트로 저장된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;준비큐 헤더에는 리스트의 첫 번째 PCB에 대한 포인터가 저장된다&lt;/p&gt;
&lt;p&gt;각 PCB에는 준비 큐의 다음 PCB를 가리키는 포인터 필드가 포함된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I/O 완료와 같은 특정 이벤트가 발생하기를 기다리는 프로세스는 대기 큐(wait queue)에 삽입된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;새 프로세스는 처음에 준비 큐에 놓인다. 프로세스는 실행을 위해 선택되거나 또는 디스패치 될 때까지 기다린다. 프로세스에 CPU 코어가 할당되고 실행 상태가 되면, 여러 이벤트 중 하나가 발생할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;프로세스가 I/O 요청을 공표한 다음 I/O 대기 큐에 놓일 수 있다.&lt;/li&gt;
&lt;li&gt;프로세스는 새 자식 프로세스를 만든 다음, 자식의 종료를 기다리는 동안 대기 큐에 놓일 수 있다.&lt;/li&gt;
&lt;li&gt;인터럽트 또는 타임 슬라이스가 만료되어 프로세스가 코어에서 강제로 제거되어 준비 큐로 돌아갈 수 있다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;처음 두 경우에는 프로세스가 결국 대기 상태에서 준비 상태로 전환된 다음 준비 큐에 다시 들어간다.&lt;/p&gt;
&lt;p&gt;프로세스는 종료될 때 까지 이 주기를 계속한다. 종료 시점에 모든 큐에서 제거되고 PCB 및 자원이 반환된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3.3.2 CPU 스케줄링 p-126&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;CPU 스케줄러의 역할은 준비 큐에 있는 프로세스 중에서 선택된 하나의 프로세스에 CPU 코어를 할당하는 것이다.&lt;/p&gt;
&lt;p&gt;프로세스는 수명주기 동안 준비 큐와 다양한 대기 큐를 이주한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3.2.3 문맥교환 Context Switch -p126&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;CPU 코어를 다른 프로세스로 교환하려면 이전의 프로세스의 상태를 보관하고 새로운 프로세스의 보관된 상태를 복구하는 작업이 필요하다. 이 작업은 문맥 교환 ( context switch )이라고 한다. 문맥은 프로세스의 PCB에 표현된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;문맥 교환이 일어나면 커널은 과거 프로세스의 문맥을 PCB에 저장하고, 실행이 스케줄된 새로운 프로세스의 저장된 문맥을 복구한다. 문맥 교환 시간은 하드웨어의 지원에 크게 좌우된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-filename=&quot;Context-Switching.webp&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;416&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bHP2a2/btqOgtGTucM/215fYjPPvj1Ah2LDPBiks0/img.webp&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bHP2a2/btqOgtGTucM/215fYjPPvj1Ah2LDPBiks0/img.webp&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bHP2a2/btqOgtGTucM/215fYjPPvj1Ah2LDPBiks0/img.webp&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbHP2a2%2FbtqOgtGTucM%2F215fYjPPvj1Ah2LDPBiks0%2Fimg.webp&quot; data-filename=&quot;Context-Switching.webp&quot; data-origin-width=&quot;684&quot; data-origin-height=&quot;416&quot; data-ke-mobilestyle=&quot;widthContent&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;3.3 프로세스에 대한 연산 Operation on Processes -p128&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;대부분 시스템 내의 프로세스들은 병행 실행될 수 있으며, 반드시 동적으로 생성되고, 제거 되어야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3.3.1 프로세스 생성 -p129&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;실행되는 동안 프로세스는 여러 개의 새로운 프로세스들을 생성할 수 있다. 앞에서 언급한 것과 같이 생성하는 프로세스를 부모 프로세스라고 부르고, 새로운 프로세스는 자식 프로세스라고 부른다. 이 새로운 프로세스들은 각각 다시 다른 프로세스들을 생성할 수 있으며, 그 결과 프로세스의 &lt;b&gt;트리&lt;/b&gt;를 형성한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;일반적으로 프로세스가 자식 프로세스를 생성할 때, 그 자식 프로세스는 자신의 임무를 달성하기 위하여 어떤 자원 ( CPU 시간, 메모리, 파일, 입출력 장치) 이 필요하다. 자식 프로세스는 자원을 운영체제로 부터 직접 얻거나, 부모 프로세스가 가진 자원의 일부분만을 사용하도록 자식 프로세스가 쓸 수 있게 제한하며, 자식 프로세스들을 많이 생성하여 시스템을 과부하 상태로 만드는 프로세스를 방지할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;프로세스가 새로운 프로세스를 생성 할 때, 두 프로세스를 실행시키는 데 두 가지 가능한 방법이 존재한다.&lt;/p&gt;
&lt;p&gt;1. 부모는 자식과 병행하게 실행을 계속한다.&lt;/p&gt;
&lt;p&gt;2. 부모는 일부 또는 모든 자식이 실행을 종료할 때까지 기다린다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;새로운 프로세스들의 주소 공간 측면에서 볼 때 다음과 같은 두 가지 가능성이 있다.&lt;/p&gt;
&lt;p&gt;1. 자식 프로세스는 부모 프로세스의 복사본이다( 자식 프로세스는 부모와 똑같은 프로그램과 데이터르 가진다)&lt;/p&gt;
&lt;p&gt;2. 자식 프로세스가 자신에게 적재될 새로운 프로그램을 가지고 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3.3.2 프로세스 종료 -p134&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;프로세스가 마지막 문장의 실행을 끝내고, exit 시스템 콜을 사용하여 운영체제에 자신의 삭제를 요청하면 종료한다.&amp;nbsp; 이 시점에서, 프로세스는 자신을 기다리고 있는 부모 프로세스에 (wait 시스템 콜)을 통해 상태 값(통상 정수값)을 반환할 수 있다. 물리 메모리와 가상 메모리, 열린 파일, 입출력 버퍼를 포함한 프로세스의 모든 자원이 할당 해제되고 운영체제로 반납된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;부모는 다음과 같이 여러 가지 이유로 인하여 자식 중 하나의 실행을 종료할 수 있다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;자식이 자신에게 할당된 자원을 초과하여 사용할 때. 이때는 부모가 자식들의 상태를 검사할 수 있는 방편이 주어져야 한다.&lt;/li&gt;
&lt;li&gt;자식에게 할당된 태스크가 더 이상 필요 없을 때&lt;/li&gt;
&lt;li&gt;부모가 exit를 하는데, 운영체제는 부모가 exit 한 후에 자식이 실행을 계속하는 것을 허용하지 않는 경우&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;몇몇 시스템에서는 부모 프로세스가 종료한 이후에 자식 프로세스가 존재할 수 없다. 그러한 시스템에서는 프로세스가 종료되면 그로부터 모든 자식 프로세스들도 종료되어야 한다. 이것을 &lt;b&gt;연쇄식 종료(cascading termination)&lt;/b&gt;이라고 부르며 이 작업은 운영체제가 시행한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;부모 프로세스는 wait() 시스템 콜을 사용해서 자식 프로세스가 종료할 때를 기다릴 수 있다. wait() 시스템 콜은 부모가 자식의 종료 상태를 얻어낼 수 있도록 하나의 인자를 전달받는다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;종료되었지만 부모 프로세스가 아직 wait() 호울을 하지 않은 프로세스를 좀비(zombie) 프로세스라고 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;부모가 wiat()를 호출하면 좀비 프로세스의 프로세스 식별자와 프로세스 테이블의 해당 항목이 운영체제에 반환된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;부모 프로세스가 wait()를 호출하는 대신 종료하면 자식 프로세스는 고아(orphan) 프로세스가 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Unix에서는 새로운 부모 프로세스로 init프로세스를 지정함으로써 이 문제를 해결한다. init 프로세스는 주기적으로 wait()를 호출 하여 고아 프로세스의 종료 상태를 수집하고 프로세스 식별자와 프로세스 테이블 항목을 반환한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Linux는 systemd 이외의 프로세스가 고아 프로세스를 상속하고 종료를 관리하도록 허용한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;3.3.2.1 Android 프로세스 계층 -p136&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Android는 임의의 프로세스를 종료하지 않고 프로세스의 중요도 계층을 식별했으며, 시스템이 프로세스를 종료하여 새로운 또는 보다 중요한 프로세스를 위한 자원을 확보해야 할 경우 중요도가 낮은 프로세스부터 종료한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. 전경 프로세스 ( forground process ) - 사용자가 현재 상호 작용하고 있는 응용 프로그램을 나타내며, 화면에 보이는 현재 프로세스&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. 가시적 프로세스 ( visible process ) - 전경에서 직접 볼 수 없지만 전경 프로세스가 참조하는 활동 ( 즉, 현재 상태가 전경 프로세스에 표시되는 활동을 수행하는 프로세스)을 수행하는 프로세스&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. 서비스 프로세스 ( service process ) - 백그라운드 프로세스와 유사하지만 사용자가 인지할 수 있는 활동 ( 예: 음악 스트리밍)을 수행하는 프로세스&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4. 백그라운드 프로세스 (background process) - 활동을 수행하고 있지만 사용자가 인식하지 못하는 프로세스&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;5. 빈 프로세스 ( empty process ) - 응용 프로그램과 관련된 활성 구성요소가 없는 프로세스&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;3.4 프로세스 간 통신 -p137&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;프로세스가 시스템에서 실행 중인 다른 프로세스들에 영향을 주거나 받는다면 이는 협력적 프로세스들이다. 독립적 프로세스는 그 반대다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;프로세스 협력을 허용하는 환경을 제공 하는 이유&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. 정보 공유 ( information sharing) :&amp;nbsp;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;여러 응용 프로그램이&lt;b&gt; 동일한 정보&lt;/b&gt;( ex: 복사, 붙여넣기) 에 필요를 느낄 수 있으므로, 그러한 정보를 병행적으로 접근할 수 있는 환경을 제공해야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. 계산 가속화 ( computation speedup) :&amp;nbsp;&lt;/p&gt;
&lt;p&gt;만일 우리가 특정 태스크를 빨리 실행하고자 한다면, 우리는 그것을 서브태스크로 나누어 이들 각각이 다른 서브태스크들과 &lt;b&gt;병렬&lt;/b&gt;로 실행되게 해야 한다. 이러한 가속화는 &lt;b&gt;복수 개의 처리 코어&lt;/b&gt;를 가진 경우에만 달성할 수 있음에 유의해야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3.모듈성 ( modularity):&lt;/p&gt;
&lt;p&gt;시스템 기능을 별도의 프로세스들 또는 스레드들로 나누어, 모듈식 형태로 시스템을 구성하기를 원할수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;협력적 프로세스들은 데이터를 교환할 수 있는, 즉 서로 데이터를 보내거나 받을 수 있는 프로세스 간 통신 ( interprocess communication, IPC ) 기법이 필요하다. 프로세스 간 통신에는 기본적으로 공유 메모리 ( shared memory) 와 메시지 전달 ( message passing) 두가지 모델이 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;메시지 전달 모델 :&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;적은 양의 데이터를 교환하는데 유용하다. 분산시스템에서 공유메모리보다 구현하기 쉽다.&lt;/p&gt;
&lt;p&gt;통상 시스템 콜을 사용하여 구현되므로 커널 간섭 등의 부가적인 시간 소비 작업이 필요하기 때문에 공유 메모리 모델이 메시지 전달보다 빠르다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;공유 메모리 시스템:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;공유 메모리 영역을 구축할 때만 시스템 콜이 필요하다. 그래서 구축이 되면 모든 접근은 일반적인 메모리 접근으로 취급되어 커널의 도움이 필요없다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;99B096385C4C756932.png&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;537&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bGsRjt/btqOdOyxC6j/31Wd0roO2L8H2CC0c5Wzm1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bGsRjt/btqOdOyxC6j/31Wd0roO2L8H2CC0c5Wzm1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bGsRjt/btqOdOyxC6j/31Wd0roO2L8H2CC0c5Wzm1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbGsRjt%2FbtqOdOyxC6j%2F31Wd0roO2L8H2CC0c5Wzm1%2Fimg.png&quot; data-filename=&quot;99B096385C4C756932.png&quot; data-origin-width=&quot;855&quot; data-origin-height=&quot;537&quot; data-ke-mobilestyle=&quot;widthContent&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;3.5 공유 메모리 시스템에서의 프로세스 간 통신 -p137&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;공유 메모리를 사용하는 프로세스 간 통신에는 통신하는 프로세스들이 공유 메모리 영역을 구축해야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;생산자 -소비자 관점 :&lt;/p&gt;
&lt;p&gt;생산자 프로세스: 정보를 생산&lt;/p&gt;
&lt;p&gt;소비자 프로세스 : 정보를 소비&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;ex)&lt;/p&gt;
&lt;p&gt;컴파일러는 어셈블리 코드 생산, 어셈블러는 이것을 소비.&lt;/p&gt;
&lt;p&gt;어셈블러는 목적 모듈 생산, 로더는 이들을 소비.&lt;/p&gt;
&lt;p&gt;웹서버는 HTML 파일과 이미지와 같은 웹 콘텐츠를 생산, 웹브라우저가 이런 자원을 요청하고 소비함.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;생산자 -소비자 문제의 하나의 해결책은 공유 메모리 사용.!&lt;/p&gt;
&lt;p&gt;생산자가 정보를 채워넣고 소비자가 소모할 수 있는 항목들의 &lt;b&gt;버퍼&lt;/b&gt;가 반드시 사용 가능해야 함.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;버퍼에는 2가지 유형이 있다.&lt;/p&gt;
&lt;p&gt;1. &lt;b&gt;무한 버퍼&lt;/b&gt; ( unbounded buffer) : 생산자 소비자 문제에서는 버퍼의 크기에 실질적인 한계가 없다. 소비자는 새로운 항목을 기다려야만 할 수도 있지만, 생산자는 항상 새로운 항목을 생산할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. &lt;b&gt;유한 버퍼&lt;/b&gt; ( bounded buffer ) : 버퍼의 크기가 고정되어 있다고 가정한다. 이 경우 버퍼가 비어있으면 소비자는 반드시 대기해야 하며, 모든 버퍼가 채워져 있으면 생산자가 대기해야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;3.6 메시지 전달 시스템에서의 프로세스 간 통신 -p141&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;메시지 전달 방식은 &lt;b&gt;동일한 주소 공간을 공유하지 않고도&lt;/b&gt; 프로세스들이 통신을 하고, 그들의 동작을 동기화할 수 있도록 허용하는 기법을 제공한다. 프로세스들이 네트워크에 의해 연결된 다른 컴퓨터들에 존재할 수 있는 &lt;b&gt;분산환경&lt;/b&gt;에서 특히 유용하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;하나의 링크와 send() / receive() 연산을 논리적으로 구현 하는 다수의 방법&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;직접 또는 간접 통신&lt;/li&gt;
&lt;li&gt;동기식 또는 비동기식 통신&lt;/li&gt;
&lt;li&gt;자동 또는 명시적 버퍼링&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3.6.1 명명 -p142&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;&lt;b&gt;직접 통신&lt;/b&gt;&lt;/span&gt;하에서, 통신을 원하는 각 프로세스는 토인의 수신자 또는 송신자의 이름을 &lt;b&gt;명시&lt;/b&gt;해야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;send( P, message ) - 프로세스 P에 메시지를 전송한다&lt;/li&gt;
&lt;li&gt;receive( Q, message ) - 프로세스 Q로부터 메시지를 수신한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;이 기법에서 통신 연결은 다음의 특성을 가진다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;통신을 원하는 각 프로세스의 쌍들 사이에 연결이&lt;b&gt; 자동&lt;/b&gt;으로 구축된다. 프로세스들은 통신하기 위해 &lt;b&gt;상대방의 신원&lt;/b&gt;( identity ) 만 알면 된다.&lt;/li&gt;
&lt;li&gt;연결은 정확히 &lt;b&gt;두 프로세스 사이에만&lt;/b&gt; 연관된다.&lt;/li&gt;
&lt;li&gt;통신하는 프로세스들의 각 쌍 사이에는 정확하게 &lt;b&gt;하나의 연결&lt;/b&gt;이 존재해야한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;위의 방법은 서로의 신원을 알아야 하는 &lt;b&gt;대칭성&lt;/b&gt;이다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;그와 반대로 비대칭을 사용할 수 있다. 송신자만 수진자의 이름을 지명하여, 수신자는 송신자의 이름을 제시할 필요가 없다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&amp;nbsp;send ( P, message ) - 메시지를 프로세스 P에 전송한다.&lt;/li&gt;
&lt;li&gt;&amp;nbsp;receive ( id, message ) - 임의의 프로세스로부터 메시지를 수신한다. 변수 id는 통신을 발생시킨 프로세스의 이름으로 설정된다.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;위의 기법들 ( &lt;b&gt;대칭성, 비대칭성 )&amp;nbsp;&lt;/b&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;background-color: #9feec3;&quot;&gt;&lt;b&gt;간접통신&lt;/b&gt;&lt;/span&gt;에서 메시지들은 메일박스(mailbox) 또는 포트(port)로 송신되고, 수신된다.&lt;/p&gt;
&lt;p&gt;메일박스는 추상적으로 프로세스들에 의해 메시지들이 넣어지고 메시지들이 제거될 수 있는 객체로 볼 수 있다.&lt;/p&gt;
&lt;p&gt;각 메일박스는 고유의 id를 가진다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt; send ( A, message ) - 메시지를 메일박스 A로 송신한다.&lt;/li&gt;
&lt;li&gt;receive ( A, message ) - 메시지를 메일박스 A로부터 수신한다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;위의 통신연결은 다음과 같은 특징을 가진다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;한 쌍의 프로세스들 사이의 연결은 이들 프로세스가 공유 메일박스를 가질 때만 구축된다.&lt;/li&gt;
&lt;li&gt;연결은 두 개 이상의 프로세스들과 연관될 수 있다.&lt;/li&gt;
&lt;li&gt;통신하고 있는 각 프로세스 사이에는 다수의 서로 다른 연결이 존재할 수 있고, 각 연결은 하나의 메일박스에 대응된다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3.6.2&amp;nbsp; 동기화 Synchronization-p145&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;메시지 전달은 봉쇄형(blocking)이거나 비봉쇄형(nonblocking) 방식으로 전달된다. 이 두 방식은 각각 동기식, 비동기식 이라고도 알려져 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;봉쇄형 보내기 :&amp;nbsp;&lt;/b&gt;송신하는 프로세스는 메시지가 수신 프로세스 또는 메일박스에 의해 수신될 때까지 봉쇄된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비봉쇄형 보내기 :&amp;nbsp;&lt;/b&gt;송신하는 프로세스가 메시지를 보내고 작업을 재시작 한다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;봉쇄형 받기 :&amp;nbsp;&lt;/b&gt;메시지가 이용 가능할 때까지 수신 프로세스가 봉쇄된다.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;비봉쇄형 받기 :&amp;nbsp;&lt;/b&gt;송신하는 프로세스가 유효한 메시지 또는 널(null)을 받는다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;send() 와 receive() 와의 다른 조합도 가능하다. send()와 receive()가 모두 봉쇄형일 때, 우리는 송신자와 수신자 간에 &lt;b&gt;랑데부(rendezvous)&lt;/b&gt;를 하게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3.6.3 버퍼링 Buffering -p146&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;통신이 직접적이든 간접적이든 간에, 통신하는 프로세스들에 의해 교환되는 메시지는 임시 큐에 들어있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1.&amp;nbsp; &lt;b&gt;무용량 ( zero capacity ) :&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;큐의 최대길이가 0이다. 즉, 링크는 자체 안에 대기하는 메시지들을 가질 수 없다. 이 경우에, 송신자는 수신자가 메시지를 수신할 때까지 기다려야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. &lt;b&gt;유한 용량 ( bounded capacity ) : &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;큐는 유한한 길이 n을 가진다. 즉, 최대 n개의 메시지가 그 안에 들어 있을 수 있다. 새로운 메시지가 전송될 때 큐가 만원이 아니라면, 메시지는 큐에 놓이며(메시지가 복사되든지 또는 메시지에 대한 포인터가 유지된다), 송신자는 대기하지 않고 실행을 계속한다. 그렇지만, 링크는 유한한 용량을 가진다. 링크가 만원이면, 송신자는 큐 안에 공간이 이용 가능할 때까지 반드시 봉쇄되어야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. &lt;b&gt;무한 용량 ( unbounded capacity ):&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;큐는 잠재적으로 무한한 길이를 가진다. 따라서 메시지들이 얼마든지 큐안에서 대기할 수 있다 송신자는 절대 &lt;b&gt;봉쇄&lt;/b&gt;되지 않는다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;무용량의 경우는 때때로 버퍼가 없는 메시지 시스템이라고 부른다. 다른 경우들은 자동 버퍼링이라 불린다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;3.7 IPC 시스템의 사례 -p146&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;4가지 다른 IPC 시스템을 탐구한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;POSIX API&lt;/li&gt;
&lt;li&gt;Mach&lt;/li&gt;
&lt;li&gt;Windows IPC&lt;/li&gt;
&lt;li&gt;UNIX pipe&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3.7.1 POSIX 공유 메모리 -p147&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;POSIX 공유 메모리는 메모리 -사상 파일을 사용하여 구현된다. 메모리-사상 파일은 공유 메모리의 특정 영역을 파일과 연관시킨다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;fd = shm_pen(name, 0_CREAT | O_RDWR, 0666 );&lt;/blockquote&gt;
&lt;p&gt;첫 번째 인자는 공유 메모리 객체의 이름을 지정한다.&lt;/p&gt;
&lt;p&gt;두 번째 인자는&amp;nbsp; 객체가 존재하지 않으면 생성되고 (0_CREAT) 객체는 읽기와 쓰기가 가능한 상태로 열린다는 것을 나타낸다(0_RDRW).&lt;/p&gt;
&lt;p&gt;마지막 인자는 공유 메모리 객체에 파일-접근 허가권을 부여한다.&lt;/p&gt;
&lt;p&gt;shm_open() 이 성공하면 공유 메모리 객체를 나타내는 정수형 파일 설명자를 반환한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3.7.2 Mach 메시지 전달 -p149&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;Mach는 특히 분산 시스템용으로 설계되었지만 2장에서 논의된 것처럼 macOS및 iOS 운영체제에 포함된 사일이 입증하듯이 데스크톱 및 모바일 시스템에도 적합하다.&lt;/p&gt;
&lt;p&gt;Mach 커널은 프로세스와 유사하지만 제어 스레드가 많고 관련 자원이 적은 다중 태스크의 생성 및 제거를 지원한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Mach는 동일한 송신자의 여러 메시지가 선입선출(FIFO) 순서로 큐에 삽입하지만 절대적 순서를 보장하지는 않는다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Mach 메세지는 두 필드를 포함한다&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;고정 크기의 메시지 헤더. 헤더는 메시지 크기, 소스 및 대상 포트를 포함한 메시지에 관한 메타 데이터를 포함한다. 일반적으로 송신 스레드는 응답을 예상하므로 소스의 포트 이름이 수신 태스크로 전달되어 응답을 보내는 데 &quot;반환 주소&quot;로 사용할 수 있다.&lt;/li&gt;
&lt;li&gt;데이터를 포함하는 가변 크기 본체&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;기본적으로 Mach는 송신자의 메시지가 포함된 주소 공간에 매핑한다. 따라서 송신자와 수신자 모두 동일한 메모리에 액세스 하므로 메시지 자체는 실제로 복사되지 않는다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3.7.3 Windows -p153&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;Windows 운영체제는 모듈화를 이용하여 기능을 향상시키고 새로운 기능을 구현하는 시간을 감소시킨 최신 설계의 예이다.&lt;/p&gt;
&lt;p&gt;다중 운영 환경 또는 서브시스템을 지원하며, 응용 프로그램은 메시지 전달 기법을 통해 이들과 통신한다. 따라서 응용 프로그램은 서브시스템 서버의 클라이언트로 간주할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Mach와 유사하게, Windows는 두 프로세스 간에 연결을 구축하고 유지하기 위해 포트 객체를 사용한다. Windows는 연결 포트&lt;/p&gt;
&lt;p&gt;( connection port ) 와 통신 포트( communication port )의 두 가지 유형의 포트를 사용한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Windows의 메시지 전달 설비는 &lt;b&gt;고급 로컬 프로시저 호출 설비&lt;/b&gt; ( advanced local procedure call facility, ALPC)라 불린다.&lt;/p&gt;
&lt;p&gt;ALPC는 동일 기계상에 있는 두 프로세스 간의 통신에 사용한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2020-11-26 오후 6.16.05.png&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;902&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b2Tq3B/btqOiAzJpFx/eMgKjSpLeTPMCEtVP8zk51/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b2Tq3B/btqOiAzJpFx/eMgKjSpLeTPMCEtVP8zk51/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b2Tq3B/btqOiAzJpFx/eMgKjSpLeTPMCEtVP8zk51/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb2Tq3B%2FbtqOiAzJpFx%2FeMgKjSpLeTPMCEtVP8zk51%2Fimg.png&quot; data-filename=&quot;스크린샷 2020-11-26 오후 6.16.05.png&quot; data-origin-width=&quot;1668&quot; data-origin-height=&quot;902&quot; data-ke-mobilestyle=&quot;widthContent&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;ALPC 채널이 생성되면 다음 3가지 중 하나의 메시지 전달 기법의 하나가 선택된다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;256 바이트까지의 작은 메시지의 경우, 포트의 메시지 큐가 중간 저장소로 사용되고, 메시지는 프로세스에서 프로세스로 복사된다.&lt;/li&gt;
&lt;li&gt;대용량 메시지는 반드시 섹션 객체(section object)를 통하여 전달되어야 한다. 섹션 객체란 채널과 연관된 공유 메모리의 영역을 말한다.&lt;/li&gt;
&lt;li&gt;데이터의 양이 너무 많아서 섹션 객체에 저장될 수 없는 경우, 서버 프로세스가 클라이언트의 주소 공간을 직접 읽거나 쓸 수 있는 API를 사용할 수 있다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Windows의 고급 로컬 프로시저 호출 설비는 Windows API의 부분이 아니리 때문에 응용 프로그래머는 사용할 수 없다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3.7.4 UNIX 파이프 -p155&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;파이프는 두 프로세스가 통신할 수 있게 하는 전달자로서 동작한다. 파이프는 초기 UNIX 시스템에서 제공하는 IPC기법의 하나였다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;pipe를 구현하기 위해 다음 4가지를 고려해야한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;파이프가 단방향 통신 또는 양방향 통신을 허용하는가?&lt;/li&gt;
&lt;li&gt;양방향 통신이 허용된다면 반이중 ( half duplex) 방식인가, 전이중( full duplex) 방식인가? 반이중 방식은 한순간에 한 방향 전송만 가능하고 전이중 방식은 동시에 양방향 데이터 전송이 가능하다.&lt;/li&gt;
&lt;li&gt;통신하는 두 프로세스 간에 부모-자식 과 같은 특정 관계가 존재해야만 하는가?&lt;/li&gt;
&lt;li&gt;파이프는 네트워크를 통하여 통신이 가능한가, 아니면 동일한 기계 안에 존재하는 두 프로세스끼리만 통신할 수 있는가?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;3.7.4.1 일반 파이프 - p155&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;일반 파이프는 생산자-소비자 형태로 두 프로세스 간의 통신을 허용한다. 생산자는 파이프의 한 종단(쓰기 종단)에 쓰고, 소비자는 다른 종단 (읽기 종단)에서 읽는다. 결과적으로 일반 파이프는 한쪽으로만 데이터를 전송할 수 있으며 오직 단방형 통신만을 가능하게 한다. 양방향을 원하면 두 파이프를 써야한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;일반 파이프는 파이프를 생성한 프로세스 이외에는 접근할 수 없다. 자식 프로세스는 열린 파일을 부모로부터 상속받는다. 파이프는 파일의 특수한 유형이기 때문에 자식 프로세스는 부모로 부터 파이프를 상속 받는다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;3.7.4.2 지명 파이프 -p160&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;지명 파이프(named pipes)는 좀 더 강력한 통신 도구를 제공한다. 통신은 양방향으로 가능하며 부모-자식 관계도 필요로 하지 않는다. 지명 파이프가 구축되면 여러 프로세스들이 이를 사용하여 통신할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;3.8 클라이언트 서버 환경에서 통신 -p161&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;클라이언트 서버에서 사용할 수 있는 두 가지 다른 통신 전략&lt;/p&gt;
&lt;p&gt;1. 소켓&lt;/p&gt;
&lt;p&gt;2. 원격 프로시저 호출(RPC)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3.8.1 소켓 Socket -p162&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;소켓(socket)은 통신의 극점 (endpoint)을 뜻한다. 두 프로세스가 네트워크상에서 통신을 하려면 양 프로세스마다 하나씩, 총 두 개의 소켓이 필요해진다. 각 소켓은 IP 주소와 포트 번호 두 가지를 접합 (concatenate)해서 구별한다.&lt;/p&gt;
&lt;p&gt;클라이언트 프로세스가 연결을 요청하면 호스트 컴퓨터가 포트 번호를 부여한다.&lt;/p&gt;
&lt;p&gt;모든 연결은 유일 해야한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;자바는 세 가진 종류의 소켓을 제공한다. 연결 기반(TCP)소켓은 Socket 클래스로 구현된다. 비연결성(UDP) 소켓은 DatagramSocket 클래스를 사용한다. 마지막으로 MulticastSocket 클래스는 DatagramSocket 클래스의 서브클래스이다. Multicast 소켓은 데이터를 여러 수신자에게 보낼 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;서버가 소켓과 통신하는 법:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;서버는 먼저 PrintWriter 객체를 만들고 이 객체는 추후 클라이언트와 통신하는데 사용된다.&lt;/p&gt;
&lt;p&gt;PrintWriter 객체는 서버가 print()나 println()과 같은 루틴을 써서 소켓에 데이터를 쓸수 있게 한다.&lt;/p&gt;
&lt;p&gt;서버는 println() 메소드를 호출하여 클라이언트에게 날짜를 보낸다. 날짜를 소켓에 쓰면 서버는 이 클라이언트와의 소켓을 닫고 다른 요청을 기다리게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;IP 주소 127.0.0.1은 루프백(loopback)을 나타내는 특별한 IP주소다. 컴퓨터가 이 주소를 참조하면 그 자신 기계를 지칭하는 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;소켓은 스레드 간에 구조화 되지 않은&lt;b&gt; 바이트 스트림&lt;/b&gt;만을 통신한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;3.8.2 원격 프로시저 호출 Remote Procedure Calls, RPC -p164&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;원격 서비스와 관련한 보편적인 형태 중 하나는 RPC 패러다임으로서, 네트워크에 연결된 두 시스템 사이의 통신에 사용하기 위하여 프로시저 호출 기법을 추상화하는 방법으로 설계되었다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;IPC 방식과는 달리 RPC 통신에서 전달되는 메시지는 구조화되어 있고, 따라서 데이터의 패킷 수준을 넘어서게 된다. 이 문맥에서 포트는 단순히 메시지 패키지의 시작 부분에 포함되는 정수이다. 시스템은 일반적으로 네트워크 주소는 하나씩 가지지만 그 시스템에서 지원되는 여러 서비스를 구별하기 위해 포트를 여러 개 가질 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;RPC는 클라이언트가 원격 호스트의 프로시저 호출하는 것을 마치 자기의 프로시저 호출하는 것처럼 해준다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;3.8.2.1 Android RPC -p167&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Android 운영체제는 바인더 프레임워크에 포함된 풍부한 IPC 기법의 집합을 가지고 있는데, 이 중 RPC는 프로세스가 다른 프로세스의 서비스를 요청할 수 있게 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;3.9 요약&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;1. 프로세스는 실행 중인 프로그램이며 프로세스의 현재 활동 상태는 프로그램 카운터와 다른 레지스터로 나타난다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. 메모리에서 프로세스의 레이아웃은 (1) 텍스트 (2) 데이터 (3) 힙&amp;nbsp; (4) 스택&amp;nbsp; 이 네가지 섹션으로 표시된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. 프로세스가 실행되면 상태가 변경된다. 프로세스의 일반적인 상태는 (1) 준비 (2)실행 (3) 대기 (4) 종료 이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4. 프로세스 제어 블록 ( PCB )은 운영체제의 프로세스를 나타내는 커널 데이터 구조이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;5. 프로세스 스케줄러의 역할은 CPU에서 실행할 수 있는 사용 가능한 프로세스를 선택하는 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;6. 운영체제는 한 프로세스 실행에서 다른 프로세스 실행으로 전환할 때 문맥 교환을 수행한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;7. fork() 및 CreateProcess() 시스템 콜은 각각 UNIX 및 Windows 시스템에서 프로세스를 생성하는 데 사용된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;8. 프로세스 간 통신에 공유 메모리를 사용하는 경우 두 개 이상의 프로세스가 동일한 메모리 영역을 공유한다. POSIX는 공유 메모리를 위한 API를 제공한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;9. 메시지 전달을 사용하여 두 프로세스가 서로 메시지를 교환하여 통신할 수 있다. Mach 운영체제는 프로세스 간 통신의 기본 형태로 메시지 전달을 사용한다. Windows는 메시지 전달 방식도 제공한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;10. 파이프는 두 프로세스가 통신할 수 있는 통로를 제공한다. 일반 및 지명 파이프의 두 가지 형태가 있다. 일반 파이프는 부모-자식 관계가 있는 프로세스 간의 통신을 위해 설계 되었다. 지명 파이프가 더 일반적이며 여러 프로세스가 통신할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;11. UNIX 시스템은 pipe() 시스템 콜을 통해 일반 파이프를 제공한다. 일반 파이프에는 읽기 종단과 쓰기 종단이 있다. 예를 들어, 부모 프로세스는 쓰기 종단을 사용하여 파이프로 데이터를 전송할 수 있으며 자식 프로세스는 읽기 종단에서 데이터를 읽을 수 있다. UNIX에서 지명 파이프를 FIFO라고 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;12. Windows 시스템도 익명 및 지명 파이프라는 두 가지 형식의 파이프를 제공한다. 익명 파이프는 UNIX 일반 파이프와 유사하다. 이들은 단방향이며 통신 프로세스간에 부모-자식 관계가 있어야 한다. 지명 파이프는 UNIX의 대응되는 FIFO보다 풍부한 프로세스 간 통신 방식을 제공한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;13. 클라이언트-서버 통신의 두 가지 일반적인 형태는 소켓과 원격 프로시저 호출(RPC)이다. 소켓을 사용하면 다른 시스템의 두 프로세스가 네트워크를 통해 통신할 수 있다. RPC는 다른 컴퓨터에 있는 프로세스에서 함수를 호출할 수 있는 방식으로 함수(프로시저) 호출 개념을 추상화한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;14. Android 운영체제는 바인더 프레임워크를 사용하여 프로세스 간 통신의 형태로 RPC를 사용한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개인공부/운영체제 공룡책 10판</category>
      <author>무제1351</author>
      <guid isPermaLink="true">https://responsibility.tistory.com/176</guid>
      <comments>https://responsibility.tistory.com/176#entry176comment</comments>
      <pubDate>Wed, 25 Nov 2020 18:21:10 +0900</pubDate>
    </item>
    <item>
      <title>운영체제 - Chapter 2. 운영체제의 구조</title>
      <link>https://responsibility.tistory.com/175</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 2. 운영체제 구조&lt;/h3&gt;
&lt;ol data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;운영체제 서비스&lt;/li&gt;
&lt;li&gt;사용자와 운영체제 인터페이스&lt;/li&gt;
&lt;li&gt;시스템 콜&lt;/li&gt;
&lt;li&gt;시스템 서비스&lt;/li&gt;
&lt;li&gt;링커와 로더&lt;/li&gt;
&lt;li&gt;응용 프로그램이 운영체제마다 다른 이유&lt;/li&gt;
&lt;li&gt;운영체제 설계 및 구현&lt;/li&gt;
&lt;li&gt;운영체제 구조&lt;/li&gt;
&lt;li&gt;운영체제 빌딩과 부팅&lt;/li&gt;
&lt;li&gt;운영체제 디버깅&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Chapter 2. 운영체제 구조&lt;/h2&gt;
&lt;p&gt;운영체제를 살펴보기 위한 3가지 관점&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;운영체제가 제공하는 &lt;b&gt;서비스&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;운영체제가 사용자와 프로그래머에게 제공하는 &lt;b&gt;인터페이스&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;시스템의 구성요소&lt;/b&gt;와 그들의 상호 연결&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;즉 사용자, 프로그래머, 운영체제 설계자의 관점에서 바라본다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;2.1 운영체제 서비스 -p62&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;운영체제는 프로그램 실행 환경을 제공한다. 운영체제는 프로그램과 그 프로그램의 사용자에게 특정 서비스를 제공한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;사용자 인터페이스(user interface)&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;일반적으로 그래픽 사용자 인터페이스(GUI)가 사용된다. 모바일로 넘어와서는 터치 스크린 인터페이스를 사용한다.&lt;/p&gt;
&lt;p&gt;명령어 라인 인터페이스도 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;프로그램 수행(program execution)&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;프로그램은 정상적이든, 비정상적이든(오류를 표시하면서) 실행을 끝낼 수 있어야 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;입출력 연산 (I/O operation)&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;수행 중인 프로그램은 입출력을 요구할 수 있다. 효율과 보호를 위해, 사용자들은 통상 입출력 장치를 &lt;b&gt;직접 &lt;/b&gt;제어할 수 없다.&lt;/span&gt;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;파일 시스템 조작 ( file system manipulation)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램은 파일을 읽고 쓸 필요가 있다. 프로그램은 파일을 생성,삭제,찾기, 파일의 정보를 열거 할 수 있어야한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;통신 (communication)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;한 프로세스가 다른 프로세스와 정보를 교환해야 할 필요가 있는 여러 상황이 있다. 통신 수행의 두가지가 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 동일한 컴퓨터에서 수행되고 있는 프로세스들 사이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 네트워크에 의해 함께 묶여 있는 서로 다른 컴퓨터 시스템상에서 수행되는 프로세스들 사이.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;통신 구현은 공유 메모리와 메시지 전달 기법을 쓴다. 메시지 전달 같은 경우 정보의 패킷들이 &lt;b&gt;운영체제&lt;/b&gt;에 의해 프로세스 사이를 이동한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;오류 탐지 (error detection)&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오류는 CPU, 메모리 하드웨어, 입출력 장치 또는 사용자 프로그램에서 일어날수 있다. 디버깅 설비는 시스템을 효율적으로 사용할 수 있는 사용자와 프로그래머의 능력을 향상시킨다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;자원 할당 ( resource allocation )&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;다수의 프로세스나 다수의 작업이 동시에 실행될때, 그들 각각에 자원을 할당해 주어야 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;기록 작성 (logging)&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;기록 관리는 회계(사용자에게 청구서를 보낼 수 있도록), 또는 단순히 사용 통계를 내기 위해 사용된다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;보호 (&amp;nbsp; protection ) 와 보안 ( security )&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;보호&lt;/b&gt;는 시스템 자원에 대한 모든 접근이 통제되도록 보장하는 것을 필요로 한다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;보안&lt;/b&gt;은 네트워크 어댑터 등과 같은 외부 입출력 장치들을 부적합한 접근 시도로부터 지키고, 침입의 탐지를 위해 모든 접속을 기록하는 것으로 범위를 넓힌다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;2.2 사용자와 운영체제 인터페이스 - p64&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;명령어 인터페이스는 사용자가 운영체제가 수행할 명령어를 직접 입력할 수 있도록 한다.&lt;/p&gt;
&lt;p&gt;GUI와 터치스크린인터페이스는 사용자가 그래픽 기반 사용자 인터페이스를 통하여 운영체제와 접촉하도록 하는 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2.2.1 명령 인터프리터 -p64&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;선택할 수 있는 여러 명령 인터프리터를 제공하는 시스템에서 이 해석기는 셸(shell)이라고 불린다.&lt;/p&gt;
&lt;p&gt;명령 인터프리터의 중요한 기능은 사용자가 지정한 명령을 가져와서 그것을 수행하는 것이다. 이 수준에서 제공된 많은 명령은 파일을 조작한다. 즉, 생성, 삭제, 리스트, 프린트, 복사, 수행 등을 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2.2.2 그래픽 기반 사용자 인터페이스 -p66&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;테스크톱이라고 특징지어지는, 마우스를 기반으로 하는 윈도 메뉴 시스템을 사용한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2.2.3 터치스크린 인터페이스 -p66&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2.2.4 인터페이스의 선택 -p67&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;개인의 선호에 달려있다.&lt;/p&gt;
&lt;p&gt;시스템관리자와 시스템에 대해 깊게 알고 있는 파워 유저 - 명령어-라인 인터페이스&lt;/p&gt;
&lt;p&gt;쉘스크립트는 UNIX와 Linux와 같이 명령어-라인 인터페이스에 기반을 둔 시스템에서는 매우 흔한 형태이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;2.3 시스템 콜 -p68&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;시스템 콜은 운영체제에 의해 사용 가능하게 된 서비스에 대한 인터페이스를 제공한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2.3.1 예제 -p69&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;파일 복사의 경우&lt;/p&gt;
&lt;p&gt;1. UNIX에선 cp란 명령어로 복사할 파일과 복사되어 나올 파일의 이름을 입력한다.&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;cp in.txt out.txt&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. 두 개의 파일 이름이 얻어지면, 프러그램은 반드시 입력 파일을 오픈하고 출력파일을 생선한 후 오픈한다.&lt;/p&gt;
&lt;p&gt;각각의 이러한 연산은 또 다른 시스템 콜을 필요로 하며, 각 시스템 콜에서 오류가 발생하면 처리되어야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. 두개의 파일이 준비되면, 입력 파일로부터 읽어서(하나의 시스템 콜), 출력 파일에 기록 (또 다른 시스템 콜) 하는 루프에 들어가게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4. 마지막으로 전체 파일이 복사된 후,프로그램은 두 개의 파일을 닫고 (2개의 시스템 콜), 콘솔 또는 윈도에 메시지를 기록하고 (추가의 시스템 콜들), 결국 정상적으로 종료(마지막 시스템 콜)하게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2.3.2 응용 프로그래밍 인터페이스(API&amp;nbsp; : Application Programming Interface)&amp;nbsp; -p70&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;API는 각 함수에 전달되어야 할 매개변수들과 프로그래머가 기대할 수 있는 반환 값을 포함하여 응용프로그래머가 사용 가능한 함수의 집합을 명시한다. ( ex: Java 가상 머신의 Java API )&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;프로그래머가 시스템 콜보다 API를 선호하는 이유&lt;/p&gt;
&lt;p&gt;1. 프로그램의 호환성&lt;/p&gt;
&lt;p&gt;2. 실제 시스템 콜은 종종 좀 더 자세한 명세가 필요하고 프로그램상에서 작업하기가 응용 프로그래머에게 가용한 API보다 더 어렵다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;대부분의 POSIX와 Windows API는 UNIX, Linux 및 Windows 운영체제가 제공하는 고유의 시스템콜과 유사하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2.3.3 시스템 콜의 유형 - p73&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;시스템 콜은 다섯 가지의 중요한 범주로 묶을수 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;프로세스 제어&lt;/li&gt;
&lt;li&gt;파일조작&lt;/li&gt;
&lt;li&gt;장치조작&lt;/li&gt;
&lt;li&gt;정보 유지 보수&lt;/li&gt;
&lt;li&gt;통신과 보호&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;2.3.3.1 프로세스 제어 -p75&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;1.실행 중인 프로그램은 수행을 정상적으로( end() ) 또는 비정상적으로 ( abort() )멈출 수 있어야 한다.&lt;/p&gt;
&lt;p&gt;2. 한 프로그램을 실행하고 있는 프로세스가 다른 프로그램을 적재 ( load() ) 하고 실행 ( execute () ) 하기를 원할 수 있다.&lt;/p&gt;
&lt;p&gt;3. 새로 생성한 잡이나 프로세스가 잘못되었거나 더 이상 필요 없다면 종료하기를 원할 수 있다. ( terminate_process() )&lt;/p&gt;
&lt;p&gt;4. 프로세스의 속성들을 결정하고 재설정(reset) 할 수 있는 능력이 필요하다.&lt;/p&gt;
&lt;p&gt;5. 일정 시간만큼 기다리기를 원할 수 있다.&lt;/p&gt;
&lt;p&gt;6. 특정 이벤트가 일어날 때까지 기다릴 수 있다. 그 경우 프로세스들은 그 이벤트가 일어나면 신호를 보내야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;2.3.3.2 파일 관리 -p79&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;1. 파일을 생성( create() ) 하고 삭제 ( delete () )할 수 있어야 한다.&lt;/p&gt;
&lt;p&gt;2. 파일이 생성되면 그것을 열고 ( open() ) 사용해야 한다.&lt;/p&gt;
&lt;p&gt;3. 읽고 쓰고 위치변경( 되감기, 파일의 끝으로 건너뛰기) 할 수 있다.&lt;/p&gt;
&lt;p&gt;4. 파일을 더 이상 사용하지 않을 경우 ( close() )가 필요하다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;2.3.3.3 장치 관리 -p79&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;1. 다수의 사용자가 동시에 사용하는 시스템은 독점적인 장치 사용을 보장받기 위해 우선 그 장치를 요청 ( request() ) 하는 것을 요구한다.&lt;/p&gt;
&lt;p&gt;2. 그 장치의 사용이 끝나면, 반드시 방출 ( release()) 해야한다.&lt;/p&gt;
&lt;p&gt;3. 장치를 요청하고 (그리고 할당받게 되면), 파일과 마찬가지로 그 장치를 읽고, 쓰고, 위치 변경할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;2.3.3.4 정보 유지 관리-p80&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;1. 많은 시스템 콜은 단순히 사용자 프로그램과 운영체제 간의 정보 전달을 위해 존재한다.&lt;/p&gt;
&lt;p&gt;2. 시스템 대부분은 현재 시간( time()과 날짜를 되돌려 주는(date()) 시스템 콜을 가지고 있다.&lt;/p&gt;
&lt;p&gt;3. 더욱이 운영체제는 현재 운영되고 있는 모든 프로세스에 관한 정보를 가지고 있으며, 이러한 정보에 접근하기 위한 시스템 콜이 있다.&lt;/p&gt;
&lt;p&gt;4. 일반적으로, 그 프로세스 정보를 획득하고 설정하기 위한 시스템 콜도 있다. ( get_process_attributes() 및 set_process_attributes)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; background-color: #9feec3;&quot;&gt;2.3.3.5 통신-p81&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;1. 메시지 전달 모델에서는 통신하는 두 포르세스가 정보를 교환하기 위하여 서로 메시지를 주고 받는다. 통신이 이루어지기 전에 연결이 반드시 열려야 한다.&lt;/p&gt;
&lt;p&gt;2. 공유 메모리 모델에서 프로세스는 다른 프로세스가 소유한 메모리 영역에 대한 접근을 위해 shared_memory_create()와 shared_memory_attach() 시스템 콜을 사용 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;일반적으로 운영체제는 한 프로세스가 다른 프로세스의 메모리에 접근하는 것을 막으려 한다. &lt;b&gt;공유메모리&lt;/b&gt;는 두 개 이상의 프로세스가 이러한 제한을 제거하는 데 동의 할 것을 필요로 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;2.3.3.6 보호 -p82&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보호는 컴퓨터 시스템이 제공하는 &lt;b&gt;자원에 대한 접근을 제어&lt;/b&gt;하기 위한 기법을 지원한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. 보호를 지원하는 시스템콜 set_permission() 과 get_permission()을 포함한다. 파일과 디스크와 같은 자원의 허가 권한을 설정 하는데 이용된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. allow_user()와 deny_user() 시스템 콜은 특정 사용자가 지정된 자원에 대해 접근이 허가 혹은 불허되었는지를 명시한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;2.4 시스템 서비스 - p82&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;시스템 서비스는, 시스템 유틸리티(system utility)로도 알려진, 프로그램 개발과 실행을 위해 더 편리한 환경을 제공한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;파일관리&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;파일과 디렉터리를 생성, 삭제, 복사, 개명 ( rename ), 인쇄, 열거하고, 그리고 일반적으로 조작한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;상태정보&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;어떤 프로그램들은 단순히 시스템에게 날짜, 시간, 사용 가능한 메모리, 디스크 공간의 양, 사용자 수, 혹은 이와 비슷한 상태 정보를 묻는다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다른 프로그램들은 더 복잡하여 상세한 성능, 로깅 및 디버깅 정보를 제공한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;파일 변경&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;디스크나 다른 저장 장치에 저장된 파일의 내용을 생성하고 변경하기 위해 다수의 문장 편집기를 사용할 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;프로그래밍언어 지원&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;일반적인 프로그래밍 언어들( ex: C, C++, Java, python등 )에 대한 컴파일러, 어셈블러, 디버거 및 해석기가 종종 운영체제와 함께 사용자에게 제공되거나 별도로 다운로드 받을 수 있다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;프로그램 적재와 수행&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;일단 프로그램이 어셈블되거나 컴파일 된 후, 그것이 수행되려면 반드시 메모리에 적재되어야 한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;통신&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;이들 프로그램은 프로세스, 사용자, 그리고 다른 컴퓨터 시스템들 사이에 가상접속을 이루기 위한 기법을 제공한다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;백그라운드 서비스&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;항상 실행되는 시스템 프로그램 프로세스는 서비스, 서브시스템, 또는 디먼으로 알려져 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;응용 프로그램에는 웹브라우저, 워드플세서, 텍스트 포매터, 스프레드시트, 데이터 베이스 시스템, 컴파일러, 도면 제작, 통계분석 패키지 그리고 게임이 포함된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;2.5 링커와 로더 -p84&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;소스 파일은 임의의 물리 메모리 위치에 적재되도록 설계된 오브젝트 파일로 컴파일 된다. 이러한 형식을 &lt;b&gt;재배치 가능 오브젝트 파일&lt;/b&gt; 이라고 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. 링커는 이러한 재배치 가능 오브젝트 파일을 하나의 이진 실행 파일로 결합한다.&lt;/p&gt;
&lt;p&gt;2. 로더는 이진 실행 파일을 메모리에 적재하는 데 사용되며, CPU 코어에서 실행할 수 있는 상태가 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;2.6 응용 프로그램이 운영체제마다 다른 이유 -p86&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;시스템의 낮은 수준에는 다른 어려움이 존재한다.&lt;/p&gt;
&lt;p&gt;1. 각 운영체제에는 헤더, 명령어 및 변수의 배치를 강제하는 응용 프로그램 이진 형식이 있다. 이러한 구성요소는 명시된 구조 형태로 실행 파일 내의 특정 위치에 있어야 운영체제가 파일을 열고 응용 프로그램을 적재하여 올바르게 실행할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. CPU는 다양한 명령어 집합을 가지며 해당 명령어가 포함된 응용 프로그램만 올바르게 실행할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. 운영체제는 응용 프로그램이 파일 생성과 네트워크 연결 열기와 같은 다양한 활동을 요청할 수 있는 시스템 콜을 제공한다. 이러한 시스템 콜은 사용되는 피연산자, 피연산자 순서, 응용 프로그램이 시스템 콜을 호출하는 방법, 시스템 콜 번호, 의미, 및 반환 결과를 포함하여 여러 측면에서 운영체제 마다 다르다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;2.7 운영체제 설계 및 구현 - p88&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2.7.1 설계 목표&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;시스템을 설계하는 데에 첫 문제점은 시스템의 목표와 명세를 정의 하는 일이다. 시스템 설계는 최상위 수준에서는 하드웨어와 시스템 유형의 선택에 의해 영향을 받을 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;이 최상위 설계 수준을 넘어서면 요구 조건들을 일일이 명시하는 것이 훨씬 어려워 진다&lt;/p&gt;
&lt;p&gt;이러한 요구 조건은 근본적으로 &lt;b&gt;사용자 목적&lt;/b&gt;과 &lt;b&gt;시스템 목적&lt;/b&gt;의 두 가지 기본 그룹으로 나눌 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2.7.2 기법과 정책 - p88&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;한 가지 중요한 원칙은 기법(mechanism)으로부터 정책을 분리하는 것이다&lt;/p&gt;
&lt;p&gt;기법 - 어떤 일을 &lt;b&gt;어떻게&lt;/b&gt; 할 것인가를 결정하는 것&lt;/p&gt;
&lt;p&gt;정책 - &lt;b&gt;무엇을 &lt;/b&gt;할 것인가를 결정하는 것&lt;/p&gt;
&lt;p&gt;(ex : 타이머 구조는 CPU 보호를 보장하기 위한 &lt;b&gt;기법&lt;/b&gt;이지만, 특정 사용자를 위해 타이머를 얼마나 오랫동안 설정할지를 결정하는 것은 &lt;b&gt;정책&lt;/b&gt;적 결정이다. )&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2.7.3 구현 implementation -p89&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;운영체제의 설계가 완료되면 구현되어야 한다. 운영체제를 구현하기 위해 고급 언어나 최소한 시스템 구현 언어를 사용함으로써 생기는 장점은 그 언어가 응용 프로그램을 위해 사용될 때 생기는 장점과 마찬가지이다.&lt;/p&gt;
&lt;p&gt;운영체제의 주요 성능 향상은 우수한 어셈블리어 코드보다는 좋은 자료구조와 알고리즘의 결과일 가능성이 크다. 단지 소량의 코드만이 고성능이 중요하다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;2.8 운영체제 구조 -p90&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;일반적인 접근 방법은 한 개의 일관된 시스템보다는 태스크를 작은 구성요소로 분할하는 것.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2.8.1 모놀리식 구조- p91&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;운영체제를 구성하는 가장 간단한 구조는 구조가 아예 없는 것이다. 즉, 커널의 모든 기능을 단일 주소 공간에서 실행되는 단일 정적 이진 파일에 넣는 것이다. 모놀리식 구조라고 하는 이 방법은 운영체제를 설계하는 일반적인 기술이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;모놀리식 커널의 명백한 단순성에도 불구하고 이 구조는 구현 및 확장하기 어렵다. 그러나 모놀리식 커널은 성능 면에서 뚜렷한 이점이 있다. 시스템 콜 인터페이스에는 오버헤드가 거의 없고 커널 안에서의 통신 속도가 빠르다. 그 이유로 속도와 효율성의 장점으로 UNIX, Linux 및 Windows 운영체제에서 발견할수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2.8.2 계층적 접근 -p92&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;시스템은 다양한 방식으로 모듈화 될 수 있다. 한 가지 방식이 계층적 접근 방식인데 이 방식에서는 운영체제가 여러 개의 층으로 나누어진다. 최하위 층은(층 0) 하드웨어이고 최상위 층(층 N)은 사용자 인터페이스 이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;계층적 접근 방식의 주된 장점은 구현과 디버깅의 간담함에 있다. 층들은 자신의 하위층들의 서비스와 기능들만을 사용하도록 선택된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;각 층은 자신보다 하위 수준의 층에 의해 제공된 연산들만 사용해 구현한다&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2.8.3 마이크로 커널 -p94&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;이 방법은 모든 중요치 않은 구성요소를 커널로부터 제거하고, 그들을 별도의 주소 공간에 존재하는 사용자 수준 프로그램으로 구현하여 운영체제를 구성하는 방법이다. 결과는 더 작은 커널이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2.8.4 모듈 Module - p95&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;운영체제를 설계하는 데 이용되는 최근 기술 중 최선책은 아마도 적재가능 커널 모듈기법의 사용일 것이다.&lt;/p&gt;
&lt;p&gt;이 접근법에서는 커널은 핵심적인 구성요소의 집합을 가지고 있고 부팅 때 또는 실행 중에 부가적인 서비스들을 모듈을 통하여 링크할 수 있다.&lt;/p&gt;
&lt;p&gt;설계의 주안점은 커널은 핵심 서비스를 제공하고 다른 서비스들은 커널이 실행되는 동안 동적으로 구현하는 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2.8.5 하이브리드 시스템 Hybrid System -p96&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;사실 엄격하게 정의된 하나의 구조를 채택한 운영체제는 거의 존재하지 않는다. 대신 다양한 구조를 결합하여 성능, 보안 및 편리성 문제를 해결하려는 혼용 구조로 구성된다.&lt;/p&gt;
&lt;p&gt;예를 들어, Linux는 운영체제 전부가 하나의 주소 공간에 존재하여 효율적인 성능을 제공하기 때문에 모놀리식 구조이다. 그러나 이 운영체제들은 모듈을 사용하기 때문에 새로운 기능을 동적으로 커널에 추가 할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;2.8.5.1 macOS와 iOSs -p96&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;1. 사용자 경험층&lt;/p&gt;
&lt;p&gt;이 층은 사용자가 컴퓨팅 장치와 상호 작용할 수 있는 소프트웨어 인터페이스를 정의한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2. 응용 프로그램 프레임워크 층&lt;/p&gt;
&lt;p&gt;이 층에는 Cocoa 및 Cocoa Touch 프레임 워크가 포함되며 Objective-C 밑 Swift 프로그래밍 언어에 대한 API를 제공한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. 핵심 프레임워크&lt;/p&gt;
&lt;p&gt;이 층은 Quicktime 및 OpenGL을 포함한 그래픽 및 미디어를 지원하는 프레임워크를 정의한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4. 커널 환경 Darwin 이라고도 불리는 이 환경에는 Mach 마이크로커널과 BSD UNIX커널이 포함된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;2.8.5.2 Android - p99&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Android는 그래픽, 오디오 및 하드웨어 기능을 지원하는 다양한 프레임워크를 제공하는 계층화된 소프트웨어 스택이라는 점에서 iOS와 유사하다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Google은 Java 개발을 위해 별도의 Android API를 설계하였다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;2.9 운영체제 빌딩과 부팅 -p100&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;일반적으로 운영체제는 다양한 주변장치 구성을 가진 모든 종류의 컴퓨터에서 실행되도록 설계된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2.9.1 운영체제 생성 -p102&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;운영체제를 처음부터 생성(또는 빌딩)하는 경우 다음 절차를 밟아야 한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;운영체제 소스 코드를 작성한다(또는 이전에 작성된 소스 코드를 확보한다)&lt;/li&gt;
&lt;li&gt;운영체제가 실행될 시스템의 운영체제를 구성한다&lt;/li&gt;
&lt;li&gt;운영체제를 컴파일 한다&lt;/li&gt;
&lt;li&gt;운영체제를 설치한다&lt;/li&gt;
&lt;li&gt;컴퓨터와 새 운영체제를 부팅한다&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2.9.2 시스템 부트 -p103&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;커널을 적재하여 컴퓨터를 시작하는 과정을 시스템 부팅이라고 한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;부트스트랩 프로그램 또는 부트 로더라고 불리는 작은 코드가 커널의 위치를 찾는다&lt;/li&gt;
&lt;li&gt;커널이 메모리에 적재되고 시작된다.&lt;/li&gt;
&lt;li&gt;커널은 하드웨어를 초기화 한다.&lt;/li&gt;
&lt;li&gt;루트 파일 시스템이 마운트 된다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;컴퓨터 전원을 처음 켜면 BIOS라고 하는 비휘발성 펌웨어에 있는 소형 부트 로더가 실행된다.&lt;/p&gt;
&lt;p&gt;많은 최신 컴퓨터 시스템이 BIOS 기반 부팅 과정을 UEFI로 대체 하였다. UEFI는 64비트 시스템과 용량이 큰 디스크를 더 잘 지원하는 것을 포함하여 BIOS에 비해 몇 가지 장점이 있다. 가장 큰 장점은 UEFI가 하나의 완전한 부팅관리자 이므로 다단계 BIOS 부팅 과정보다 빠르다는 것이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;2.10 운영체제 디버깅 -p105&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;넓게는 디버깅은 하드웨어와 소프트웨어에서의 시스템의 오류를 발견하고 수정하는 행위이다.&lt;/p&gt;
&lt;p&gt;성능 문제는 버그로 간주되므로 시스템에서 처리 중에 발생하는 &lt;b&gt;병목 현상&lt;/b&gt;을 제거하여 성능을 향상시키려는 &lt;b&gt;성능 조정&lt;/b&gt;도 디버깅에 포함된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2.10.1 장애분석 -p106&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;만일 프로세스가 실패한다면, 운영체제는 오류 정보를 &lt;b&gt;로그 파일&lt;/b&gt;에 기록한다.&amp;nbsp;&lt;/p&gt;
&lt;p&gt;또한 프로세스가 사용하던 메모리를 캡처한&lt;b&gt; 코어 덤프(core dump)&lt;/b&gt;를 취하고 차후 분석을 위해 파일로 저장한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;커널 장애는 &lt;b&gt;크래시( crash )&lt;/b&gt; 라고 불린다. 프로세스 장애와 마찬가지로 오류 정보가 로그 파일에 저장되고 메모리의 상태가 크래시 덤프&lt;/p&gt;
&lt;p&gt;( crash dump)에 저장된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2.10.2 성능 관찰 및 조정 -p106&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;성능 조정은 처리 병목 지점을 제거함으로써 성능을 향상시키려고 한다. 병목지점을 발견하기 위하여 시스템 성능을 감시할 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;2.10.2.1 카운터 Counters&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;OS는 일련의 카운터를 통해 호출된 시스템 콜 횟수 또는 네트워크 장치 또는 디스크에 수행된 작업 수와 같은 시스템 활동을 추적한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2.10.3 추적 -p108&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;추적 도구는 시스템 콜과 관련된 단계와 같은 특정 이벤트에 대한 데이터를 수집한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;2.10.4 BCC -p108&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;BCC&lt;/b&gt;(BPF Compiler Collection) 는 Linux 시스템을 위한 추적 기능을 제공하는 풍부한 툴킷이다. BCC는 eBPF ( extended Berkeley Packet Filter) 도구에 대한 프런트-엔드 인터페이스이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;2.11 요약 - p110&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;1.운영체제는 사용자 및 프로그램에 서비스를 제공하여 프로그램 실행 환경을 제공한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;2.운영체제와 상호 작용하기 위한 세 가지 주요 접근 방식: (1) 명령 인터프리터 (2) 그래픽 사용자 인터페이스 (3) 터치스크린 인터페이스&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;3. 시스템 콜은 운영체제에서 제공하는 서비스에 대한 인터페이스를 제공한다. 프로그래머는 시스템 콜 서비스에 액세스 하기 위해 시스템 콜의 API (application programming interface)를 사용한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;4. 시스템 콜은 (1) 프로세스 제어, (2) 파일관리 (3) 장치 관리 (4) 정보 유지 관리 (5) 통신 및 (6) 보호 라는 6가지 주요 범주로 나눌수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;5. 표준 C 라이브러리는 UNIX 밑 Linux 시스템을 위한 시스템 콜 인터페이스를 제공한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;6. 운영체제에는 사용자에게 유틸리티를 제공하는 시스템 프로그램 모음도 포함되어 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;7. 링커는 재배치 가능한 여러 오브젝트 모듈을 하나의 이진 실행 파일로 결합한다. 로더는 실행 파일을 메모리에 적재하여 사용 가능한 CPU에서 실행할 수 있게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;8. 응용 프로그램이 운영체제에 따라 달라지는 몇 가지 이유가 있다. 여기에는 프로그램 실행 파일에 대한 서로 다른 이진 형식, CPU에 따라 다른 명령 집합 및 운영체제 마다 다른 시스템 콜이 포함된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;9. 운영체제는 특정 목표를 염두에 두고 설계되었다. 이러한 목표는 궁극적으로 운영체제 정책을 결정한다. 운영체제는 특정 기법을 통해 이러한 정책을 구현한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;10. 모놀리식 운영체제는 구조가 없다. 모든 기능은 하나의 주소 공간에서 실행되는 단일 정적 바이너리 파일로 제공된다. 이러한 시스템을 수정하기는 어렵지만 주요 이점은 효율성이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;11. 계층화된 운영체제는 여러 개의 개별 층으로 나뉜다. 여기서 하위칭은 하드웨어 인터페이스이고 최상위층은 사용자 인터페이스이다.&lt;/p&gt;
&lt;p&gt;계층화된 소프트웨어 시스템이 어느 정도 성공을 거두었지만 이 방법은&amp;nbsp; 일반적으로 성능 문제로 인해 운영체제를 설계하는 데 적합하지 않다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;12.&amp;nbsp; 운영체제 설계를 위한 마이크로커널 접근 방식은 최소한의 커널을 사용한다. 대부분의 서비스는 사용자 수준 응용 프로그램으로 실행된다. 메시지 전달을 통해 통신이 이루어진다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;13. 운영체제 설계를 위한 모듈식 접근 방식은 실생 시간 중에 적재 및 제거할 수 있는 모듈을 통해 운영체제 서비스를 제공한다. 현대의 많은 운영체제는 모놀리식 커널과 모듈의 조합을 사용하여 하이브리드 시스템으로 구성된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;14. 부트 로더는 운영체제를 메모리에 적재하고 초기화를 수해앟며 시스템 실행을 시작한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;15. 카운터 또는 추적을 사용하여 운영체제의 성능을 관찰할 수 있다. 카운터는 시스템 전체 또는 프로세스별 통계의 모음인 반면에 추적은 운영체제를 통한 프로그램의 실행을 추적한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;연습문제&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;2.1 시스템 콜의 목적은 무엇인가?&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;2.2 명령 인터프리터의 목적은 무엇인가? 통상 커널에 포함되지 않는 이유는 무엇인가?&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;2.3 UNIX 시스템에서 새 프로세스를 시작하기 위해 명령 인터프리터나 셸에서 어떤 시스템 콜이 실행되어야 하는가?&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;2.4 시스템 프로그램의 목적은 무엇인가?&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;2.5 시스템 설계 시 계층화된 접근 방식의 주요 장점은 무엇인가? 계층화된 접근 방식의 단점은 무엇인가?&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;2.6 운영체제에서 제공하는 5가지 서비스를 나열하고 각 서비스가 사용자에게 편의를 제공하는 방법을 설명하라. 사용자 수준 프로그램이 이러한 서비스를 제공할 수 없는 겨우는 언제인가? 여러분의 답을 설명하라&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;2.7 일부 시스템은 운영체제를 펌웨어에 저장하고 다른 시스템은 디스크에 저장하는 이유는 무엇인가?&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style3&quot;&gt;2.8 부팅할 운영체제를 선택할 수 있도록 시스템을 설계하는 방법은 무엇인가? 부트스트랩 프로그램이 해야 할 일은 무엇인가?&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개인공부/운영체제 공룡책 10판</category>
      <category>Operating System</category>
      <category>OS</category>
      <category>공룡책</category>
      <category>운영체제</category>
      <author>무제1351</author>
      <guid isPermaLink="true">https://responsibility.tistory.com/175</guid>
      <comments>https://responsibility.tistory.com/175#entry175comment</comments>
      <pubDate>Wed, 25 Nov 2020 14:46:29 +0900</pubDate>
    </item>
    <item>
      <title>운영체제 - Chapter1. 서론</title>
      <link>https://responsibility.tistory.com/173</link>
      <description>&lt;h3 data-ke-size=&quot;size23&quot;&gt;목차&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 1. 서론&lt;/h3&gt;
&lt;ol data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;운영체제가 할 일&lt;/li&gt;
&lt;li&gt;컴퓨터 시스템의 구성&lt;/li&gt;
&lt;li&gt;컴퓨터 시스템 구조&lt;/li&gt;
&lt;li&gt;운영체제의 작동&lt;/li&gt;
&lt;li&gt;자원 관리&lt;/li&gt;
&lt;li&gt;보안과 보호&lt;/li&gt;
&lt;li&gt;가상화&lt;/li&gt;
&lt;li&gt;분산 시스템&lt;/li&gt;
&lt;li&gt;커널 자료구조&lt;/li&gt;
&lt;li&gt;계산 환경&lt;/li&gt;
&lt;li&gt;무료 및 공개 소스 운영체제&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Chapter 1. 서론&lt;/h2&gt;
&lt;p&gt;운영체제는 컴퓨터 하드웨어를 관리하는 소프트웨어이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;1.1 운영체제가 할 일 - p4&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;운영체제는 정부처럼 그 자체로는 유용한 기능을 수행하지 못한다. 운영체제는 단순히 다른 프로그램이 유용한 작업을 할 수 있는 &lt;b&gt;환경&lt;/b&gt;을 제공한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.1.1 사용자 관점 - p4&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;컴퓨터에 대한 사용자의 관점은 사용되는 인터페이스에 따라 달라진다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #333333; background-color: #f6e199;&quot;&gt;&amp;nbsp;1.1.2 시스템 관점 - p5&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;컴퓨터의 관점에서 운영체제는 하드웨어와 가장 밀접하게 연관된 프로그램이다. 따라서 우리는 운영체제를 &lt;b&gt;자원 할당자&lt;/b&gt;로 볼수있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.1.3 운영체제의 정의 - p5&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;운영체에는 항상 실행 중인 커널, 응용 프로그램 개발을 쉽게 하고 기능을 제공하는 미들웨어 프레임워크 및 시스템 실행 중에 시스템을 관리하는 데 도움이 되는 시스템 프로그램이 포함된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;1.2 컴퓨터 시스템의 구성 -p7&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;현대의 범용 컴퓨터 시스템은 하나 이상의 CPU와 구성요소와 공유 메모리 사이의 액세스를 제공하는 공통 &lt;b&gt;버스&lt;/b&gt;를 통해 연결된 여러 장치 컨트롤러로 구성된다. 일반적으로 운영체제에는 각 장치 컨트롤러마다 &lt;b&gt;장치 드라이버&lt;/b&gt;가 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.2.1 인터럽트 - p7&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;컨트롤러는 장치 드라이버에게 작업을 완료했다는 사실을 어떻게 알리는가? 이는 인터럽트를 통해 이루어진다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;1.2.1.1 개요 - p8&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;하드웨어는 어느 순간이든 시스템 버스를 통해 CPU에 신호를 보내 인터럽트를 발생시킬 수 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;CPU가 인터럽트 되면, CPU는 하던 일을 중단하고 즉시 고정된 위치로 실행을 옮긴다 (이러한 고정된 위치는 일반적으로 &lt;b&gt;인터럽트를 위한 서비스 루틴이 위치한 시작 주소&lt;/b&gt;를 가지고 있다.)&lt;/li&gt;
&lt;li&gt;인터럽트 서비스 루틴이 실행된다&lt;/li&gt;
&lt;li&gt;인터럽트 서비스 루틴(인터럽트 핸들러)의 실행이 완료되면, CPU는 인터럽트 되었던 연산을 재개한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;span style=&quot;background-color: #9feec3;&quot;&gt;1.2.1.2 구현 - p9&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;CPU하드웨어에는 &lt;b&gt;인터럽트 요청라인&lt;/b&gt;이라는 선이 있는데, 이는 하나의 명령어의 실행을 완료할 때마다 CPU가 이 선을 감지한다.&lt;/li&gt;
&lt;li&gt;CPU가, 컨트롤러가 인터럽트 요청 라인에 신호를 보낸 것을 감지하면, 인터럽트 번호를 읽고 이 번호를 인터럽트 벡터의 인덱스로 사용하여 인터럽트 핸들러 루틴으로 점프한다&lt;/li&gt;
&lt;li&gt;그런 다음 해당 인덱스와 관룐된 주소에서 실행을 시작한다&lt;/li&gt;
&lt;li&gt;인터럽트 핸들러는 작업 중에 변경될 상태를 저장하고, 인터럽트 원인을 확인하고, 필요한 처리를 수행하고, 상태 복원을 수행하고, return_from_interrupt 명령어를 실행하여 CPU를 인터럽트 전 실행 상태로 되돌린다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.2.2 저장장치 구조 - p12&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;RAM- 범용 컴퓨터는 프로그램 대부분을 메인 메모리(RAM)을 재기록 가능한 메모리에서 가져온다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ROM- 컴퓨터 전원을 켤 때 가장 먼저 실행되는 프로그램은 부트스트랩 프로그램이며 운영체제를 적재한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보조저장장치 - 대부분의 컴퓨터 시스템은 메인 메모리의 확장으로 보조저장장치를 제공한다( 영구 보존 )&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.2.3 입출력 구조 - p15&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;인터럽트 I/O - 소량의 데이터 이동&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NVS I/O - 대량 데이터 이동 ( 높은 오버헤드를 해결하기 위해 직접 메모리 액세스(DMA) 사용 )&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;1.3 컴퓨터 시스템 구조 - p16&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;컴퓨터 시스템은 사용된 범용 처리기의 수에 따라 분류 가능한 다양한 방식으로 구성될 수 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.3.1 단일 처리기 시스템 - p16&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;단일 처리 코어를 가진 범용 CPU가 하나만 있는 경우 시스템은 단일 프로세서 시스템이다.&lt;/p&gt;
&lt;p&gt;( 현대 컴퓨터 시스템은 단일 프로세서 시스템이 거의 없다.)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.3.2 다중 처리기 시스템 - p17&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가장 일반적인 다중 처리기 시스템은 각 피어 CPU 프로세서가 운영체제 기능 및 사용자 프로세스를 포함한 모든 작업을 수행하는 SMP를 사용한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.3.3 클러스터형 시스템 -p20&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 CPU를 가진 시스템의 또 다른 유형. 둘 이상의 독자적 시스템 또는 노드들을 연결하여 구성한다는 점에서 다중 처리기 시스템과 차이가 난다. 각 노드는 통상 다중 코어 시스템이다. 그러한 시스템은 약결합(loosely coupled)라고 간주된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;비대칭형 클러스터링 - 다른 컴퓨터들이 응용 프로그램을 싱행하는 동안 한 컴퓨터는 긴급대기 모드 상태를 유지&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대칭형 클러스터링 - 둘 이상의 호스트들이 응용 프로그램을 실행하고 서로를 감시&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;1.4 운영체제의 작동 -p23&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;컴퓨터 실행시 - CPU 레지스터에서 장치 컨트롤러, 메모리 내용에 이르기까지 시스템의 모든 측면을 초기화 한다. 부트 스트랩 프로그램이 운영체제 커널을 찾아 메모리에 적재한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;실행할 프로세스, 서비스할 I/O 장치 및 응답할 사용자가 없는 경우 운영체제는 조용히 무언가가 발생할 때까지 기다린다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.4.1 다중 프로그래밍과 다중 태스킹 -p24&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다중 프로그래밍 :&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;CPU가 항상 한 개는 실행할 수 있도록 프로그램을 구성하여 CPU 이용률을 높이고 사용자 만족도를 높인다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;다중 태스킹:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다중 프로그래밍의 논리적 확장이다. 다중 태스킹 시스템에서 CPU는 여러 프로세스를 전환하며 프로세스를 실행하지만 전환이 자주 발생하여 사용자에게 빠른 응답 시간을 제공하게 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.4.2 이중-모드와 다중모드 운용 -p26&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;적어도 두 개의 독립된 연산 모드, 즉 사용자 모드와 커널모드를 필요로 한다. 모드 비트라고 하는 하나의 비트가 현재의 모드를 나타내기 위해 컴퓨터의 하드웨어에 추가 되었다. 이 비트는 커널 모드(0) 또는 사용자 모드(1)를 나타낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.4.3 타이머(Timer) -p28&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;타이머&lt;/b&gt;는 지정된 시간 후 컴퓨터를 인터럽트 하도록 설정할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;가변 타이머&lt;/b&gt;는 일반적으로 고정률의 클록과 계수기로 구현한다.&lt;/p&gt;
&lt;p&gt;사용자에게 제어를 양도하기 전에, &lt;b&gt;운영체제&lt;/b&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;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;1.5 자원 관리 -p28&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;운영체제는 자원 관리자이다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;시스템의 CPU&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;메모리 공간&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;파일-저장 공간 및 I/O 장치는 운영체제가 관리해야 하는 자원에 속한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.5.1 프로세스 관리 -p29&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;실행 중인 프로그램인 프로세스다. 프로그램 그 자체는 프로세스가 아니다. 하나의 프로그램은 디스크에 저장된 파일의 내용과 같이 수동적 개체지만 프로세스는 다음 수행할 명령을 지정하는 프로그램 카운터를 가진 능동적인 개체이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;운영체제는 프로세스 관리와 연관해 다음과 같은 활동에 대한 책임을 진다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;사용자 프로세스와 시스템 프로세스의 생성과 제거&lt;/li&gt;
&lt;li&gt;CPU에 프로세스와 스레드 스케줄하기&lt;/li&gt;
&lt;li&gt;프로세스의 일시 중지와 재수행&lt;/li&gt;
&lt;li&gt;프로세스 동기화를 위한 기법 제공&lt;/li&gt;
&lt;li&gt;프로세스 통신을 위한 기법 제공&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.5.2 메모리 관리 -p30&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;운영체제는 메모리 관리와 관련하여 다음과 같은 일을 담당해야 한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;메모리의 어느 부분이 현재 사용되고 있으며 어느 프로세스에 의해 사용되고 있는지를 추적해야 한다.&lt;/li&gt;
&lt;li&gt;필요에 따라 메모리 공간을 할당하고 회수해야 한다.&lt;/li&gt;
&lt;li&gt;어떤 프로세스(또는 그 일부) 들을 메모리에 적재하고 제거할 것인가를 결정해야 한다.&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.5.3 파일 시스템 관리 -p31&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;운영체제는 파일 관리를 위하여 다음과 같은 일을 담당한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;파일의 생성 및 제거&lt;/li&gt;
&lt;li&gt;디렉터리 생성 및 제거&lt;/li&gt;
&lt;li&gt;파일과 디렉터리를 조작하기 위한 프리미티브의 제공&lt;/li&gt;
&lt;li&gt;파일을 보조저장장치로 매핑&lt;/li&gt;
&lt;li&gt;안정적인(비휘발성) 저장 매체에 파일을 백업&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.5.4 대용량 저장장치 관리 -p32&lt;/span&gt;&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;운영체제는 보조저장장치 관리와 관련하여 다음 활동을 담당한다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;마운팅과 언마운팅&lt;/li&gt;
&lt;li&gt;사용 가능 공간(free-space)의 관리&lt;/li&gt;
&lt;li&gt;저장장소 할당&lt;/li&gt;
&lt;li&gt;디스크 스케줄링&lt;/li&gt;
&lt;li&gt;저장장치 분할&lt;/li&gt;
&lt;li&gt;보호&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.5.5 캐시 관리 -p33&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;캐시&lt;/b&gt;는 운영체제로 제어할 수 없다. 캐시 크기가 제한되어 있으므로 캐시관리는 중요한 설계 문제다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;캐시&lt;/b&gt;로 부터 CPU 및 레지스터로의 데이터 전송은 통상 운영체제의 간섭 없이 하드웨어적으로 이루어진다.&lt;/p&gt;
&lt;p&gt;(디스크와 메모리 간의 데이터 전송은 통상 운영체제에 의해 제어된다.)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.5.6 입출력 시스템 관리 I/O Systems Management -p34&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;운영체제의 목적 중의 하나는 사용자에게 특정 하드웨어 장치의 특성을 숨기는 것이다.&lt;/p&gt;
&lt;p&gt;UNIX에서 입출력 장치의 특성은 입출력 서브시스템에 의해 운영체제 자체의 대부분으로 부터 숨겨져 있다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;1.6 보안과 보호 -p35&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;보호&lt;/b&gt;란 컴퓨터 시스템이 정의한 자원에 대해 프로그램, 프로세스, 또는 사용자들의 접근을 제어하는 기법이다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;보안&lt;/b&gt;은 외부 또는 내부의 공격을 방어하는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;1.7 가상화 -p36&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;가상화&lt;/b&gt;는 단일 컴퓨터(CPU, 메모리, 디스크 드라이브, 네트워크 인터페이스 카드 등)의 하드웨어를 여러 가지 실행 환경으로 추상화하여 개별 환경이 자신만의 컴퓨터에서 실행되고 있다는 환상을 만들 수 있는 기술이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;1.8 분산 시스템 - p38&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;분산 시스템은 물리적으로 떨어져 있는 이기종 컴퓨터들의 집합이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;1.9 커널 자료구조 - p39&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.9.1 리스트, 스택 및 큐 - p39&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;리스트&lt;/b&gt;는 데이터 값들의 집단을 하나의 시퀀스로 표시한다. 이 구조를 구현하는 가장 일반적인 방법이 연결 리스트(lniked list)이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;연결 리스트에서는 각 항이 다른 하나에 연결되어 있다.&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;단일 연결 리스트는 후속항을 가리킨다&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;이중 연결 리스트는 자신의 앞 항이나 뒤 항을 가리킨다&lt;/li&gt;
&lt;li data-ke-size=&quot;size16&quot;&gt;원형 연결 리스트는 리스트의 마지막 항이 null이 아니라 첫 항을 가리킨다.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;b&gt;스택&lt;/b&gt;은 순차적 순서를 가진 자료구조로 항을 넣거나 꺼내는 데 후입선출(last in first out, LIFO)을 사용한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;큐&lt;/b&gt;는 순차 순서의 자료구조로 선입선출(first in first out, FIFO)을 사용한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.9.2 트리 - p41&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;트리&lt;/b&gt;는 데이터의 서열을 표시하는 데 사용 가능한 자료구조이다. 트리 구조에서 데이터 값들은 부모-자식 관계로 연결된다.&lt;/p&gt;
&lt;p&gt;일반트리 - 부모는 임의의 자식을 가질 수 있다.&lt;/p&gt;
&lt;p&gt;이진트리 - 부모는 최대 두 개의 자식을 가질수 있다. 이를 좌측 자식, 우측 자식이라 부른다.&lt;/p&gt;
&lt;p&gt;이진 탐색 트리 - 추가로 붐의 두 자식 사이에 좌측 자식 &amp;lt;= 우측 자식의 순서를 요구한다. (&amp;nbsp; 최악의 경우 성능 = O(n)&amp;nbsp; )&lt;/p&gt;
&lt;p&gt;군형 이진 탐색트리 - 최악 경우 성능&amp;nbsp; O(lg n)을 보장&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.9.3 해시 함수와 맵 - p41&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;해시 함수&lt;/b&gt;는 데이터를 입력으로 받아 이 데이터에 산술 연산을 수행하여 하나의 수를 반환한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.9.4 비트맵 - p42&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;비트맵&lt;/b&gt;은 n개의 항의 상태를 나타내는 데 사용 가능한 n개의 이진 비트의 스트링이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;1.10 계산 환경 - p43&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.10.1 전통적 계산 -p43&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;&lt;b&gt;배치 시스템&lt;/b&gt; 파일이나 다른 데이터 소스로부터 미리 정해진 입력을 가지고 대량으로 작업을 처리하였다.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;대화형 방식 시스템&lt;/b&gt;은 사용자로부터 입력을 기다렸다.&lt;/p&gt;
&lt;p&gt;계산 자원을 최적으로 사용하기 위하여 다중 사용자들이 이 시스템을 나누어 사용했다.&lt;/p&gt;
&lt;p&gt;이러한 시분할 시스템은 자원의 일정량을 각 사용자에게 프로세스를 CPU에 하나씩 순환시켜 가면서 실행시키기 위하여 타이머와 스케줄링 알고리즘을 이용한다.&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;span style=&quot;background-color: #f6e199;&quot;&gt;1.10.1 모바일 컴퓨팅 -p44&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;모바일 컴퓨팅&lt;/b&gt;은 휴대용 스마트폰과 태블릿 컴퓨터의 컴퓨팅 환경을 말한다 ( iOS &amp;amp; Adroid )&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;span style=&quot;background-color: #f6e199;&quot;&gt;1.10.3 클라이언트 서버 컴퓨팅 -p45&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;현대 네트워크 구조는 &lt;b&gt;서버 시스템&lt;/b&gt;이 &lt;b&gt;클라이언트 시스템&lt;/b&gt;이 생성한 요청을 만족시키는 배치를 특징으로 한다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트-서버 시스템이라 불린다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;계산-서버 시스템&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이언트가 어떤 작업을(ex 데이터 일기) 요청할 수 있는 인터페이스를 제공한다. 그 결과로 서버는 그 작업을 수행하고 그 결과를 클라이언트에게 돌려보낸다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 클라이언트의 데이터 요청에 응답하는 DB를 실행하고 있는 서버.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;파일-서버 시스템&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라이어트가 파일을 생성, 갱신, 읽기 및 제거할 수 있는 파일 시스템 인터페이스를 제공한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 웹 브라우저 클라이언트에게 파일을 전달하는 웹 서버&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;span style=&quot;background-color: #f6e199;&quot;&gt;1.10.4 피어 간 계산 -p46&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분산 시스템의 다른 구조는 피어 간 시스템(P2P)이다.&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;span style=&quot;background-color: #f6e199;&quot;&gt;1.10.5 클라우드 컴퓨팅 -p47&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;클라우드 컴퓨팅은 계산, 저장장치는 물론 응용조차도 네트워크를 통한 서비스로 제공하는 계산 유형이다. 어떤 면에서 클라우드 컴퓨팅은 가상화를 그 기능의 기반으로 사용하기 때문에 가상화의 논리적 확장이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ex) 아마존의 ec2&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;span style=&quot;background-color: #f6e199;&quot;&gt;1.10.6 실시간 내장형 시스템 -p48&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;내장형 시스템은 거의 언제나 &lt;b&gt;실시간 운영체제&lt;/b&gt;를 수행한다. 실시간 시스템은 처리기의 작동이나 데이터의 흐름에 엄격한 시간 제약이 있을 때 사용한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;실시간 시스템은 잘 정의된, 고정된 시간 제약을 가진다. 정의된 제한 시간 내에 처리가 반드시 이루어져야 하며, 그렇지 않으면 시스템은 실패하게 된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;1.11 무료 및 공개 소스 운영체제 -p50&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;무료 운영체제와 공개 소스 운영체제는 컴파일된 이진 코드가 아닌 소스 코드 형식으로 제공된다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.11.1 역사 -p51&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;현대 컴퓨팅의 초기(1950년대)에 소프트웨어는 일반적으로 소스 코드와 함께 제공되었다.&lt;/p&gt;
&lt;p&gt;1980년 까지는 독점 소프트웨어가 일반적인 경우였다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.11.2 무료 운영체제 -p51&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;소프트웨어 사용 및 재배포를 제한하려는 움직임에 대응하기 위해 1984년 Richard Stallman은 GNU라는 무료 UNIX 호환 운영체제( GNU's Not Unix!&quot;의 약어) 를 개발하기 시작하였다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.11.3 GNU/Linux - p52&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.11.4 BSD Unix - p53&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.11.5 Solaris -p54&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;background-color: #f6e199;&quot;&gt;1.116 학습 도구로서 공개 소스 시스템 -p54&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;1.12 요약 -p56&lt;/span&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;인터럽트는 하드웨어가 운영체제와 상호 작용하는 주요 방법이다. 하드웨어 장치는 CPU에 신호를 보내 인터럽트를 촉발하여 일부 이벤트에 주의가 필요하다는 것을 CPU에게 경고한다. 인터럽트는 인터럽트 핸들러에 의해 관리된다.&lt;/li&gt;
&lt;li&gt;컴퓨터가 프로그램을 실행하려면 프로그램이 메인 메모리에 있어야 한다. 이 메모리는 프로세서가 직접 액세스 할 수 있는 유일한 대용량 저장장소이다.&lt;/li&gt;
&lt;li&gt;메인 메모리는 일반적으로 전월을 끄거나 잃을 때 내용이 손실되는 휘발성 저장장치 이다.&lt;/li&gt;
&lt;li&gt;비휘발성 저장장치는 메인 메모리의 확장이며 대량의 데이터를 역구적으로 보유할 수 있다.&lt;/li&gt;
&lt;li&gt;가장 일반적인 비휘발성 저장장치는 프로그램과 데이터를 모두 저장할 수 있는 하드 디스크이다.&lt;/li&gt;
&lt;li&gt;컴퓨터 시스템의 다양한 저장장치 시스템은 속도와 비용에 따라 계층 구조로 구성할 수 있다. 레벨이 높을수록 비싸지만 속도가 빠르다. 계층이 내려갈수록 일반적으로 비트당 비용은 감소하고 반면 액세스 시간은 증가한다&lt;/li&gt;
&lt;li&gt;최신 컴퓨터 아키텍처는 각 CPU에 여러 컴퓨팅 코어가 포함된 다중 처리기 시스템이다.&lt;/li&gt;
&lt;li&gt;CPU를 최대한 활용하기 위해 최신 운영체제는 다중 프로그래밍을 사용하여 여러 작업을 동시에 메모리에 적재할 수 있으므로 항상 CPU가 실행할 작업이 있게 보장한다.&lt;/li&gt;
&lt;li&gt;다중 태스킹은 CPU 스케줄링 알고리즘이 프로세스 간에 빠르게 전환하여 사용자에게 빠른 응답 시간을 제공하는 다중 프로그래밍의 확장이다&lt;/li&gt;
&lt;li&gt;사용자 프로그램이 시스템의 올바른 작동을 방해하지 않도록 시스템 하드웨어에는 사용자 모드와 커널 모드의 두 가지 모드가 있다.&lt;/li&gt;
&lt;li&gt;다양한 명령어가 특권을 가지며 커널 모드에서만 실행될 수 있다. 예를 들어 커널 모드로 전환하는 명령, I/O 제어, 타이머 관리 및 인터럽트 관리가 이러한 명령어들이다.&lt;/li&gt;
&lt;li&gt;프로레스는 운영체제의 기본 작업 단위이다. 프로세스 관리에는 프로세스 생성 및 삭제와 프로세스 간 통신 및 동기화 기법 제공이 포함된다.&lt;/li&gt;
&lt;li&gt;운영체제는 사용중인 메모리 영역과 사용 중인 프로세스를 추적하여 메모리를 관리한다. 또한 메모리 공간을 동적으로 할당하고 해제해야한다.&lt;/li&gt;
&lt;li&gt;저장장치 공간은 운영체제에서 관리한다. 이러한 책무에는 파일 및 디렉터리를 나타내는 파일 시스템을 제공하고 대용량 저장장치의 공간을 관리하는 것이 포함된다.&lt;/li&gt;
&lt;li&gt;운영체제는 ㅇ누영체제 및 사용자를 보호하고 안전하게 만들기 위한 기법을 제공한다. 보호 조치는 컴퓨터 시스템에서 사용 가능한 자원에 대한 프로세스 또는 사용자의 액세스를 제어한다.&lt;/li&gt;
&lt;li&gt;가상화에는 컴퓨터 하드웨어를 여러 가지 실행 환경으로 추상화하는 작어비 포함된다.&lt;/li&gt;
&lt;li&gt;운영체제에서 사용되는 자료구조엔 리스트, 스택, 큐, 트리 및 맵이 포함된다.&lt;/li&gt;
&lt;li&gt;컴퓨팅은 전통적인 컴퓨팅, 모바일 컴퓨팅, 클라이언트-서버 시스템, 피어 간 시스템, 클라우드 컴퓨팅 및 실시간 임베디드 시스템을 포함한 다양한 환경에서 이루어진다.&lt;/li&gt;
&lt;li&gt;무료 및 공개 소스 운영체제는 소스 코드 형식으로 제공된다. 무료 소프트웨어는 무료로 사용, 재배포 및 수정이 가능하다. GNU/Linux, FreeBSD 및 Solaris는 널리 사용되는 공개 소스 시스템의 예이다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;연습문제 - p58&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size18&quot; data-ke-style=&quot;style3&quot;&gt;1.1 운영체제의 세 가지 주요 목적은 무엇인가?&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size18&quot; data-ke-style=&quot;style3&quot;&gt;1.2 컴퓨팅 하드웨어를 효율적으로 사용하려면 운영체제가 필요하다고 강조하였다. 운영체제가 이 원칙을 버리고 자원을 낭비하는 것이 적절한 때는 언제인가? 그러한 시스템이 실제로 낭비하는 것이 아닌 이유는 무엇인가?&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size18&quot; data-ke-style=&quot;style3&quot;&gt;1.3 실시간 환경을 위해 운영체제를 작성할 때 프로그래머가 극복해야 하는 주요 어려움은 무엇인가?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size18&quot; data-ke-style=&quot;style3&quot;&gt;1.4 운영체제의 다양한 정의를 염두에 두고 운영체제에 웹 브라우저 및 메일 프로그램과 같은 응용 프로그램이 포함되어야 하는지 생각해 보라. 포함시킨다와 포함 시키지 않는다는 주장 모두의 입장에서 논증하라.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size18&quot; data-ke-style=&quot;style3&quot;&gt;1.5 커널 모드와 사용자 모드의 구별은 기본적인 형태의 보호(보안)로서 어떤 기능을 하는가?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size18&quot; data-ke-style=&quot;style3&quot;&gt;1.6 다음 중 특권 명령이어야 하는 명령어는 무엇인가?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size18&quot; data-ke-style=&quot;style3&quot;&gt;1.7 일부 초기 컴퓨터는 운영체제를 사용자 작업이나 운영체제 자체에서 수정할 수 없는 메모리 파티션에 배치하여 운영체제를 보호하였다. 이러한 기법에서 발생할 수 있다고 생각되는 두 가지 어려움을 설명하라.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size18&quot; data-ke-style=&quot;style3&quot;&gt;1.8 일부 CPU는 세 개 이상의 작동 모드를 제공한다. 이 다중 모드를 사용할 수 있는 두 가지 경우는 무엇인가?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size18&quot; data-ke-style=&quot;style3&quot;&gt;1.9 타이머는 현재 시간을 계산하는 데 사용될 수 있다. 어떻게 계산이 가능한지 간단하게 설명하라.&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size18&quot; data-ke-style=&quot;style3&quot;&gt;1.10 캐시가 유용한 두가지 이유를 제시하라. 어떤 문제를 해결할 수 있는가? 어떤 문제를 야기하는가? 캐시의 크기를 캐싱하는 장치만큼 크게 만들 수 있다면 (예 : 디스크의 크기와 같은 캐시) 캐시의 용량을 늘린 후 원래 장치를 제거하지 않는 이유는 무엇인가?&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-size=&quot;size18&quot; data-ke-style=&quot;style3&quot;&gt;1.11 분산 시스템의 클라이언트 - 서버 시스템과 피어 간 모델의 차이를 설명하라&lt;/blockquote&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개인공부/운영체제 공룡책 10판</category>
      <category>Operating System</category>
      <category>OS</category>
      <category>공룡책</category>
      <category>운영체제</category>
      <author>무제1351</author>
      <guid isPermaLink="true">https://responsibility.tistory.com/173</guid>
      <comments>https://responsibility.tistory.com/173#entry173comment</comments>
      <pubDate>Tue, 24 Nov 2020 00:57:17 +0900</pubDate>
    </item>
    <item>
      <title>운영체제 공룡책 10판 - 목차정리</title>
      <link>https://responsibility.tistory.com/171</link>
      <description>&lt;blockquote data-ke-style=&quot;style2&quot;&gt;개인적으로 혼자 책을 보면서 훑어보며 밑줄 쳤던 내용들입니다.&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;아직 식견이 부족하여 중요하지 않은 부분을 내포할수 있습니다.&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;정리를 위한 정리글이니 참고만 해주시면 감사하겠습니다.&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;본문 각 챕터의 제목마다 대 중 소 순으로 형광팬 색깔로 구분해놨습니다.&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;예)&lt;/h4&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;Chapter 1. 서론&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffc1c8;&quot;&gt;대- 1.1 운영체제가 할일&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #f6e199;&quot;&gt;중- 1.1.1 사용자 관점&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #f6e199;&quot;&gt;중- 1.1.2 시스템관점&lt;/span&gt;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #f6e199;&quot;&gt;중- 1.1.3 운영체제의 정의&amp;nbsp;&lt;/span&gt;&lt;/h4&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #ffc1c8;&quot;&gt;대- 1.2 컴퓨터 시스템의 구성&lt;/span&gt;&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #f6e199;&quot;&gt;중- 1.2.1 인터럽트&lt;/span&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;&lt;span style=&quot;color: #000000; background-color: #9feec3;&quot;&gt;소- 1.2.1.1 개요&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&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;color: #333333;&quot;&gt;본격적으로 공부하기 전에 목차를 보시면 대략 어떤 내용을 학습하는지 파악하실수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;차례&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size18&quot;&gt;(part 1 개관 - chap 1, 2)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 1. 서론&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 2. 운영체제 구조&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;(part 2 프로세스 관리 - chap 3~5)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 3. 프로세스&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 4. 스레드와 병행성&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 5. CPU 스케줄링&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(part 3 프로세스 동기화 - chap 6~8)&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 6. 동기화 도구들&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 7. 동기화 예제&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 8. 교착 상태&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(part 4 메모리 관리 - chap 9~10)&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 9. 메인 메모리&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 10. 가상 메모리&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(part &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;5 저장장치 관리 - chap 11~12)&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 11. 대용량 저장장치 구조&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 12. 입출력 시스템&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(part&lt;span&gt; 6&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt; 파일 시스템 - chap 13~15)&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 13. 파일 시스템 인터페이스&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 14. 파일 시스템 구현&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 15. 파일 시스템 내부구조&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(part&lt;span&gt; 7&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt; 보안과 보호- chap 16~17)&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 16. 보안&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 17. 보호&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(part&lt;span&gt;&lt;span&gt; 8&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;진보된 주제&lt;/span&gt;- chap 18~19)&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 18. 가상 머신&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 19. 네트워크 및 분산 시스템&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;(그외 20. Linux 시스템, 21.윈도우 가 있지만 포함하지 않았습니다. 각자 공부하는 OS에 맞춰 따로 공부하시면 될 것같습니다. 저는 &lt;a href=&quot;http://www.yes24.com/Product/Goods/89769181?OzSrank=1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;이것이 리눅스다&lt;/a&gt; 라는 책으로 공부할 예정입니다.)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;세분화&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 1. 서론&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;운영체제가 할 일&lt;/li&gt;
&lt;li&gt;컴퓨터 시스템의 구성&lt;/li&gt;
&lt;li&gt;컴퓨터 시스템 구조&lt;/li&gt;
&lt;li&gt;운영체제의 작동&lt;/li&gt;
&lt;li&gt;자원 관리&lt;/li&gt;
&lt;li&gt;보안과 보호&lt;/li&gt;
&lt;li&gt;가상화&lt;/li&gt;
&lt;li&gt;분산 시스템&lt;/li&gt;
&lt;li&gt;커널 자료구조&lt;/li&gt;
&lt;li&gt;계산 환경&lt;/li&gt;
&lt;li&gt;무료 및 공개 소스 운영체제&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 2. 운영체제 구조&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;운영체제 서비스&lt;/li&gt;
&lt;li&gt;사용자와 운영체제 인터페이스&lt;/li&gt;
&lt;li&gt;시스템 콜&lt;/li&gt;
&lt;li&gt;시스템 서비스&lt;/li&gt;
&lt;li&gt;링커와 로더&lt;/li&gt;
&lt;li&gt;응용 프로그램이 운영체제마다 다른 이유&lt;/li&gt;
&lt;li&gt;운영체제 설계 및 구현&lt;/li&gt;
&lt;li&gt;운영체제 구조&lt;/li&gt;
&lt;li&gt;운영체제 빌딩과 부팅&lt;/li&gt;
&lt;li&gt;운영체제 디버깅&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;(part 2 프로세스 관리 - chap 3~5)&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 3. 프로세스&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;프로세스 개념&lt;/li&gt;
&lt;li&gt;프로세스 스케줄링&lt;/li&gt;
&lt;li&gt;프로세스에 대한 연산&lt;/li&gt;
&lt;li&gt;프로세스 간 통신&lt;/li&gt;
&lt;li&gt;공유 메모리 시스템에서의 프로세스 간 통신&lt;/li&gt;
&lt;li&gt;메시지 전달 시스템에서의 프로세스 간 통신&lt;/li&gt;
&lt;li&gt;IPC 시스템의 사례&lt;/li&gt;
&lt;li&gt;클라이언트 서버 환경에서 통신&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 4. 스레드와 병행성&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;개요&lt;/li&gt;
&lt;li&gt;다중 코어 프로그래밍&lt;/li&gt;
&lt;li&gt;다중 스레드 모델&lt;/li&gt;
&lt;li&gt;스레드 라이브러리&lt;/li&gt;
&lt;li&gt;암묵적 스레딩&lt;/li&gt;
&lt;li&gt;스레드와 관련된 문제들&lt;/li&gt;
&lt;li&gt;운영체제 사례&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 5. CPU 스케줄링&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;기본 개념&lt;/li&gt;
&lt;li&gt;스케줄링 기준&lt;/li&gt;
&lt;li&gt;스케줄링 알고리즘&lt;/li&gt;
&lt;li&gt;스레드 스케줄링&lt;/li&gt;
&lt;li&gt;다중 처리기 스케줄링&lt;/li&gt;
&lt;li&gt;실시간 CPU 스케줄링&lt;/li&gt;
&lt;li&gt;운영체제 사례들&lt;/li&gt;
&lt;li&gt;알고리즘의 평가&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(part 3 프로세스 동기화 - chap 6~8)&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 6. 동기화 도구들&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;배경&lt;/li&gt;
&lt;li&gt;임계구역 문제&lt;/li&gt;
&lt;li&gt;Peterson의 해결안&lt;/li&gt;
&lt;li&gt;동기화를 위한 하드웨어 지원&lt;/li&gt;
&lt;li&gt;Mutex Locks&lt;/li&gt;
&lt;li&gt;세마포&lt;/li&gt;
&lt;li&gt;모니터&lt;/li&gt;
&lt;li&gt;라이브니스&lt;/li&gt;
&lt;li&gt;평가&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 7. 동기화 예제&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;고전적인 동기화 문제들&lt;/li&gt;
&lt;li&gt;커널 안에서의 동기화&lt;/li&gt;
&lt;li&gt;POSIX 동기화&lt;/li&gt;
&lt;li&gt;Java에서의 동기화&lt;/li&gt;
&lt;li&gt;대체 방안들&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 8. 교착 상태&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;시스템 모델&lt;/li&gt;
&lt;li&gt;다중 스레드 응용에서의 교착 상태&lt;/li&gt;
&lt;li&gt;교착 상태 특성&lt;/li&gt;
&lt;li&gt;교착 상태 처리 방법&lt;/li&gt;
&lt;li&gt;교착 상태 예방&lt;/li&gt;
&lt;li&gt;교착 상태 회피&lt;/li&gt;
&lt;li&gt;교착 상태 탐지&lt;/li&gt;
&lt;li&gt;교착 상태로부터 회복&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(part 4 메모리 관리 - chap 9~10)&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 9. 메인 메모리&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;배경&lt;/li&gt;
&lt;li&gt;연속 메모리 할당&lt;/li&gt;
&lt;li&gt;페이징&lt;/li&gt;
&lt;li&gt;페이지 테이블의 구조&lt;/li&gt;
&lt;li&gt;스와핑&lt;/li&gt;
&lt;li&gt;사례: Intel 32비트와 64비트 구조&lt;/li&gt;
&lt;li&gt;사례 : ARM 구조&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 10. 가상 메모리&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;배경&lt;/li&gt;
&lt;li&gt;요구 페이징&lt;/li&gt;
&lt;li&gt;쓰기 시 복사&lt;/li&gt;
&lt;li&gt;페이지 교체&lt;/li&gt;
&lt;li&gt;프레임의 할당&lt;/li&gt;
&lt;li&gt;스래싱&lt;/li&gt;
&lt;li&gt;메모리 압축&lt;/li&gt;
&lt;li&gt;커널 메모리의 할당&lt;/li&gt;
&lt;li&gt;기타 고려 사항&lt;/li&gt;
&lt;li&gt;운영체제의 예&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(part&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;5 저장장치 관리 - chap 11~12)&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 11. 대용량 저장장치 구조&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;대용량 저장장치 구조의 개관&lt;/li&gt;
&lt;li&gt;디스크 스케줄링&lt;/li&gt;
&lt;li&gt;NVM 스케줄링&lt;/li&gt;
&lt;li&gt;오류 감지 및 수정&lt;/li&gt;
&lt;li&gt;저장장치 관리&lt;/li&gt;
&lt;li&gt;스왑 공간 관리&lt;/li&gt;
&lt;li&gt;저장장치 연결&lt;/li&gt;
&lt;li&gt;RAID 구조&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 12. 입출력 시스템&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;개관&lt;/li&gt;
&lt;li&gt;입출력 하드웨어&lt;/li&gt;
&lt;li&gt;응용 입출력 인터페이스&lt;/li&gt;
&lt;li&gt;커널 입출력 서브시스템&lt;/li&gt;
&lt;li&gt;입출력 요구를 하드웨어 연산으로 변환&lt;/li&gt;
&lt;li&gt;STREAMS&lt;/li&gt;
&lt;li&gt;성능&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(part&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;6&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;파일 시스템 - chap 13~15)&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 13. 파일 시스템 인터페이스&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;파일 개념&lt;/li&gt;
&lt;li&gt;접근 방법&lt;/li&gt;
&lt;li&gt;디렉터리 구조&lt;/li&gt;
&lt;li&gt;보호&lt;/li&gt;
&lt;li&gt;메모리 사상 파일&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 14. 파일 시스템 구현&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;파일 시스템 구조&lt;/li&gt;
&lt;li&gt;파일 시스템 구현&lt;/li&gt;
&lt;li&gt;티렉터리 구현&lt;/li&gt;
&lt;li&gt;할당 방법&lt;/li&gt;
&lt;li&gt;가용 공간의 관리&lt;/li&gt;
&lt;li&gt;효율과 성능&lt;/li&gt;
&lt;li&gt;복구&lt;/li&gt;
&lt;li&gt;예: WAFL 파일 시스템&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 15. 파일 시스템 내부구조&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;파일 시스템&lt;/li&gt;
&lt;li&gt;파일 시스템 마운팅&lt;/li&gt;
&lt;li&gt;파티션과 마운팅&lt;/li&gt;
&lt;li&gt;파일 공유&lt;/li&gt;
&lt;li&gt;가상 파일 시스템&lt;/li&gt;
&lt;li&gt;원격 파일 시스템&lt;/li&gt;
&lt;li&gt;일관성의 의미&lt;/li&gt;
&lt;li&gt;NFS&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(part&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;7&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;보안과 보호- chap 16~17)&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 16. 보안&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;보안 문제&lt;/li&gt;
&lt;li&gt;프로그램 위협&lt;/li&gt;
&lt;li&gt;시스템과 네트워크 위협&lt;/li&gt;
&lt;li&gt;보안 도구로서 암호 기법&lt;/li&gt;
&lt;li&gt;사용자 인증&lt;/li&gt;
&lt;li&gt;보안 방어의 구현&lt;/li&gt;
&lt;li&gt;예: Windows 10&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 17. 보호&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;보호의 목표&lt;/li&gt;
&lt;li&gt;보호의 원칙&lt;/li&gt;
&lt;li&gt;보호 링&lt;/li&gt;
&lt;li&gt;보호의 영역&lt;/li&gt;
&lt;li&gt;접근 행렬&lt;/li&gt;
&lt;li&gt;접근 행렬의 구현&lt;/li&gt;
&lt;li&gt;접근 권한의 취소&lt;/li&gt;
&lt;li&gt;역할 기반 액세스 제어&lt;/li&gt;
&lt;li&gt;강제적 접근 제어&lt;/li&gt;
&lt;li&gt;자격-기반 시스템&lt;/li&gt;
&lt;li&gt;기타 보호 개선 방법&lt;/li&gt;
&lt;li&gt;언어 기반의 보호&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;(part&lt;span&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;8&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;span&gt;&amp;nbsp;진보된 주제&lt;/span&gt;- chap 18~19)&lt;/span&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 18. 가상 머신&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;개요&lt;/li&gt;
&lt;li&gt;역사&lt;/li&gt;
&lt;li&gt;장점 및 특징&lt;/li&gt;
&lt;li&gt;빌딩 블록&lt;/li&gt;
&lt;li&gt;VM유형 및 구현&lt;/li&gt;
&lt;li&gt;가상화와 운영체제 구성요소&lt;/li&gt;
&lt;li&gt;사례&lt;/li&gt;
&lt;li&gt;가상화 연구&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Chapter 19. 네트워크 및 분산 시스템&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;분산 시스템의 장점&lt;/li&gt;
&lt;li&gt;네트워크 구조&lt;/li&gt;
&lt;li&gt;통신 구조&lt;/li&gt;
&lt;li&gt;네트워크 및 분산 운영체제&lt;/li&gt;
&lt;li&gt;분산 시스템의 설계 문제&lt;/li&gt;
&lt;li&gt;분산 파일 시스템&lt;/li&gt;
&lt;li&gt;DFS 명명 및 투명성&lt;/li&gt;
&lt;li&gt;원격 파일 액세스&lt;/li&gt;
&lt;li&gt;분산 파일 시스템에 대한 최종 생각&lt;/li&gt;
&lt;li&gt;요약&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2020-11-23 오후 10.13.48.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1152&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6nryl/btqN5fvE7VF/iNrRWwN5ngNPDvVxH2e6bk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6nryl/btqN5fvE7VF/iNrRWwN5ngNPDvVxH2e6bk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6nryl/btqN5fvE7VF/iNrRWwN5ngNPDvVxH2e6bk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6nryl%2FbtqN5fvE7VF%2FiNrRWwN5ngNPDvVxH2e6bk%2Fimg.png&quot; data-filename=&quot;스크린샷 2020-11-23 오후 10.13.48.png&quot; data-origin-width=&quot;800&quot; data-origin-height=&quot;1152&quot; data-ke-mobilestyle=&quot;widthContent&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;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>개인공부/운영체제 공룡책 10판</category>
      <category>Operating System</category>
      <category>OS</category>
      <category>공룡책</category>
      <category>운영체제</category>
      <author>무제1351</author>
      <guid isPermaLink="true">https://responsibility.tistory.com/171</guid>
      <comments>https://responsibility.tistory.com/171#entry171comment</comments>
      <pubDate>Mon, 23 Nov 2020 22:13:03 +0900</pubDate>
    </item>
    <item>
      <title>자바의정석 - Chapter 2 변수</title>
      <link>https://responsibility.tistory.com/163</link>
      <description>&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 변수&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.1 변수(variable)란?&lt;/h3&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;단 하나의 값을 저장할 수 있는 메모리상의 공간&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.2 변수의 선언과 초기화&lt;/h3&gt;
&lt;p&gt;&lt;b&gt;변수 타입 : &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;변수에 저장될 값이 어떤 '타입(type)'인지 지정&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;변수이름:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;메모리 공간에 이름을 붙여주는 것.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;변수의 초기화 : &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;변수를 사용하기 전에 처음으로 값을 저장하는 것&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;초기화 이유 : &lt;/b&gt;&lt;/p&gt;
&lt;p&gt;메모리는 여러 프로그램이 공유하는 자원이므로 전에 다른 프로그램에 의해 저장된 '알 수없는 값(쓰레기값, garbage value)'이 남아있을 수 있기 때문.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1.3 변수의 명명규칙&lt;/h3&gt;
&lt;p&gt;변수의 이름 처럼 프로그래밍에 사용하는 모든 이름을 식별자 라고 하며, 식별자는 같은 영역 내에서 서로 구분될수 있어야한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;규칙&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;대소문자가 구분되며 길이에 제한이 없다.&lt;/li&gt;
&lt;li&gt;예약어를 사용해서는 안 된다.&lt;/li&gt;
&lt;li&gt;숫자로 시작해서는 안된다.&lt;/li&gt;
&lt;li&gt;특수문자는 '_'와 '$'만을 허용한다&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 변수의 타입&lt;/h2&gt;
&lt;p&gt;문자와 숫자 ( 정수, 실수)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;기본형:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;기본형 변수는 실제 값(data)을 저장한다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;참조형:&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;참조형 변수는 어떤 값이 저장되어 있는 주소(memory address)를 값으로 갖는다.&lt;/p&gt;
&lt;p&gt;참조형 변수를 선언할 때는 &lt;b&gt;변수의 타입으로 클래스의 이름을 사용&lt;/b&gt;하므로 클래스의 이름이 참조변수의 타입이 된다.&lt;/p&gt;
&lt;p&gt;그래서 새로운 클래스를 작성한다는 것은 새로운 참조형을 추가하는 셈이다.&lt;/p&gt;
&lt;p&gt;참조변수는 null 또는 객체의 주소를 값으로 갖는다.&lt;/p&gt;
&lt;p&gt;(JVM이 32비트면 4byte의 메모리 크기를, 64bit이면 8byte가 된다)&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;C언어와 달리 참조형 변수 간의 연산을 할 수 없으므로 실제 연산에 사용되는 것은 모두 기본형 변수이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2.1 기본형(primitive type)&lt;/h3&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2020-11-17 오전 12.12.00.png&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;410&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqv6LV/btqNCxiAMdf/y4z7SX8S0LQT8qDbflYwJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqv6LV/btqNCxiAMdf/y4z7SX8S0LQT8qDbflYwJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqv6LV/btqNCxiAMdf/y4z7SX8S0LQT8qDbflYwJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdqv6LV%2FbtqNCxiAMdf%2Fy4z7SX8S0LQT8qDbflYwJ0%2Fimg.png&quot; data-filename=&quot;스크린샷 2020-11-17 오전 12.12.00.png&quot; data-origin-width=&quot;1056&quot; data-origin-height=&quot;410&quot; data-ke-mobilestyle=&quot;widthContent&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;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2020-11-17 오전 12.11.51.png&quot; data-origin-width=&quot;1726&quot; data-origin-height=&quot;704&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/VnWua/btqNuQKGZu7/RMIxY6iWD4ViZ0SNn8yBMk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/VnWua/btqNuQKGZu7/RMIxY6iWD4ViZ0SNn8yBMk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/VnWua/btqNuQKGZu7/RMIxY6iWD4ViZ0SNn8yBMk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FVnWua%2FbtqNuQKGZu7%2FRMIxY6iWD4ViZ0SNn8yBMk%2Fimg.png&quot; data-filename=&quot;스크린샷 2020-11-17 오전 12.11.51.png&quot; data-origin-width=&quot;1726&quot; data-origin-height=&quot;704&quot; data-ke-mobilestyle=&quot;widthContent&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;</description>
      <category>개인공부/java</category>
      <author>무제1351</author>
      <guid isPermaLink="true">https://responsibility.tistory.com/163</guid>
      <comments>https://responsibility.tistory.com/163#entry163comment</comments>
      <pubDate>Tue, 17 Nov 2020 00:12:56 +0900</pubDate>
    </item>
    <item>
      <title>자바의 정석 - Chapter 01 자바를 시작하기 전에</title>
      <link>https://responsibility.tistory.com/162</link>
      <description>&lt;p data-ke-size=&quot;size14&quot;&gt;제가 따로 보기 위해 제 기준으로 요약하고 건너뛴 부분이 있습니다.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size14&quot;&gt;처음 자바를 공부하신 분이라면 학습하는데 있어 왜곡이 생길수도 있으니 그 점 주의하시면서 참고해주시면 감사하겠습니다. :)&lt;/p&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 자바 ( Java Programming Language)&lt;/h2&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.1 자바란?&lt;/h4&gt;
&lt;p&gt;C++의 장점을 채택하는 동시에 잘 사용되지 않는 부분은 과감히 제외&lt;/p&gt;
&lt;p&gt;풍부한 클래스 라이브러리(Java API)를 통해 프로그래밍에 필요한 요소들을 기본적으로 제공&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;1.2 자바의 역사&lt;/h4&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;/h4&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;li&gt;
&lt;ul style=&quot;list-style-type: disc;&quot;&gt;
&lt;li&gt;&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&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;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&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;1458&quot; data-origin-height=&quot;794&quot; data-filename=&quot;스크린샷 2020-11-16 오후 11.53.48.png&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bNXDvs/btqNEfhrhUU/MAr5iRLFNgsEf6ey2HrEC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bNXDvs/btqNEfhrhUU/MAr5iRLFNgsEf6ey2HrEC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bNXDvs/btqNEfhrhUU/MAr5iRLFNgsEf6ey2HrEC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbNXDvs%2FbtqNEfhrhUU%2FMAr5iRLFNgsEf6ey2HrEC0%2Fimg.png&quot; data-origin-width=&quot;1458&quot; data-origin-height=&quot;794&quot; data-filename=&quot;스크린샷 2020-11-16 오후 11.53.48.png&quot; data-ke-mobilestyle=&quot;widthContent&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;JVM (Java Virtual Machine) &lt;/span&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span&gt;자바 가상 머신으로 자바 바이트 코드&lt;/span&gt;&lt;span&gt;(.class &lt;/span&gt;&lt;span&gt;파일&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;를 &lt;/span&gt;&lt;span&gt;OS&lt;/span&gt;&lt;span&gt;에 특화된 코드로 &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;변환&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;인터프리터와 &lt;/span&gt;&lt;span&gt;JIT &lt;/span&gt;&lt;span&gt;컴파일러&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;하여 실행한다&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;바이트 코드를 실행하는 표준&lt;/span&gt;&lt;span&gt;(JVM &lt;/span&gt;&lt;span&gt;자체는 표준&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;이자 구현체&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;특정 밴더가 구현한 &lt;/span&gt;&lt;span&gt;JVM)&lt;/span&gt;&lt;span&gt;다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp; JVM &lt;/span&gt;&lt;span&gt;스팩&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&lt;a href=&quot;https://docs.oracle.com/javase/specs/jvms/se11/html/&quot;&gt;https://docs.oracle.com/javase/specs/jvms/se11/html/&lt;/a&gt; &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;JVM &lt;/span&gt;&lt;span&gt;밴더&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;오라클&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;아마존&lt;/span&gt;&lt;span&gt;, Azul, ... &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;특정 플랫폼에 종속적&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;스크린샷 2020-11-16 오후 11.57.05.png&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;974&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bxmSrz/btqNzpFAmtm/fxMX3D3XVaIO4RA0fPB9W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bxmSrz/btqNzpFAmtm/fxMX3D3XVaIO4RA0fPB9W0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bxmSrz/btqNzpFAmtm/fxMX3D3XVaIO4RA0fPB9W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbxmSrz%2FbtqNzpFAmtm%2FfxMX3D3XVaIO4RA0fPB9W0%2Fimg.png&quot; data-filename=&quot;스크린샷 2020-11-16 오후 11.57.05.png&quot; data-origin-width=&quot;1456&quot; data-origin-height=&quot;974&quot; data-ke-mobilestyle=&quot;widthContent&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;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;JRE (Java Runtime Environment): JVM + &lt;/span&gt;&lt;span style=&quot;letter-spacing: 0px;&quot;&gt;라이브러리&lt;/span&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span&gt;자바 애플리케이션을 실행할 수 있도록 구성된 배포판&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp; JVM&lt;/span&gt;&lt;span&gt;과 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스 &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;파일을 가지고 있다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp; &lt;/span&gt;&lt;span&gt;개발 관련 도구는 포함하지 않는다&lt;/span&gt;&lt;span&gt;. (&lt;/span&gt;&lt;span&gt;그건 &lt;/span&gt;&lt;span&gt;JDK&lt;/span&gt;&lt;span&gt;에서 제공&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;span&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;span&gt;JDK (Java Development Kit): JRE + &lt;/span&gt;&lt;span&gt;개발 툴 &lt;/span&gt;&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&amp;nbsp;JRE+&lt;/span&gt;&lt;span&gt;개발에필요할툴&lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;span&gt;소스 코드를 작성할 때 사용하는 자바 언어는 플랫폼에 독립적&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;오라클은 자바 &lt;/span&gt;&lt;span&gt;11&lt;/span&gt;&lt;span&gt;부터는 &lt;/span&gt;&lt;span&gt;JDK&lt;/span&gt;&lt;span&gt;만 제공하며 &lt;/span&gt;&lt;span&gt;JRE&lt;/span&gt;&lt;span&gt;를 따로 제공하지 않는다&lt;/span&gt;&lt;span&gt;. &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;span&gt;&amp;nbsp;Write Once Run Anywhere &lt;/span&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description>
      <category>개인공부/java</category>
      <author>무제1351</author>
      <guid isPermaLink="true">https://responsibility.tistory.com/162</guid>
      <comments>https://responsibility.tistory.com/162#entry162comment</comments>
      <pubDate>Mon, 16 Nov 2020 23:59:02 +0900</pubDate>
    </item>
    <item>
      <title>포프님 영상을 보고 ( 혼자 생각하기 )</title>
      <link>https://responsibility.tistory.com/159</link>
      <description>&lt;p&gt;&lt;a href=&quot;https://www.youtube.com/watch?v=MFDz8uBIjhU&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;www.youtube.com/watch?v=MFDz8uBIjhU&lt;/a&gt;&lt;/p&gt;
&lt;figure data-ke-type=&quot;video&quot; data-ke-style=&quot;alignCenter&quot; data-video-host=&quot;youtube&quot; data-video-url=&quot;https://www.youtube.com/watch?v=MFDz8uBIjhU&quot; data-video-thumbnail=&quot;https://scrap.kakaocdn.net/dn/bnRXzs/hyIfpbLRCc/9XfmunJhBDmQKL2UmP5KLK/img.jpg?width=1280&amp;amp;height=720&amp;amp;face=436_126_1110_702&quot; data-video-width=&quot;860&quot; data-video-height=&quot;484&quot; data-video-origin-width=&quot;860&quot; data-video-origin-height=&quot;484&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;iframe src=&quot;https://www.youtube.com/embed/MFDz8uBIjhU&quot; width=&quot;860&quot; height=&quot;484&quot; frameborder=&quot;&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;figcaption&gt;혼자 많은 생각을 하게 해준 포프님의 영상&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;국비교육 중에 인프런과 유튜브에 올라온 강의들로 기본개념과 지식들을 채웠다. 영상의 강사님들은 이미 정도에 올라 해당 분야의 임계점을 뚫고, 내용적으로 검증된 강의라고 생각하여 내용 그대로 학습했다. 필터없이 받아들인 것인데 당연히 백지인 상태에서 자신만의 관점과 필터란게 있을수 없고, 있다면 처음부터 왜곡된 관점을 가지는것 아닐까?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;하지만 모든 사람들이 공통적으로 같은 말을 할 수 있는 기본중의 기본을 익히고 나면, 그 기반을 토대로 자신이 스스로 생각하고 사유하면서 기반을 다져나가야 다른 사람의 지식을 왜곡없이 받아들일수 있다고 생각한다.&lt;/p&gt;
&lt;p&gt;결국 기본 다음 단계로 넘어가면 다들 자신들의 삶의 태도와 경험을 기반으로 관점이 만들어져, 그 관점을 기준으로 지식을 쌓고 해석하며 타인에게 말을하기 때문이다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;span style=&quot;color: #333333;&quot;&gt;요즘은 강의를 보고 공부하는 시기를 지나 다시 책을 보면서 혼자 공부하고 있다. 아직 혼자 사유하고 정리하기에 기본이 부족하다. 배우는 과정에서 정보를 왜곡하여 생각하고 중요한 정보를 놓치는 누수를 방지하기 위해 기본을 더 공부한다. 이는 &lt;/span&gt;&lt;span style=&quot;color: #333333;&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;color: #333333;&quot;&gt;미술유학중 석사과정을 밟고 있는 형이 내게 이런 말을 했다. &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&quot;어떤 철학자의 생각이 너무 맘에들어서 그 사람의 사상에 지독하게 빠지면 안된다. &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그렇게 되는 순간 우리는 사유하고 행동하는 인간이 아니라&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 철학자의 사상을 필터없이 받아들이고 그대로 전파하는 그저 녹음기, 앵무새가 된다. &lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;&lt;span style=&quot;color: #333333;&quot;&gt;그 사상이 마치 자기가 해낸 것인냥 혹은 그 사상을 이해하고 받아들였다는 사실만으로&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;blockquote data-ke-style=&quot;style2&quot;&gt;&lt;span style=&quot;font-family: 'Noto Sans Demilight', 'Noto Sans KR';&quot;&gt;우월감을 느끼는 멍청한 인간이 된다.&quot;&lt;/span&gt;&lt;/blockquote&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;한참 더 나은 철학자, 더 나은 사상을 찾아 해매던 나에게 큰 도움을 준 한마디였다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;물론 이 생각도 그 형의 생각이기 때문에 그대로만 받아들이면 자가당착이겠지만&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;내 경험과 사유로도 납득이 가고 많은 분야에서 같은 말이 나오는것을 보면서 좀 더 확신하게 됐다.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-filename=&quot;1.jpg&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;1088&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sDB4A/btqNzqXOiHC/yqIAES4dD8FSBVyBok29C0/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sDB4A/btqNzqXOiHC/yqIAES4dD8FSBVyBok29C0/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sDB4A/btqNzqXOiHC/yqIAES4dD8FSBVyBok29C0/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsDB4A%2FbtqNzqXOiHC%2FyqIAES4dD8FSBVyBok29C0%2Fimg.jpg&quot; data-filename=&quot;1.jpg&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;1088&quot; data-ke-mobilestyle=&quot;widthContent&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-filename=&quot;2.jpg&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;1116&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfJPSb/btqNuRaNIET/edHcD5INjGN1iVRgos6wC1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfJPSb/btqNuRaNIET/edHcD5INjGN1iVRgos6wC1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfJPSb/btqNuRaNIET/edHcD5INjGN1iVRgos6wC1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfJPSb%2FbtqNuRaNIET%2FedHcD5INjGN1iVRgos6wC1%2Fimg.jpg&quot; data-filename=&quot;2.jpg&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;1116&quot; data-ke-mobilestyle=&quot;widthContent&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-filename=&quot;3.jpg&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;742&quot; data-ke-mobilestyle=&quot;widthContent&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/La5gJ/btqNx9aXy0p/IWVO6gzSZdPc3kJaYckaNK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/La5gJ/btqNx9aXy0p/IWVO6gzSZdPc3kJaYckaNK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/La5gJ/btqNx9aXy0p/IWVO6gzSZdPc3kJaYckaNK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLa5gJ%2FbtqNx9aXy0p%2FIWVO6gzSZdPc3kJaYckaNK%2Fimg.jpg&quot; data-filename=&quot;3.jpg&quot; data-origin-width=&quot;660&quot; data-origin-height=&quot;742&quot; data-ke-mobilestyle=&quot;widthContent&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;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;너무 생각의 흐름대로 글을 쓴것같다..&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&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;이제 관점에 따라 갈리는 부분들은 한사람의 말만 듣지말고 여러 사람의 말을 들으면서 나의 관점과 경험을 토대로 정리한다.&lt;/li&gt;
&lt;li&gt;나의 지식과 관점에 오류가 있을수 있다는 사실을 항상 인식한다&lt;/li&gt;
&lt;li&gt;타인의 말도 100퍼센트 흡수하거나 거부하지 않고 사유해본다.&lt;/li&gt;
&lt;li&gt;기본을 잊지 않도록 다시 공부한다.&lt;/li&gt;
&lt;li&gt;기본을 토대로 쌓은 나의 사유는 나의 믿음이되고 이것이 나의 성장을 이끈다.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>주저리/개발공부중 드는 생각</category>
      <author>무제1351</author>
      <guid isPermaLink="true">https://responsibility.tistory.com/159</guid>
      <comments>https://responsibility.tistory.com/159#entry159comment</comments>
      <pubDate>Mon, 16 Nov 2020 11:38:49 +0900</pubDate>
    </item>
  </channel>
</rss>