<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>dev_bbie.log</title>
        <link>https://velog.io/</link>
        <description>필요한 개발공부</description>
        <lastBuildDate>Thu, 01 Dec 2022 14:37:09 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <copyright>Copyright (C) 2019. dev_bbie.log. All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dev_sun" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[[컴퓨터구조] 파이프라이닝]]></title>
            <link>https://velog.io/@dev_sun/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B4%EB%8B%9D</link>
            <guid>https://velog.io/@dev_sun/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%ED%8C%8C%EC%9D%B4%ED%94%84%EB%9D%BC%EC%9D%B4%EB%8B%9D</guid>
            <pubDate>Thu, 01 Dec 2022 14:37:09 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p><strong>pipelining?</strong>
: 명령어를 순차적으로 실행하는 프로세서에 적용하는 기술, 
한 번에 하나의 명령어만 실행하는 것이 아닌,
<strong>동시에 여러 개의 명령어를 처리하여 throughput을 늘리는 것</strong>.
<a href="https://it-eldorado.tistory.com/44">참고자료1</a>
<a href="https://splendidlolli.tistory.com/399">참고자료2</a></p>
</blockquote>
<h2 id="1-instruction-execution-steps">1. Instruction Execution Steps</h2>
<p>-&gt; <strong>RISC-V instructions classically take 5 steps</strong>
-&gt; 이 스탭을 : pipeline stage라 부름</p>
<p>1) IF : 메모리로 부터 명령어 인출
2) ID : rd,rs,opcode 등 명령어 해독 및 레지스터 파일 읽기
3) EX : 실행 및 주소 계산 
4) MEM : Access Memory 
5) WB : 레지스터에 쓰기</p>
<h2 id="2-파이프라인-동작-방식">2. 파이프라인 동작 방식</h2>
<p><img src="https://velog.velcdn.com/images/dev_sun/post/55648a44-f8ba-4dad-b872-6fa50252d454/image.png" alt=""></p>
<p>★ 각 stage마다 2가지의 경우 기억하자</p>
<ul>
<li>모든 stage가 balanced -&gt; 동일한 시간</li>
<li>각 stage 마다 unbalanced lengths ---&gt; Reduces speedup (왜? 가장 딜레이가 긴 단계에 맞춰서 클락주기 설계)</li>
</ul>
<p>★ 단계별로 존재하는 파이프라인 레지스터
: 특정 단계의 파이프라인 레지스터는 직전 단계의 CLC에서 계산되어 전달받은 값들 저장됨. 그 값들을 바탕으로 CLC가 다음 단계로 전달할 값들 계산함.</p>
<p>★ 단계를 늘리면, 
Overall latency increases -&gt; 단계별 레지스터를 계속 두니까~
<img src="https://velog.velcdn.com/images/dev_sun/post/c4565437-dbfa-48bb-bc13-6c522995a707/image.png" alt=""></p>
<h2 id="3-speedup">3. Speedup</h2>
<ul>
<li>increased throughput</li>
<li>don&#39;t help latency of single task
<img src="https://velog.velcdn.com/images/dev_sun/post/fa91893a-809c-4e37-8a56-9c88045a1c7e/image.png" alt=""></li>
</ul>
<p>① Rn = 전달받은 값을 레지스터에 저장하는 데 걸리는 시간</p>
<p>② Cn = 다음 단계로 전달할 값을 계산하는 데 걸리는 시간</p>
<p>③ 총 지연 시간 (Overall Latency) = ∑(Rn+Cn)</p>
<p>④ 클락의 주기 = T ≥ max(Rn+Cn) </p>
<p>⑤ 처리량 (Throughput) = 1/T</p>
<blockquote>
<p>이런 예제 연습해두자!!
If pipelining adds 0.2 ns to the machine clock cycle, calculate the amount of speedup in instruction execution from pipelining</p>
</blockquote>
<h2 id="4-성능이슈">4. 성능이슈</h2>
<h3 id="1-nonuniform-delays">1) Nonuniform Delays</h3>
<p>Throughput limited by slowest stage
<img src="https://velog.velcdn.com/images/dev_sun/post/ccc742f2-7d70-4288-9305-71dbef1503df/image.png" alt=""></p>
<h3 id="2-register-overhead">2) Register Overhead</h3>
<p>stage 개수를 늘릴수록, 한순간에 처리되는 명령어가 많아지고, 클럭 주기 짧아진다. 
but,
파이프라인 레지스터 개수가 증가하면서 latency(총 지연시간) 증가함. 하지만 얘가 주는 장점이 확실해서 현대 프로세서들 through very deep pipelining</p>
<h2 id="5-주요-이슈">5. 주요 이슈</h2>
<p>◆ instruction pipeline에서의 문제점</p>
<ul>
<li>각 segment의 수행시간이 다르다. execute 단계의 시간이 가장 오래 걸리기 때문에, clock 속도를 제일 오래 걸리는 segment인 execute에 맞추어 주어야 한다. </li>
</ul>
<ul>
<li><p>instruction에 따라서 일부 단계(특정 segment)는 스킵될 수 있다. </p>
<h3 id="1-structural-hazards">1) structural hazards</h3>
</li>
<li><p>프로세서 자원 부족해서 발생 </p>
</li>
<li><p>resource conflicts
: 메모리 access는 한 순간에 하나의 레지스터만 접근. 명령어를 병렬처리하는 도중에 두 개의 segment에서 메모리에 access라고 한다면 resource conflict가 발생한다. (아,,, 운영체제에서 얼핏 배웠다.. 하하)</p>
<h3 id="2-data-hazards">2) data hazards</h3>
</li>
<li><p>직전 명령어의 실행 결과에 해당하는 레지스터의 값을 현재 명령어에서 사용해야 할 때 발생</p>
</li>
<li><p>해결 방법 2가지</p>
<ul>
<li><strong>Forwarding</strong> : 직전 명령어의 실행 결과를 <strong>계산되는 즉시 현재 명령어에게 전달해주는 방식</strong></li>
<li><strong>Stalling</strong> : 직전 명령어의 <strong>실행 결과가 레지스터에 저장이 될 때까지 버블을 끼워</strong> 넣으며 기다리는 방식 </li>
</ul>
</li>
</ul>
<h3 id="3-control-hazards">3) control hazards</h3>
<ul>
<li>문제는 Fetch 단계에서 다음에 실행할 명령어의 주소를 정확히 알 수 없는 경우-&gt; *<em>ex) branch, jump.. *</em></li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_sun/post/43dc5894-7204-42bd-bd02-84140cd594fa/image.png" alt=""></p>
<blockquote>
<p>결론, 4과,,, 교재 예제를 풀어보든,,, ppt 예제라도 이해하자</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[링킹(Linking)]]></title>
            <link>https://velog.io/@dev_sun/%EB%A7%81%ED%82%B9Linking</link>
            <guid>https://velog.io/@dev_sun/%EB%A7%81%ED%82%B9Linking</guid>
            <pubDate>Thu, 17 Nov 2022 09:26:17 GMT</pubDate>
            <description><![CDATA[<h2 id="1-linking-과-linker">1. Linking 과 Linker</h2>
<blockquote>
<p><strong>Linking</strong> is performed automatically by programs called <strong>linker</strong></p>
</blockquote>
<h3 id="1-프로그램-빌드-컴파일-과정">1) 프로그램 빌드 (컴파일 과정)</h3>
<p>의미를 완전히 구분 짓기도 하지만, 거의 같은 의미긴 하다. </p>
<ul>
<li>빌드 : 하나의 실행가능한 파일을 만든느 것</li>
<li>컴파일 : 링커 이전까지의 과정</li>
</ul>
<p>큰 의미의 컴파일 과정으로 싹다, &quot;Compiliing + Linking&quot; 이 전 구간을 말하기도 한다. </p>
<p><img src="https://velog.velcdn.com/images/dev_sun/post/f2847ed2-e4f3-4387-a06b-6c87ea110b42/image.png" alt=""></p>
<h4 id="-seperately-compiled-relocatable-object-files">* Seperately compiled relocatable object files</h4>
<p>1) 컴파일러는 Highl level 언어로 작성한 소스 파일을 
컴퓨터가 이해할 수 있는 Low level언어, 이진수 파일로 변환해준다. 
이 파일이 바로 object file이다!!</p>
<p>2) 이 object file은 기계어로 작성된 로직과 실행하는데 필요한 정보들(디버깅 or Symbol정보) 들로 이루어짐.</p>
<h4 id="-fully-linked-executable-object-file">* Fully linked executable object file</h4>
<p>3) 그 다음이, <strong>링킹(linking)</strong>이다. 여러개의 재배치 가능한 object file들을 모아서 하나의 실행가능한 파일로 만들어지는 과정이다. </p>
<p>4) 이 object file들은 자신만의 code섹션과 data 섹션을 가진다 </p>
<h3 id="2-링커linker가-하는-일">2) 링커(Linker)가 하는 일</h3>
<ul>
<li><p>간단하게 
1) object file을 하나로 합치기
2) 여기에 Library까지 합쳐서</p>
</li>
<li><blockquote>
<p>하나의 실행파일 만들기</p>
</blockquote>
</li>
<li><p>좀 더 깊게</p>
<h4 id="step1-symbol-resolution">Step1. Symbol Resolution</h4>
<p>: object 파일에 있는 각각의 Symbol Reference를 정확히 하나의 Symbol Definition에 연결하는 작업. 여기서 Symbol은 함수, 전역변수, static 변수 등을 의미한다. 
<img src="https://velog.velcdn.com/images/dev_sun/post/56879ae3-5007-4a7c-b03a-b42e9b3bd51e/image.png" alt=""></p>
</li>
</ul>
<h4 id="step-2-relocation">Step 2. Relocation</h4>
<p>컴파일러와 어셈블러는 기본적으로 0번지에서 시작하는 코드 섹션과 데이터 섹션을 만들어 낸다. 링커는 이러한 섹션들을 적절한 가상 주소로 재배치하고, 이에 따라 각 심볼 정의에도 알맞은 가상 주소를 부여한다.</p>
<h2 id="2-object-files">2. Object Files</h2>
<h3 id="1-오브젝트-파일-3가지-유형">1) 오브젝트 파일 3가지 유형</h3>
<p>1) Relocatable object file
: 컴파일의 output</p>
<p>2) Execuatable object file
: 링커의 output 
(즉, 실행파일이라 부름, 코드와 데이터가 메모리에 로드되어 실행될 수 있음)</p>
<p>3) Shared object file
: road time이나 run time에 동적으로 메모리에 로드되어 링킹 됨.
(Dynamic Linker Libraries(DLL)이 대표적)</p>
<h3 id="2-elfexecutable-and-linkable-format">2) ELF(Executable and Linkable Format)</h3>
<p>각 오브젝트 파일은 특정 오브젝트 파일 포맷을 가진다.
오브젝트 파일 포맷은 컴파일러와 어세블러가 만들어내는 정보를 relocatable object file 안에 어떤 구조로 담을지 결정한다(시스템ㅁ다 각기 다름)
-&gt; 내가 배우고 있는건! ELF라는 오프젝트 파일 포맷 기준으로 설명!(아래 그림)</p>
<p><img src="https://velog.velcdn.com/images/dev_sun/post/0d692122-ad2a-473d-a026-e38ff3f5e55c/image.png" alt="">
<a href="https://it-eldorado.tistory.com/49">그림, 글 참고(자세히)</a></p>
<h4 id="왜-초기화된-초기화되지-않은-전역변수를-구분해서-배치할까">왜 초기화된, 초기화되지 않은 전역변수를 구분해서 배치할까?</h4>
<ul>
<li><p>data section : Initialized global variables</p>
</li>
<li><p>bss section : Unitialized global variables
bss는 오브젝트 파일에서 전혀 공간을 차지하지 않고, 실행파일에서도 이곳에 저장될 데이터의 총 사이즈 &quot;정보&quot;를 저장할 만큼의 공간만 차지한다.
즉, 프로그램이 실행될때 이 정보를 바탕으로 bss 섹션을 메모리에 할당하는 것!!</p>
</li>
</ul>
<p>결국엔, <strong>&quot;Better Save Space&quot;</strong>를 위해서다. </p>
<blockquote>
<p>아 그리고, 이건 그냥 내가 정리</p>
</blockquote>
<ul>
<li>초기화된 전역변수, static 변수는 data 섹션에 저장됨.</li>
<li>non-static local 변수는 스택 영역에서 저장 관리..</li>
<li>static local 변수는 스택을 통해서 제공되는게 아니라, data 섹션에 들어감. 프로그램 끝날때까지 메모리에 상주할 수 있음.</li>
</ul>
<h2 id="3-symbols-and-symbol-tables">3. Symbols and Symbol Tables</h2>
<h3 id="-linker-symbols-3가지-종류">* Linker Symbols 3가지 종류</h3>
<blockquote>
<p>symbol : reference to a <strong>variable</strong> or to a <strong>function</strong>
Linker symbol은 program 변수랑은 다른 개념임!</p>
</blockquote>
<p>1) global symbols
: non-static 함수 또는 전역변수 등
2) external symbols
3) local symbols
: static 함수 또는 전역/지역 변수</p>
<ul>
<li>local static variable은 스택에의 관리 되는게 아님 -&gt; .data나 .bss에 저장(초기화 여부에 따라결정)</li>
<li>local non-static varible은 스택에 저장</li>
</ul>
<blockquote>
<p>여기까지 달려온 이유는!!!! 결국 주어진 코드 보고 각 symbol의 symbol entry 존재 여부, symbol type, section등을 구분 지을 수 있느냐이다..(symbol table)
<a href="https://it-eldorado.tistory.com/49">심볼 종류.. 설명 자세히</a></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/dev_sun/post/a213d919-d575-4dc8-afa9-87369c4e994c/image.png" alt=""></p>
<ul>
<li>symbol table in swap.o 예시(ppt 29참고)</li>
<li><a href="-https://www.chegg.com/homework-help/questions-and-answers/problem-concerns--o-module-figure-75-following-version-swap-c-function-counts-number-times-q19545092">추가로 풀어볼만한 예제 하나</a></li>
<li><a href="https://www.slideserve.com/octavius-buchanan/linking">참고할만한 추가 ppt 여기에도 예시 하나 </a></li>
</ul>
<p>일단, 여기까지 추가로 더 배우는 개념은 나중에.. ㅎ</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2.2(2) RISC-V ISA]]></title>
            <link>https://velog.io/@dev_sun/2.22-RISC-V-ISA-1</link>
            <guid>https://velog.io/@dev_sun/2.22-RISC-V-ISA-1</guid>
            <pubDate>Wed, 19 Oct 2022 17:43:24 GMT</pubDate>
            <description><![CDATA[<h2 id="6-basic-types-of-instructions">6 basic types of instructions</h2>
<p>명령어 구성도 아주.. 다채롭게 하신다.</p>
<p><img src="https://velog.velcdn.com/images/dev_sun/post/2e1920c5-9957-4d68-a78a-96eb340af912/image.png" alt=""></p>
<hr>
<p>[아래 3가지 ★을 이해하기 위한 정리이다]</p>
<p><strong>* 레지스터 값에는 주소값이 있을수도, 상수가 있을 수도!</strong></p>
<p>★ add x30, x30, x10 //(<strong>R</strong>) x30에 x30에 저장된 값 + x10에 저장된 값
★ ld x30, 0(x30) //<strong>(R)</strong> x30이 가리키는 Mem[base+0]에 x30의 값을 로드
★ sd x30, 0(x31) //<strong>(S)</strong> x31이 가리키는 Mem[base+0]에 x30에 있는 값을 저장</p>
<hr>
<h1 id="1-r-type-alu">1. R-type (ALU)</h1>
<ul>
<li>3개 operands (2 src + 1 rd)</li>
<li>sub a, b, c (b에서 c를 뺀 값을 -&gt; a로)</li>
<li>sll rd, rs1, rs2 (rs1의 값을 rs2에 있는 값만큼 왼쪽으로 shift시키겠다 = n칸 이동(X2^n같은뜻)) -&gt; 산술, 논리 </li>
<li>srl vs sra 비교 (/2^n같은뜻)
(sra경우는 산술! MSB 값이 shift시 그래도 이동
(산술 경우엔 shift후 싹다 0으로 채워~ 즉, srl의 경우엔 /2^n이 안통할수도-&gt; 특히 음수에서)</li>
<li>slt x1, x5, x3 (x5에 있는 값 &lt; x3에 있는 값이면,, x1에 true인 1값을 넣어!)</li>
</ul>
<blockquote>
<p>** [ALU]**
<strong>* 산술(add, sub) logic(and, or, xor), slt, shift(sll, srl, sra)</strong></p>
<ul>
<li>GPR[rd] &lt;- GPR[rs1] + GPR[rs2]</li>
<li>PC &lt;- PC + 4 (32bit -&gt; 즉 4byte씩 증가)</li>
</ul>
</blockquote>
<ul>
<li>명령어,,, 16진수로 나타내는 법(ppt 27) : 아.. 이거.. 그림을 외워야 할거 같다... -&gt; 교수님이 opcode를 제시해준다는게 뭔말인지 이제 이해했다</li>
<li><blockquote>
<p>이거 따로 손으로 해보자</p>
</blockquote>
```
[ 해야할 것 ]</li>
<li>ALU 명령어 16진수로 표현(R-type 명령어) 직접 손으로 해보기</li>
<li>shift 명령어 결과값 구하기 연습 </li>
<li>compare(slt) 얘도!
```<h2 id="constant-or-immediate-operands">Constant or Immediate Operands</h2>
</li>
<li>자주 사용되는 상수는 직접 연산이 낫다!!</li>
<li>Immediate 값이라,,, 자 그럼 얘가 메모리에 담기는 영역은?? -&gt; I-Type으로 ㄱㄱ</li>
</ul>
<h1 id="2-i-type-alu-load">2. I-type (ALU, Load)</h1>
<blockquote>
</blockquote>
<p><strong>[ALU]</strong>
<strong>* addi, <del>subi</del>, slti, andi, ori, xori, slli, srli, srai</strong>
GPR[rd] &lt;- GPR[rs1] + sign-extend(imm)
PC &lt;- PC+4</p>
<p><img src="https://velog.velcdn.com/images/dev_sun/post/4ff4ae7e-2f91-4d2a-9439-a31c8ee3d820/image.png" alt="">
그림에서 보면, (R-type비교시) func7+rs2 =&gt; imm(12bit)</p>
<pre><code>[반드시 나올것]
- C &lt;-&gt; 어셈블리어 로... 바꾸는 연습(p44,45) 
</code></pre><p>RISC-V code 공부할때 유용한 사이트
<a href="https://www.cs.cornell.edu/courses/cs3410/2019sp/riscv/interpreter/#">https://www.cs.cornell.edu/courses/cs3410/2019sp/riscv/interpreter/#</a></p>
<h2 id="memory-operand-load">Memory Operand (Load)</h2>
<blockquote>
<h3 id="ld--메모리---레지스터">ld : 메모리 -&gt; 레지스터</h3>
<p>-- 예시
<strong>ld x2, 16(x3)</strong>
offset = 16
메모리의 시작주소가 x3에 저장되어 있다.
기준 주소 + offset 의 위치의 값을 가져온다</p>
</blockquote>
<p>아직,, I-Type 하고 있다...핳..</p>
<blockquote>
<p>** [Load]**
<strong>*ld, lw, lwu, lh, lhu, lb, lbu</strong>
GPR[rd] &lt;- Mem[bye_address]
PC &lt;- PC+4
//byte_address는 offset(12bit) + GPR[base] </p>
</blockquote>
<pre><code>ppt 51 참고해서
예시) lw x14, 8(x2) -&gt; I-Type으로 나타내는거 해보기!
</code></pre><h1 id="3-s-type-store">3. S-type (Store)</h1>
<p>*
sw x14, 8(x12)
얘는
sw rs2, imm(rs1)
즉,, destination register(rd)가 없다.
명령어 구조가 ,, 그래서 7bit(imm) + 5bit(imm) = 12bit(얘로 상대주소), R-type이랑 비슷하게 생겼는데 암튼,,, 그 rd 자리에 5bit이 들어간다.(뭔말인가 하면,, 그림을 보면됨)</p>
<blockquote>
<p><strong>[Store]</strong>
<strong>* sd, sw, sh, sb</strong>
Mem[byte_address] &lt;- GPR[rs2]
PC &lt;- PC+4</p>
</blockquote>
<pre><code>ppt p54 참고해서
예시) sw x14, 8(x2) -&gt; S-Type 으로 나타내는 거 해보기!
p55~58 예제 -&gt; 직접 해보기 
- SWAP : C -&gt; 어셈블리어 (이 과정 잘 이해해야한다!)
간단히 이해.(swap시)
레지스터에 메모리값 2개 로드 -&gt; ld 2개
swap하고자 하는 변수가 들어있는 메모리에 레지스터값에 로드된 값 저장-&gt; sd 2개


</code></pre><p>★ SWAP 과정이해하기
<img src="https://velog.velcdn.com/images/dev_sun/post/66ceb886-56ab-423b-a6b4-055593387b67/image.png" alt=""></p>
<h1 id="4-sb-type-branch">4. SB-type (Branch)</h1>
<p>*
beq rs1, rs2, Label (rs1이랑 rs2에 들어간 값 equal이면 Label(target)으로 가라</p>
<ul>
<li>PC(Program Counter)값을 변경해준다.</li>
</ul>
<blockquote>
<p>★ Immplication of Immediate filed size</p>
</blockquote>
<ul>
<li>Conditional branch : 13bits</li>
<li>Unconditional branch : 21bits</li>
</ul>
<blockquote>
<p>★ New PC &lt;- register + branch offset</p>
</blockquote>
<p>*** Label은 determined by imm(13) **</p>
<blockquote>
<p>★PC-relative addressing </p>
<ul>
<li>label로  안 가 -&gt; PC=PC+4(그냥 다음 instruction실행)</li>
<li>label로 가 -&gt; PC = PC + (immediate*4) </li>
</ul>
</blockquote>
<blockquote>
<p><strong>[Branch]</strong>
<strong>* beq, bne, blt, bge, bltu, bgeu</strong>
• Target = PC + sign-extended (imm13)
• If GPR(rs1) = GPR (rs2) then PC &lt;- target
else PC &lt;- PC+4</p>
</blockquote>
<pre><code>* Can specify ± 2^11 addresses from the PC by 12-bit wide immediate field
* Immediate is # of instructions to move either forward (+) or backwards (–)
* Instructions are “word-aligned” (32-bit wide):
* Address is always a multiple of 4 (in bytes)</code></pre><p><strong>Let immediate specify #words instead of #bytes</strong>
Instead of specifying ± 2^11 bytes from the PC, we will now specify ± 2^11 words =** ± 2^13 byte addresses around PC**</p>
<ul>
<li>imm[0] 항상 0이다 -&gt; encoded 되지 않음</li>
<li>immediate filed = 13bits<pre><code>p78~82 예제 직접 해보기!</code></pre><img src="https://velog.velcdn.com/images/dev_sun/post/b094046d-0d4c-45f3-84cd-487f2a56aa36/image.png" alt="">
참말이지... 이거... 나는 어셈블리어로 바꾸고 나발이고 익숙하질 않다.. 걍 눈에 담자... ㅇ ㅏ 그렇 구 ㄴ ㅏ ~~</li>
</ul>
<h1 id="5-u-type-lui">5. U-type (LUI)</h1>
<ul>
<li>I-type은 imm값 12bit만 제공</li>
<li>더 큰 수로 하고 싶어! </li>
<li>how do we deal with 32-bit immediate<blockquote>
<p><strong>lui</strong> x10, 0x87654
//얘가.... <strong>0x87654000(32bit내에서 앞쪽으로 위치하게 해둠</strong>(더 큰값을 만들기위한??)
addi x10, x10, 0x321 
//얘는,,, 원래 알다시피 0x00000321이렇게
그럼 x10에 들어있는 값은 =&gt; 0x87654321 
(아니 진심 이걸 어따 써먹음?하..)</p>
<ul>
<li>근데 주의해야할 것! (sign-extended 되면서... 막 숫자 겹쳐가지고 저렇게 이쁘게 제대로 안더해질때 있음  -&gt; assembler가 알아서 해준대...(lui x10, 여기겹치는 값을 하나 더 더해주고 시작하나봄)</li>
</ul>
</blockquote>
</li>
</ul>
<h1 id="6-uj-type-jump--link">6. UJ-type (Jump &amp; Link)</h1>
<p>★ 왜 Link냐?
:기존에 돌고 있던 함수에서 Jump하면서 다시 그 함수 위치를 &quot;레지스터&quot;에 저장 하겠다.
-&gt; 앞에서 배운 x1레지스터에는 항상 return address를 담아두는 곳으로 약속해놓음</p>
<ul>
<li>PC(Program Counter)값을 변경해준다.</li>
</ul>
<blockquote>
<ul>
<li><strong>jal</strong> rd, imm21 (imm[0], implicitly)</li>
</ul>
</blockquote>
<blockquote>
<p>[Jump &amp; Link]</p>
</blockquote>
<ul>
<li><p>Target = PC+imm(21bit)</p>
</li>
<li><p>GPR(rd) &lt;- PC+4(return address) , PC &lt;- Target</p>
<p>//////참고로... I-type으로 jalr rd, rs1(base), imm(12) </p>
</li>
</ul>
<p>rd에는 PC+4를 저장하고,  PC=rs+imm(12)로 이동해라</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2.2 RISC-V Intro...]]></title>
            <link>https://velog.io/@dev_sun/2.2-RISC-V-Intro</link>
            <guid>https://velog.io/@dev_sun/2.2-RISC-V-Intro</guid>
            <pubDate>Wed, 19 Oct 2022 16:25:43 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>*<em>RISC-V란, The Free and Open RISC Instruction Set Architecture *</em>- 나무위키
RISC-V 를 중점으로 컴퓨터구조를 한번 살펴봅시당!</p>
</blockquote>
<h2 id="risc-v-특징">RISC-V 특징</h2>
<ul>
<li>32개의 64-bit (2 WORD) register를 가지고 있다.</li>
<li>32 General Purpose Registers</li>
<li>Register Size =** 64bit**</li>
<li>메모리랑 직접 연산 X</li>
<li>Instruction Size = <strong>32bit</strong> (기계어를 바꾸지 않겠다! 는 의지..)</li>
</ul>
<h2 id="register">Register</h2>
<ul>
<li><p><strong>33개의 레지스터</strong> : general purpose register(GPR) 32개 + special register인 PC 1개 </p>
</li>
<li><p>0번 register는 항상 0으로 고정돼있다. (0이라는 상수를 만드는 데에 비효율적인 과정 필요)</p>
</li>
<li><p>Load-store architecture이다 -&gt; register를 적극 활용해서 빠른 연산을 수행</p>
<blockquote>
<p>Load-store architecture 란, 모든 연산을 최대한 register에서 해결하는 아키텍처</p>
</blockquote>
</li>
<li><p>레지스터 직접 지정 가능하지만, 몇개의 레지스터들은 이미 규약으로 정해져있음
<img src="https://velog.velcdn.com/images/dev_sun/post/e2989a44-cb19-42fe-b9f5-80d5d35bf193/image.png" alt=""></p>
</li>
</ul>
<h2 id="operation">Operation</h2>
<ul>
<li>ALU</li>
<li>Data transfer</li>
<li>Control (or Branch)</li>
</ul>
<p>바로 전 블로그에서 이미 공부한 내용!!</p>
<h3 id="부록--2의-보수">[부록] : 2의 보수</h3>
<blockquote>
<p>모든 0과 1을 뒤집고, 1을 더해서 구한다.
(Negate all bits and add 1)
<a href="https://life-with-coding.tistory.com/m/298">혹시 모르면 여기 참고</a></p>
</blockquote>
<p>왜 알아야 하냐... 나중에 shift 명령어 이런거 할라면, 2의 보수를 알아야 이해함</p>
<p>음수를 어떻게 표현하냐? 2의 보수를 이용해 표현 </p>
<h3 id="추가--16진수---2진수-2진수---16진수">[추가] : 16진수 -&gt; 2진수, 2진수 -&gt; 16진수</h3>
<p>이거 기본이다!</p>
<ul>
<li>2진수로 변환 : 16진수 1글자 -&gt; 4bit 간주 </li>
<li>16진수로 변환 : 2진수를 4개씩 끊어서</li>
</ul>
<p><a href="https://ko.wikihow.com/16%EC%A7%84%EC%88%98%EB%A5%BC-2%EC%A7%84%EC%88%98%EC%99%80-10%EC%A7%84%EC%88%98%EB%A1%9C-%EB%B3%80%ED%99%98%ED%95%98%EB%8A%94-%EB%B2%95">2진수로</a></p>
<p><a href="https://ko.wikihow.com/2%EC%A7%84%EC%88%98%EB%A5%BC-16%EC%A7%84%EC%88%98%EB%A1%9C-%EB%B0%94%EA%BE%B8%EB%8A%94-%EB%B2%95">16진수로</a>
아래 표 외워야 한다 
1~9 까지 + 그냥 A부터 10 이구나!! F는 15구나!! 기준</p>
<p><img src="https://velog.velcdn.com/images/dev_sun/post/bb6d6de8-563f-4bcf-ac09-d7dba82ecb1a/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2.1(2) 명령어의 구조]]></title>
            <link>https://velog.io/@dev_sun/2.1-ISA</link>
            <guid>https://velog.io/@dev_sun/2.1-ISA</guid>
            <pubDate>Wed, 19 Oct 2022 15:36:08 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>CPU의 언어, 
CPU가 이해할 수 있는 명령어들의 모음,</p>
</blockquote>
<h3 id="isainstruction-set-architecture">ISA(Instruction Set Architecture)</h3>
<p>ISA가 다르다 -&gt; 각 CPU마다 쓰이는 명령어가 다르다 -&gt; 어셈블리어도 다르다
<strong><em>&quot;아! 같은 소스코드로 만들어진 프로그램이라 할지라도 ISA가 다르면 명령어도, 어셈블리어도 달라지는구나!&quot;</em></strong></p>
<ul>
<li>CPU별 명령어들이 다르다
: 가장 대표적인 CPU 아키텍쳐인 x86, ARM, MIPS, RISC-V
(학교에선 RISC-V 구조만 오지게 판다...)</li>
<li>RISC-V Instruction Set은 다른 CPU들(x86, ARM, MIPS)에 비해서 효율적으로 설계되어 있다
<img src="https://velog.velcdn.com/images/dev_sun/post/81a42078-b171-40b6-8273-4d7927209d6e/image.png" alt=""></li>
<li>opcode의 위치 :  RISC-V는 최하위 비트에 배치됨 (MIPS는 최상위 비트에 배치) </li>
<li><blockquote>
<p>장점은? 
: *<em>operand의 가변성과 호환성이 좋아짐. *</em>
(명령어 크기가 32비트에서 64비트, 128비트.. 증가해도 opcode의 위치는 변함이 없어서 Instruction Set 설계의 일관성을 유지)</p>
</blockquote>
</li>
</ul>
<blockquote>
<p>RISC-V 의 ISA를 이해하기 위해서는 다음과 같은 개념들이 워밍업?!이 되시겠다.. </p>
</blockquote>
<h3 id="instruction-set을-design-할-때-고려할-사항">Instruction set을 design 할 때 고려할 사항</h3>
<ul>
<li><p>Operands를 어디에 저장할 것인가? - register, memory, stack, acc …</p>
</li>
<li><p>Operands 몇 개까지 허용할 것인가? - 0, 1, 2 or 3</p>
</li>
<li><p>Operands의 위치를 어떻게 나타낼 것인가? - Direct, Immediate, Indirect …</p>
</li>
<li><p>Operands의 종류와 크기를 어디까지 지원할 것인가? - byte, int, float, double …</p>
</li>
<li><p>어떤 operation을 지원할 것인가? - add, sub, mul, div, mov, comp …
<a href="https://velog.io/@embeddedjune/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-%EC%9A%94%EC%95%BD-%EC%A0%95%EB%A6%AC-4.-Instruction-Set-Architecture-ISA-1">참고블로그</a></p>
<h1 id="isa-classification">ISA Classification</h1>
<h2 id="1-storing-operand">(1) Storing Operand</h2>
</li>
<li><p>Stack Architecture </p>
</li>
<li><p>Accumulator Architecture</p>
</li>
<li><p><strong>General-purpose register architecture</strong>
: only *<em>explict operands either registers or memory *</em></p>
<ul>
<li>CPU 내부에 여러개의 register 를 둬서 저장공간 확보하겠다. </li>
<li>요즘은 전부 이거 사용</li>
<li>줄여서** GPR**
add A, B
add A, B, C
load <strong>Ra</strong> Rb (Ra &lt;- mem[Rb]) //레지스터에 저장! Ra는 rd
store Ra <strong>Rb</strong> (mem[Rb] &lt;- Ra) //메모리에 저장! Ra는 src</li>
</ul>
</li>
<li><p>Memory-Memory Architectures
<img src="https://velog.velcdn.com/images/dev_sun/post/29780fe8-a03a-4403-94f2-4d6c79547722/image.png" alt=""></p>
<p> <img src="https://velog.velcdn.com/images/dev_sun/post/c4beb2ed-3c9a-4495-887a-84668a303154/image.png" alt=""></p>
</li>
</ul>
<hr>
<p>#of Registers -&gt; ARM, MIPS 등 각 다른 종류의 CPU들마다 두는 레지스터들의 개수가 다르네.. 16,8,32...(ppt27 이미지)</p>
<hr>
<h2 id="2--of-operhands">(2) # of Operhands</h2>
<ul>
<li><p>ALU : 실제 연산을 담당, 논리연산과 산술연산이 있음
  -&gt;** 2 or 3 operands**</p>
</li>
<li><p>명령어 구조 = 연산 코드 + operands
여기서 operands 에는 주소, 수, 아스키코드, bit이나 flag같은 논리데이터가 저장될 수 있다. 이때, Operands가 주소를 나타내는 경우</p>
</li>
<li><blockquote>
<p>*<em>operand의 개수에 따라 3,2,1,0 주소방식이 있다. *</em>
<img src="https://velog.velcdn.com/images/dev_sun/post/d39c65f4-c2f3-4c09-8ce6-f8710e6a84cc/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<h2 id="3-addressing-mode">(3) Addressing Mode</h2>
<h4 id="unit-of-data">Unit of Data</h4>
<p><strong>&quot;1byte = 8bit&quot;</strong>
1kB = 1000byte
1MB = 1000kB
1GB = 1000MB
1TB - 1000GB</p>
<blockquote>
<p>&quot;KB&quot; 는 2^10byte일까? 10^3byte 일까? 
여기서 혼동하지 말아야할것이 1024씩 묶어서 표현되는 단위는 KiB, MiB, GiB, TiB 으로 해야한다 </p>
</blockquote>
<p><strong>&quot;Word&quot;</strong>
-프로세서가 한번에 처리할 수 있는 데이터의 크기
-The <strong>size of register</strong> in a processor(워드 크기 = 레지스터 크기)
-The <strong>largest possibe address size</strong> 
-대부분 32bit 또는 64bit (근데 난 음.. 4byte(32bit)로 주로 봄,,, 컴망에서도 그렇고,,)</p>
<p><strong>Byte Order (Endianness)</strong>
Little Endian 알아두자 : 큰 byte 일수록 큰 주소
&quot;Little end goes first&quot;
-&gt; Intel, ARM, RISC-V</p>
<p><strong>Type of Addressing Mode</strong>
<a href="https://skagh.tistory.com/8">여기에 그림이랑 설명잘되어있음 </a>
여러가지 있지만, 중요한 것만 정리(ppt 40 이미지 꼭 보기)</p>
<ul>
<li><p>Register direct addressing mode </p>
</li>
<li><p>Immediate addresssing mode : 오퍼랜드에 필드에 연산에 사용할 데이터를 직접!</p>
</li>
<li><p>Displacement addressing mode</p>
</li>
<li><p>Register indirect addressing mode</p>
</li>
</ul>
<h2 id="4-type--size-of-operhands">(4) Type &amp; Size of Operhands</h2>
<p><strong>Common operand types: (imply their sizes)</strong>
• Character (8 bits or 1 byte)Characters are almost always in ASCII
• Half word (16 bits or 2 bytes)
• Word (32 bits or 4 bytes)
• Double word (64 bits or 8 bytes)
• Single precision floating point (4 bytes or 1 word)
• Double precision floating point (8 bytes or 2 words)</p>
<h2 id="5-type-of-operations">(5) Type of Operations</h2>
<h3 id="1-data-transfer">1) Data transfer</h3>
<p>: 데이터를 source에서 destination으로 옮기거나 복사</p>
<p>Load : 레지스터에 가져와
Store : 메모리에 저장
Move</p>
<h3 id="2-arithmetic-and-logic-alu">2) Arithmetic and Logic (ALU)</h3>
<p>: Operands 사이에서 <strong>특정 연산을 수행</strong>하고 destination에 저장</p>
<p>ADD
SUB
Shift
등등</p>
<h3 id="3-branch-or-control-flow">3) Branch (or Control flow)</h3>
<p>: 순차적인 흐름에서 벗어나서 다른 곳으로 분기할 때 사용다.</p>
<p>BEQ
…</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[2.1 ISA (Instruction Set Architecture)]]></title>
            <link>https://velog.io/@dev_sun/2.1-ISA-Instruction-Set-Architecture</link>
            <guid>https://velog.io/@dev_sun/2.1-ISA-Instruction-Set-Architecture</guid>
            <pubDate>Wed, 12 Oct 2022 12:22:49 GMT</pubDate>
            <description><![CDATA[<p>ppt를 봐도 잘 뭔 소린가 싶어서 이 블로그 참고
-&gt; <a href="https://it-eldorado.tistory.com/21">참고1</a> , <a href="https://inyongs.tistory.com/108">참고2</a> , <a href="https://melonicedlatte.com/computerarchitecture/2019/01/30/192433.html">참고3</a>, <a href="https://it-eldorado.tistory.com/33">참고3</a></p>
<h2 id="1-isa">1. ISA</h2>
<p>Instruction set architecture 의 약자, 명령어 집합 구조</p>
<blockquote>
<p>소프트웨어(프로그램)와 하드웨어(CPU) 사이의 인터페이스
-&gt; Software 에서 Hardware 로 넘어가는 단계에서 중재자 역할을 해줌
<img src="https://velog.velcdn.com/images/dev_sun/post/a1c4ea68-299c-4791-b1c9-5aad1117d63b/image.png" alt=""></p>
</blockquote>
<ul>
<li><p>작성된 프로그램이 <strong>ISA의 규칙에 맞게 적절히 기계어로 번역</strong>이 되면 그것을 CPU가 읽고 해석해서 지시된 동작을 수행</p>
<pre><code>개발자들은 보통 high-level language로 코드를 짜면,
컴파일러(high-level language → assembly language)와 어셈블러(assembly language → machine language)를 거쳐 low-level lanaguage로 번역되어야 한다. 
이렇게 low-level language로 번역된 후에는 hw에게 명령을 내려줘야 하는데, 이 때 sw와 hw 사이를 연결해주는 것이 ISA이다.</code></pre></li>
</ul>
<ul>
<li><p>ISA는 소프트웨어와 하드웨어가 서로 통신할 수 있게 해주는 &quot;명령어들의 집합&quot;</p>
</li>
<li><p><strong>하나의 CPU는 반드시 하나의 ISA를 사용</strong> </p>
</li>
<li><p>프로그램이 동작 시 -&gt; <strong>컴파일러나 어셈블러도</strong> 해당 CPU가 사용하는 ISA에 맞춰 설계</p>
</li>
<li><p>ISA는 최하위 레벨의 프로그래밍 인터페이스로, 프로세서가 실행할 수 있는 모든 명령어들을 포함
<img src="https://velog.velcdn.com/images/dev_sun/post/e3d254d6-2376-44ea-a948-ba4f5f449e8d/image.png" alt=""></p>
</li>
</ul>
<h2 id="2-microarchitecture">2. Microarchitecture</h2>
<blockquote>
</blockquote>
<p>ISA를 구현하는 방법을 Microarchitecture라고 한다.
-&gt; 컴퓨터 아키텍쳐랑 구분하셈</p>
<p><img src="https://velog.velcdn.com/images/dev_sun/post/4a8f51ba-d77a-40bd-a757-0ab1b692b953/image.png" alt=""></p>
<p>ISA 아래에 있는 micro architecture는 micro processor가 사용하는 명령어 처리 방식이다. micro processor는 우리가 아는 CPU라고 생각하면 된다.(과거와 비교했을 때 상대적으로 사이즈가 작아져서 micro가 붙었다고 한다.) 따라서 micro architecture 역시 <strong>CPU architecture</strong>의 맥락으로 이해하면 된다.</p>
<blockquote>
<p>CPU architecture의 종류로는 CISC와 RISC가 있다.</p>
</blockquote>
<h2 id="3-isa-더-자세히">3. ISA 더 자세히</h2>
<h3 id="1-isa-as-an-adt">1) ISA as an ADT</h3>
<blockquote>
<p><strong>ADT, 즉 추상 자료형</strong>이란 자료와 그 자료를 이용한 연산들의 집합을 의미한다. 
스택을 예로 들면, </p>
</blockquote>
<ul>
<li><p>자료 : 스택의 원소</p>
</li>
<li><p>연산 : push()와 pop()등의 연산은 자료를 이용한 연산들에 해당함.</p>
<p>ISA는 하나의 추상 자료형으로 바라볼 수도 있다. 
아래 그림은 ISA를 ADT로 나타낸 것이다. </p>
</li>
</ul>
<ul>
<li>자료란 Registers &amp; Memory 를 의미</li>
<li>연산이란 Instruction을 의미한다. Instruction이 수행되고 나면 레지스터의 값과 메모리 상태가 변하는 것을 떠올리면 이해가 수월할 거 같다.</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dev_sun/post/952503e8-6c33-497c-b64f-d4976a718e42/image.png" alt=""></p>
<p>교재에는 없는 ppt(p8 ~ 12) 해당 ISA가 정의하는 연산(명령어)에 의해 <strong>상태(레지스터, 메모리)가 변화</strong>하는 그림이 있는데... 이건 음 직접 다 지워보고 한번 이해해보기~~!</p>
<h3 id="2-risc-와-cisc">2) RISC 와 CISC</h3>
<p><a href="https://velog.io/@kjw2298/CISC-RISC-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EC%B0%A8%EC%9D%B4">개념설명 잘되어있음</a>
<a href="https://velog.io/@kjw2298/CISC-RISC-%EA%B0%9C%EB%85%90-%EB%B0%8F-%EC%B0%A8%EC%9D%B4">장단점 잘써있음</a></p>
<p>CPU(중앙처리장치) 를 설계하는 방식이다.
CPU가 작동하려면 프로그램이 있어야 하고 명령어를 주입해서 설계를 한다.</p>
<p>-명령어가 H/W 적인 방식을 RISC라고 한다.
-명령어가 S/W 적인 방식을 CISC라고 한다.</p>
<h3 id="▶-cisc">▶ CISC</h3>
<ul>
<li>가변 길이 명령어 형식</li>
<li>인텔 대부분이 CISC</li>
<li>왜 인텔은 명령어 구조도 복잡하고 길이도 제각각인 CISC를 계속 사용했을까? (-&gt; 호환성이 좋다!)</li>
<li>명령어 길이가 길어진다 = 싸이클도 많이 걸린다.</li>
<li>backward compatibility</li>
</ul>
<h5 id="cisc-내부에-갖추어진-모든-명령어들-중-불과-20에-해당하는-명령어들만이-전체-80-이상의-일을-처리한다-따라서-cisc와-같이-필요한-모든-명령어-셋을-갖고-있는-것은-비효율적----이를-극복하기-위해-등장한-것이-risc"><em>CISC 내부에 갖추어진 모든 명령어들 중 불과 20%에 해당하는 명령어들만이 전체 80% 이상의 일을 처리한다. 따라서 CISC와 같이 필요한 모든 명령어 셋을 갖고 있는 것은 비효율적 -&gt;  이를 극복하기 위해 등장한 것이 RISC</em></h5>
<h3 id="▶-risc">▶ RISC</h3>
<ul>
<li>고정 길이 명령어 형식</li>
<li>Easier to design CPU</li>
<li>ARM, MIPS, RISC-V</li>
<li>Smaller instruction set -&gt; higher clock speed</li>
<li>하드웨어가 간단한 대신 소프트웨어가 크고 복잡해졌으며, 하위 호환성이 부족하다.</li>
</ul>
<blockquote>
<p>이 둘의 차이점 표(p16) 여기서 무조건 한문제 낸다고 했음
(특히, required memory, instruction, power comsumption 부분 잘 보기)</p>
</blockquote>
<p>주말에 너가 할것 -&gt;CISC 랑 RISC 완벽히 이해하기(질문 대답할 수 있을 만큼)</p>
<hr>
<h3 id="3-isa-classification">3. ISA Classification</h3>
<h4 id="1-storing-operand">(1) Storing Operand</h4>
<ul>
<li>Stack Architecture</li>
<li>Accumulator Architecture</li>
<li>Register-Memory Architectures</li>
<li>#of Registers</li>
<li>#of Operands<h4 id="2--of-operhands">(2) # of Operhands</h4>
<h4 id="3-addressing-mode">(3) Addressing Mode</h4>
</li>
<li>Unit of Data</li>
<li>&quot;Byte&quot;</li>
<li>&quot;Word&quot;</li>
<li>Byte Order (Endianness)</li>
<li>Type of Addressing Mode <h4 id="4-type--size-of-operhands">(4) Type &amp; Size of Operhands</h4>
<h4 id="5-type-of-opherations">(5) Type of Opherations</h4>
</li>
</ul>
<blockquote>
<p>와... 이 많은 걸... 내일 정리합세.. 오늘으느으느은... 여기까지.. 깨꼬닥..</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[1.3 Performance]]></title>
            <link>https://velog.io/@dev_sun/1.3-Performance</link>
            <guid>https://velog.io/@dev_sun/1.3-Performance</guid>
            <pubDate>Wed, 12 Oct 2022 10:23:07 GMT</pubDate>
            <description><![CDATA[<h1 id="which-has-higher-performance">Which has higher performance?</h1>
<blockquote>
<p>어떤 _<strong>기준</strong>_으로 퍼포먼스가 제일 높다고 말할 수 있을까?</p>
</blockquote>
<h3 id="✔-time">✔ Time</h3>
<p>: The time between start and completion</p>
<ul>
<li>처음부터 끝까지</li>
<li>사용자
▶ CPU Time, CPI에 대한 이해,, 계산문제 풀 줄 알아야해..</li>
</ul>
<h3 id="✔-rate">✔ Rate</h3>
<p>: How many tasks are completed per unit time</p>
<ul>
<li>특정단위 시간에 처리되는 task, job 무언가...
▶ MIPS, MFLOPS,, 계산 문제 풀 줄 알아야해..</li>
</ul>
<h3 id="✔-ratio">✔ Ratio</h3>
<ul>
<li>몇 배 빨라? 몇 % 빨라?</li>
</ul>
<blockquote>
<p>상황에 따라, 산술평균,, 기하평균,, 구분해서 쓸 줄 알아야함.</p>
</blockquote>
<h1 id="time">Time</h1>
<h2 id="1-measuring-cpu-time">1. Measuring CPU Time</h2>
<p><img src="https://velog.velcdn.com/images/dev_sun/post/665b2004-ac4b-456e-923a-482ca4c49c79/image.jpeg" alt=""></p>
<h3 id="1-cpu-time">1) CPU time</h3>
<p>: 프로그램을 실행시키는데 걸리는 시간</p>
<blockquote>
<p><strong>= CPU Clock Cycles X Clock Cycle Time
= CPU Clock Cycles/Clock Rate</strong></p>
</blockquote>
<h3 id="2-cpu-clock-cycles">2) CPU Clock Cycles</h3>
<p>: 어떤 일을 수행하는데 cpu가 <strong>몇개의 clock을 사용</strong>하는 지</p>
<blockquote>
<p><strong>= IC X CPI
= 명령어 수 X 명령어당 평균 클럭 사이클 수</strong></p>
</blockquote>
<h3 id="3-clock-cycle-time">3) Clock Cycle Time</h3>
<p>: 한 clock 당 수행시간 </p>
<blockquote>
<p><strong>= 1/ clock frequency(rate)</strong></p>
</blockquote>
<p><img src="https://velog.velcdn.com/images/dev_sun/post/2648b5d7-bddc-4268-9168-1d5ef9b2df4d/image.jpeg" alt=""></p>
<h3 id="4-ic-cpi">4) IC, CPI</h3>
<ul>
<li><strong>IC : 명령어 수</strong></li>
<li><blockquote>
<h1 id="of-instructions-executed-for-a-program">of instructions executed for a program</h1>
</blockquote>
</li>
<li><strong>CPI : 명령어 하나를 처리하는데 필요한 클럭 사이클 수</strong></li>
<li><blockquote>
<p><strong>Average</strong> clock cycles per instructions.
** CPI = Total CPU clock cycle / Total Instruction count**
<img src="https://velog.velcdn.com/images/dev_sun/post/f0e1cb3f-a6f9-4349-af1c-d563ab6a81f4/image.png" alt="">
CPI(명령어당 평균 클럭 사이클 수) = Σ (각 명령어당 CPI * 비율) </p>
</blockquote>
</li>
</ul>
<h1 id="rate">Rate</h1>
<p>CPU Time 외에도 MIPS (Millions of Instruction Per Second) 라는 성능 측정 지표가 있다.</p>
<h2 id="2-mips-or-mflops">2. MIPS (or MFLOPS)</h2>
<blockquote>
<p>시간이 아닌 <strong>처리량을 기준</strong>으로 컴퓨터의 성능을 알 수 있는 수치</p>
</blockquote>
<p> 백만개의 명령을 1초에 몇번 수행할 수 있는지 -&gt; ** 10^6** 을 실행시간 곱해줌</p>
<blockquote>
<p>MIPS = 명령어 개수 / (실행시간 * 10^6)</p>
</blockquote>
<p>MIPS 가 크면 -&gt; 실행시간 짧다 -&gt; 즉, 컴퓨터의 성능이 우수하다고 할 수 있다.
단순히 명령어를 실행하는 속도를 나타낼 뿐이지 명령어 하나가 얼마나 많은 일을 수행하는지는 모른다는 단점이 있다. 직관적 이해는 가능해도 정확한건 아니라구 하넹..</p>
<ul>
<li>실행시간 = (명령어 개수 * CPI) / Clock Rate</li>
</ul>
<blockquote>
<p>MIPS = Clock Rate(=Clock frequency) / (CPI * 10^6)</p>
</blockquote>
<p>추가로,** MFLOPS** = 부동 소수점 연산 개수 / (실행시간 * 10^6)</p>
<blockquote>
<p>얘도 계산 문제 나온다고 했다..
MHz = 10^6
GHz = 10^9
기억해두기</p>
</blockquote>
<h2 id="3-benchmark">3. Benchmark</h2>
<blockquote>
<p>컴퓨터 성능을 측정하기 위해 나온 개념!</p>
</blockquote>
<ul>
<li>컴퓨터, 스마트폰 등 전자기기의 연산성능을 시험하여 수치화하는 것</li>
<li>실사용자의 사용환경을 모사 -&gt; 평가프로그램의 형태로 만들어</li>
<li>새롭게 만든 걸 가지고, &quot;이게 진짜로 좋아??&quot;</li>
</ul>
<blockquote>
<p>✦<em>** Mimic**</em> a particular type of &quot;workload&quot; on a component or system
✦ <em><strong>Acceptance</strong></em> : <strong>vendor and users</strong> embrace it</p>
</blockquote>
<p>예시로 SPEC, TPC..가 있다고 한다..</p>
<p>결과표를 보면 &quot;SPEC ratio&quot; 를 볼 수 있는데, 
이게 기준 컴퓨터보다 몇배가 뛰어난지 측정한 값이다. 
// 산술평균 말고 기하평균을 쓴걸 볼 수 있음.</p>
<h2 id="4-amdahls-law">4. Amdahl&#39;s Law</h2>
<blockquote>
<p>멀티 프로세스를 썼을 때 싱글 프로세스를 썼을 때보다 <strong>얼마만큼 speed up이 되는지</strong>를 보여주는 법칙
<img src="https://velog.velcdn.com/images/dev_sun/post/6b350de5-4603-4d99-bcd9-9aeb5b3cd424/image.png" alt=""></p>
</blockquote>
<ul>
<li>코드 중에서 f 만큼의 비율을 병렬처리 가능한 부분</li>
<li>(1-f) 는 병렬처리가 불가능한 부분</li>
</ul>
<p>(1-f)는 병렬화가 안된 부분이기 때문에 T(1-f)는 단일 프로세서로 해야합니다. 밑에 분수에선 Tf 가 병렬화가 가능하기 때문에 <strong>프로세서의 개수만큼 나눠줄 수 있습니다</strong>. </p>
<blockquote>
<p>결과적으로 코어의 개수가 아무리 많아져도 (N -&gt; 무한) 이 되어도 속도는 1/(1-f) 에 의존합니다.</p>
</blockquote>
<p>✦ 프로세서 개수를 계속 늘린다고 성능이 무한대로 좋아지는게 아니다!
<img src="https://velog.velcdn.com/images/dev_sun/post/0bb0a414-92b0-44b1-87ff-6cc744765425/image.png" alt=""></p>
<blockquote>
<p>즉, 뭐가 중요해?</p>
</blockquote>
<ul>
<li>속도향상은 얼마나 병렬화가 이루어졌냐(f가 얼마나 많은 비율을 차지하나)</li>
<li>반드시 연속적으로 의존성있게 그런 순서를 반드시 지켜야하는 부분(병렬화가 불가능)이 얼마나 많은가</li>
</ul>
<p>-&gt; 암달의 법칙이용해서 얼마만큼의 속도향상이 있는지 구하는 계산 문제도 나온다했다. </p>
<hr>
<p>그럼 정리,</p>
<ol>
<li>성능 기준에 따라 다른 평균기법 (산술평균, 기하평균을 상황에 맞게 적용할 줄 알아야함)</li>
<li>CPU Time, CPI, MIPS, 암달의 법칙 등의 계산 문제 연습하자(이건! 주말에 미래의 나야 화이팅 -&gt; 전공책 예제 다 풀어보기~~)</li>
<li>상황에 맞는 매트릭 사용 -&gt; 그 이유에 대한 설명도 할 줄 알아야함</li>
<li>계산 부분점수 없단다.. -&gt; 교수님 너무 하다!</li>
<li>컴퓨터 성능을 평가하는데에는 다양한 고려 요소가 있지만, 컴퓨터 구조에선 &quot;CPU 성능&quot; 에 포커스를 둔다.</li>
</ol>
<p>나중에 계산 문제 참고할 링크 ↓
<a href="https://snoop-study.tistory.com/80">공식 간단하게</a>
<a href="https://mjso9805.tistory.com/3">계산 문제 예시</a>
<a href="https://www.youtube.com/watch?v=5jmQj6tV7rg">이건 계산 문제 해설해주는 동영상</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[1.2 Technology Trend]]></title>
            <link>https://velog.io/@dev_sun/1.2-Technology-Trend</link>
            <guid>https://velog.io/@dev_sun/1.2-Technology-Trend</guid>
            <pubDate>Mon, 10 Oct 2022 05:00:59 GMT</pubDate>
            <description><![CDATA[<h2 id="1-폰노이만-구조">1. 폰노이만 구조</h2>
<p>-프로그램과 데이터는 메모리에 동일한 방식으로 저장되며 컴퓨터는 동일한 방식으로 처리</p>
<blockquote>
<p>2가지 핵심</p>
</blockquote>
<p>1) CPU
2) 메모리</p>
<ul>
<li>메모리에 있는 것만 접근해서 연산하겠다!</li>
<li>현대 컴퓨터의 프로토타입 -&gt; 기본적인 골격은 지금까지 유지</li>
<li>&quot;메모리&quot;라는 컨셉을 처음 제시</li>
<li>메모리에 내가 원하는 프로그램을 올리면 그에 맞춰 수행</li>
</ul>
<ul>
<li><p>Stored-program computer
: 프로그램은 데이터와 동일하게 숫자로 표현하여 데이터와 동일한 형태로 저장장치에 저장 (-&gt; 이 개념을 구현하기 위한 아키텍쳐 : 폰노이만의 아키텍쳐와 하버드 아키텍쳐 가있음)</p>
</li>
<li><p>Processing unit can communicate <strong>with main memory only</strong></p>
</li>
<li><blockquote>
<p>A processing unit : 산술계산, logic 등을 처리할 유닛이 필요</p>
</blockquote>
</li>
<li><blockquote>
<p>A control unit : instruction register와 computer counter 포함</p>
</blockquote>
</li>
<li><blockquote>
<p>Memory : 메모리에 있는 것만 접근</p>
</blockquote>
</li>
<li><blockquote>
<p>External mass storage : 프로그램들을 저장할 스토리지 필요</p>
</blockquote>
</li>
<li><blockquote>
<p>Input &amp; Output mechanisms</p>
</blockquote>
</li>
</ul>
<h3 id="✔-폰노이만-bottleneck">✔ 폰노이만 Bottleneck</h3>
<blockquote>
<p>bottleneck(병목현상)이란? 컴퓨터 성능 저하 현상.
담을 수 있는 데이터의 양은 적으나 한꺼번에 많은 양의 데이터가 유입 됨으로써 컴퓨터가 느려지는 현상</p>
</blockquote>
<ul>
<li>근본적인 원인 </li>
<li><blockquote>
<p>프로그램 메모리와 데이터 메모리가 물리적 구분 없이 하나의 버스를 통해 CPU와 교류</p>
</blockquote>
</li>
<li><blockquote>
<p>CPU는 명령어와 데이터에 동시에 접근 불가능, 나열된 명령어 한 번에 하나씩 읽고 씀</p>
</blockquote>
</li>
</ul>
<blockquote>
<p>✔ CPU와 메모리의 성능갭 -&gt; 5번 참고!
✔ CPU 속도 빨라, 메모리 속도 느려..</p>
</blockquote>
<ul>
<li>병목현상과 그 해결책, 
여러가지 나옴 그중에....</li>
<li><em>-&gt; 하버드 구조*</em> : CPU 명령어와 데이터를 동시에 사용할 수 있도록 명령용 버스와 데이터용 버스를 물리적으로 구분</li>
<li><blockquote>
<p>cache, DMA, Memory hieracrchy... 등등..
<img src="https://velog.velcdn.com/images/dev_sun/post/cbbf399a-78a5-48e6-bb86-8712292c87fb/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<blockquote>
<p>결국!!! 핵심은 뭐다??? 
<strong>메모리에 대한 접근을 어떻게 하면 최소화 할 수 있을까?</strong></p>
</blockquote>
<h2 id="2-moores-law">2. Moore&#39;s Law</h2>
<p>약 18개월~24개월 주기로 칩의 집적도가 약 2배씩 상승한다는 말이다. 즉, 트랜지스터가 두배씩 증가한다.</p>
<pre><code>    &gt;인텔 코어 i시리즈쯤 부터 무어의 법칙이 깨지게 됩니다. 즉 2년마다 2배의 성능이 향상된다는 법칙을 실현하지 못하게 된 셈입니다.무어의 법칙이 최근 몇년사이 실현되지 못한 이유는 점점 미세공정화됨에 따라 한계에 이르고 발열을 잡기 힘든데다가 더이상 집적도를 높이기 위해서는 예전과는 다른 천문학적 금액이 소요되기 때문에 현재 한계에 다다르고 그로 인해 무어의 법칙이 깨졌다고 봐도 무방합니다.</code></pre><h2 id="3-issue-power-wall">3. Issue: Power Wall</h2>
<blockquote>
<p>1) We can&#39;t reduce voltage further
2) We can&#39;t remove more heat</p>
</blockquote>
<ul>
<li><p>더이상 퍼포먼스 향상을 위해 전력을 낮추는 것, 발열을 낮추는 것이 불가능해졌고, <strong>이런 소비 전력과 냉각 문제가 퍼포먼스 성장의 정체를 야기했다</strong>는 이론.</p>
<ul>
<li><p>power wall 상황에서 퍼포먼스를 끌어올리기 위해 여러 개의 프로세서를 집적한 마이크로프로세서를 생산하였고, 이때의 프로세서를 &#39;코어&#39;, 코어가 집적된 마이크로프로세서를 &#39;멀티코어 마이크로프로세서&#39;라고 부르기 시작.</p>
</li>
<li><p>Effective cycle time is defined as the cycle time of <strong>an individual CPU divided by the number of its professor cores.</strong></p>
<h2 id="4--multiprocessors">4.  Multiprocessors</h2>
<blockquote>
<p>More than one processor per chip
// 나중에,,, 더 공부하기.. 문제점도 있나봄.. ppt 36참고</p>
</blockquote>
</li>
</ul>
</li>
</ul>
<h2 id="5-issue--cpu-memory-gap">5. Issue : CPU-Memory Gap</h2>
<ul>
<li><p>CPU는 매년 클록 속도를 높이며 성능이 빠르게 향상되는 데 비해 메모리는 높은 미세공정 기술 난이도 때문에 성능 속도 향상은 비교적 제한적이다. 고성능 CPU를 장착해도 메모리 데이터 전송속도가 따라가지 못해 전체 컴퓨팅 성능을 높이지 못하는 것이다.<a href="https://www.etnews.com/20150903000281">링크텍스트</a>
<img src="https://velog.velcdn.com/images/dev_sun/post/01f7d2c6-bd87-4ca3-b795-d5f7e98e6970/image.png" alt=""></p>
</li>
<li><p>데이터의 위치에 따라 읽는 속도가 달라짐. 
<img src="https://velog.velcdn.com/images/dev_sun/post/842d344c-52d9-4896-89b1-a5ec74cd9638/image.png" alt=""></p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[1.1 Introduction]]></title>
            <link>https://velog.io/@dev_sun/1.1-Introduction</link>
            <guid>https://velog.io/@dev_sun/1.1-Introduction</guid>
            <pubDate>Mon, 10 Oct 2022 03:51:31 GMT</pubDate>
            <description><![CDATA[<blockquote>
<p>일단은 워밍업,,</p>
</blockquote>
<h3 id="1-컴퓨터-구조를-배워야-하는-이유">1. 컴퓨터 구조를 배워야 하는 이유</h3>
<ul>
<li>문제 해결 능력 향상</li>
<li>어떤 CPU를 사용할지, 어떤 메모리를 사용할지</li>
<li><blockquote>
<p>선택에 따라 <strong>성능/용량/비용</strong> 달라짐</p>
</blockquote>
</li>
</ul>
<h3 id="2-컴퓨터-구조의-큰그림">2. 컴퓨터 구조의 큰그림</h3>
<h4 id="1-컴퓨터가-이해하는-정보">1) 컴퓨터가 이해하는 정보</h4>
<p>크게 2가지 종류가 있음.
둘다 0과 1로 표현됨.</p>
<ul>
<li><strong>데이터</strong> : 컴퓨터가 이해하는 숫자, 문자, 이미지, 동여상과 같은 정적인 정보. 컴퓨터가 주고받는 정보나 컴퓨터에 저장된 정보를 가리킬때.</li>
<li><strong>명령어</strong> : 데이터를 움직이고 컴퓨터를 작동시키는 정보</li>
</ul>
<h4 id="2-4가지-핵심-부품">2) 4가지 핵심 부품</h4>
<ul>
<li>CPU : 메모리에 저장된 명령어 읽어 들이고, 해석하고, 실행</li>
<li><blockquote>
<p>CPU 구성요소 중 중요한 3가지</p>
</blockquote>
</li>
<li><blockquote>
<p>ALU, 레지스터, 제어장치</p>
</blockquote>
</li>
</ul>
<p><em>ALU : 계산하는 장치
레지스터 : CPU 내부의 작은 임시 저장 장치
제어장치 : 제어신호라는 전기 신호를 내보내고 명령어를 해석하는 장치</em></p>
<ul>
<li><p>메모리(보통 주기억장치 RAM을 말함) : 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품</p>
</li>
<li><blockquote>
<p>주소 : 메모리에 저장된 값에 빠르고 효율적인 접근을 위해</p>
</blockquote>
</li>
<li><blockquote>
<p>단점 : 가격이 비싸 저장 용량이 적다! 전원이 꺼지면 저장된 내용을 잃는다! (--&gt; 이를 위해 &#39;보조기억장치&#39;)</p>
</blockquote>
</li>
<li><p>보조기억장치 
하드디스크, SSD, USB 메모리, DVD, CD-ROM 등</p>
<blockquote>
<p>즉, 메모리는 현재 &#39;실행되는&#39; 프로그램 저장, 보조기억장치는 &#39;보관할&#39; 프로그램 저장</p>
</blockquote>
</li>
<li><p>입출력장치 : 마이크, 스피커, 프린터, 마우스, 키보드처럼 컴퓨터 외부에 연겨로디어 컴퓨터 내부와 정보를 교환하는 장치</p>
</li>
</ul>
<h3 id="3-메인보드와-시스템-버스">3. 메인보드와 시스템 버스</h3>
<ul>
<li>메인보드 : 여러 컴퓨터 부품 연결</li>
<li>시스템 버스 : 퓨터의 4가지 핵심 부품이 서로 정보를 주고받는 통로(주소버스, 데이터 버스, 제어버스)</li>
</ul>
<blockquote>
<p>Introduction. 앞으로 배워나갈 것들..</p>
</blockquote>
<h3 id="8-great-ideas-in-computer-architecture">8 Great Ideas in Computer Architecture</h3>
<ul>
<li><p>Design for Moore&#39;s Law</p>
</li>
<li><p>Use <strong>abstraction</strong> to simplify design
: 복잡한 자료, 모듈, 시스템 등으로부터 핵심적인 개념 또는 기능을 간추려 내는 것 (-&gt; 내가 detail을 알지 못해도 사용 가능하게 해주는 개념)</p>
</li>
<li><p>Make the common case fast</p>
</li>
<li><p>Performance via paralleism</p>
</li>
<li><p>Performance via pipelining</p>
</li>
<li><p>Prformance via prediction</p>
</li>
<li><p><strong>Virtualization</strong> : Hierachy of memories
: 컴퓨터에서 컴퓨터 리소스의 추상화를 일컫는 광범위한 용어. (-&gt; 물리적인 컴퓨터 리소스의 특징을 다른 시스템, 응용 프로그램, 최종 사용자들이 리소스와 상호 작용하는 방식으로부터 감추는 기술 ex) process, virtual machine, cache memory..)
@참고 : <a href="https://velog.io/@bernard717/1.-Virtualization">https://velog.io/@bernard717/1.-Virtualization</a>
@교재 : illusion that each user has its own computer system or has infinite computer resources</p>
</li>
<li><p>Depenability via redundancy</p>
</li>
</ul>
<p>이거 8가지 좀 간단하게 설명해놓은거 이거 참고
<a href="https://www.blog.ecsimsw.com/entry/1-%EC%BB%B4%ED%93%A8%ED%84%B0-%EC%B6%94%EC%83%81%ED%99%94-%EB%B0%8F-%EA%B4%80%EB%A0%A8-%EA%B8%B0%EC%88%A0">https://www.blog.ecsimsw.com/entry/1-%EC%BB%B4%ED%93%A8%ED%84%B0-%EC%B6%94%EC%83%81%ED%99%94-%EB%B0%8F-%EA%B4%80%EB%A0%A8-%EA%B8%B0%EC%88%A0</a></p>
<blockquote>
<p>볼드 처리한거.. 개념이 중요함 (이해하기!)</p>
</blockquote>
]]></description>
        </item>
    </channel>
</rss>