<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>vysryoo</title>
    <link>https://vysryoo.tistory.com/</link>
    <description></description>
    <language>ko</language>
    <pubDate>Thu, 25 Jun 2026 18:16:36 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>vysryoo</managingEditor>
    <image>
      <title>vysryoo</title>
      <url>https://tistory1.daumcdn.net/tistory/5368609/attach/c59095527cf6472c9232ccb39fbe6d9f</url>
      <link>https://vysryoo.tistory.com</link>
    </image>
    <item>
      <title>[DS] deque 모듈</title>
      <link>https://vysryoo.tistory.com/154</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;i&gt;&lt;b&gt;파이썬 deque 모듈&lt;/b&gt;&lt;/i&gt;&lt;br&gt;&amp;nbsp;- double-ended queue (양쪽 끝에서 데이터를 삽입/삭제할 수 있는 큐)&lt;br&gt;&amp;nbsp;- collections 모듈에 포함되어 있고,&lt;br&gt;&amp;nbsp; &amp;nbsp; 내부적으로 &lt;b&gt;이중 연결 리스트(doubly linked list)&lt;/b&gt; 로 구현되어 있어 &lt;b&gt;양쪽 끝에서 O(1) 시간에 삽입/삭제&lt;/b&gt;가 가능&lt;br&gt;&amp;nbsp;- 파이썬 리스트(list)는 맨 앞쪽에서 요소를 삽입/삭제할 때 &lt;b&gt;O(n)&lt;/b&gt;시간이 걸리지만, deque는 &lt;b&gt;O(1)&lt;/b&gt; 성능을 보장&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;i&gt;&lt;b&gt;deque 모듈에 주요 메서드&lt;/b&gt;&lt;/i&gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;삽입/삭제&lt;br&gt;append(x) : 오른쪽(뒤)에 요소 추가&lt;br&gt;appendleft(x) : 왼쪽(앞)에 요소 추가&lt;br&gt;pop() : 오른쪽(뒤) 요소 제거 후 반환&lt;br&gt;popleft() : 왼쪽(앞) 요소 제거 후 반환&lt;br&gt;&amp;nbsp;&lt;br&gt;확장&lt;br&gt;extend(iterable) : iterable을 오른쪽에 확장&lt;br&gt;extendleft(iterable) : iterable을 왼쪽에 확장 (역순으로 들어감)&lt;br&gt;&amp;nbsp;&lt;br&gt;회전&lt;br&gt;rotate(n) : 양수 n이면 오른쪽으로 회전, 음수 n이면 왼쪽으로 회전&lt;br&gt;&amp;nbsp;&lt;br&gt;제거/삽입&lt;br&gt;insert(i, x) : 인덱스 i에 요소 삽입&lt;br&gt;remove(x) : 첫 번째로 등장하는 x 삭제&lt;br&gt;&amp;nbsp;&lt;br&gt;기타&lt;br&gt;clear() : 모든 요소 제거&lt;br&gt;count(x) : x의 개수 세기&lt;br&gt;reverse() : deque를 제자리에서 뒤집기&lt;br&gt;maxlen : deque 생성 시 최대 길이 지정 가능 (슬라이딩 윈도우 등에 활용)&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;deque 활용 (큐, 스택, 연결리스트, 슬라이딩 윈도우)&lt;br&gt;&amp;nbsp;&lt;br&gt;(1) FIFO 큐&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from collections import deque

queue = deque()

queue.append(1)
queue.append(2)
queue.append(3)

print(queue.popleft())&amp;nbsp;&amp;nbsp;# 1
print(queue.popleft())&amp;nbsp;&amp;nbsp;# 2
print(queue.popleft())&amp;nbsp;&amp;nbsp;# 3&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;(2) 스택 (LIFO 구조)&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;stack = deque()

stack.append(1)
stack.append(2)
stack.append(3)

print(stack.pop())&amp;nbsp;&amp;nbsp;# 3
print(stack.pop())&amp;nbsp;&amp;nbsp;# 2
print(stack.pop())&amp;nbsp;&amp;nbsp;# 1&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;(3) 연결리스트&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;linked = deque([10, 20, 30])

linked.appendleft(5)&amp;nbsp;&amp;nbsp; # 앞에 추가
linked.append(40)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;# 뒤에 추가
linked.insert(2, 15)&amp;nbsp;&amp;nbsp; # 인덱스 2에 삽입

print(linked)&amp;nbsp;&amp;nbsp;# deque([5, 10, 15, 20, 30, 40])

linked.remove(20)&amp;nbsp;&amp;nbsp;
print(linked)&amp;nbsp;&amp;nbsp;# deque([5, 10, 15, 30, 40])&lt;/code&gt;&lt;/pre&gt;&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;(4) 슬라이딩 윈도우&lt;br&gt;&amp;nbsp;&lt;br&gt;maxlen 속성을 활용하면 &lt;b&gt;고정 크기 버퍼&lt;/b&gt;나 &lt;b&gt;슬라이딩 윈도우&lt;/b&gt;를 쉽게 구현 가능&lt;/p&gt;&lt;pre data-ke-type=&quot;codeblock&quot; class=&quot;python&quot; data-ke-language=&quot;python&quot;&gt;&lt;code&gt;from collections import deque

window = deque(maxlen=3)&amp;nbsp;&amp;nbsp;# 최대 길이 3

for i in range(1, 7):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;window.append(i)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;print(list(window))


'''
[1]
[1, 2]
[1, 2, 3]
[2, 3, 4]
[3, 4, 5]
[4, 5, 6]
'''&lt;/code&gt;&lt;/pre&gt;</description>
      <author>vysryoo</author>
      <guid isPermaLink="true">https://vysryoo.tistory.com/154</guid>
      <comments>https://vysryoo.tistory.com/154#entry154comment</comments>
      <pubDate>Fri, 22 Aug 2025 12:39:37 +0900</pubDate>
    </item>
    <item>
      <title>[Web] Node.js</title>
      <link>https://vysryoo.tistory.com/149</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Node.js는 Chrome의 V8 JavaScript 엔진 위에서 동작하는 서버 사이드 JavaScript 런타임 환경&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원래 웹 브라우저에서만 동작하던 JavaScript를 브라우저 바깥,&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;p data-ke-size=&quot;size16&quot;&gt;새로운 패키지 생성&lt;/p&gt;
&lt;pre id=&quot;code_1751954201626&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm init&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이후, package.json 파일 생성을 위한 여러 질문을 차례대로 입력 (패키지 이름, 버전, 설명 등)&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;/p&gt;
&lt;pre id=&quot;code_1751954258383&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm init -y&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;Node.js 환경에서 자바스크립트 파일 실행 터미널 명령어&lt;/p&gt;
&lt;pre id=&quot;code_1751954345786&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;node index.js&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;패키지 스크립트(package script)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;package.json 파일의 &quot;scripts&quot; 항목에 정의되어 있으며,&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;이렇게 package.json을 설정한 후에&lt;/p&gt;
&lt;pre id=&quot;code_1751954638565&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;my-app&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;scripts&quot;: {
    &quot;start&quot;: &quot;node app.js&quot;,
    &quot;dev&quot;: &quot;nodemon app.js&quot;,
    &quot;test&quot;: &quot;echo \&quot;Error: no test specified\&quot; &amp;amp;&amp;amp; exit 1&quot;
  }
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;터미널에서 아래처럼 실행&lt;/p&gt;
&lt;pre id=&quot;code_1751954769270&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;npm run start     # &quot;node app.js&quot; 실행
npm run dev       # &quot;nodemon app.js&quot; 실행
npm test          # &quot;npm run test&quot;와 같음

// start와 test는 특별한 예약어로, npm start, npm test 처럼 run 생략 가능&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;자주 쓰는 스크립트 예시&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%; height: 105px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&quot;start&quot;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;서버 시작 (node index.js, ts-node, 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&quot;dev&quot;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;개발 모드 실행 (nodemon, webpack-dev-server 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&quot;build&quot;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;프로젝트 빌드 (webpack, tsc 등)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&quot;lint&quot;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;코드 스타일 검사 (eslint .)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;&quot;test&quot;&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;테스트 실행 (jest, mocha, 등)&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;&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;i&gt;&lt;b&gt;모듈&lt;/b&gt;&lt;/i&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;(1) commonJS (CJS)&lt;/p&gt;
&lt;pre id=&quot;code_1751955724178&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// test/src/math.js

function add(a, b){
    return a+b;
}

function sub(a, b){
    return a-b;
}

module.exports = {
    add: add,   // add (key와 value 이름 같을 경우) 
    sub: sub    // sub
}&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751955790942&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// test/src/index.js
 
const mathModule = require(&quot;./math.js&quot;);
console.log(mathModule.add(1,2));
console.log(mathModule.sub(4,3));

// const {add, sub} = require(&quot;./math.js&quot;);
// console.log(add(3,4));
// console.log(sub(5,6));&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(2) ECMAScript Module (ESM)&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;pakage.jason 파일에 설정 필요: &amp;nbsp;&amp;nbsp;&quot;type&quot;: &quot;module&quot; 항목 추가&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;ES 모듈 시스템을 사용하겠다고 설정하면, CJS는 사용할 수 없다&lt;/p&gt;
&lt;pre id=&quot;code_1751956468410&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;{
  &quot;name&quot;: &quot;test&quot;,
  &quot;version&quot;: &quot;1.0.0&quot;,
  &quot;main&quot;: &quot;index.js&quot;,
  &quot;scripts&quot;: {
    &quot;test&quot;: &quot;echo \&quot;Error: no test specified\&quot; &amp;amp;&amp;amp; exit 1&quot;,
    &quot;start&quot;: &quot;node src/index.js&quot;
  },
  &quot;author&quot;: &quot;&quot;,
  &quot;license&quot;: &quot;ISC&quot;,
  &quot;description&quot;: &quot;&quot;,
  &quot;type&quot;: &quot;module&quot;
}&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1751956711639&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import {add, sub} from &quot;./math.js&quot;
// import mul, {add, sub} from &quot;./math.js&quot;

console.log(add(3,4));
console.log(sub(5,6));&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1751956725958&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 방법 1

function add(a, b){
    return a+b;
}

function sub(a, b){
    return a-b;
}

export {add, sub};&lt;/code&gt;&lt;/pre&gt;
&lt;pre id=&quot;code_1751956842613&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;// 방법2

export function add(a, b){
    return a+b;
}

export function sub(a, b){
    return a-b;
}

export default funcion mult(a, b){
	return a*b;
}
// export 뒤에 default 키워드를 붙이면 모듈을 대표하는 기본값이 된다
// import할때, 중괄호 없이 불러오도록 설정해 주어야 하고, 이름을 바꿔서 불러오는 것도 가능하다&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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;i&gt;node.js 라이브러리&lt;/i&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;&lt;a href=&quot;https://www.npmjs.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&amp;nbsp;noreferrer&quot;&gt;https://www.npmjs.com/&lt;/a&gt;&lt;/p&gt;
&lt;figure id=&quot;og_1751958134025&quot; contenteditable=&quot;false&quot; data-ke-type=&quot;opengraph&quot; data-ke-align=&quot;alignCenter&quot; data-og-type=&quot;website&quot; data-og-title=&quot;npm | Home&quot; data-og-description=&quot;Bring the best of open source to you, your team, and your company Relied upon by more than 17 million developers worldwide, npm is committed to making JavaScript development elegant, productive, and safe. The free npm Registry has become the center of Java&quot; data-og-host=&quot;www.npmjs.com&quot; data-og-source-url=&quot;https://www.npmjs.com/&quot; data-og-url=&quot;https://www.npmjs.com/&quot; data-og-image=&quot;https://scrap.kakaocdn.net/dn/bgtlWW/hyZf7e7hqo/JSXCUYYhLEc2DVkukRKlw0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630&quot;&gt;&lt;a href=&quot;https://www.npmjs.com/&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot; data-source-url=&quot;https://www.npmjs.com/&quot;&gt;
&lt;div class=&quot;og-image&quot; style=&quot;background-image: url('https://scrap.kakaocdn.net/dn/bgtlWW/hyZf7e7hqo/JSXCUYYhLEc2DVkukRKlw0/img.png?width=1200&amp;amp;height=630&amp;amp;face=0_0_1200_630');&quot;&gt;&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;og-text&quot;&gt;
&lt;p class=&quot;og-title&quot; data-ke-size=&quot;size16&quot;&gt;npm | Home&lt;/p&gt;
&lt;p class=&quot;og-desc&quot; data-ke-size=&quot;size16&quot;&gt;Bring the best of open source to you, your team, and your company Relied upon by more than 17 million developers worldwide, npm is committed to making JavaScript development elegant, productive, and safe. The free npm Registry has become the center of Java&lt;/p&gt;
&lt;p class=&quot;og-host&quot; data-ke-size=&quot;size16&quot;&gt;www.npmjs.com&lt;/p&gt;
&lt;/div&gt;
&lt;/a&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;원하는 모듈의 설치 명령어를 터미널에 입력하면 해당 라이브러리 설치가 진행된다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- package.jason 파일 dependencies 항목에 라이브러리 이름, 버전이 추가됨&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- node_modules 폴더 추가됨 (설치한 라이브러리가 실제로 저장되는 공간)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- package-lock.jason에는 좀 더 정확한 버전 정보가 저장됨&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;node_modules 폴더나, package-lock.jason 파일이 삭제되면 정상적으로 동작하지 않는데,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이때 터미널에 &lt;b&gt;npm install&lt;/b&gt; 또는 &lt;b&gt;npm i&lt;/b&gt; 명령어를 입력하면&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;package.jason 파일의 dependencies 부분을 참고하여 자동으로 필요한 라이브러리를 설치해 준다&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;라이브러리로부터 import 할 때에는 from 뒤에 경로를 명시할 필요 없이,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;그냥 &quot;라이브러리 이름&quot;만 명시해 주면 된다&lt;/p&gt;
&lt;pre id=&quot;code_1751958866268&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;import randomColor from &quot;randomcolor&quot;;&lt;/code&gt;&lt;/pre&gt;</description>
      <author>vysryoo</author>
      <guid isPermaLink="true">https://vysryoo.tistory.com/149</guid>
      <comments>https://vysryoo.tistory.com/149#entry149comment</comments>
      <pubDate>Tue, 8 Jul 2025 14:52:28 +0900</pubDate>
    </item>
    <item>
      <title>[Web] JavaScript 비동기 처리</title>
      <link>https://vysryoo.tistory.com/148</link>
      <description>&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;939&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bCc6WX/btsO6LtIvav/Cwp4ZW8lryxkYTNfkpRdmK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bCc6WX/btsO6LtIvav/Cwp4ZW8lryxkYTNfkpRdmK/img.jpg&quot; data-alt=&quot;https://levelup.gitconnected.com/javascript-and-asynchronous-magic-bee537edc2da&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bCc6WX/btsO6LtIvav/Cwp4ZW8lryxkYTNfkpRdmK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbCc6WX%2FbtsO6LtIvav%2FCwp4ZW8lryxkYTNfkpRdmK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;417&quot; height=&quot;392&quot; data-origin-width=&quot;1000&quot; data-origin-height=&quot;939&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;https://levelup.gitconnected.com/javascript-and-asynchronous-magic-bee537edc2da&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Web APIs: 웹 브라우저가 직접 관리하는 별도의 영역&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-end=&quot;171&quot; data-start=&quot;149&quot; data-ke-size=&quot;size16&quot;&gt;비동기 처리의 핵심 구성 요소&lt;/p&gt;
&lt;p data-end=&quot;171&quot; data-start=&quot;149&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;212&quot; data-start=&quot;173&quot; data-ke-size=&quot;size16&quot;&gt;1. &lt;b&gt;자바스크립트 엔진 (런타임 / Call Stack)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 자바스크립트 코드를 &lt;b&gt;한 줄씩 실행&lt;/b&gt;하는 공간&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 동기 코드는 여기서 처리됨&lt;/p&gt;
&lt;pre id=&quot;code_1751903620556&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(&quot;A&quot;); // 실행됨 &amp;rarr; Stack에서 빠짐&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;343&quot; data-start=&quot;313&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;343&quot; data-start=&quot;313&quot; data-ke-size=&quot;size16&quot;&gt;2. &lt;b&gt;Web APIs (브라우저가 제공)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- setTimeout, fetch, DOM 이벤트 리스너 등을 처리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 이 작업들은 자바스크립트 엔진이 아니라 브라우저가 처리함&lt;/p&gt;
&lt;pre id=&quot;code_1751903642726&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;setTimeout(() =&amp;gt; {
  console.log(&quot;비동기 실행&quot;);
}, 1000);&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- setTimeout 함수는 엔진이 아니라 &lt;b&gt;Web API 영역&lt;/b&gt;으로 보내짐&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 1초가 지난 뒤, 콜백은 Callback Queue로 이동&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-end=&quot;618&quot; data-start=&quot;580&quot; data-ke-size=&quot;size16&quot;&gt;3. &lt;b&gt;Callback Queue (Task Queue)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Web API 작업이 끝나고, &lt;b&gt;실행할 준비가 된 콜백 함수들이 대기&lt;/b&gt;하는 곳&lt;/p&gt;
&lt;p data-end=&quot;703&quot; data-start=&quot;673&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;703&quot; data-start=&quot;673&quot; data-ke-size=&quot;size16&quot;&gt;4. &lt;b&gt;Event Loop (이벤트 루프)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Call Stack이 비어 있으면 &amp;rarr; Callback Queue에서 콜백을 가져와 Stack에 올려서 실행시킴&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1751903693259&quot; class=&quot;javascript&quot; data-ke-language=&quot;javascript&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;console.log(&quot;A&quot;);

setTimeout(() =&amp;gt; {
  console.log(&quot;B&quot;);
}, 1000);

console.log(&quot;C&quot;);


// console.log(&quot;A&quot;) &amp;rarr; 바로 실행 (Call Stack &amp;rarr; 출력)
// setTimeout(...) &amp;rarr; Web API에게 넘김 &amp;rarr; 1초 기다림
// console.log(&quot;C&quot;) &amp;rarr; 바로 실행
// 1초 후 &amp;rarr; 콜백 함수가 Callback Queue로 이동
// Call Stack이 비었으므로, Event Loop가 콜백을 실행함 &amp;rarr; &quot;B&quot; 출력&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <author>vysryoo</author>
      <guid isPermaLink="true">https://vysryoo.tistory.com/148</guid>
      <comments>https://vysryoo.tistory.com/148#entry148comment</comments>
      <pubDate>Tue, 8 Jul 2025 00:15:34 +0900</pubDate>
    </item>
    <item>
      <title>[Multicore] Final</title>
      <link>https://vysryoo.tistory.com/141</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;OpenMP is a framework for &lt;b&gt;shared&lt;/b&gt; memory parallel computing&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Raytracing: graphics rendering technique by tracing the path of light from the view camera&lt;br /&gt;through the 2D viewing plane, out into the 3D scene, and back to the light sources&lt;br /&gt;&amp;nbsp;&lt;br /&gt;GPU provides much higher &lt;b&gt;insturction throughput&lt;/b&gt; and &lt;b&gt;memory bandwidth&lt;/b&gt; than CPU&lt;br /&gt;GPU is designed for &lt;b&gt;highly parallel computations&lt;/b&gt; and&lt;br /&gt;therefore designed such that more &lt;b&gt;transistors&lt;/b&gt; are devoted to &lt;b&gt;data processing&lt;/b&gt;&lt;br /&gt;rather than&lt;b&gt; data control&lt;/b&gt; and &lt;b&gt;flow caching&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;CPU: Optimized for sequential code execution&lt;br /&gt;&amp;nbsp;- sophisticated &lt;b&gt;control logic&lt;/b&gt;&lt;br /&gt;&amp;nbsp;- large&lt;b&gt; cache memory&lt;/b&gt;&lt;br /&gt;&amp;nbsp;- powerful &lt;b&gt;ALU&lt;/b&gt;&lt;br /&gt;GPU: Optimized for execution of multiple threads&lt;br /&gt;&amp;nbsp;- minimize &lt;b&gt;control logic&lt;/b&gt; and &lt;b&gt;cache memory&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;- energy efficient &lt;b&gt;ALU&lt;/b&gt;&lt;br /&gt;&amp;nbsp;- cores are grouped&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;host code: &lt;b&gt;the part of code which will be run on the CPU&lt;/b&gt;&lt;br /&gt;device code: &lt;b&gt;the part of code which will be run on the GPU&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;guided is a type of OpenMP schedule&amp;nbsp;&lt;br /&gt;that is similar to the dynamic schedule, but &lt;b&gt;the chunk size decreases as the program runs&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;NVCC is a &lt;b&gt;proprietary compiler&lt;/b&gt; by Nvidia intended for use with CUDA&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Thrust is a &lt;b&gt;C++ template library&lt;/b&gt; for CUDA based on STL: &lt;b&gt;high-level interface&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;omp_get_thread_num()&lt;br /&gt;omp_set_num_threads()&lt;br /&gt;&amp;nbsp;&lt;br /&gt;meaning of #pragma omp sections:&lt;br /&gt;&lt;b&gt;Each section runs by only one thread in parallel&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;similarity between private and firstprivte:&lt;br /&gt;Each thread gets a copy of shared variable&lt;br /&gt;&amp;nbsp;&lt;br /&gt;difference between private and firstprivate:&lt;br /&gt;private: uninitialized per-thread copy of shared variable&lt;br /&gt;firstprivate: initialized per-thread copy of shared variable&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;CUDA로 stencil 구현 시, &amp;lt;&amp;lt;N+THREAD_NUM-1/THREAD_NUM, THREAD_NUM&amp;gt;&amp;gt; 사용하는 이유:&lt;br /&gt;&lt;b&gt;The vector size is an arbitrary number, &lt;/b&gt;&lt;br /&gt;&lt;b&gt;so we cannot ensure that N/THREAD_NUM blocks can cover &lt;/b&gt;&lt;b&gt;all elements &lt;/b&gt;&lt;br /&gt;&lt;b&gt;Thus I used N+THREAD_NUM-1 to&amp;nbsp; round up and ensure full coverage&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Parallel algorithms&lt;br /&gt;Tp = running time on p processors&lt;br /&gt;T1 (work) = running time on 1 processorss&lt;br /&gt;Tinf (span) = longest time to execute algorithm on inf # of processors&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Lower bounds&lt;br /&gt;Tp &amp;gt;= T1 / P&lt;br /&gt;Tp &amp;gt;= Tinf&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;Speed up&lt;/b&gt;&lt;br /&gt;&lt;b&gt;T1 / Tp&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;Parallelism (max speed up)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;T1 / Tinf&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;[Parallel Merge Sort]&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;432&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pqQBo/btsOwDI7DKM/6g6B3f4Ultmxy05M18Y7gk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pqQBo/btsOwDI7DKM/6g6B3f4Ultmxy05M18Y7gk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pqQBo/btsOwDI7DKM/6g6B3f4Ultmxy05M18Y7gk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpqQBo%2FbtsOwDI7DKM%2F6g6B3f4Ultmxy05M18Y7gk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;474&quot; height=&quot;242&quot; data-origin-width=&quot;846&quot; data-origin-height=&quot;432&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;Problem&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Parallelism is T1 / Tinf is Theta(logn) and that is too small so Merge step needs to&lt;/b&gt;&lt;br /&gt;&lt;b&gt;be parallelized&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;818&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kQcld/btsOwsA07SD/il9SUyGSL4VeKJz7an3nYK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kQcld/btsOwsA07SD/il9SUyGSL4VeKJz7an3nYK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kQcld/btsOwsA07SD/il9SUyGSL4VeKJz7an3nYK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkQcld%2FbtsOwsA07SD%2Fil9SUyGSL4VeKJz7an3nYK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;399&quot; height=&quot;393&quot; data-origin-width=&quot;830&quot; data-origin-height=&quot;818&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;spwan 부분은 두 스레드가 동시에 진행하는 것이기 때문에 2를 곱할 필요 없이&amp;nbsp;&lt;br /&gt;더 오래걸리는 하나의 함수 기준으로 시간 복잡도 측정하면 된다&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Par-Merge&lt;br /&gt;O(3n/4) &amp;lt;- largest possible size of function&lt;br /&gt;T(n) = O(logn) + T(3n/4) =&amp;gt; theta(log^2(n))&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Par-Merge-Sort&lt;br /&gt;T(n) = T(n/2) + theta(log^2(n)) =&amp;gt; theta(log^3(n))&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Parallelism = T1 / Tinf&lt;br /&gt;이때 T1은 일반적인 merge sort O(nlgn)&lt;br /&gt;Tinf는 theta(log^3(n))&lt;br /&gt;따라서 Parallelism은 theta (n/log^2(n))&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;[Parallel Quick Sort]&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHmfu8/btsOwDCjJ6s/dp6cCcvy5mucKEvfE8KplK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHmfu8/btsOwDCjJ6s/dp6cCcvy5mucKEvfE8KplK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHmfu8/btsOwDCjJ6s/dp6cCcvy5mucKEvfE8KplK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHmfu8%2FbtsOwDCjJ6s%2Fdp6cCcvy5mucKEvfE8KplK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;441&quot; height=&quot;312&quot; data-origin-width=&quot;836&quot; data-origin-height=&quot;592&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;886&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cehx7D/btsOww4QrhV/dmP8zVdqyKgp2gxrikiOmk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cehx7D/btsOww4QrhV/dmP8zVdqyKgp2gxrikiOmk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cehx7D/btsOww4QrhV/dmP8zVdqyKgp2gxrikiOmk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcehx7D%2FbtsOww4QrhV%2FdmP8zVdqyKgp2gxrikiOmk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;457&quot; height=&quot;468&quot; data-origin-width=&quot;866&quot; data-origin-height=&quot;886&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;984&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/A8GUo/btsOxurmDAW/PiyKTedFXOwTnNfTaft8U0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/A8GUo/btsOxurmDAW/PiyKTedFXOwTnNfTaft8U0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/A8GUo/btsOxurmDAW/PiyKTedFXOwTnNfTaft8U0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FA8GUo%2FbtsOxurmDAW%2FPiyKTedFXOwTnNfTaft8U0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;427&quot; height=&quot;540&quot; data-origin-width=&quot;778&quot; data-origin-height=&quot;984&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/beHDWk/btsOx1P3tZz/O6kasx6oD1UkUKJK2Rqyu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/beHDWk/btsOx1P3tZz/O6kasx6oD1UkUKJK2Rqyu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/beHDWk/btsOx1P3tZz/O6kasx6oD1UkUKJK2Rqyu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbeHDWk%2FbtsOx1P3tZz%2FO6kasx6oD1UkUKJK2Rqyu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;429&quot; height=&quot;380&quot; data-origin-width=&quot;706&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;In CUDA, &lt;b&gt;warp&lt;/b&gt;&amp;nbsp;is &lt;b&gt;a group of 32 threads&lt;/b&gt; where multiprocessors &lt;b&gt;execute the same instructions&lt;/b&gt; at each clock cycle.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;__global__ &lt;b&gt;runs on device&lt;/b&gt;, &lt;b&gt;callable from host code&lt;/b&gt;, &lt;b&gt;should have void return type&lt;/b&gt;&lt;br /&gt;__host__ runs on host, callable from host&lt;br /&gt;__device__ runs on device, callable fron device&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;Local, Global: Off-chip memory&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Shared, Register: On-chip memory&lt;/b&gt;&lt;br /&gt;In fact, shared memory latency is roughly 100x lower than uncached global memory latency&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Any call to a __global__ function must specify &lt;b&gt;execution configuration&lt;/b&gt; for that call&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;In GPU, a stream multiprocessor (&lt;b&gt;SM&lt;/b&gt;) is basically &lt;b&gt;SIMT processor&lt;/b&gt; that executes a warp simultaneously&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;(1) Static scheduling:&lt;/b&gt;&lt;br /&gt;#pragma omp parallel for schedule(static, n)&lt;br /&gt;&amp;rarr;&amp;nbsp;&lt;b&gt;Chunks of size n are assigned to threads in round-robin fashion before execution, &lt;/b&gt;&lt;br /&gt;&lt;b&gt;resulting in low overhead but potential load imbalance.&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;(2) Dynamic scheduling:&lt;/b&gt;&lt;br /&gt;#pragma omp parallel for schedule(dynamic, n)&lt;br /&gt;&amp;rarr;&amp;nbsp;&lt;b&gt;Chunks of size n are assigned to threads at runtime as they become available, &lt;/b&gt;&lt;br /&gt;&lt;b&gt;resulting in good load balance but high overhead.&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;double start_time = omp_get_wtime();&lt;br /&gt;// parallel section&lt;br /&gt;double end_time = omp_get_wtime();&lt;br /&gt;printf(&quot;execution time = %.10lf second&quot;, end_time - start_time);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;In OpenMp, values of private variables are &lt;b&gt;undefined&lt;/b&gt; on entry and exit of parallel region&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Characteristics of __global__ functions:&lt;br /&gt;1) Must specify &lt;b&gt;execution configuration&lt;/b&gt;&lt;br /&gt;2) &lt;b&gt;Exected on&lt;/b&gt; device&lt;br /&gt;3) &lt;b&gt;Callable from&lt;/b&gt; host code&lt;br /&gt;4) Must return void&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;cudaMemcpy() parameters:&lt;br /&gt;destination pointer, source pointer, size in byte, type of transfer&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Prefix sum:&amp;nbsp; si = x1&amp;oplus;x2&amp;oplus;⋯&amp;oplus;xi.&amp;nbsp; for 1 &amp;le; i &amp;le; n&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;__syncthreads():&lt;br /&gt;&lt;b&gt;__syncthreads() acts as a barrier, &lt;/b&gt;&lt;br /&gt;&lt;b&gt;ensuring that all threads have reached the same point in execution &lt;/b&gt;&lt;br /&gt;&lt;b&gt;before any can proceed.&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;Main advantages of &lt;b&gt;PSRS (Parallel Sorting by Regular Sampling)&lt;/b&gt;&lt;br /&gt;over parallel quicksort and hyper-quicksort algorithms are:&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Better &lt;b&gt;load balancing&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Repeated communications&lt;/b&gt; of a same value are &lt;b&gt;avoided&lt;/b&gt;&lt;br /&gt;The &lt;b&gt;number of processes does not have to be&lt;/b&gt; &lt;b&gt;a power of two&lt;/b&gt;, which is required by the other two algorithms.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;OpenMP에서 #pragma omp parallel for는 순서를 반드시 지켜야 하지만, 그 뒤에 오는 reduction, private, shared 같은 clause들은 순서를 자유롭게 바꿔도 된다.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;PSRS algorithm&lt;br /&gt;&lt;b&gt;In phase 1&lt;/b&gt;, each process uses the sequential quicksort algorithm to sort its share of elements, Each process selects regular sample of sorted list&lt;br /&gt;&lt;b&gt;In phase 2&lt;/b&gt;, all samples are gathered, sorted and p-1 global pivots are selected and broadcasted&lt;br /&gt;&lt;b&gt;In phase 3&lt;/b&gt;, each process partitions its list into p pieces using pivot values and sends partitions to other processes&lt;br /&gt;&lt;b&gt;In phase 4&lt;/b&gt;, each process merges its partitions into a single sorted partition&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;</description>
      <category>Multicore</category>
      <author>vysryoo</author>
      <guid isPermaLink="true">https://vysryoo.tistory.com/141</guid>
      <comments>https://vysryoo.tistory.com/141#entry141comment</comments>
      <pubDate>Wed, 11 Jun 2025 21:39:56 +0900</pubDate>
    </item>
    <item>
      <title>[OS] Memory #2</title>
      <link>https://vysryoo.tistory.com/140</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;1. Fetch Policy&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;Demand Paging&lt;/b&gt;&lt;br /&gt;&lt;b&gt;페이지에 접근이 있을 때만 메모리에 적재하는 방식&lt;/b&gt;&lt;br /&gt;&lt;u&gt;처음엔 페이지 폴트가 많지만 지역성 원리에 따라 점차 줄어든다.&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;Prepaging: 필요한 페이지 외에 근처 페이지도 미리 적재하는 방식&lt;/b&gt;&lt;br /&gt;&lt;u&gt;적재된 페이지가 사용되지 않으면 비효율적&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;2. Placement Policy&amp;nbsp;&lt;br /&gt;세그먼테이션에서는 중요하지만(처음 어떻게 배치되느냐에 따라 컴팩션 달라질 수..)&lt;br /&gt;페이징에서는 별로 중요하지 않다&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;3. Replacement Policy&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;Frame Locking: 교체를 방지하기 위해 프레임에 잠금을 설정하여 메모리에 유지되도록 하는 것&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;u&gt;Optimal: 가장 나중에 참조될 페이지를 교체 대상으로 선정&lt;/u&gt; (미래를 다 알아야 하기 때문에 현실적으로 불가능)&lt;br /&gt;&lt;u&gt;LRU(Least Recently Used): 가장 오래 전에 참조한 페이지를 교체 대상으로 선정&lt;/u&gt;&lt;br /&gt;&lt;u&gt;FIFO: 가장 오래 전에 들어온 페이지를 교체 대상으로 선정&lt;/u&gt; (오래 전에 들어왔어도 사용 될 수 있다)&lt;br /&gt;&lt;u&gt;Clock: 처음 들어오거나 참조되면 use-bit 1이 되고, 원형 큐에서 0인 페이지를 찾아서 교체 대상으로 선정&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1304&quot; data-origin-height=&quot;774&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/oqQ5V/btsOwG6JOMa/OViyKw0Nj4yuB3QyvCC2Vk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/oqQ5V/btsOwG6JOMa/OViyKw0Nj4yuB3QyvCC2Vk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/oqQ5V/btsOwG6JOMa/OViyKw0Nj4yuB3QyvCC2Vk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FoqQ5V%2FbtsOwG6JOMa%2FOViyKw0Nj4yuB3QyvCC2Vk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;511&quot; height=&quot;303&quot; data-origin-width=&quot;1304&quot; data-origin-height=&quot;774&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&lt;u&gt;(일단 프레임에 있는 페이지가 들어오면 그대로 진행)&lt;/u&gt;&lt;br /&gt;&lt;u&gt;(프레임에 없는 페이지가 들어오면)&lt;/u&gt;&lt;br /&gt;&lt;u&gt;(OPT는 뒤로 가면서 나오는 페이지 빼다가 가장 마지막에 빠지는 애 교체)&lt;/u&gt;&lt;br /&gt;&lt;u&gt;(LRU는 앞으로 가면서 나오는 페이지 빼다가 가장 마지막에 빠지는 애 교체)&lt;/u&gt;&lt;br /&gt;&lt;u&gt;(FIFO는 교체된 칸 기억해 뒀다가, 교체해야 하면 다음 칸 교체: 점 이동은 폴트 날 때에만)&lt;/u&gt;&lt;br /&gt;&lt;u&gt;(CLOCK는 새로 추가/이미 있는 프레임이면 * 넣고, 없으면 *떼면서 다음 칸으로: 점 이동 &amp;amp; 떼는 것은 폴트 날 때에만)&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;(FIFO랑 CLOCK에서 .은 반드시 순차적으로 진행)&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;Page Buffering (=Page Cache): 교체된 페이지를 메모리에 잠시 유지해 재참조 시 비용을 줄이는 기법&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/YgQA0/btsOwKg3V98/KEJMAsclew8P2M4Gkepl2k/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/YgQA0/btsOwKg3V98/KEJMAsclew8P2M4Gkepl2k/img.png&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;490&quot; style=&quot;width: 37.9621%; margin-right: 10px;&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;38.41&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/YgQA0/btsOwKg3V98/KEJMAsclew8P2M4Gkepl2k/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FYgQA0%2FbtsOwKg3V98%2FKEJMAsclew8P2M4Gkepl2k%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;494&quot; height=&quot;490&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bohsIN/btsOw3VghQZ/AHB8fsu3WKqh8aO2U9B9L0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bohsIN/btsOw3VghQZ/AHB8fsu3WKqh8aO2U9B9L0/img.png&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;240&quot; style=&quot;width: 60.8751%;&quot; data-is-animation=&quot;false&quot; data-widthpercent=&quot;61.59&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bohsIN/btsOw3VghQZ/AHB8fsu3WKqh8aO2U9B9L0/img.png&quot; alt=&quot;&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbohsIN%2FbtsOw3VghQZ%2FAHB8fsu3WKqh8aO2U9B9L0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;388&quot; height=&quot;240&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Free Frame List에 있는 프레임 최대한 먼저 쓰고&lt;br /&gt;Modified Page List에 있는 애들의 프레임을 쓰려면 디스크로 가서 수정해 주고 와서 써야하기&lt;br /&gt;때문에 시간이 걸린다&lt;br /&gt;Modified Page List에 있는 애들 모아뒀다가 한 번에 팍 적고 FFL로 옮겨 주는 cluster하면 효율적으로 운용 가능&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;Fixed-allocation: 프로세스에 고정된 수의 프레임을 할당&lt;/b&gt;, 폴트 시 해당 프로세스 내에서 페이지를 교체&lt;br /&gt;&lt;b&gt;Variable-allocation:&amp;nbsp; 페이지 폴트율에 따라 할당된 프레임 수를 동적으로 조절&lt;/b&gt;, 효율적이나 오버헤드가 발생&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;Local replacement policy: 폴트 시 프로세스의 페이지만 교체 후보로 고려&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Global replacement policy: 폴트 시 언락인 모든 페이지를 교체 후보로 고려&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;u&gt;fixed implies local&lt;/u&gt;&lt;br /&gt;&lt;u&gt;variable can be either local global&lt;/u&gt;&lt;br /&gt;&lt;u&gt;variable + local: 폴트율에 따라 동적으로 조절되되, 프로세스의 페이지만 가능&lt;/u&gt;&lt;br /&gt;&lt;u&gt;variable + global:&amp;nbsp; 폴트율에 따라 동적으로 조절되되, 메모리의 모든 프레임 선택 가능 (레지던트 셋 크기 변경)&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;u&gt;레지던트 셋 할당이 너무 적으면: 페이지 폴트 증가로 시스템이 느려짐&lt;/u&gt;&lt;br /&gt;&lt;u&gt;레지던트 셋 할당이 너무 많으면: 메모리 내 프로세스 수가 줄어 CPU Utilization이 떨어짐&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;u&gt;Variable+gloabal&lt;/u&gt;&lt;br /&gt;&lt;u&gt;페이지 폴트 발생 시,&lt;/u&gt;&lt;br /&gt;&lt;u&gt;FFL에 free frame이 있으면 레지던트 셋에 추가하고,&lt;/u&gt;&lt;br /&gt;&lt;u&gt;FFL이 비어있으면, 다른 프로세스의 레지던트 셋에서 하나 뺏어서 자신의 레지던트 셋에 넣는다&lt;/u&gt;&lt;br /&gt;&lt;u&gt;=&amp;gt; 이런 식으로 작동하면 비효율 초래 가능&lt;/u&gt;&lt;br /&gt;==&amp;gt; 해결: Page Buffering&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;4. Cleaning Policy&lt;br /&gt;modified page는 반드시 디스크에 기록되어야 하는데.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;Demand Cleaning&lt;/b&gt;&lt;br /&gt;&lt;b&gt;modified page를 페이지 교체 시 디스크에 기록하는 방법&lt;/b&gt;&lt;br /&gt;&lt;u&gt;페이지 폴트 시 두 번의 디스크 접근으로 CPU 활용도가 낮아질 수 있다.&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;Precleaning&lt;/b&gt;&lt;br /&gt;&lt;b&gt;modified page를 미리 미리 디스크에 기록해두고, 실제 교체 시 지연을 줄이는 방법&lt;/b&gt;&lt;br /&gt;&lt;u&gt;한 번 수정된 페이지들은 다시 수정될 가능성 높기 때문에 디스크 기록이 더 많이 필요할 수 있다&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;5. Load Contorol&lt;br /&gt;&amp;nbsp;&lt;br /&gt;메모리 내의&lt;br /&gt;너무 적은 프로세스 수는 스와핑이 늘어난다&lt;br /&gt;너무 많은 프로세수 수는 스레싱이 늘어난다&lt;br /&gt;&amp;nbsp;&lt;br /&gt;L = 페이지 폴트 간 시간&lt;br /&gt;S = 페이지 폴트로 처리 시간&lt;br /&gt;&amp;nbsp;&lt;br /&gt;L &amp;gt; S: 폴트 발생 x, 너무 안정됨 =&amp;gt; CPU 활용률이 너무 낮다&lt;br /&gt;L &amp;lt; S: 처리하기도 전에 또 다른 폴트 발생 =&amp;gt; 스레싱&lt;br /&gt;L = S일 때 최적이다&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Clock이 너무 천천히 돈다: CPU 활용률이 너무 낮다&amp;nbsp;&lt;br /&gt;Clock이 너무 빨리 돈다: 페이지 폴트가 너무 많이 발생, 스레싱 (멀티프로그래밍 레벨을 줄여야 한다)&lt;br /&gt;&amp;nbsp;&lt;br /&gt;멀티프로그래밍 레벨을 줄이기 위한 Process suspension 기준&lt;br /&gt;우선순위가 가장 낮은 프로세스,&lt;br /&gt;페이지 폴트를 일으킨 프로세스,&lt;br /&gt;마지막으로 활성화된 프로세스(최근에 들어왔으니까 레지던트 셋 작을 것이므로),&lt;br /&gt;레지던트 집합이 가장 작은 프로세스,&lt;br /&gt;가장 큰 프로세스(한 방에 큰 공간 확보할 수 있으므로),&lt;br /&gt;남은 실행 시간이 가장 긴 프로세스(짧게 남은 애들 빨리 빨리 처리하기 위해서).&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;I/O Buffering -&amp;gt; I/O 성능을 높일 수 있다&lt;br /&gt;&amp;nbsp;&lt;br /&gt;블록 지향 장치(Block-oriented device)&lt;br /&gt;고정 크기 블록 단위로 데이터 전송 (예: 디스크, USB)&lt;br /&gt;&lt;br /&gt;스트림 지향 장치(Stream-oriented device)&lt;br /&gt;바이트 스트림 형태로 데이터 전송하며 (예: 터미널, 프린터, 포트, 마우스)&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Disk Scheduling&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;u&gt;PRI: 우선순위대로 처리&lt;/u&gt;&lt;br /&gt;&lt;u&gt;FIFO: 요구순서대로 처리&lt;/u&gt;&lt;br /&gt;&lt;u&gt;SSTF(Shortest Service Time First): 근처에 있는 요청 먼저 처리(멀리 있는 요청 기아 가능)&lt;/u&gt;&lt;br /&gt;&lt;u&gt;SCAN: 한번 주욱 갔다가 주욱 오면서 요청 처리 (최대 2*h 대기)&lt;/u&gt;&lt;br /&gt;&lt;u&gt;LOOK: SCAN과 유사하지만 끝까지 가지 않고, 더 이상 요청이 없을 때 방향을 바꿔 불필요한 이동을 줄인다.&lt;/u&gt;&lt;br /&gt;&lt;u&gt;C-SCAN: 한 방향으로만 스캔 (최대 h+c 대기)&lt;/u&gt;&lt;br /&gt;&lt;u&gt;N-step-SCAN: 큐를 길이 N의 하위 큐로 나누고 각 큐를 SCAN으로 처리&lt;/u&gt;&lt;br /&gt;&lt;u&gt;(N이 너무 작으면 C-SCAN이랑 동일, N이 너무 크면 FIFO랑 동일)&lt;/u&gt;&lt;br /&gt;&lt;u&gt;arm stickiness problem: 디스크 암이 특정 구간에 머물러 다른 요청이 오래 대기하는 현상&lt;/u&gt;&lt;br /&gt;&lt;u&gt;FSCAN: 두 개의 하위 큐를 사용해,&lt;/u&gt;&lt;br /&gt;&lt;u&gt;한 큐에만 요청을 모으고 다른 큐는 주욱 실행하고,&lt;/u&gt;&lt;br /&gt;&lt;u&gt;다른 큐의 실행이 끝나면 해당 큐에서&amp;nbsp;요청을 모으고 다른 큐에서 요청을 주욱 실행하는 방법&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;RAID&lt;br /&gt;여러 독립 디스크를 하나의 논리 드라이브로 구성해&lt;br /&gt;데이터를 스트라이핑하고, 패리티를 통해 고장 시 데이터 복구를 보장하는 것&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;RAID 0: 중복성 없이 데이터를 디스크에 스트라이핑해 성능을 높이나 데이터 보호 기능은 없다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;376&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/BIAoQ/btsOxyHiDNy/SrNmK4DeHDD34WUCYYaniK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/BIAoQ/btsOxyHiDNy/SrNmK4DeHDD34WUCYYaniK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/BIAoQ/btsOxyHiDNy/SrNmK4DeHDD34WUCYYaniK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FBIAoQ%2FbtsOxyHiDNy%2FSrNmK4DeHDD34WUCYYaniK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;451&quot; height=&quot;186&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;376&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;RAID 1: 모든 데이터를 미러링해 고장 시 데이터 접근이 가능하며, 쓰기 병목이 없으나 비용이 높다&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1314&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/5D6Eo/btsOynkJwgU/f98hKOKdeHA7tOsohUhu71/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/5D6Eo/btsOynkJwgU/f98hKOKdeHA7tOsohUhu71/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/5D6Eo/btsOynkJwgU/f98hKOKdeHA7tOsohUhu71/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F5D6Eo%2FbtsOynkJwgU%2Ff98hKOKdeHA7tOsohUhu71%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;591&quot; height=&quot;136&quot; data-origin-width=&quot;1314&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;(RAID 2: 해밍 코드를 사용해 단일 비트 오류를 수정)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blI4HE/btsOw2hM3G8/oB8JnfiIfWSqzZWmLHBXTk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blI4HE/btsOw2hM3G8/oB8JnfiIfWSqzZWmLHBXTk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blI4HE/btsOw2hM3G8/oB8JnfiIfWSqzZWmLHBXTk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FblI4HE%2FbtsOw2hM3G8%2FoB8JnfiIfWSqzZWmLHBXTk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;548&quot; height=&quot;137&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;RAID 3: 비트 단위 스트라이핑과 단일 패리티 디스크를 사용&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;222&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dPVaUh/btsOwHLqdXH/KkuqIfdGHn2XQjwnZOi55K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dPVaUh/btsOwHLqdXH/KkuqIfdGHn2XQjwnZOi55K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dPVaUh/btsOwHLqdXH/KkuqIfdGHn2XQjwnZOi55K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdPVaUh%2FbtsOwHLqdXH%2FKkuqIfdGHn2XQjwnZOi55K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;499&quot; height=&quot;164&quot; data-origin-width=&quot;676&quot; data-origin-height=&quot;222&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;RAID 4: 블록 단위 스트라이핑과 단일 패리티 디스크를 사용, 쓰기 병목이 발생할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;266&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bdsgu4/btsOwLm5e7a/EiKaGI6QCtFOet3UuwFiek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bdsgu4/btsOwLm5e7a/EiKaGI6QCtFOet3UuwFiek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bdsgu4/btsOwLm5e7a/EiKaGI6QCtFOet3UuwFiek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbdsgu4%2FbtsOwLm5e7a%2FEiKaGI6QCtFOet3UuwFiek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;524&quot; height=&quot;173&quot; data-origin-width=&quot;806&quot; data-origin-height=&quot;266&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;RAID 5: 블록 단위 스트라이핑과 하나의 분산 패리티를 사용해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;쓰기 병목을 해결하고, 하나의 디스크 손실 시 복구가 가능하다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;350&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bkmD1r/btsOv9PdBrO/1VG2eVWV6JgRQHps0aAEUk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bkmD1r/btsOv9PdBrO/1VG2eVWV6JgRQHps0aAEUk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bkmD1r/btsOv9PdBrO/1VG2eVWV6JgRQHps0aAEUk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbkmD1r%2FbtsOv9PdBrO%2F1VG2eVWV6JgRQHps0aAEUk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;675&quot; height=&quot;263&quot; data-origin-width=&quot;900&quot; data-origin-height=&quot;350&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;RAID 6: 블록 단위 스트라이핑과 두 개의 분산 패리티를 사용해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;디스크 2개가 동시에 고장 나도 복구 가능, &lt;b&gt;쓰기 시 패리티 두 개를 갱신하여야하므로&lt;/b&gt; 성능이 RAID 5보다 저하된다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lFuNx/btsOyvJKSlM/gTD88se8UQH6rVs9v5Qtgk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lFuNx/btsOyvJKSlM/gTD88se8UQH6rVs9v5Qtgk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lFuNx/btsOyvJKSlM/gTD88se8UQH6rVs9v5Qtgk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlFuNx%2FbtsOyvJKSlM%2FgTD88se8UQH6rVs9v5Qtgk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;619&quot; height=&quot;166&quot; data-origin-width=&quot;820&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;812&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yfq96/btsOwMfcZKK/zdiQcqfZgLjgbYKDTCZYY0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yfq96/btsOwMfcZKK/zdiQcqfZgLjgbYKDTCZYY0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yfq96/btsOwMfcZKK/zdiQcqfZgLjgbYKDTCZYY0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fyfq96%2FbtsOwMfcZKK%2FzdiQcqfZgLjgbYKDTCZYY0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;261&quot; height=&quot;469&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;812&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;디스크 하나 고장 시 &lt;/b&gt;&lt;br /&gt;&lt;b&gt;RAID 0+1은 스트라이프 전체가 무효화되지만&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;RAID 1+0은 고장 난 디스크의 미러를 사용해 계속 작동 가능하기 때문에&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;RAID 1+0이 RAID 0+1 보다 더 우수하다&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;</description>
      <category>Operating system</category>
      <author>vysryoo</author>
      <guid isPermaLink="true">https://vysryoo.tistory.com/140</guid>
      <comments>https://vysryoo.tistory.com/140#entry140comment</comments>
      <pubDate>Wed, 11 Jun 2025 20:11:27 +0900</pubDate>
    </item>
    <item>
      <title>[SE] 소프트웨어 테스팅</title>
      <link>https://vysryoo.tistory.com/138</link>
      <description>&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;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;소프트웨어 테스트의 목적&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;bull; &lt;/span&gt;잠재적 &lt;u&gt;&lt;span&gt;오류&lt;/span&gt;&lt;/u&gt;와 &lt;span&gt;결함&lt;/span&gt;의 &lt;u&gt;발견&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;bull; &lt;/span&gt;&lt;u&gt;&lt;span&gt;요구사항&lt;/span&gt;의 준수 여부(기능/비기능) 확인&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;bull; &lt;/span&gt;소프트웨어 &lt;span&gt;신뢰성 등 품질&lt;/span&gt;&lt;span&gt; &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;오류를 발견하기 위한 활동으로, 테스팅이 오류가 없음을 확인시켜 주지는 않음&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;u&gt;직접 테스팅하지 않음&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 테스팅의 &lt;u&gt;목적은 결함이 존재함을 밝히는 것&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- &lt;u&gt;완벽한 테스팅은 불가능&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- &lt;u&gt;개발 초기에 테스팅 시작&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;살충제 패러독스&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;동일한 테스트를 반복하면 새로운 결함을 찾기 어려워, 테스트 케이스를 주기적으로 개선해야 한다.&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-07 오후 2.19.39.png&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfFlcQ/btsOroeYCl4/pkll1UAyHpG4gpBzFMjsG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfFlcQ/btsOroeYCl4/pkll1UAyHpG4gpBzFMjsG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfFlcQ/btsOroeYCl4/pkll1UAyHpG4gpBzFMjsG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfFlcQ%2FbtsOroeYCl4%2Fpkll1UAyHpG4gpBzFMjsG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;547&quot; height=&quot;183&quot; data-filename=&quot;스크린샷 2025-06-07 오후 2.19.39.png&quot; data-origin-width=&quot;1176&quot; data-origin-height=&quot;394&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-07 오후 2.25.04.png&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;514&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXQ3HM/btsOr5FxqQl/AIc1fKHcV6RPkx0z3YmS21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXQ3HM/btsOr5FxqQl/AIc1fKHcV6RPkx0z3YmS21/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXQ3HM/btsOr5FxqQl/AIc1fKHcV6RPkx0z3YmS21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXQ3HM%2FbtsOr5FxqQl%2FAIc1fKHcV6RPkx0z3YmS21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;470&quot; height=&quot;244&quot; data-filename=&quot;스크린샷 2025-06-07 오후 2.25.04.png&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;514&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;테스트에 대한 시각&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;검증: 개발 단계의 산출물이 설정된 조건을 만족하는 지 평가 (소프트웨어 프로세스가 잘 진행되는 지 평가)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;확인: 요구사항들을 만족하는 지 평가&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;&lt;span style=&quot;color: #666666;&quot;&gt;테스트의 목적&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;회복 테스트: 고의적 실패 유도&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;보안 테스트: 불법적인 침해&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;스트레스 테스트: 과부하 테스트&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;성능 테스트: 응답시간, 처리량, 속도&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #666666;&quot;&gt;회귀 테스트: 변경이 새로운 오류를 발생시키지 않음을 확인&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;&lt;b&gt;V-모델:&lt;/b&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-07 오후 2.32.28.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;428&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cQmYtE/btsOsAdZGdf/B7VUTzGt3aVxAFPkMeUYrk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cQmYtE/btsOsAdZGdf/B7VUTzGt3aVxAFPkMeUYrk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cQmYtE/btsOsAdZGdf/B7VUTzGt3aVxAFPkMeUYrk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcQmYtE%2FbtsOsAdZGdf%2FB7VUTzGt3aVxAFPkMeUYrk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;472&quot; height=&quot;210&quot; data-filename=&quot;스크린샷 2025-06-07 오후 2.32.28.png&quot; data-origin-width=&quot;960&quot; data-origin-height=&quot;428&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;단위 테스팅:&lt;/b&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;&lt;b&gt;&amp;nbsp;- 스텁: 테스팅 대상 모듈이 호출하는 모듈&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- 드라이버: 테스팅 대상 모듈을 호출하는 환경&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;&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;b&gt;빅뱅 기법&lt;/b&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;b&gt;하향식 기법&lt;/b&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;b&gt;상향식 기법&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;시스템 테스팅:&lt;/b&gt; &lt;b&gt;통합 완료된 시스템&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;인수 테스팅&lt;/b&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;b&gt;알파 테스팅&lt;/b&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;b&gt;베타 테스팅&lt;/b&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Selenium&lt;/b&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;&lt;b&gt;사용자처럼 동작을 재현해 정확한 테스트가 가능&lt;/b&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;&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;블랙박스 테스팅 (Black-Box Testing)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&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; &lt;/span&gt;&lt;u&gt;입출력&lt;span&gt; &lt;/span&gt;값에만&lt;span&gt; &lt;/span&gt;관심&lt;/u&gt;이&lt;span&gt; &lt;/span&gt;있음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- 사용자 관점의 테스트 가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- 코드 지식이 불필요하기 때문에 비기술적 테스트도 참여 가능&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- 입출력 관계를 중심으로 테스트하기 때문에,&lt;/b&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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;구문 테스팅 (Syntax Testing)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;입력 값&lt;/u&gt;을 &lt;u&gt;적합(Valid)과 부적합(Invalid)&lt;/u&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;&lt;b&gt;동등 분할 (Equivalence Partitioning)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;입력값&lt;/u&gt; &lt;u&gt;각 범위의 대표값&lt;/u&gt;을 이용하여 테스팅&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-07 오후 2.59.33.png&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;494&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cIVa69/btsOsTYHXSD/kkBkNB4EMTK17cZzcfxXk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cIVa69/btsOsTYHXSD/kkBkNB4EMTK17cZzcfxXk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cIVa69/btsOsTYHXSD/kkBkNB4EMTK17cZzcfxXk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcIVa69%2FbtsOsTYHXSD%2FkkBkNB4EMTK17cZzcfxXk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;460&quot; height=&quot;194&quot; data-filename=&quot;스크린샷 2025-06-07 오후 2.59.33.png&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;경계 값 분석 (Boundary Value Analysis)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;입력 값의 주요 오류 대상인 &lt;u&gt;경계 값&lt;/u&gt;을 &lt;u&gt;입력 값&lt;/u&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;(가령, 1~50, 50~100이 범위 일때, 50은 중복이므로 한 번만 사용한다는 것)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-07 오후 3.00.39.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;324&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EWWNV/btsOs3z0BG9/cvQWftmW9qTNP0kZ8NNjJk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EWWNV/btsOs3z0BG9/cvQWftmW9qTNP0kZ8NNjJk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EWWNV/btsOs3z0BG9/cvQWftmW9qTNP0kZ8NNjJk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEWWNV%2FbtsOs3z0BG9%2FcvQWftmW9qTNP0kZ8NNjJk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;588&quot; height=&quot;173&quot; data-filename=&quot;스크린샷 2025-06-07 오후 3.00.39.png&quot; data-origin-width=&quot;1100&quot; data-origin-height=&quot;324&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;의사결정 테이블 (Decision Table)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;입/출력 값이 True, False로 결정될 수 있는 경우, 테이블로 모든 경우의 수를 확인해보는 방법&lt;/u&gt;&lt;span&gt;&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;&lt;span&gt;&amp;nbsp;- 입력. 출력 값이 Yes, No로 결정될 수 있는 경우&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp;- 적은 수의 조건을 가진 입력 값에 유용&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-07 오후 3.03.46.png&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;634&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dgEVUD/btsOsUDiGc0/EKnQg9eGwCceJYD94xXeG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dgEVUD/btsOsUDiGc0/EKnQg9eGwCceJYD94xXeG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dgEVUD/btsOsUDiGc0/EKnQg9eGwCceJYD94xXeG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdgEVUD%2FbtsOsUDiGc0%2FEKnQg9eGwCceJYD94xXeG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;587&quot; height=&quot;260&quot; data-filename=&quot;스크린샷 2025-06-07 오후 3.03.46.png&quot; data-origin-width=&quot;1432&quot; data-origin-height=&quot;634&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;화이트박스 테스팅 (White-Box Testing)&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;(커버리지: 테스트 케이스가 얼마나 많은 상황들을 커버할 수 있는 지 나타내는 척도)&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;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;&lt;b&gt;문장 커버리지 (Statement Coverage)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;프로그램을 구성하는 &lt;u&gt;문장들이 최소 한번은 실행될&lt;/u&gt; 수 있는 입력 값을 테스트 케이스로 선정&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-07 오후 3.19.53.png&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dTdC4w/btsOrxJtw3u/IIw7H5FHJ8aNe6IAXhywj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dTdC4w/btsOrxJtw3u/IIw7H5FHJ8aNe6IAXhywj0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dTdC4w/btsOrxJtw3u/IIw7H5FHJ8aNe6IAXhywj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdTdC4w%2FbtsOrxJtw3u%2FIIw7H5FHJ8aNe6IAXhywj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;280&quot; height=&quot;409&quot; data-filename=&quot;스크린샷 2025-06-07 오후 3.19.53.png&quot; data-origin-width=&quot;430&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-07 오후 3.20.33.png&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;264&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/chpj7R/btsOrz8iCWU/tFZQLKsElMpK4O5kkNs2J0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/chpj7R/btsOrz8iCWU/tFZQLKsElMpK4O5kkNs2J0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/chpj7R/btsOrz8iCWU/tFZQLKsElMpK4O5kkNs2J0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fchpj7R%2FbtsOrz8iCWU%2FtFZQLKsElMpK4O5kkNs2J0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;383&quot; height=&quot;111&quot; data-filename=&quot;스크린샷 2025-06-07 오후 3.20.33.png&quot; data-origin-width=&quot;910&quot; data-origin-height=&quot;264&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;분기 커버리지 (Branch Coverage)&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;u&gt;(yes / no를 한 번씩은 거쳐야 한다)&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-07 오후 3.23.19.png&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;294&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bb8vMr/btsOsmmJs8j/ix3LgsbhLtBxkVwenBihG1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bb8vMr/btsOsmmJs8j/ix3LgsbhLtBxkVwenBihG1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bb8vMr/btsOsmmJs8j/ix3LgsbhLtBxkVwenBihG1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbb8vMr%2FbtsOsmmJs8j%2Fix3LgsbhLtBxkVwenBihG1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;431&quot; height=&quot;142&quot; data-filename=&quot;스크린샷 2025-06-07 오후 3.23.19.png&quot; data-origin-width=&quot;894&quot; data-origin-height=&quot;294&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;조건 커버리지 (Condition Coverage)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;amp;&amp;amp;, || 등의 조건을 가진 분기문이&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전체 조건식의 결과와 관계없이,&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;amp;&amp;amp; 나 || 전후&lt;/span&gt;의 각 개별 조건식이 참 한 번, 거짓 한 번을 갖도록 &lt;span&gt;테스트 케이스를 만드는 방법&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-07 오후 3.26.29.png&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cfklvN/btsOtssNhny/zDcMJ9cB2UqfKJyGRB7Ou0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cfklvN/btsOtssNhny/zDcMJ9cB2UqfKJyGRB7Ou0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cfklvN/btsOtssNhny/zDcMJ9cB2UqfKJyGRB7Ou0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcfklvN%2FbtsOtssNhny%2FzDcMJ9cB2UqfKJyGRB7Ou0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;432&quot; height=&quot;259&quot; data-filename=&quot;스크린샷 2025-06-07 오후 3.26.29.png&quot; data-origin-width=&quot;1074&quot; data-origin-height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(개별 조건 컴럼 당 참, 거짓 하나씩만 있으면 됨, 가령 TF. FT만 해도 각 개별 조건이 한 번씩은 가지게 된 것)&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;&lt;b&gt;다중 조건 커버리지 (Multiple Condition Coverage)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;다중 조건 커버리지는 전체 조건식의 모든 경우의 조건을 검사하는 테스트 케이스를 만드는 방법&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-07 오후 3.28.01.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;690&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/LIYD5/btsOr2IVQ91/1dcIq7E2WQGVH8fMOW9bJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/LIYD5/btsOr2IVQ91/1dcIq7E2WQGVH8fMOW9bJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/LIYD5/btsOr2IVQ91/1dcIq7E2WQGVH8fMOW9bJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FLIYD5%2FbtsOr2IVQ91%2F1dcIq7E2WQGVH8fMOW9bJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;423&quot; height=&quot;285&quot; data-filename=&quot;스크린샷 2025-06-07 오후 3.28.01.png&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;690&quot;/&gt;&lt;/span&gt;&lt;/figure&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;&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;기본 경로 테스팅 (Basic Path Testing)&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;1. 테스팅 대상의 플로우 그래프를 그린다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. 순환복잡도(Cyclomatic Complexity)를 계산한다.&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;span&gt;▪ &lt;/span&gt;프로그램 내부구조를 시험 할 수 있는 독립적인 경로의 수를 계산&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;▪ &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;&lt;b&gt;&amp;bull; CC = R의 수&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;bull; CC = E - N + 2&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;bull; CC = P + 1&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;&lt;span&gt;✓ &lt;/span&gt;CC(Cyclomatic Complexity): 순환복잡도&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;✓ &lt;/span&gt;R(Region): 노드로 둘러싸인 영역과 그래프 밖 영역의 수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;✓ &lt;/span&gt;E(Edge): 화살표의 수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;✓ &lt;/span&gt;N(Node): 노드의 수&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;✓ &lt;/span&gt;P(Predicate): 분기 노드의 수&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;3. 독립적인 경로들을 정의한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;▪ &lt;/span&gt;순환복잡도를 통해 계산된 횟수를 기반으로 독립적인 경로들을 정의&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;▪ &lt;/span&gt;&lt;span&gt;단계 1: 조건 노드를 최대한 많이 거쳐 가도록 하는 기본 경로를 하나 선택&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;▪ &lt;/span&gt;&lt;span&gt;단계 2: 기본 경로의 첫번째 분기를 바꾸어 새로운 기본 경로를 생성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;▪ &lt;/span&gt;&lt;span&gt;단계 3: 단계 2에서 생성된 기본 경로의 노드 중 다음 결정 구조의 분기를 기본 경로와 다르게&lt;/span&gt;&lt;span&gt;하여 생성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;▪ &lt;/span&gt;&lt;span&gt;단계 4: 기본경로로부터 첫번째 결정구조에 관하여 더 이상 새로운 경로가 없으면 &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 두번째 결&lt;/span&gt;&lt;span&gt;정구조에 관하여 같은 방법으로 기본 경로를 구함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;▪ &lt;/span&gt;단계 5: 더 이상 기본 경로 중 결정구조가 없으면 기본 경로 생성을 중지&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;4. 정의된 각 경로의 테스트 케이스를 작성한다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-07 오후 3.43.20.png&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;598&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/byBcEf/btsOrlo0LW9/WhTvcFrKQHi2JcLISkBRh1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/byBcEf/btsOrlo0LW9/WhTvcFrKQHi2JcLISkBRh1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/byBcEf/btsOrlo0LW9/WhTvcFrKQHi2JcLISkBRh1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbyBcEf%2FbtsOrlo0LW9%2FWhTvcFrKQHi2JcLISkBRh1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;507&quot; height=&quot;260&quot; data-filename=&quot;스크린샷 2025-06-07 오후 3.43.20.png&quot; data-origin-width=&quot;1164&quot; data-origin-height=&quot;598&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예) 국어, 영어, 수학 점수를 입력받아 평균 점수가 70점 이상이면 PASS를 미만이면 FAIL을 출력한다&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-07 오후 3.45.44.png&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;654&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Q9eZ5/btsOrT6wvkl/KIGxxipkmkLCgVK7Qoxaek/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Q9eZ5/btsOrT6wvkl/KIGxxipkmkLCgVK7Qoxaek/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Q9eZ5/btsOrT6wvkl/KIGxxipkmkLCgVK7Qoxaek/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQ9eZ5%2FbtsOrT6wvkl%2FKIGxxipkmkLCgVK7Qoxaek%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;410&quot; height=&quot;408&quot; data-filename=&quot;스크린샷 2025-06-07 오후 3.45.44.png&quot; data-origin-width=&quot;658&quot; data-origin-height=&quot;654&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-07 오후 3.59.48.png&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;592&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhOV3S/btsOsUDjik2/8iZXAkJYBqk63piY6RRQx1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhOV3S/btsOsUDjik2/8iZXAkJYBqk63piY6RRQx1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhOV3S/btsOsUDjik2/8iZXAkJYBqk63piY6RRQx1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhOV3S%2FbtsOsUDjik2%2F8iZXAkJYBqk63piY6RRQx1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;440&quot; height=&quot;268&quot; data-filename=&quot;스크린샷 2025-06-07 오후 3.59.48.png&quot; data-origin-width=&quot;972&quot; data-origin-height=&quot;592&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;✓&lt;/span&gt;&lt;span&gt;경로&lt;/span&gt; 1: 1 - 2 - 3 - 2 - 4 - 5 - 6 - 8&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;✓&lt;/span&gt;&lt;span&gt;경로&lt;/span&gt; 2: 1 - 2 - 3 - 2 - 4 - 5 - 7 - 8&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;✓&lt;/span&gt;&lt;span&gt;경로&lt;/span&gt; 3: 1 - 2 - 4 - 5 - 6 - 8&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-07 오후 4.03.52.png&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;474&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qsFHI/btsOrY0MQ5W/wsKEcoatMnHgq4wJNqESI1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qsFHI/btsOrY0MQ5W/wsKEcoatMnHgq4wJNqESI1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qsFHI/btsOrY0MQ5W/wsKEcoatMnHgq4wJNqESI1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqsFHI%2FbtsOrY0MQ5W%2FwsKEcoatMnHgq4wJNqESI1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;416&quot; height=&quot;196&quot; data-filename=&quot;스크린샷 2025-06-07 오후 4.03.52.png&quot; data-origin-width=&quot;1004&quot; data-origin-height=&quot;474&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;예)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;bull; &lt;/span&gt;휴대폰 배터리 표시 기능 예&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;bull; &lt;/span&gt;2.5 V 이상 2.8 V 미만: 배터리 0칸&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;bull; &lt;/span&gt;2.8 V 이상 3.3 V 미만: 배터리 1칸&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;bull; &lt;/span&gt;&lt;span&gt;3.3 V 이상 3.8 V 미만: 배터리 2칸&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;&lt;span&gt;동등 분할, 경계 값 분석로 테스트 케이스를 작성하시오&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-07 오후 4.06.16.png&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bX9yGV/btsOsjDBxl8/cOxfTxel0Mm6pkfPuNe7ZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bX9yGV/btsOsjDBxl8/cOxfTxel0Mm6pkfPuNe7ZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bX9yGV/btsOsjDBxl8/cOxfTxel0Mm6pkfPuNe7ZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbX9yGV%2FbtsOsjDBxl8%2FcOxfTxel0Mm6pkfPuNe7ZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;482&quot; height=&quot;143&quot; data-filename=&quot;스크린샷 2025-06-07 오후 4.06.16.png&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-07 오후 4.06.30.png&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;304&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/9qIuH/btsOtfUKVKu/kyu2sCDqOKXDufnuf7Rit0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/9qIuH/btsOtfUKVKu/kyu2sCDqOKXDufnuf7Rit0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/9qIuH/btsOtfUKVKu/kyu2sCDqOKXDufnuf7Rit0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F9qIuH%2FbtsOtfUKVKu%2Fkyu2sCDqOKXDufnuf7Rit0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;485&quot; height=&quot;137&quot; data-filename=&quot;스크린샷 2025-06-07 오후 4.06.30.png&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;304&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;bull; &lt;/span&gt;모바일 은행 어플리케이션&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;bull; &lt;/span&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;&lt;span&gt;&amp;bull; &lt;/span&gt;폰에 칩이 없을 경우 칩이 필요하다는 경고를 보여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;bull; &lt;/span&gt;칩이 있을 경우, 칩이 유효한지 검사한다. 칩이 유효하지 않다면 유효하지 않다는 경고를 보여준다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;bull; &lt;/span&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;장되어 있다면 둘 중 하나를 지울 것을 사용자에게 요청한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;bull; &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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;의사 결정 테이블 테스트 케이스를 작성하시오&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-07 오후 4.05.58.png&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;688&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GPIlR/btsOsO4dtXx/1QYUA4kC5bqI9rAiu2kU70/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GPIlR/btsOsO4dtXx/1QYUA4kC5bqI9rAiu2kU70/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GPIlR/btsOsO4dtXx/1QYUA4kC5bqI9rAiu2kU70/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGPIlR%2FbtsOsO4dtXx%2F1QYUA4kC5bqI9rAiu2kU70%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;465&quot; height=&quot;297&quot; data-filename=&quot;스크린샷 2025-06-07 오후 4.05.58.png&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;688&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;</description>
      <category>Softeware engineering</category>
      <author>vysryoo</author>
      <guid isPermaLink="true">https://vysryoo.tistory.com/138</guid>
      <comments>https://vysryoo.tistory.com/138#entry138comment</comments>
      <pubDate>Sat, 7 Jun 2025 14:50:06 +0900</pubDate>
    </item>
    <item>
      <title>[SE] 소프트웨어 관리</title>
      <link>https://vysryoo.tistory.com/137</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;1. 위험 관리&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;위험 관리 절차&lt;/b&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;500&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cge6Er/btsOrwRid2j/FuhhArkz36tFGEhYkObXxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cge6Er/btsOrwRid2j/FuhhArkz36tFGEhYkObXxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cge6Er/btsOrwRid2j/FuhhArkz36tFGEhYkObXxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcge6Er%2FbtsOrwRid2j%2FFuhhArkz36tFGEhYkObXxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;473&quot; height=&quot;231&quot; data-origin-width=&quot;1024&quot; data-origin-height=&quot;500&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;1. 위험 식별&lt;br&gt;(일반적인 프로젝트 위험 리스트 + 이전 유사 프로젝트 위험 리스트)&lt;br&gt;=&amp;gt; 브레인 스토밍, 조사, 인터뷰&lt;br&gt;=&amp;gt; (현재 프로젝트 위험 리스트: &lt;u&gt;분야, 위험 요소, 원인&lt;/u&gt;)&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;620&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/vBd0F/btsOsWVo8Do/Ns29XmdSCzHk7JnYcTnPF1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/vBd0F/btsOsWVo8Do/Ns29XmdSCzHk7JnYcTnPF1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/vBd0F/btsOsWVo8Do/Ns29XmdSCzHk7JnYcTnPF1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FvBd0F%2FbtsOsWVo8Do%2FNs29XmdSCzHk7JnYcTnPF1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;532&quot; height=&quot;314&quot; data-origin-width=&quot;1052&quot; data-origin-height=&quot;620&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;2. 위험 계량화&lt;br&gt;식별된 위험 요소들은 &lt;u&gt;발생 확률과 영향도&lt;/u&gt;에 따라 구분 (상, 중, 하)&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;252&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bhY4z6/btsOrz8hoto/z0u5NQn2Mw4cyA2ioev3r0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bhY4z6/btsOrz8hoto/z0u5NQn2Mw4cyA2ioev3r0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bhY4z6/btsOrz8hoto/z0u5NQn2Mw4cyA2ioev3r0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbhY4z6%2FbtsOrz8hoto%2Fz0u5NQn2Mw4cyA2ioev3r0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;459&quot; height=&quot;121&quot; data-origin-width=&quot;954&quot; data-origin-height=&quot;252&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;3. 위험 우선순위 선정&lt;br&gt;우선순위를 설정하여 대응책을 만들고 위험을 관리&lt;/p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;544&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bz0hBc/btsOrrPXYF2/b7rXSdCnkOFGfa3ZgNQRbk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bz0hBc/btsOrrPXYF2/b7rXSdCnkOFGfa3ZgNQRbk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bz0hBc/btsOrrPXYF2/b7rXSdCnkOFGfa3ZgNQRbk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbz0hBc%2FbtsOrrPXYF2%2Fb7rXSdCnkOFGfa3ZgNQRbk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;440&quot; height=&quot;209&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;544&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;4. 위험 관리 계획&lt;br&gt;위험 관리 계획에는 위험을 언제, 어떠한 방법으로 관리할 것인가에 대한 내용 등이 포함&lt;/p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zfDhq/btsOsB42aN9/xQUkNwgb36vHt2ocji3DEK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zfDhq/btsOsB42aN9/xQUkNwgb36vHt2ocji3DEK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zfDhq/btsOsB42aN9/xQUkNwgb36vHt2ocji3DEK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FzfDhq%2FbtsOsB42aN9%2FxQUkNwgb36vHt2ocji3DEK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;450&quot; height=&quot;282&quot; data-origin-width=&quot;1002&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;5. 위험 해결&lt;br&gt;위험은 어느 시점에나 문제로 발생할 수 있으므로,&amp;nbsp;&lt;br&gt;위험 관리는 &lt;u&gt;프로젝트 초반부터 프로젝트 종료 시까지 수행&lt;/u&gt;해야하고&lt;br&gt;&lt;u&gt;주기 별로&lt;/u&gt; 식별된 위험 요소에 대한 &lt;u&gt;평가가 수행&lt;/u&gt;되어야 함&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;6. 결과 측정 및 문서화&lt;br&gt;대응 방안에 대한 수행 결과가 어느 정도 효과가 있었는지 평가하고, 그 결과를 기록해야 함&lt;br&gt;위험 관리 결과는 조직의 위험 요소 리스트에 다시 반영시켜야 함&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;2. 형상 관리&lt;br&gt;&lt;b&gt;형상 항목을 식별하고 그 변경을 제어·추적하여 제품의 무결성과 변경에 대한 추적성을 유지하는 관리 활동&lt;/b&gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;형상 관리의 필요성&lt;br&gt;: 소프트웨어의 비가시성, 변경 추적 어려움, 관리 통제 어려움, 요구사항의 잦은 변경 때문에 발생할 수 있는&amp;nbsp;&lt;br&gt;&amp;nbsp; 위험을 최소화하기 위해서 필요하다&lt;br&gt;&amp;nbsp;&lt;br&gt;형상 담당자(Configuration Manager), 형상 통제 위원회(CCB)&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;626&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Hyzgs/btsOsyHdnHu/8nYNCzx2G1liQQhNiMc0gK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Hyzgs/btsOsyHdnHu/8nYNCzx2G1liQQhNiMc0gK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Hyzgs/btsOsyHdnHu/8nYNCzx2G1liQQhNiMc0gK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHyzgs%2FbtsOsyHdnHu%2F8nYNCzx2G1liQQhNiMc0gK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;412&quot; height=&quot;220&quot; data-origin-width=&quot;1170&quot; data-origin-height=&quot;626&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;1. 형상 식별&lt;br&gt;&lt;u&gt;형상 항목 선정, 형상 식별자 선정, 베이스라인 기준 선정&lt;/u&gt;&lt;br&gt;&amp;nbsp;&lt;br&gt;&lt;u&gt;형상 식별자: 형상 항목에 유일한 이름과 번호를 정하고 버전을 부여하는 체계&lt;/u&gt;&lt;br&gt;&lt;u&gt;(일정한 규칙이 있다, 버전 관리의 핵심)&lt;/u&gt;&lt;/p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;134&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dh50C5/btsOsblvx3f/w7zloFppDCK685nA09x8ZK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dh50C5/btsOsblvx3f/w7zloFppDCK685nA09x8ZK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dh50C5/btsOsblvx3f/w7zloFppDCK685nA09x8ZK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdh50C5%2FbtsOsblvx3f%2Fw7zloFppDCK685nA09x8ZK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;316&quot; height=&quot;86&quot; data-origin-width=&quot;492&quot; data-origin-height=&quot;134&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;&lt;b&gt;베이스라인&lt;/b&gt;&lt;br&gt;&lt;b&gt;형상 항목이 소프트웨어 개발에 하나의 완전한 산출물로써 쓰여질 수 있는 상태(버전 1.0으로 표기)&lt;/b&gt;&lt;br&gt;&lt;u&gt;추후 개발의 기초가 되며, 오직 공식 통제 절차(CCB의 평가와 승인)에 의해서만 변경될 수 있다&lt;/u&gt;&lt;br&gt;형상 관리 계획서 작성 시 수립&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;2. 형상 제어&lt;/p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;550&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6mqG6/btsOrvEQHmM/ziJvFsPznBYsEXBEGFINaK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6mqG6/btsOrvEQHmM/ziJvFsPznBYsEXBEGFINaK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6mqG6/btsOrvEQHmM/ziJvFsPznBYsEXBEGFINaK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6mqG6%2FbtsOrvEQHmM%2FziJvFsPznBYsEXBEGFINaK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;501&quot; height=&quot;291&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;550&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br&gt;변경 요청, 변경 심사 후&lt;br&gt;변경을 실시하기 위해 형상 저장소에서 해당 항목을 체크아웃&lt;br&gt;변경이 확인되면 변경한 베이스라인은 형상 저장소에 체크인되고, 변경 항목은 다시 베이스라인으로 수립됨&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;3. 형상 상태 보고&lt;br&gt;변경 상태를 기록하여, 형상 항목의 개발 상태에 대한 가시성을 제공(변경 사항 로그로 남긴다)&lt;br&gt;&amp;nbsp;&lt;br&gt;4. 형상 감사&lt;br&gt;베이스라인의 무결성을 검증하는 것을 목적으로 한다&lt;br&gt;&amp;nbsp;&lt;br&gt;&amp;nbsp;&lt;br&gt;형상 관리 도구&lt;br&gt;&lt;u&gt;CVS: 중앙 저장소 기반의 초기 버전 관리 시스템, 파일별 이력 관리와 덮어쓰기 방지 기능을 제공&lt;/u&gt;&lt;br&gt;&lt;u&gt;SVN: CVS의 단점을 개선한 중앙 집중식 시스템으로, 변경 사항만 저장하며 복구가 용이함&amp;nbsp;&lt;/u&gt;&lt;br&gt;&lt;u&gt;Git: 로컬에서도 작업 가능한 분산 버전 관리 시스템으로, 성능과 협업 효율이 뛰어나다&lt;/u&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Softeware engineering</category>
      <author>vysryoo</author>
      <guid isPermaLink="true">https://vysryoo.tistory.com/137</guid>
      <comments>https://vysryoo.tistory.com/137#entry137comment</comments>
      <pubDate>Sat, 7 Jun 2025 14:11:05 +0900</pubDate>
    </item>
    <item>
      <title>[SE] 소프트웨어 구조 설계</title>
      <link>https://vysryoo.tistory.com/136</link>
      <description>&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;요구사항 명세서는 What 관점, 설계는 How 관점&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;u&gt;상위 설계 (=아키텍쳐 설계)&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- &lt;u&gt;구성 모듈들의 관계&lt;/u&gt;로 표현되는 시스템 전체 구조&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 시스템 구조도, 외부 피일 및 DB 설계(ERD), 인터페이스 설계&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;하위 설계 (=모듈 설계)&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- &lt;u&gt;모듈의&lt;/u&gt;&amp;nbsp;&lt;u&gt;내부 구조&lt;/u&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;좋은 설계: 모듈이 독립적이어야 하고, 모듈 간의 결합이 낮게 설계되어야함&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;/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;/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;(1) 추상화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;필요 정보&lt;/u&gt;만 &lt;u&gt;추출&lt;/u&gt;하여 &lt;u&gt;강조&lt;/u&gt;하고, &lt;u&gt;관련 없는&lt;/u&gt; &lt;u&gt;사항&lt;/u&gt;은 &lt;u&gt;생략&lt;/u&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;과정 추상화: 입력이 출력으로 변환되는 과정을 추상화&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;p data-ke-size=&quot;size16&quot;&gt;(2) 단계적 분해&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;상위 개념부터 더 구체적 단계로 분할하는 하향식 기법&lt;/u&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;(3) 모듈화&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;모듈(=component)의 특성&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;- 다른 모듈 사용 가능&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;u&gt;모듈 내의 응집력은 높게, 모듈 간의 결합력은 약하게하는 정도의 크기&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- explicit invocation(function call): 모듈 간 결합력 높음&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Implicit invocation(메세지 던져 놓으면 해당하는 애가 수행): 모듈간 결합력 낮음, scailability 높음&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;u&gt;효과적인 설계: 정보 은닉&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;효과적인 설계: 강한 모듈의 응집력&lt;/u&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;&lt;u&gt;효과적인 설계: 약한 모듈의 결합도&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설계 시 주의사항&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 넓게 퍼지고, 깊이는 낮을 수록 좋다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-07 오전 2.21.58.png&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;394&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/k7bzb/btsOs4r3GF7/VFiKOdT3Rb7mTPH1MX43c1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/k7bzb/btsOs4r3GF7/VFiKOdT3Rb7mTPH1MX43c1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/k7bzb/btsOs4r3GF7/VFiKOdT3Rb7mTPH1MX43c1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fk7bzb%2FbtsOs4r3GF7%2FVFiKOdT3Rb7mTPH1MX43c1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;467&quot; height=&quot;185&quot; data-filename=&quot;스크린샷 2025-06-07 오전 2.21.58.png&quot; data-origin-width=&quot;994&quot; data-origin-height=&quot;394&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-07 오전 2.25.57.png&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;636&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/q3aBe/btsOrYfi5Or/OQYYMbcZKTRX5yOVt08kWk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/q3aBe/btsOrYfi5Or/OQYYMbcZKTRX5yOVt08kWk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/q3aBe/btsOrYfi5Or/OQYYMbcZKTRX5yOVt08kWk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fq3aBe%2FbtsOrYfi5Or%2FOQYYMbcZKTRX5yOVt08kWk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;395&quot; height=&quot;205&quot; data-filename=&quot;스크린샷 2025-06-07 오전 2.25.57.png&quot; data-origin-width=&quot;1228&quot; data-origin-height=&quot;636&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&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-07 오전 2.26.16.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;524&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/D9w7N/btsOsjpWzPB/ahT4ZjLrq2y3oK7KIOE8n1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/D9w7N/btsOsjpWzPB/ahT4ZjLrq2y3oK7KIOE8n1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/D9w7N/btsOsjpWzPB/ahT4ZjLrq2y3oK7KIOE8n1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FD9w7N%2FbtsOsjpWzPB%2FahT4ZjLrq2y3oK7KIOE8n1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;411&quot; height=&quot;243&quot; data-filename=&quot;스크린샷 2025-06-07 오전 2.26.16.png&quot; data-origin-width=&quot;888&quot; data-origin-height=&quot;524&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;변환 분석은 DFD를 입력 흐름 &amp;rarr; 변환 센터 &amp;rarr; 출력 흐름으로 분할&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;bull; &lt;/span&gt;입력 흐름: 입력을 준비하는 단계(입력, 검증...)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;bull; &lt;/span&gt;출력 흐름: 출력을 준비하는 단계(포매팅, 출력)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&amp;bull; &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;①~② 자료 흐름의 요소를 분해: &lt;u&gt;&lt;span&gt;입력 자료 흐름, 출력 자료 흐름, 변환 센터&lt;/span&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;③ &lt;u&gt;변환 중심부&lt;/u&gt;를 축으로&lt;u&gt; 최상위 구조&lt;/u&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;⑤ 설계 기준을 적용하여 수정, 최적화&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dqnEC8/btsOrvx2mSQ/Iq9XVMnKK33nPgB4NiG1aK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dqnEC8/btsOrvx2mSQ/Iq9XVMnKK33nPgB4NiG1aK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1048&quot; data-origin-height=&quot;364&quot; data-filename=&quot;스크린샷 2025-06-07 오전 2.30.31.png&quot; width=&quot;466&quot; height=&quot;162&quot; style=&quot;width: 59.5031%; margin-right: 10px;&quot; data-widthpercent=&quot;60.2&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dqnEC8/btsOrvx2mSQ/Iq9XVMnKK33nPgB4NiG1aK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdqnEC8%2FbtsOrvx2mSQ%2FIq9XVMnKK33nPgB4NiG1aK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1048&quot; height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/batOe4/btsOrF1pE9C/q1o0ykoVOwdxk00KW8fXpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/batOe4/btsOrF1pE9C/q1o0ykoVOwdxk00KW8fXpk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;944&quot; data-origin-height=&quot;496&quot; data-filename=&quot;스크린샷 2025-06-07 오전 2.30.59.png&quot; width=&quot;435&quot; height=&quot;229&quot; style=&quot;width: 39.3341%;&quot; data-widthpercent=&quot;39.8&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/batOe4/btsOrF1pE9C/q1o0ykoVOwdxk00KW8fXpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbatOe4%2FbtsOrF1pE9C%2Fq1o0ykoVOwdxk00KW8fXpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;944&quot; height=&quot;496&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dNNnMR/btsOtijxyvT/59P53eGw4pXP3msaL98kkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dNNnMR/btsOtijxyvT/59P53eGw4pXP3msaL98kkK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;952&quot; data-origin-height=&quot;494&quot; data-filename=&quot;스크린샷 2025-06-07 오전 2.34.03.png&quot; width=&quot;430&quot; height=&quot;223&quot; style=&quot;width: 46.0494%; margin-right: 10px;&quot; data-widthpercent=&quot;46.59&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dNNnMR/btsOtijxyvT/59P53eGw4pXP3msaL98kkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdNNnMR%2FbtsOtijxyvT%2F59P53eGw4pXP3msaL98kkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;952&quot; height=&quot;494&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kQ91F/btsOrynZufh/iYcFIJSqVAaGz3YBn8kK21/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kQ91F/btsOrynZufh/iYcFIJSqVAaGz3YBn8kK21/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1162&quot; data-origin-height=&quot;526&quot; data-filename=&quot;스크린샷 2025-06-07 오전 2.34.31.png&quot; width=&quot;480&quot; height=&quot;217&quot; style=&quot;width: 52.7879%;&quot; data-widthpercent=&quot;53.41&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kQ91F/btsOrynZufh/iYcFIJSqVAaGz3YBn8kK21/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkQ91F%2FbtsOrynZufh%2FiYcFIJSqVAaGz3YBn8kK21%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1162&quot; height=&quot;526&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;객체 = 속성(Attribute)과 행위(Behavior)를 가지고 있는 개체(Entity)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-07 오후 12.49.41.png&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/PHIFh/btsOroTxeMn/tZK9VYwUjjDvPLM6u4kEE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/PHIFh/btsOroTxeMn/tZK9VYwUjjDvPLM6u4kEE1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/PHIFh/btsOroTxeMn/tZK9VYwUjjDvPLM6u4kEE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FPHIFh%2FbtsOroTxeMn%2FtZK9VYwUjjDvPLM6u4kEE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;263&quot; height=&quot;330&quot; data-filename=&quot;스크린샷 2025-06-07 오후 12.49.41.png&quot; data-origin-width=&quot;480&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;클래스 이름은 반드시 적어야한다&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;+가 붙으면 public, -가 붙으면 private&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;#가 붙으면 protected, ~가 붙으면 default,&amp;nbsp;&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;readonly가 붙으면 final, 밑줄이 쳐지면 static&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imagegridblock&quot;&gt;
  &lt;div class=&quot;image-container&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bKrmNp/btsOruspl4H/VCkTKllE9w4HIPHLTGkRRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bKrmNp/btsOruspl4H/VCkTKllE9w4HIPHLTGkRRk/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;938&quot; data-origin-height=&quot;700&quot; data-filename=&quot;스크린샷 2025-06-07 오후 12.54.22.png&quot; width=&quot;361&quot; height=&quot;269&quot; style=&quot;width: 31.9234%; margin-right: 10px;&quot; data-widthpercent=&quot;32.3&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bKrmNp/btsOruspl4H/VCkTKllE9w4HIPHLTGkRRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbKrmNp%2FbtsOruspl4H%2FVCkTKllE9w4HIPHLTGkRRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;938&quot; height=&quot;700&quot;/&gt;&lt;/span&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cBlQ1P/btsOsWujVp3/aCoB18i6cK4weVgZEIXRLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cBlQ1P/btsOsWujVp3/aCoB18i6cK4weVgZEIXRLK/img.png&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;1028&quot; data-origin-height=&quot;366&quot; data-filename=&quot;스크린샷 2025-06-07 오후 12.55.07.png&quot; width=&quot;545&quot; height=&quot;194&quot; style=&quot;width: 66.9138%;&quot; data-widthpercent=&quot;67.7&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cBlQ1P/btsOsWujVp3/aCoB18i6cK4weVgZEIXRLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcBlQ1P%2FbtsOsWujVp3%2FaCoB18i6cK4weVgZEIXRLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1028&quot; height=&quot;366&quot;/&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;아키텍쳐 유형 =&amp;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;&lt;u&gt;계층식 (Layered)&lt;/u&gt;&lt;br /&gt;&lt;u&gt;정의: 시스템을 계층화하여, 상위 계층이 하위 계층의 기능에 의존하는 구조이다.&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;인터페이스 계층 / 응용&amp;amp;도메인 계층 / 인프라스트럭쳐 계층&lt;/u&gt;&lt;br /&gt;&lt;u&gt;장점: 유지보수가 용이하며 확장성이 높다&lt;/u&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;u&gt;클라이언트-서버 (Client-server)&lt;/u&gt;&lt;br /&gt;&lt;u&gt;정의: 클라이언트가 요청하고 서버가 응답하는 분산 구조이다.&lt;/u&gt;&lt;br /&gt;&lt;u&gt;장점: 자원을 중앙 집중화하여 관리 효율성과 보안성을 높일 수 있다.&lt;/u&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;마스터-슬레이브 (Master-slave)&lt;br /&gt;정의: 마스터가 제어하고 슬레이브가 작업을 수행하는 구조이다.&lt;br /&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;파이프-필터 (Pipe-filter)&lt;br /&gt;정의: 데이터를 필터들이 파이프를 통해 순차적으로 처리하는 구조이다. 데이터 스트림 처리 시스템에서 자주 사용된다.&lt;br /&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;브로커 (Broker)&lt;br /&gt;정의: 컴포넌트 간 통신을 중개자가 관리하는 구조이다. 서버의 대행자 역할을 하며 메인 서버의 부하를 분산할 수 있다&lt;br /&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;피어 투 피어 (Peer to peer)&lt;br /&gt;정의: 모든 노드가 동등하게 요청과 서비스를 수행하며, 중앙 서버 없이 서로 직접 연결되는 구조이다.&lt;br /&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;이벤트 기반 (Event driven)&lt;br /&gt;정의: 이벤트를 기반으로 컴포넌트들이 비동기적으로 동작하는 구조이다.&lt;br /&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;u&gt;모델-뷰-컨트롤러 (MVC)&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&lt;u&gt;정의: 모델, 뷰, 컨트롤러로 역할을 분리한 아키텍쳐 유형이다&lt;/u&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;&lt;b&gt;&lt;u&gt;&amp;nbsp;- 모델 (Model): 애플리케이션의 핵심 데이터 보관과 비즈니스 로직을 담당&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;&amp;nbsp;- 뷰 (View): 사용자에게 보여지는 화면을 구성&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;&amp;nbsp;- 컨트롤러 (Controller): 사용자 입력을 처리하고, 모델과 뷰 사이를 연결한다.&lt;/u&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;&lt;b&gt;&lt;u&gt;&amp;nbsp;- 역할 별로 관심사를 분리하여 협업에 유리하며 충돌 없이 효율적으로 개발할 수 있다&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;&amp;nbsp;- 기능 수정 시 해당 역할만 수정하면 되어서 유지보수와 확장성이 높다&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;&amp;nbsp;- 모델, 뷰, 컨트롤러는 서로 독립적이기 때문에, 테스트를 뷰를 제외하고 모델과 컨트롤러에 집중해서 진행할 수 있다&lt;/u&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;u&gt;&amp;nbsp;- 다수의 웹 프레임워크가 MVC 아키텍쳐를 지원하기 때문에 편리하게 구현할 수 있다&lt;/u&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;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;블랙보드 (Blackboard)&lt;br /&gt;정의: 여러 컴포넌트가 공유된 데이터 공간을 통해 협력하는 구조이다. 데이터를 한 곳에 저장하고 모든 컴포넌트가 이를 참조하는 방식이다.&lt;br /&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;인터프리터 (Interpreter)&lt;br /&gt;정의: 코드를 한 줄씩 해석하며 즉시 실행하는 구조이다.&lt;br /&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;모놀리식 (Monolithic)&lt;br /&gt;정의: 모든 기능이 하나의 일체형 애플리케이션에 포함된 구조이다.&lt;br /&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;마이크로서비스 (Microservice)&lt;br /&gt;정의: 기능을 독립적인 작은 서비스로 나눈 분산 아키텍처이다. 각 서비스를 끼웠다 뺐다 하듯이 독립적으로 개발하고 배포할 수 있다.&lt;br /&gt;장점: 독립 배포와 스케일링이 가능하며 기술 선택이 유연하다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Softeware engineering</category>
      <author>vysryoo</author>
      <guid isPermaLink="true">https://vysryoo.tistory.com/136</guid>
      <comments>https://vysryoo.tistory.com/136#entry136comment</comments>
      <pubDate>Sat, 7 Jun 2025 02:27:59 +0900</pubDate>
    </item>
    <item>
      <title>[OS] Memory</title>
      <link>https://vysryoo.tistory.com/135</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;Frame&lt;/b&gt;&lt;br /&gt;&lt;b&gt;메인 메모리에서 사용되는 고정 길이의 블록&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;Page&lt;/b&gt;&lt;br /&gt;&lt;b&gt;고정 길이의 메모리 블록으로&lt;/b&gt;&lt;br /&gt;&lt;b&gt;페이지를 일시적으로 메인 메모리의 프레임에 올릴 수 있다&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;Segment&lt;/b&gt;&lt;br /&gt;&lt;b&gt;가변 길이의 메모리 단위&lt;/b&gt;&lt;br /&gt;&lt;b&gt;전체 세그먼트를 메인 메모리에 일시적으로 올릴 수 있고(세그멘테이션),&lt;/b&gt;&lt;br /&gt;&lt;b&gt;페이지 단위로 나눈 세그먼트의 페이지를 개별적으로 메인 메모리에 올릴 수도 있다 (세그멘테이션과 페이징의 결합)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;메모리 관리 요구사항&lt;br /&gt;&amp;nbsp;&lt;br /&gt;재배치(Relocation)&lt;br /&gt;보호(Protection)&lt;br /&gt;공유(Sharing)&lt;br /&gt;논리적 구성(Logical organization)&lt;br /&gt;물리적 구성(Physical organization)&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&lt;u&gt;재배치(Relocation)&lt;/u&gt;&lt;br /&gt;프로세스들이 &lt;u&gt;스왑 아웃되었다가 스왑 인될때&lt;/u&gt;, &lt;u&gt;메모리의 동일한 영역로 돌아오는 것은 시스템 상 제한을 초래&lt;/u&gt;하므로,&lt;br /&gt;&lt;u&gt;다른 영역으로 재배치하는 기능이 필요&lt;/u&gt;하다&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;보호(Protection)&lt;br /&gt;&lt;u&gt;Memory Protection은&lt;/u&gt; &lt;u&gt;OS가 아니라 하드웨어에 의해&lt;/u&gt; 충족&lt;br /&gt;OS가 일일이 메모리 참조 위반이 없는지 매번 확인하는 것은 지나치게 많은 시간을 소모하게 되기 때문이다&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;u&gt;Hardware Address Protection&lt;/u&gt;&lt;br /&gt;합법적인 주소 범위를 판단할 수 있는 기능&lt;br /&gt;Base register: 가장 작은 합법적인 물리적 메모리 주소를 저장&lt;br /&gt;Limit or Bounds register: 주소 범위의 크기를 저장&lt;br /&gt;베이스 레지스터에 300040이 저장되어 있고 리밋 레지스터에 120900이 저장되어 있다면,&lt;br /&gt;300040부터 420939까지의 모든 주소에 합법적으로 접근 가능&lt;br /&gt;&lt;u&gt;(Base ~ Base+Limit)인 주소에는 합법적으로 접근할 수 있다&lt;/u&gt;&lt;br /&gt;CPU는 사용자 모드에서 발생하는 모든 메모리 접근이 해당 사용자의 베이스와 리밋 사이에 있는지 반드시 검사해야 한다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;공유(Sharing)&lt;br /&gt;여러 프로세스가 &lt;u&gt;동일한 프로그램을 실행할 경우&lt;/u&gt;, &lt;u&gt;별도의 복사본을 가지기보다 동일한 복사본에 접근할 수 있도록 하는 것&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;논리적 구성(Logical Organization)&lt;br /&gt;메인 메모리는 linear address로 구성.&lt;br /&gt;프로그램은 &lt;u&gt;nonlinear하며&lt;/u&gt;, &lt;u&gt;모듈 단위로&lt;/u&gt; 작성&lt;br /&gt;모듈은 &lt;u&gt;독립적으로 작성 및 컴파일&lt;/u&gt;. 모듈별로 보호도 다르게. 모듈은 여러 프로세스 간에 공유 가능&lt;br /&gt;&lt;u&gt;세그멘테이션은 이러한 요구사항에 적합&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;물리적 구성(Physical Organization)&lt;br /&gt;프로그래머가 메모리 관리를 맡는 것은 바람직하지 않다.&lt;br /&gt;&amp;nbsp;- 구현 프로그램이 가용 데이터보다 클 수 있다&lt;br /&gt;&amp;nbsp; &amp;nbsp; Overlay를 사용해 필요할 때마다 모듈들이 특정 메모리 영역에 교체, 로딩, 실행&lt;br /&gt;&amp;nbsp;-&amp;nbsp; &lt;u&gt;프로그래머가 가용 공간의 크기나 위치를 알 수 없다&lt;/u&gt;&lt;br /&gt;&lt;b&gt;Overlay: 작은 메모리에서 큰 프로그램을 실행하기 위해 필요한 부분만 교체하며 사용하는 기법&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;메모리는 프로세서 실행을 위해 프로세스를 메인 메모리로 불러온다&lt;br /&gt;&amp;nbsp;- 가상 메모리 (세그멘테이션, 페이징 or 둘 다)&lt;br /&gt;&amp;nbsp;- 메모리 파티셔닝(더 단순한 방법, Simple Paging, Simple Segmentation..)&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;고정 분할(Fixed Partitioning)&lt;/b&gt;&lt;br /&gt;시스템 생성 시점에 &lt;b&gt;메모리를 정해진 크기와 개수의 분할로 나눈다&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;단점1: 내부 단편화의 발생&lt;/b&gt;&lt;br /&gt;&lt;b&gt;단점2:&amp;nbsp;활성 프로세스 수가&lt;/b&gt;&lt;span style=&quot;color: #333333;&quot;&gt;&lt;b&gt;&amp;nbsp;&lt;/b&gt;&lt;/span&gt;&lt;b&gt;분할 개수만큼으로&amp;nbsp;제한된다&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;내부 단편화(Internal fragmentation)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;고정 크기로 메모리 블록을 할당할 때, 실제 필요 공간보다 더 큰 블록이 할당되어 낭비되는 공간들&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Equal-size Fixed Partitions&lt;br /&gt;&lt;u&gt;구현이 간단하고 오버헤드가 적다&lt;/u&gt;&lt;br /&gt;&lt;u&gt;프로그램이 분할 크기보다 크면 오버레이(overlay)를 사용하도록 설계되어야 함&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Unequal-size Fixed Partitions&lt;br /&gt;가용 공간에서 &lt;u&gt;내부 단편화를 최소화하도록 프로세스를 할당 가능한 분할 중 가장 작은 분할에 할당&lt;/u&gt;한다&lt;br /&gt;&amp;nbsp;&lt;br /&gt;(1) &lt;u&gt;분할별로 스케줄링 큐 사용&lt;/u&gt;: &lt;u&gt;큰 분할들은 잘 사용되지 않을 수 있&lt;/u&gt;으므로, 시스템 전체 관점에서는 최적이 아니다&lt;br /&gt;(2) &lt;u&gt;싱글 큐를 사용&lt;/u&gt;: 모든 분할이 사용 중이면 스와핑을 하여야 한다&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;가변 분할(Dynamic Partitioning)&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;프로세스가 필요한 만큼의 메모리를 정확히 할당받음&amp;nbsp;&lt;/b&gt;&lt;br /&gt;내부 단편화가 없다, 외부 단편화를 제거하기 위해 컴팩션이 필요하다&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;단점: 외부 단편화로 컴팩션 오버헤드가 발생한다&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;외부 단편화 (External Fragmentation)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;동적으로 메모리의 할당과 해제를 반복하면서, 사이 사이에 조각나서 낭비되는 작은 공간들&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;압축 (Compaction)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;외부 단편화를 해소하기 위해 OS가 메모리 내 프로세스를 연속되게 재배치하여 빈 공간을 하나로 모으는 기법&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;First-fit&lt;/b&gt;&lt;br /&gt;메모리의 &lt;u&gt;처음부터 스캔&lt;/u&gt;하여 &lt;u&gt;할당 가능한 첫 번째 빈 공간&lt;/u&gt;에 할당하는 방식&lt;br /&gt;간단하고 기징 빠른 성능&lt;br /&gt;&lt;b&gt;Next-fit&lt;/b&gt;&lt;br /&gt;&lt;u&gt;이전 할당 위치부터 스캔&lt;/u&gt;하여 &lt;u&gt;할당 가능한 다음 빈 공간&lt;/u&gt;에 할당하는 방식&lt;br /&gt;전체적으로 할당이 일어나기 때문에 Compaction이 더 자주 필요하다&lt;br /&gt;&lt;b&gt;Best-fit&lt;/b&gt;&lt;br /&gt;&lt;u&gt;요청 크기와 가장 가까운 크기의 빈 공간&lt;/u&gt;에 할당하는 방식 (외부 단편화가 가장 작게 생기도록)&lt;br /&gt;외부 단편화가 너무 잘게 만들어지기 때문에 컴팩션이 자주 필요&lt;br /&gt;&lt;b&gt;Worst-fit&lt;/b&gt;&lt;br /&gt;&lt;u&gt;가장 큰 빈 공간&lt;/u&gt;에 할당하는 방식&lt;br /&gt;실제로 가장 비효율적 (큰 공간들이 사라지면서 컴팩션이 더 자주 필요하다)&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;버디 시스템(Buddy System)&lt;br /&gt;고정 분할과 동적 분할 기법의 절충안&lt;br /&gt;&lt;br /&gt;초기에는 전체 공간이 크기 2^U인 하나의 블록으로 취급&lt;br /&gt;2^U는 할당 가능한 전체 메모리 크기&lt;br /&gt;메모리 블록은 크기 2^K 단위, L &amp;le; K &amp;le; U&lt;br /&gt;(2^L = 할당 가능한 가장 작은 블록 크기)&lt;br /&gt;(2^U = 할당 가능한 가장 큰 블록 크기(대개 전체 메모리 크기)&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;버디 시스템(Buddy System) 알고리즘&lt;br /&gt;2^(k-1) &amp;lt; s &amp;le; 2^k를 만족할 때까지 분할하고, 2^k인 블록을 할당한다&lt;br /&gt;인접한 버디를 직전의 더 큰 분할 크기로 합칠 수 있을 때 합친다&lt;br /&gt;&lt;u&gt;(같거나 살짝 큰 단위까지 나눈다)&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;776&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/JpSgU/btsOpD18RNO/Jk8UZyU1KvGzvxKn9KCAJK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/JpSgU/btsOpD18RNO/Jk8UZyU1KvGzvxKn9KCAJK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/JpSgU/btsOpD18RNO/Jk8UZyU1KvGzvxKn9KCAJK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FJpSgU%2FbtsOpD18RNO%2FJk8UZyU1KvGzvxKn9KCAJK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;629&quot; height=&quot;390&quot; data-origin-width=&quot;1252&quot; data-origin-height=&quot;776&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;페이징(Paging)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;메인 메모리는 동일 크기의 여러 프레임으로 나뉘고&lt;/u&gt;&lt;br /&gt;&lt;b&gt;프로세스가 프레임과 같은 크기의 여러 페이지로 나뉘고,&lt;/b&gt;&lt;br /&gt;&lt;b&gt;페이지들을 연속될 필요 없이 가능한 프레임에 적재하는 방식&lt;/b&gt;&lt;br /&gt;&lt;b&gt;외부 단편화는 없으나, 프로세스의 마지막 페이지에 작은 내부 단편화가 발생할 수 있다.&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;페이지 테이블(Page Table)&lt;br /&gt;프로세스의 페이지가 위치한 프레임 정보를 담고 있다.&lt;br /&gt;페이지 번호(0부터 시작)를 인덱스로 사용&lt;br /&gt;&lt;u&gt;메인 메모리의 사용되지 않는 프레임을 관리하는 하나의 free-frame list&lt;/u&gt;를 관리&lt;br /&gt;프로세서는 logical addresss(페이지 번호, 오프셋)를 page table을 통해 physical address(프레임 번호, 오프셋)로 변환&lt;br /&gt;고정 분할과 유사하지만, (1) 분할 크기가 매우 작고 (2) &lt;u&gt;연속적일 필요 없다는 점에서 다르다&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;페이지 번호(p): 페이지 테이블의 인덱스로 사용, 물리 메모리 내 각 페이지의 base address를 가리킨다&lt;br /&gt;페이지 오프셋(d): base address에 더해져 실제 물리 메모리 주소를 구할 수 있고, 이 주소가 메모리로 전달됨&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;세그멘테이션(Segmentation)&lt;/b&gt;&lt;br /&gt;&lt;b&gt;프로세스가 최대 길이가 정해져 있는 가변적 길이의 여러 개의 세그먼트로 나뉘고&lt;/b&gt;&lt;br /&gt;&lt;b&gt;세그먼트들을 연속될 필요 없이 가능한 분할에 적재하는 방식&lt;/b&gt;&lt;br /&gt;Logical Address는 (Segment #, Offset)&lt;br /&gt;동적 분할과 유사지만, 연속적이지 않아도 되는 분할에 적재&lt;br /&gt;&lt;b&gt;내부 단편화는 없지만 외부 단편화는 발생할 수 있다&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1365&quot; data-origin-height=&quot;927&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/MKE32/btsOsTjO3fE/JZ6mKTip8Pt1sbLb2O5Zv1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/MKE32/btsOsTjO3fE/JZ6mKTip8Pt1sbLb2O5Zv1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/MKE32/btsOsTjO3fE/JZ6mKTip8Pt1sbLb2O5Zv1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FMKE32%2FbtsOsTjO3fE%2FJZ6mKTip8Pt1sbLb2O5Zv1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1365&quot; height=&quot;927&quot; data-origin-width=&quot;1365&quot; data-origin-height=&quot;927&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Simple segmentation 기법은&lt;br /&gt;각 프로세스마다 세그먼트 테이블과 빈 블록 리스트를 사용&lt;br /&gt;1. 논리 주소의 왼쪽 n비트를 세그먼트 번호로 추출&lt;br /&gt;2. 세그먼트 번호를 인덱스로 세그먼트 테이블에서 해당 세그먼트의 Base를 찾는데, 논리 주소의 오른쪽 m비트로 Offset이 세그먼트&amp;nbsp; &amp;nbsp;Length보다 크거나 같으면 주소가 유효하지 않다.&lt;br /&gt;3. 원하는 물리 주소는 세그먼트 Base address와 offset의 합이다&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;u&gt;(페이징과 유사하나, 세그먼트 테이블에 length가 추가적으로 있어서 offset과의 비교를 통해 유효한 주소인지 확인한다)&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;가상 메모리&lt;br /&gt;&lt;u&gt;보조 기억 장치를 마치 메인 메모리의 일부처럼 프로그램 주소를 변환해 사용하는 저장 방식&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;프로그램 주소는 물리 주소와 구별&amp;nbsp;&lt;br /&gt;프로그램이 생성한 주소는 자동으로 기계 주소로 변환&lt;br /&gt;가상 저장 공간의 크기는 주소 정책이나 보조 기억 장치의 용량에 의해 제한&lt;br /&gt;&amp;nbsp;&lt;br /&gt;실행 중에 프로세스의 모든 페이지나 세그먼트가 메인 메모리에 있을 필요는 없다&lt;br /&gt;&amp;nbsp;&lt;br /&gt;필요한 주소가 메인 메모리에 없을 경우, 페이지 폴트 인터럽트가 발생한다.&lt;br /&gt;운영체제는 인터럽트가 발생한 프로세스를 블로킹 상태로 전환&lt;br /&gt;논리적 주소를 포함하는 프로세스 조각이 메인 메모리로 불러져 와야 한다&lt;br /&gt;운영체제는 디스크 I/O 읽기 요청을 수행&lt;br /&gt;디스크 I/O가 수행되는 동안, 다른 프로세스가 실행된다.&lt;br /&gt;디스크 I/O가 완료되면 인터럽트가 발생하고 제어가 운영체제로 돌아가며, 운영체제는 해당 프로세스를 레디 상태로 전환&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;1130&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CsNc6/btsOB9nd3WK/llcEKEQeWjxTNRIuc4kidk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CsNc6/btsOB9nd3WK/llcEKEQeWjxTNRIuc4kidk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CsNc6/btsOB9nd3WK/llcEKEQeWjxTNRIuc4kidk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCsNc6%2FbtsOB9nd3WK%2FllcEKEQeWjxTNRIuc4kidk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;392&quot; height=&quot;303&quot; data-origin-width=&quot;1460&quot; data-origin-height=&quot;1130&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&lt;u&gt;(페이지 테이블 확인했을 때, 메인 메모리에 있으면 물리 주소를 계산해서 메인 메모리로 접근)&lt;/u&gt;&lt;br /&gt;&lt;u&gt;(페이지 테이블을 확인했을 때, 메인 메모리에 없으면(i) 해당 프로세스를 블로킹한다음 디스크로 가서 메인 메모리로&lt;/u&gt;&lt;br /&gt;&lt;u&gt;가서 가져온 다음 레디 상태로 전환)&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;가상 메모리의 장점&lt;br /&gt;&lt;b&gt;(1) 더 많은 프로세스를 메모리에 수용 가능해서 CPU Utilization이 높아짐&lt;/b&gt;&lt;br /&gt;&lt;b&gt;(2) 프로세스의 크기가 물리적 메모리의 크기보다 커질 수 있다&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;지역성의 원리:&lt;/b&gt; &lt;b&gt;프로그램은 짧은 시간 동안 한정된 메모리 영역만을 집중적으로 참조하는 경향이 있다는 원리&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Thrashing&lt;/b&gt;: &lt;b&gt;OS가 페이지 교체에 과도하게 많은 시간을 소비하여 실제 작업은 거의 수행되지 않는 상태&lt;/b&gt;&lt;br /&gt;(사용되기 직전의 조각을 계속해서 내보낸다면 비효율적으로 작동하게 됨)&lt;br /&gt;OS는 최근 사용 이력을 기반, 가까운 미래에 사용될 가능성이 가장 낮은 조각을 추측하여 내보내려고 한다.&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;가상 메모리가 효과적으로 동작하기 위해서:&lt;br /&gt;하드웨어 지원(주소 변환)&lt;br /&gt;OS는 어떤 페이지가 들어가고 나오는지를 관리하는 소프트웨어를 포함해야함&lt;br /&gt;&amp;nbsp;&lt;br /&gt;각 프로세스는 고유한 페이지 테이블을 가진다&lt;br /&gt;각 PTE(Page Table Entry)는&amp;nbsp; 메모리 내 해당 페이지의 프레임 번호, 컨트롤 비트(P-bit, M-bit)&lt;br /&gt;&lt;u&gt;OS는 free-frame list를 관리&lt;/u&gt;&lt;br /&gt;&lt;u&gt;P bit(valid-invalid bit): 페이지가 메모리에 존재함을 나타냄&lt;/u&gt;&lt;br /&gt;&lt;u&gt;M bit: 페이지가 변경되었음을 나타냄&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;[Paging]&lt;br /&gt;&lt;u&gt;Virtual address: Page #, Offset&lt;/u&gt;&lt;br /&gt;&lt;u&gt;PTE: Page #, Frame #, Control bit(P-bit, M-bit)&lt;/u&gt;&lt;br /&gt;&lt;u&gt;Physical address: Frame #, Offset&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;[Inverted Page Table]&lt;br /&gt;&lt;u&gt;Virtual address: Page #, Offset&lt;/u&gt;&lt;br /&gt;&lt;u&gt;Inverted Page Table: Index(Frame #), Pid, VPN, Chain, Control bit&lt;/u&gt;&lt;br /&gt;&lt;u&gt;Physical address: Frame #, Offset&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;[Segmentation]&lt;br /&gt;&lt;u&gt;Virtual address: Segment #, Offset&lt;/u&gt;&lt;br /&gt;&lt;u&gt;STE: Segment #, Length, Base, Control bit&lt;/u&gt;&lt;br /&gt;&lt;u&gt;Physical address: Base + Offset&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;3086&quot; data-origin-height=&quot;2182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ccLzJy/btsOrYmv3O8/WPh1bmoVJkKPWOdCXuJtxK/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ccLzJy/btsOrYmv3O8/WPh1bmoVJkKPWOdCXuJtxK/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ccLzJy/btsOrYmv3O8/WPh1bmoVJkKPWOdCXuJtxK/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FccLzJy%2FbtsOrYmv3O8%2FWPh1bmoVJkKPWOdCXuJtxK%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;382&quot; height=&quot;270&quot; data-origin-width=&quot;3086&quot; data-origin-height=&quot;2182&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Two Level Hierarchical Page Table&lt;br /&gt;한 페이지의 크기 4KB(2^12) , 32비트(2^32 = 2^20개 * 한 개당 2^12) 주소를 가정&lt;br /&gt;4GB(2^32) 가상 주소 공간은 2^20개 페이지로 구성&lt;br /&gt;&lt;u&gt;총 용량: 4GB(2^32) = 2^20개 * 4KB(2^12)&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;따라서 하나의 페이지 테이블은 2^20개의 PTE로 구성되고 하나의 PTE는 4Byte(32비트)&lt;br /&gt;&lt;u&gt;user 페이지 테이블 용량: 4MB = 2^20개 * 4Byte&lt;/u&gt;&lt;br /&gt;각 프로세스마다 페이지 테이블 용량으로 4MB(2^22)차지&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;u&gt;root 페이지 테이블 용량: 4KB = 엔트리 2^10개 * 엔트리당 4Byte&amp;nbsp;&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;u&gt;프로세스들은 4KB(4 * 2^10)의 root 페이지 테이블만 메인 메모리에 상주시키고&lt;/u&gt;&lt;br /&gt;&lt;u&gt;나머지는 필요할 때만 디스크에서 가져온다&lt;/u&gt;&lt;br /&gt;&lt;u&gt;4GB 저장하는데&lt;/u&gt;&lt;br /&gt;&lt;u&gt;1계층이었으면 프로세스당 페이지 테이블을 저장하는데 4M 필요했는데&lt;/u&gt;&lt;br /&gt;&lt;u&gt;2계층으로 구성함으로써 프로세스당 페이지 테이블 저장하는데 4K만 필요&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;536&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pVD40/btsOtgMIJfw/QtKr0kUpPQX4OH6pWfL9Kk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pVD40/btsOtgMIJfw/QtKr0kUpPQX4OH6pWfL9Kk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pVD40/btsOtgMIJfw/QtKr0kUpPQX4OH6pWfL9Kk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpVD40%2FbtsOtgMIJfw%2FQtKr0kUpPQX4OH6pWfL9Kk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;411&quot; height=&quot;192&quot; data-origin-width=&quot;1146&quot; data-origin-height=&quot;536&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;(2 * 2^10 = 2^12)&lt;/u&gt;&lt;br /&gt;&lt;u&gt;(2^12 * 2 ^10 = 2^22)&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1552&quot; data-origin-height=&quot;1128&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmszxq/btsOqG00lZC/Fi4cakBMTM6KeSbWAtopK0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmszxq/btsOqG00lZC/Fi4cakBMTM6KeSbWAtopK0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmszxq/btsOqG00lZC/Fi4cakBMTM6KeSbWAtopK0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbmszxq%2FbtsOqG00lZC%2FFi4cakBMTM6KeSbWAtopK0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;486&quot; height=&quot;353&quot; data-origin-width=&quot;1552&quot; data-origin-height=&quot;1128&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;페이지 테이블의 크기가 virtual address space(VAS)의 크기에 비례&lt;/b&gt;&lt;br /&gt;=&amp;gt; 대안 : &lt;b&gt;Inverted Page Table&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;각 엔트리는 다음을 포함&lt;br /&gt;VPN (페이지 번호) &amp;ndash; 가상 주소(Virtual Address)의 페이지 번호&amp;nbsp;&lt;br /&gt;pid &amp;ndash; 이 페이지의 소유 프로세스&lt;br /&gt;제어 비트&amp;nbsp;&lt;br /&gt;chain 포인터 &amp;ndash; 체인 내 다음 항목의 인덱스 값&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;u&gt;&lt;b&gt;Hash (PID, VPN(Virtual Page Number)) =&amp;gt; Index(Frame #)&lt;/b&gt;&lt;/u&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;u&gt;&lt;b&gt;Inverted Page Table에서 해당 테이블 인덱스의 항목에서,&lt;/b&gt;&lt;/u&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;u&gt;&lt;b&gt;pid, VPN이 같으면 =&amp;gt; (Index == Frame #) + Offset 해서 실제 주소로 이동&lt;/b&gt;&lt;/u&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;u&gt;&lt;b&gt;pid, VPN이 다르면 =&amp;gt; 체인을 타고 다음 인덱스 항목으로 넘어간다&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;가상 페이지마다 하나씩이 아니라, &lt;/b&gt;&lt;u&gt;&lt;b&gt;실제 물리적 메모리 프레임마다 엔트리들이 존재&lt;/b&gt;&lt;/u&gt;&lt;br /&gt;프레임 번호로 페이지 테이블 항목(PTE)을 인덱싱&lt;br /&gt;(페이지 번호 X, 프레임 번호 O)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1582&quot; data-origin-height=&quot;1108&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/0eDmQ/btsOtq2Fh9n/8KZKSQ1dVlimHOtgTG617K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/0eDmQ/btsOtq2Fh9n/8KZKSQ1dVlimHOtgTG617K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/0eDmQ/btsOtq2Fh9n/8KZKSQ1dVlimHOtgTG617K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F0eDmQ%2FbtsOtq2Fh9n%2F8KZKSQ1dVlimHOtgTG617K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;396&quot; height=&quot;277&quot; data-origin-width=&quot;1582&quot; data-origin-height=&quot;1108&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;TLB&lt;br /&gt;가상 메모리 참조는 두 번의&amp;nbsp; 메모리 접근을 유발(한 번은 페이지 테이블, 한 번은 데이터)&lt;br /&gt;&lt;b&gt;최근에 사용된 PTE를 저장하는 캐시&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1842&quot; data-origin-height=&quot;1104&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b0NMR0/btsOsBYu90c/Hekk1UJYV1WHryg6ZtAtKK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b0NMR0/btsOsBYu90c/Hekk1UJYV1WHryg6ZtAtKK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b0NMR0/btsOsBYu90c/Hekk1UJYV1WHryg6ZtAtKK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb0NMR0%2FbtsOsBYu90c%2FHekk1UJYV1WHryg6ZtAtKK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;536&quot; height=&quot;321&quot; data-origin-width=&quot;1842&quot; data-origin-height=&quot;1104&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;b&gt;Direct Mapping:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;PTE를 TLB의 고정된 엔트리에 매핑하고, 찾는 방식&lt;/b&gt;&lt;br /&gt;&lt;b&gt;Associative Mapping:&lt;/b&gt;&lt;br /&gt;&lt;b&gt;PTE를 TLB의 어떤 엔트리에든 저장할 수 있으며, 하드웨어가 동시에 모든 엔트리를 한방에 확인하는 방식&lt;/b&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/TZKJA/btsOsd4vud6/YQtMEuGOoNko7uhlNhYhx0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/TZKJA/btsOsd4vud6/YQtMEuGOoNko7uhlNhYhx0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/TZKJA/btsOsd4vud6/YQtMEuGOoNko7uhlNhYhx0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FTZKJA%2FbtsOsd4vud6%2FYQtMEuGOoNko7uhlNhYhx0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;393&quot; height=&quot;324&quot; data-origin-width=&quot;1202&quot; data-origin-height=&quot;992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;캐쉬는 블록단위로 불러오고 블록단위로 저장 (지역성의 원리를 활용하기 위해서)&lt;br /&gt;TLB 히트 + 캐쉬 히트 시, 메모리에 한 번도 접근하지 않고 값을 바로 가져올 수 있다&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Page Size&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;페이지 크기 결정 시 고려 세 요소&lt;br /&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;내부 단편화 감소&lt;/u&gt;: 페이지 크기가 작을수록 내부 단편화는 줄지만, 페이지 수 증가로 페이지 테이블이 커진다.&lt;br /&gt;&lt;u&gt;페이지 폴트 감소&lt;/u&gt;: 큰 페이지는 PTE 수를 줄여서 해당 페이지 테이블이 메인 메모리에 유지될 확률을 높여서&lt;br /&gt;이중 페이지 폴트를 줄일 수 있으나, 내부 단편화가 발생할 수 있다&lt;br /&gt;&lt;u&gt;효율적인 데이터 블록 전송&lt;/u&gt;: 큰 페이지 크기가 I/O 성능에 유리하나, 내부 단편화가 발생한다&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;페이지 폴트율&lt;br /&gt;1. 큰 페이지는 &lt;u&gt;지역성의 효과를 약화&lt;/u&gt;시켜 &lt;u&gt;페이지 폴트율을 증가&lt;/u&gt;시킬 수 있지만, 페이지 크기가&lt;u&gt; 프로세스 크기에 가까워지면&lt;/u&gt; &lt;u&gt;다시 감소&lt;/u&gt;한다.&lt;br /&gt;2. 페이지 폴트율은 페이지 크기뿐만 아니라 &lt;u&gt;프로세스에 할당된 프레임 수&lt;/u&gt;에도 영향을 받는다(SW issue)&lt;br /&gt;&lt;u&gt;(할당 프레임 수가 증가함에 따라 확 줄다가 서서이 줄어든다)&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;Segmentation Only&lt;br /&gt;&amp;nbsp;&lt;br /&gt;메모리를 세그먼트로 나누어서 관리&lt;br /&gt;장점: 동적 구조 처리, 모듈화, 공유 및 보호 지원&lt;br /&gt;&amp;nbsp;&lt;br /&gt;P-bit: 세그먼트가 이미 메모리에 있는지 확인&lt;br /&gt;M-bit: 세그먼트가 수정되었는지 확인&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;912&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/pEsar/btsOseh6nJR/bPOURvJ2yfDGpVS2E1ymsK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/pEsar/btsOseh6nJR/bPOURvJ2yfDGpVS2E1ymsK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/pEsar/btsOseh6nJR/bPOURvJ2yfDGpVS2E1ymsK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FpEsar%2FbtsOseh6nJR%2FbPOURvJ2yfDGpVS2E1ymsK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;478&quot; height=&quot;324&quot; data-origin-width=&quot;1346&quot; data-origin-height=&quot;912&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(Simple Segmentation과 유사하게 동작)&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;Combining Paging and Segmentation&lt;br /&gt;각 세그먼트는&amp;nbsp; 페이지 여러 개로 나뉜다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;322&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cjzpOm/btsOssz9fnw/EMqEnKOLOtIFA3szxcWDu1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cjzpOm/btsOssz9fnw/EMqEnKOLOtIFA3szxcWDu1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cjzpOm/btsOssz9fnw/EMqEnKOLOtIFA3szxcWDu1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcjzpOm%2FbtsOssz9fnw%2FEMqEnKOLOtIFA3szxcWDu1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;376&quot; height=&quot;192&quot; data-origin-width=&quot;630&quot; data-origin-height=&quot;322&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;장점:&lt;br /&gt;&amp;nbsp;- &lt;u&gt;세그멘테이션은 프로그래머에게 visible&lt;/u&gt;&lt;br /&gt;&amp;nbsp;- 동적 구조 처리, &lt;u&gt;모듈화&lt;/u&gt;, 공유 및 보호 지원&lt;br /&gt;&amp;nbsp;- segmentation과 달리, &lt;u&gt;외부 단편화가 없다&lt;/u&gt;&lt;br /&gt;&amp;nbsp;- 매핑이 단순&lt;br /&gt;&amp;nbsp;- &lt;u&gt;segment 테이블에서 꺼내는 base address로 page 테이블을 찾고&lt;/u&gt;&lt;br /&gt;&lt;u&gt;&amp;nbsp;- Page 테이블에서 page #로 frame #를 찾아 물리 주소로 변환&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;858&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/EmexF/btsOrulzgUD/E0slhedjXcM4iAPV47wNv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/EmexF/btsOrulzgUD/E0slhedjXcM4iAPV47wNv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/EmexF/btsOrulzgUD/E0slhedjXcM4iAPV47wNv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FEmexF%2FbtsOrulzgUD%2FE0slhedjXcM4iAPV47wNv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;535&quot; height=&quot;356&quot; data-origin-width=&quot;1290&quot; data-origin-height=&quot;858&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;(프로세스마다 세그먼트 테이블)&lt;/u&gt;&lt;br /&gt;&lt;u&gt;(세그먼트 별로 페이지 테이블)&lt;/u&gt;&lt;br /&gt;&lt;u&gt;(메모리를 3번 접근해야 한다는 단점이 있다)&lt;/u&gt;&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>Operating system</category>
      <author>vysryoo</author>
      <guid isPermaLink="true">https://vysryoo.tistory.com/135</guid>
      <comments>https://vysryoo.tistory.com/135#entry135comment</comments>
      <pubDate>Wed, 4 Jun 2025 13:20:37 +0900</pubDate>
    </item>
    <item>
      <title>[Alg] NP Problem</title>
      <link>https://vysryoo.tistory.com/134</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;Two approaches&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) develope a more efficient algorithm.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) try to prove that more efficient algorithm is NOТ possible&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; ==&amp;gt; Quit/Stop.&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;1) try to find a more efficient algorithm using NEW design&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&amp;nbsp;: O(n^3) -&amp;gt; O(n^2) -&amp;gt; O(nlogn)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) try to find a greater(better) lower bound using computational analysis.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bQTC4Y/btsOkprmgcV/cAeZ8TPsD38rEinv9yi4P0/img.png&quot; width=&quot;326&quot; height=&quot;183&quot; data-is-animation=&quot;false&quot; data-origin-width=&quot;542&quot; data-origin-height=&quot;304&quot; data-filename=&quot;스크린샷 2025-05-31 오전 12.17.46.png&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;p data-ke-size=&quot;size16&quot;&gt;Example&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Sorting: nlogn (comparison)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; omega(nlogn): lower bound already found, algoritms already found/used&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Search&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; binary search (TC) is as good as lower bound&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; omega(logN)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; upper bound를 점점 낮추는 것이 알고리즘 developement&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; lower bound를 점점 높여서 만나는 지점에서, 알고리즘 개발을 멈출 수 있을 것&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;NP Theory&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;Solving a problem (for Normal/Classic Problems)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. Design algorithms (for optimal/exact solution)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Analysis: time complexity, proofs, lower bound&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;IF we can NOT find efficient algorithms? (NP문제)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1. very slow algorithm for optimal solution&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. optimal solution 포기-&amp;gt; approximate solution 채택 (suboptimal, near-optimal solutions)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;===&amp;gt; Approximation algorithm (NEW) 설계/분석&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 alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;Note-292.jpg&quot; data-origin-width=&quot;3086&quot; data-origin-height=&quot;2182&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/y91JE/btsOkSlu45H/lg4FHMgfFfZDZcJ0zmnzj1/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/y91JE/btsOkSlu45H/lg4FHMgfFfZDZcJ0zmnzj1/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/y91JE/btsOkSlu45H/lg4FHMgfFfZDZcJ0zmnzj1/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy91JE%2FbtsOkSlu45H%2Flg4FHMgfFfZDZcJ0zmnzj1%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;468&quot; height=&quot;331&quot; data-filename=&quot;Note-292.jpg&quot; data-origin-width=&quot;3086&quot; data-origin-height=&quot;2182&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;Problem Classification&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&quot;P &amp;lt;= NP &amp;lt;= EXP &amp;lt;= Solvable &amp;lt;= Countable&quot;&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;table style=&quot;border-collapse: collapse; width: 100%; height: 76px;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Q1: 0~10 사이 정수&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;9개&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Finite, Countable&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;P&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Q2: 0~10 사이 실수&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;무한개&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Uncountable&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Not countable / unsolvable as counting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Q3: 0~&amp;infin; 사이 정수&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;무한개&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Infinite, Countable&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Solvable (정의 가능), Not finite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr style=&quot;height: 19px;&quot;&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Q4: 0~1 실수 &amp;gt; 0~10 정수?&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;예&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;Uncountable vs Finite&lt;/td&gt;
&lt;td style=&quot;height: 19px;&quot;&gt;P (간단한 비교)&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;Q5. Sort 문제(P)는 KS(NP)보다 쉬운가? 증명하시오&lt;br /&gt;&amp;rarr; 문제의 난이도 클래스 확인 &amp;rarr; proper design/analysis&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;- 자연수 집합과 일대일 대응이 가능하면 countable&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 자연수 집합과 일대일 대응이 불가능하면 uncountable&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 문제가 애초에 어떤 정답이 있는지조차 컴퓨터로 항상 판단할 수 없는 경우면 unsolvable&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;Easy problem vs intractable problem&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) easy problem: good algorithm 존재, &lt;b&gt;polynomial TC.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2)&lt;b&gt; intractable&lt;/b&gt; problem: difficult to treat or work&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp; &amp;nbsp; (&lt;b&gt;NO Polynomial-time&lt;/b&gt; algorithm), NP(X)&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;P-class:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;1. the class of decision problems that are polynomially bounded&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;2. T(n) = polynomial function of 'n' &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;3. problems solvable in polynomial time &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;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;EXP-class: &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;problems solvable in Exponential time&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;me &lt;/span&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;(N-queens, KS, ...)&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;polynomial 알고리즘을 찾지 못했다고 해서 그 문제가 p-class가 아니라고 단정지을 수 없다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;exp 알고리즘을 찾았다고 해서 그 문제가 exp-class라고 단정지을 수도 없다&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;=&amp;gt; 언젠가 polynomial 알고리즘을 찾을 수도 있다 ==&amp;gt; 수학적 정의 필요!&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;3 categories:&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;&lt;b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;1.&amp;nbsp;Problem&amp;nbsp;proven&amp;nbsp;to&amp;nbsp;be&amp;nbsp;in&amp;nbsp;P-class:&amp;nbsp;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;sort, search, CMM, SP, Dijkstra, ... -&amp;gt; easy, efficient, fast, optimal, tractable.&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;&lt;b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;2.&amp;nbsp;Problem&amp;nbsp;proven&amp;nbsp;to&amp;nbsp;be&amp;nbsp;NOT&amp;nbsp;in&amp;nbsp;P-class:&amp;nbsp;&quot;a&amp;nbsp;few&quot;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&quot;intractable&quot;&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;:&amp;nbsp;O(n^2)&amp;nbsp;X,&amp;nbsp;O(n^4)&amp;nbsp;X&amp;nbsp;O(n!)&amp;nbsp;O&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&lt;br /&gt;: determine ALL Hamiltonian paths -&amp;gt; O(n!) only BF&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;: Non-polynomial amount of output&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;&lt;span style=&quot;font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', 'Apple SD Gothic Neo', Arial, sans-serif; letter-spacing: 0px;&quot;&gt;&quot;halting problem&quot;: given a computer program(algorithm), does&amp;nbsp;it&amp;nbsp;stop/halt?&amp;nbsp;YES/NO.&lt;br /&gt;: NOT in P-class임이 증명&lt;br /&gt;: famous because it was the FIRST problem proven to be uncomputable/undecidable.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;halting problem은 unsolvable&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;&lt;b&gt;3. Problem proven &quot;neither&quot;&amp;nbsp; to be in P &quot;nor&quot; to be intractable.&lt;/b&gt;&lt;br /&gt;&lt;b&gt;==&amp;nbsp;neither&amp;nbsp;(1)&amp;nbsp;nor&amp;nbsp;(2)&lt;/b&gt;&lt;br /&gt;:&amp;nbsp;Knapsack,&amp;nbsp;Graph&amp;nbsp;coloring,&amp;nbsp;TSP,&amp;nbsp;Subset&amp;nbsp;sum,&amp;nbsp;....&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;&amp;nbsp;심증 : ( 1 ) 난이도 &amp;lt;&amp;lt; ( 3 ) 난 이 도&amp;nbsp;&lt;br /&gt;(3) could be (1) in the future&lt;br /&gt;(3) 문제 범주&amp;nbsp; =&amp;nbsp; NP-class 문제&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;NP Definition (loosely speaking):&lt;br /&gt;NP&amp;nbsp;is&amp;nbsp;the&amp;nbsp;class&amp;nbsp;of&amp;nbsp;decision&amp;nbsp;problems&amp;nbsp;for&amp;nbsp;which&amp;nbsp;a&amp;nbsp;given&lt;br /&gt;solution can be checked quickly (in polynomial time) to see if it is true solution&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;- Solution을 빠르게 계산하는 nice algorithm을 찾지 못했을 때,&lt;br /&gt;- 일단 가정&lt;b&gt;:&lt;/b&gt; Solution이 주어졌다고 가정하고 출발&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;Optimization Problem vs Decision Problem&lt;/p&gt;
&lt;p data-end=&quot;125&quot; data-start=&quot;88&quot; data-ke-size=&quot;size16&quot;&gt;TSP (Optimization problem &amp;rarr; optimization prob ver, decision prob ver)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Optimization problem: find optimal tour&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Decision problem: Is there a TSP tour with cost &amp;lt; 200? &amp;rarr; Yes / No&lt;/p&gt;
&lt;p data-end=&quot;256&quot; data-start=&quot;242&quot; data-ke-size=&quot;size16&quot;&gt;Knapsack&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Optimization problem: maximize total profit&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Decision problem: Is there a set &lt;span&gt;&lt;span&gt;AA&lt;/span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; with profit &amp;gt; 100? &amp;rarr; Yes / No&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Graph Coloring&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Optimization problem(version): minimize the number of colors&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Decision problem: Is the graph m-colorable? &amp;rarr; Yes or No (e.g., via backtracking)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Clique Problem&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Clique: 완전 부분 그래프 (예: Bioinformatics, SNS 등에서 활용)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Clique size 예시: size = 4 (파란색), size = 3 (초록색)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Optimization Problem: 최대 clique를 찾아라 (find max. clique)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- Decision Problem: 그래프에 크기 &lt;span&gt;&lt;span&gt;k 이상의 clique가 존재 하는가? &lt;span style=&quot;color: #333333; text-align: start;&quot;&gt;&amp;rarr; Yes or No&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-05-31 오전 12.48.50.png&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;382&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/daKqzm/btsOmjpbzGp/MhSqTEgmhZnM1mCjtF6cNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/daKqzm/btsOmjpbzGp/MhSqTEgmhZnM1mCjtF6cNk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/daKqzm/btsOmjpbzGp/MhSqTEgmhZnM1mCjtF6cNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdaKqzm%2FbtsOmjpbzGp%2FMhSqTEgmhZnM1mCjtF6cNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;208&quot; height=&quot;162&quot; data-filename=&quot;스크린샷 2025-05-31 오전 12.48.50.png&quot; data-origin-width=&quot;490&quot; data-origin-height=&quot;382&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Q: TSP는 P인가? NP인가?&lt;br /&gt;A: Optimization version TSP는 NP-Hard, Decision version은 NP-Complete&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;Q: Sorting 문제는 P인가? NP인가?:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A: Sorting문제는 P문제&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;Knapsack_Optimization ver : NP (x) NP-Hard (o)&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Item&amp;nbsp;set&amp;nbsp;A가&amp;nbsp;주어졌을&amp;nbsp;때,&amp;nbsp;최대&amp;nbsp;500&amp;nbsp;profit이&amp;nbsp;maximum인지&amp;nbsp;P-time에서&amp;nbsp;확인&amp;nbsp;가능한가?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;rarr;&amp;nbsp;2ⁿ개의&amp;nbsp;조합을&amp;nbsp;비교하여&amp;nbsp;real&amp;nbsp;max,&amp;nbsp;optimal&amp;nbsp;여부를&amp;nbsp;판별할&amp;nbsp;수&amp;nbsp;있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Knapsack_Decision ver : NP (o)&lt;/p&gt;
&lt;h4 data-end=&quot;114&quot; data-start=&quot;79&quot; data-ke-size=&quot;size20&quot;&gt;&amp;nbsp;&lt;/h4&gt;
&lt;p data-end=&quot;170&quot; data-start=&quot;140&quot; data-ke-size=&quot;size16&quot;&gt;Deterministic (결정적)&lt;/p&gt;
&lt;p data-end=&quot;170&quot; data-start=&quot;140&quot; data-ke-size=&quot;size16&quot;&gt;어떤 입력을 넣으면 항상 똑같은 출력이 나오는 시스템&lt;/p&gt;
&lt;p data-end=&quot;170&quot; data-start=&quot;140&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;114&quot; data-start=&quot;79&quot; data-ke-size=&quot;size16&quot;&gt;Stochastic (확률적, random, probabilistic)&lt;/p&gt;
&lt;p data-end=&quot;114&quot; data-start=&quot;79&quot; data-ke-size=&quot;size16&quot;&gt;무작위(randomness)를 기반으로 가능한 선택지 중 하나를 랜덤하게 고르고,&lt;/p&gt;
&lt;p data-end=&quot;114&quot; data-start=&quot;79&quot; data-ke-size=&quot;size16&quot;&gt;그 결과가 성공인지 실패인지는 운에 따라 결정됨.&lt;/p&gt;
&lt;p data-end=&quot;114&quot; data-start=&quot;79&quot; data-ke-size=&quot;size16&quot;&gt;동일한 인풋에서 아웃풋이 살짝 살짝씩 변한다&lt;/p&gt;
&lt;p data-end=&quot;114&quot; data-start=&quot;79&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;114&quot; data-start=&quot;79&quot; data-ke-size=&quot;size16&quot;&gt;Nondeterministic&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;Magic algorithm = Nondeterministic algorithm&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;Nondeterministic Algorithm Machine&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;1.&amp;nbsp;Nondeterministic&amp;nbsp;Guess&amp;nbsp;(step&amp;nbsp;1)&lt;br /&gt;: given a problem instance, guess a correct solution&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;in&amp;nbsp;unit&amp;nbsp;time&amp;nbsp;if&amp;nbsp;exists.&amp;nbsp;(without&amp;nbsp;trying&amp;nbsp;all&amp;nbsp;options)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;2.&amp;nbsp;Deterministic&amp;nbsp;Verification&amp;nbsp;(step&amp;nbsp;2)&lt;br /&gt;: verify the gussed solution&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;NP의 정의&lt;/b&gt;&lt;br /&gt;1.&amp;nbsp;Decision&amp;nbsp;problems&amp;nbsp;in&amp;nbsp;P.time&amp;nbsp;via&amp;nbsp;a&amp;nbsp;magic&amp;nbsp;algorithm&lt;br /&gt;2.&amp;nbsp;Decision&amp;nbsp;problems&amp;nbsp;with&amp;nbsp;solutions&amp;nbsp;that&amp;nbsp;can&amp;nbsp;be&amp;nbsp;checked(verifiable)&amp;nbsp;in&amp;nbsp;P&amp;nbsp;time&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3. set of all problems solvable by polynomial time Nondeterministic algorithm&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4. solvable in polynomial time by Nondeterministic algorithm&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; Nondeterministic 알고리즘이 Polynomial time 안에 풀 수 있는 문제&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;= set of decision problems solvable in polynomial time by nondeterministic algorithm&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;P == NP (미해결 문제, probably no)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span&gt;&lt;span&gt;P&lt;/span&gt;&lt;span&gt;&amp;sube;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;NP (Yes)&lt;/span&gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Almost&lt;/b&gt;&amp;nbsp;all&amp;nbsp;important&amp;nbsp;&lt;b&gt;problems&amp;nbsp;&lt;/b&gt;in&amp;nbsp;CS&amp;nbsp;are&amp;nbsp;in&amp;nbsp;&lt;b&gt;NP.&amp;nbsp;&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Too&amp;nbsp;many&amp;nbsp;problems&amp;nbsp;cannot&amp;nbsp;be&amp;nbsp;proven&amp;nbsp;to&amp;nbsp;be&amp;nbsp;in&amp;nbsp;P.&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Only one of NP-C is in&lt;/b&gt; &lt;b&gt;P &amp;rArr; All of them are in P.&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;NP 중에서 제일 대표적이고 어려운, core, 완전한 문제 &amp;rarr; NP-Complete 문제&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;only one of NP-C problems is polynomial time solvable, then so are all of them&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;(하나의 NP-C라도 다항 시간 내에 풀 수 있다는 것이 밝혀지면 다른 모든 NP 문제도 다항 시간 내에 풀 수 있는 것이 증명되므로)&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;(P == NP임이 증명된다, 현재는 P가 NP에 포함된다는 것만 밝혀진 상태: P이면 NP이다)&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-22 오전 12.15.32.png&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;118&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xBPnK/btsOMGkbwlC/JzXSwjZzwzMBsBMe04Ygvk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xBPnK/btsOMGkbwlC/JzXSwjZzwzMBsBMe04Ygvk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xBPnK/btsOMGkbwlC/JzXSwjZzwzMBsBMe04Ygvk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxBPnK%2FbtsOMGkbwlC%2FJzXSwjZzwzMBsBMe04Ygvk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;227&quot; height=&quot;69&quot; data-filename=&quot;스크린샷 2025-06-22 오전 12.15.32.png&quot; data-origin-width=&quot;388&quot; data-origin-height=&quot;118&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- A문제가 B문제로 바뀔 수 있다 (transform, reduce)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- A is transfromed into B&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- A is reduced into B&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;Def: NP-Complete&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Problem B is NP-Complete if&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;[Definition 1]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Problem B is NP-Complete&amp;nbsp;&lt;br /&gt;&lt;b&gt;if 1) B is in NP and&lt;/b&gt;&lt;br /&gt;&lt;b&gt;2)&amp;nbsp;for&amp;nbsp;all&amp;nbsp;A&amp;nbsp;in&amp;nbsp;NP,&amp;nbsp;A&amp;nbsp;=&amp;gt;&amp;nbsp;B&amp;nbsp;(transform,&amp;nbsp;reduce).&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(B가 NP이고, 모든 NP 문제를 polynomial 시간 안에 B로 환원할 수 있어야 한다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(그러나 수학적으로 2번을 증명하기가 너무 어려움)&lt;br /&gt;&lt;br /&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;[Definition 2]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Problem C is NP-Complete&lt;br /&gt;&lt;b&gt;if 1) C is NP and&lt;/b&gt;&lt;br /&gt;&lt;b&gt;2) for NP-Complete B, B = &amp;gt; C. (transform, reduce)&lt;/b&gt;&lt;br /&gt;NP-C인&amp;nbsp;B를&amp;nbsp;알&amp;nbsp;수&amp;nbsp;없기&amp;nbsp;때문에,&amp;nbsp;C가&amp;nbsp;NP-C임을&amp;nbsp;증명할&amp;nbsp;수도&amp;nbsp;없다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(C가 NP이고, 모든 NP-C 문제를 polynomial 시간 안에 B로 환원할 수 있어야 한다)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(NP-C인 B를 알 수 없기 때문에, C가 NP-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;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;NP-Complete 문제란&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-end=&quot;202&quot; data-start=&quot;101&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li data-end=&quot;124&quot; data-start=&quot;101&quot;&gt;&lt;b&gt;NP에 속하는 문제이면서&lt;/b&gt;,&lt;/li&gt;
&lt;li data-end=&quot;202&quot; data-start=&quot;127&quot;&gt;&lt;b&gt;다른 모든 NP 문제(좁은 정의에서는 이미 알려진 하나의 NP-Complete 문제)가 &lt;/b&gt;&lt;b&gt;다항시간 내에 환원될 수 있는 문제&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Cook's&amp;nbsp;Theorem&amp;nbsp;(1971)&lt;br /&gt;&quot;If CNF problem is P, then P==NP.&quot;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CNF problem는 NP-C임이 증명된 최초의 문제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- CNF를 해결하는 polynomial 알고리즘이 하나 존재한다면, 다른 모든 np&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;CNF-Satisfiability&amp;nbsp;(Boolean&amp;nbsp;SAT)&amp;nbsp;Problem&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b&gt;CNF: Conjunctive Normal Form (논리곱 표준형)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;= SAT (Satisfactory Problem, 논리식 만족 문제)&lt;/b&gt;&lt;br /&gt;ex.&amp;nbsp;(x1&amp;nbsp;or&amp;nbsp;x2)&amp;nbsp;and&amp;nbsp;(x2&amp;nbsp;or&amp;nbsp;not&amp;nbsp;x3)&amp;nbsp;and&amp;nbsp;not&amp;nbsp;x2&amp;nbsp;=&amp;nbsp;F&amp;nbsp;(bool&amp;nbsp;expr)&amp;nbsp;&amp;nbsp;&lt;br /&gt;CNF&amp;nbsp;(DP&amp;nbsp;ver):&amp;nbsp;is&amp;nbsp;there&amp;nbsp;a&amp;nbsp;truth&amp;nbsp;assignment&amp;nbsp;for&amp;nbsp;x1,&amp;nbsp;x2,&amp;nbsp;x3&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- true로 만드는 x1, x2, x3에 대한 진리표 할당이 있을 수 있느냐 (Decision Problem: 대답 예/아니요)&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;Theorem:&amp;nbsp; If Decision Problem B is P-class and A =&amp;gt;p B, then A is also P&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;SAT는 Decision Problem,&amp;nbsp; transform 가능한 문제 역시 DP 형태를 가져야함&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SAT(Decision Problem ver) &amp;rArr; p(나의 문제, Decision Problem)&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-22 오전 12.48.04.png&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;424&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/FyLHD/btsOLzfi2TT/9Wa5FuMm2nZZTYkbrK4Fkk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/FyLHD/btsOLzfi2TT/9Wa5FuMm2nZZTYkbrK4Fkk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/FyLHD/btsOLzfi2TT/9Wa5FuMm2nZZTYkbrK4Fkk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FFyLHD%2FbtsOLzfi2TT%2F9Wa5FuMm2nZZTYkbrK4Fkk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;405&quot; height=&quot;278&quot; data-filename=&quot;스크린샷 2025-06-22 오전 12.48.04.png&quot; data-origin-width=&quot;618&quot; data-origin-height=&quot;424&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Motivation: 주어진 어려운 문제를 NP-C로 해결할 수 있다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SAT =&amp;gt;p (My Problem)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: NP-C 중에 하나가 해결되면, 다른 NP-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;p data-ke-size=&quot;size16&quot;&gt;Hamiltonian Circuit&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;본질적으로 Decision Problem임&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;NP-Complete 문제.&lt;/p&gt;
&lt;p data-end=&quot;617&quot; data-start=&quot;558&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;617&quot; data-start=&quot;558&quot; data-ke-size=&quot;size16&quot;&gt;TSP Decision Problem&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;간선에 가중치가 있음.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;역시 NP-Complete 문제.&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;u&gt;(SAT &amp;le;p HC)&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;(HC &amp;le;p TSP-DP)&lt;/u&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;1) TSP의 Decision Problem은 NP이다: 정답이 주어졌을 때, O(n)만에 판별 가능&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) HC가 NC-Complete이고, HC를 polynomail time 안에 TSP Decision Problem으로 환원할 수 있다&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;[HC &amp;rarr; TSP Decision Problem 환원]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- HC에 있던 엣지는 TSP로 옮기면서 웨이트를 1로 주고&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- HC에 없던 엣지는 TSP로 옮기면서 기존에 있던 값보다 훨씬 큰 값을 넣어준다&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;nbsp;- 2가 할당되어 있는 엣지는 절대 정답에 포함될 수 없으므로, TSP로 답을 풀면 HC 문제의 답을 구할 수 있다&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-22 오전 11.26.25.png&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;398&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RqYEK/btsOMTqjI6Y/FDbfYt7yZBT3KJ5gEJs9BK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RqYEK/btsOMTqjI6Y/FDbfYt7yZBT3KJ5gEJs9BK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RqYEK/btsOMTqjI6Y/FDbfYt7yZBT3KJ5gEJs9BK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRqYEK%2FbtsOMTqjI6Y%2FFDbfYt7yZBT3KJ5gEJs9BK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;423&quot; height=&quot;159&quot; data-filename=&quot;스크린샷 2025-06-22 오전 11.26.25.png&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;398&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2025-06-22 오전 11.26.39.png&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;602&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Wm0I1/btsOMOWSROL/iWiFA2Kn8ttd5lnHj8CoA1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Wm0I1/btsOMOWSROL/iWiFA2Kn8ttd5lnHj8CoA1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Wm0I1/btsOMOWSROL/iWiFA2Kn8ttd5lnHj8CoA1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FWm0I1%2FbtsOMOWSROL%2FiWiFA2Kn8ttd5lnHj8CoA1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;454&quot; height=&quot;294&quot; data-filename=&quot;스크린샷 2025-06-22 오전 11.26.39.png&quot; data-origin-width=&quot;930&quot; data-origin-height=&quot;602&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;전제: Subset sum 문제가 NP-C이다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;1) 0/1 Knapsack은 NP문제이다: 특정 해가 주어졌을 때, O(n)만에 검증할 수 있으므로 NP임을 증명 가능&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;2) Subset sum 문제가 NP-C이고, subset sum을 polynomial time 안에 0/1 KS로 환원할 수 있다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;따라서 0/1 KS도 NP-C이다&lt;/p&gt;
&lt;p style=&quot;color: #333333; text-align: start;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-end=&quot;80&quot; data-start=&quot;38&quot; data-ke-size=&quot;size16&quot;&gt;[Subset Sum &amp;rarr; 0/1 Knapsack 환원]&lt;/p&gt;
&lt;p data-end=&quot;103&quot; data-start=&quot;82&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;Subset Sum 문제:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 입력: 정수 집합 &lt;span&gt;&lt;span&gt;S={a1,a2,&amp;hellip;,an}&lt;/span&gt;&lt;/span&gt;, 목표합 T&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;- 질문: &lt;span&gt;&lt;span aria-hidden=&quot;true&quot;&gt;&lt;span&gt;&lt;span&gt;S&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;의 어떤 부분집합의 합이 정확히 &lt;span&gt;&lt;span&gt;T&lt;/span&gt;&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;이걸 0/1 Knapsack 문제로 바꾸는 방법:&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;아이템&lt;/td&gt;
&lt;td&gt;원소 &lt;span&gt;a_i&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;아이템 &lt;span&gt;i&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;무게 &lt;span&gt;wi&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;a_i&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;a_i&lt;/span&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;가치 &lt;span&gt;vi&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;td&gt;&lt;span&gt;a_i&lt;/span&gt; &amp;larr; 무게와 동일하게 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;배낭 용량 &lt;span&gt;W&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;목표합 &lt;span&gt;T&lt;/span&gt;&lt;/td&gt;
&lt;td&gt;&lt;span&gt;T&lt;/span&gt;&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;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) Clique의 Decision Problem은 NP이고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) SAT가 polynomial time안에 Clique의 DP로 환원될 수 있기 때문에, Clique의 DP도 NP-Complete이다&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;TSP는 NP-Complete? =&amp;gt; No&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TSP-DP는 NP-Complete? =&amp;gt; Yes&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;Subset Sum, HC, N-Queens는 본질적으로 Decision Problem&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Knapsack, TSP는 본질적으로 Optimization Problem&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Optimization 버전으로 제시된 문제는 ==&amp;gt; NP-Hard category&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;[Definition]&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;A is NP-Hard&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;if for NP-Complete인 B에 대해서, B =&amp;gt;p A&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(A가 NP 문제일 것을 요하지 않는다)&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;HC-DP: 100개 도시를 1시간 내에 다 돌고 돌아올 수 있느냐? =&amp;gt; O(n)에 검증 가능 =&amp;gt; NP&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;TSP-DP: &amp;ldquo;비용이 k 이하인 해가 존재하는가? &amp;rdquo;해답(경로)을 주면 그 해답을 다항 시간 내에 검증 가능 =&amp;gt; NP&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;TSP-OP: 최소 경로가 주어졌을 때, 이 경로가 optimal이라는 것 검증 =&amp;gt; O(n!) 필요하다 =&amp;gt; NP에 속하지 않음!&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;Knapsack (default OP) =&amp;gt; NP-Hard&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; given sollution: O(2^n) verified required&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;u&gt;대응하는 결정 문제가 NP-Complete라면&lt;/u&gt;&lt;br /&gt;&lt;u&gt;그 최적화 문제는 적어도 NP-Hard임이 보장&lt;/u&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&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;[Approximation Algorithm: TSP]&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;: MST만든 다음에 pre-order 순회&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;MST: short edge 연결, no cycle&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;Approximation&amp;nbsp;design:&lt;br /&gt;1. determine a MST (using Prim's alg) : ranking (=&amp;gt; 가장 dominant한 것은 mst 만드는 것: O(n^2))&lt;br /&gt;2.&amp;nbsp;Create&amp;nbsp;a&amp;nbsp;path&amp;nbsp;around&amp;nbsp;the&amp;nbsp;MST&amp;nbsp;(using&amp;nbsp;preorder&amp;nbsp;visit)&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;Approximation analysis:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. Time complexity: poly.time O(n^2)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. Boundness (theorm, proof)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;: approximate sol &amp;lt; opt sol (관계성 보여주는 것)&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;Boundness: approxiate path (p) &amp;lt; 2*optimal path (p*)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;cost(MST.path) &amp;lt; cost(p*)&amp;nbsp;&lt;br /&gt;cost(Full&amp;nbsp;walk&amp;nbsp;on&amp;nbsp;MST)&amp;nbsp;=&amp;nbsp;2&amp;nbsp;*&amp;nbsp;cost(MST.path)&lt;br /&gt;-&amp;gt;&amp;nbsp;cost(Full&amp;nbsp;walk&amp;nbsp;on&amp;nbsp;MST)&amp;nbsp;&amp;lt;&amp;nbsp;2&amp;nbsp;*&amp;nbsp;cost(p*)&lt;br /&gt;cost(p)&amp;nbsp;&amp;lt;&amp;nbsp;cost(Full&amp;nbsp;walk&amp;nbsp;on&amp;nbsp;MST)&amp;nbsp;(by&amp;nbsp;triangular&amp;nbsp;inequality)&lt;br /&gt;-&amp;gt; cost(p) &amp;lt; 2 * cost(p*)&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;u&gt;(여기서 p*는 optimal이고, p는 mst를 preorder로 순회한 것)&lt;/u&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;&lt;b&gt;[Approximation: Bin Packing]&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;n items with sizes: s1, s2, ... sn (0 &amp;lt; si &amp;lt;= 1)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;--&amp;gt; find min # bins (unit-cap bins)&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;Bin Packing Problem은 NP-Hard 문제&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-end=&quot;567&quot; data-start=&quot;513&quot; data-ke-size=&quot;size16&quot;&gt;Subset Sum 문제를 Bin Packing 문제로 환원&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-end=&quot;567&quot; data-start=&quot;513&quot; data-ke-size=&quot;size16&quot;&gt;Subset Sum의 목표 합 t를 bin의 크기 1로 정규화(normalization)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;각각의 정수 aᵢ를 bin packing의 item으로 바꾸고, sᵢ = aᵢ / t 로 정규화&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;subset sum은 NP-Complete이고, 다항 시간 안에 bin packing 문제로 환원될 수 있지만&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;bin packing 문제가 NP가 아니기 때문에(Optimization), bin packing은 NP-Hard에 속한다&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;Example: n=8, item size= 0.85, 0.1, 0.5, 0.2, 0.4, 0.4, 0.3, 0.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;b&gt;Approximation design: NFF(Nonincreasing First-Fit)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. sort the items in nonincreasing order (greedy ranking)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. pack into as close bin as possible in First Fit manner&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;=&amp;gt; 이 방식으로 위의 예시를 풀면 4개가 필요하지만, Optimal은 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;Approximation analysis:&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. time complexity: T(n) = O(nlogn)&lt;/b&gt; : 이 알고리즘의 dominant part는 정렬하는 부분&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2. bound theorm (qaulity)&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;---&amp;gt; &lt;b&gt;approximate bin &amp;lt; optimal bin * 1.5 (theorm)&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;---&amp;gt; &lt;b&gt;&quot;any items placed by NFF in an extra bin has size &amp;lt;= 1/3&quot; (lemma)를 이용하여 위의 관계 증명 가능&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;&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 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;</description>
      <category>Algorithm</category>
      <author>vysryoo</author>
      <guid isPermaLink="true">https://vysryoo.tistory.com/134</guid>
      <comments>https://vysryoo.tistory.com/134#entry134comment</comments>
      <pubDate>Fri, 30 May 2025 15:53:58 +0900</pubDate>
    </item>
  </channel>
</rss>