├── README.md ├── chapter_1.md ├── chapter_2.md ├── chapter_3_컴퓨터 산술과 논리연산.md ├── chapter_4_제어 유니트.md ├── chapter_5_기억장치.md ├── chapter_6.md ├── chapter_7.md ├── chapter_8.md └── img ├── CPU와 I_O 장치들 간의 접속.JPG ├── CPU와 기억장치의 접속.JPG ├── IAS 컴퓨터의 구조.JPG ├── bookCover.JPG ├── ch3_1.jpg ├── ch3_2.jpg ├── ch3_3.jpg ├── ch3_4.jpg ├── ch3_5.jpg ├── ch3_6.jpg ├── ch3_7.jpg ├── ch3_8.jpg ├── ch4_1.JPG ├── ch4_2.JPG ├── ch4_3.JPG ├── ch4_4.JPG ├── ch5_1.JPG ├── ch5_2.JPG ├── ch5_3.JPG ├── ch6_1.JPG ├── ch6_2.JPG ├── ch8_1.JPG ├── ch8_2.JPG ├── ch8_3.JPG ├── ch8_4.JPG ├── ch8_5.JPG ├── ch8_6.JPG ├── ch8_7.JPG ├── 정답_1.JPG └── 프로그램 실행 과정의 예.JPG /README.md: -------------------------------------------------------------------------------- 1 | 2 | # ComputerArchitecture_Summary 3 | 김종현 교수님 저자 컴퓨터 구조론 요약입니다. 4 | 5 | BOOK: 6 | 7 | ![Book Cover](https://image.aladin.co.kr/product/3533/36/cover500/8970507892_1.jpg) 8 | 9 | 10 | 11 | ## 목록 12 | ### CHAPTER O1 컴퓨터시스템 개요 13 | - 1.1 컴퓨터의 기본 구조 14 | - 1.2 정보의 표현과 저장 15 | - 1.3 시스템의 구성 16 | - 1.3.1 CPU와 기억장치의 접속 17 | - 1.3.2 CPU와 I/O 장치의 접속 18 | - 1.3.3 전체 시스템의 구성 19 | - 1.4 컴퓨터 구조의 발전 과정 20 | - 1.4.1 초기 컴퓨터들의 구조 21 | - 1.4.2 주요 컴퓨터 부품들의 발전 경위 22 | - 1.4.3 컴퓨터시스템의 분류와 발전 동향 23 | - 기본문제 24 | - 연습문제 25 | 26 | ### CHAPTER O2 CPU의 구조와 기능 27 | - 2.1 CPU의 기본 구조 28 | - 2.2 명령어 실행 29 | - 2.2.1 인출 사이클 30 | - 2.2.2 실행 사이클 31 | - 2.2.3 인터럽트 사이클 32 | - 2.2.4 간접 사이클 33 | - 2.3 명령어 파이프라이닝 34 | - 2.3.1 2-단계 명령어 파이프라인 35 | - 2.3.2 4-단계 명령어 파이프라인 36 | - 2.3.3 슈퍼스칼라 37 | - 2.3.4 듀얼 코어 및 멀티 코어 38 | - 2.4 명령어 세트 39 | - 2.4.1 연산의 종류 40 | - 2.4.2 명령어 형식 41 | - 2.4.3 주소지정 방식 42 | - 2.4.4 실제 상용 프로세서들의 명령어 형식 43 | - 기본문제 44 | - 연습문제 45 | 46 | ### CHAPTER O3 컴퓨터 산술과 논리 연산 47 | - 3.1 ALU의 구성 요소 48 | - 3.2 정수의 표현 49 | - 3.2.1 부호화-크기 표현 50 | - 3.2.2 보수 표현 51 | - 3.2.3 부호-비트 확장 52 | - 3.3 논리 연산 53 | - 3.4 시프트 연산 54 | - 3.5 정수의 산술 연산 55 | - 3.5.1 덧셈 56 | - 3.5.2 뺄셈 57 | - 3.5.3 곱셈 58 | - 3.5.4 나눗셈 59 | - 3.6 부동소수점 수의 표현 60 | - 3.7 부동소수점 산술 연산 61 | - 3.7.1 덧셈과 뺄셈 62 | - 3.7.2 곱셈과 나눗셈 63 | - 기본문제 64 | - 연습문제 65 | 66 | ### CHAPTER O4 제어 유니트 67 | - 4.1 제어 유니트의 기능 68 | - 4.2 제어 유니트의 구조 69 | - 4.3 마이크로명령어의 형식 70 | - 4.4 마이크로프로그래밍 71 | - 4.4.1 인출 사이클 루틴 72 | - 4.4.2 간접 사이클 루틴 73 | - 4.4.3 실행 사이클 루틴 74 | - 4.5 마이크로프로그램의 순서제어 75 | - 기본문제 76 | - 연습문제 77 | 78 | ### CHAPTER O5 기억장치 79 | - 5.1 기억장치의 분류와 특성 80 | - 5.2 계층적 기억장치시스템 81 | - 5.2.1 필요성 및 효과 82 | - 5.2.2 기억장치 계층 83 | - 5.3 반도체 기억장치 84 | - 5.3.1 RAM 85 | - 5.3.2 ROM 86 | - 5.4 기억장치 모듈의 설계 87 | - 5.5 캐시 메모리 88 | - 5.5.1 캐시 용량 89 | - 5.5.2 인출 방식 90 | - 5.5.3 사상 방식 91 | - 5.5.4 교체 알고리즘 92 | - 5.5.5 쓰기 정책 93 | - 5.5.6 다중 캐시 94 | - 5.6 최신 기억장치 기술 95 | - 5.6.1 SDRAM 96 | - 5.6.2 DDR SDRAM 97 | - 5.6.3 차세대 비휘발성 기억장치 98 | - 기본문제 99 | - 연습문제 100 | 101 | ### CHAPTER O6 보조저장장치 102 | - 6.1 자기 디스크 103 | - 6.1.1 디스크의 구조 104 | - 6.1.2 디스크 액세스 시간 105 | - 6.2 RAID 106 | - 6.2.1 RAID 출현의 배경 107 | - 6.2.2 RAID의 종류 108 | - 6.3 플래시 메모리와 SSD 109 | - 6.3.1 플래시 메모리 110 | - 6.3.2 SSD 111 | - 6.4 광 저장장치 112 | - 6.4.1 CD-ROM 113 | - 6.4.2 CD-R/RW 114 | - 6.4.3 DVD 115 | - 6.4.4 블루-레이 디스크(BD) 116 | - 기본문제 117 | - 연습문제 118 | 119 | ### CHAPTER O7 시스템 버스, I/O 및 인터럽트 120 | - 7.1 시스템 버스 121 | - 7.1.1 시스템 버스의 조직 122 | - 7.1.2 시스템 버스의 기본 동작 123 | - 7.2 버스 중재 124 | - 7.2.1 병렬 중재 방식 125 | - 7.2.2 직렬 중재 방식 126 | - 7.2.3 폴링 방식 127 | - 7.3 I/O 장치의 접속 128 | - 7.3.1 I/O 제어 129 | - 7.3.2 I/O 주소지정 130 | - 7.4 인터럽트를 이용한 I/O 131 | - 7.4.1 다중 인터럽트 방식 132 | - 7.4.2 데이지-체인 방식 133 | - 7.4.3 소프트웨어 폴링 방식 134 | - 7.5 DMA를 이용한 I/O 135 | - 기본문제 136 | - 연습문제 137 | 138 | ### CHAPTER O8 고성능 컴퓨터시스템 구조 139 | - 8.1 병렬처리의 개념 및 필요성 140 | - 8.2 병렬처리의 단위 141 | - 8.3 병렬컴퓨터의 분류 142 | - 8.3.1 Flynn의 분류 143 | - 8.3.2 기억장치 액세스 모델에 따른 분류 144 | - 8.3.3 시스템 구성 방법에 따른 분류 145 | - 8.4 다중프로세서시스템 구조 146 | - 8.4.1 공유-기억장치 시스템 구조 147 | - 8.4.2 분산-기억장치 시스템 구조 148 | - 8.5 클러스터 컴퓨터 149 | - 8.5.1 클러스터 컴퓨터의 기본 구조 150 | - 8.5.2 클러스터 컴퓨터의 분류 151 | - 8.5.3 클러스터 미들웨어와 단일 시스템 이미지 152 | - 기본문제 153 | - 연습문제 154 | -------------------------------------------------------------------------------- /chapter_1.md: -------------------------------------------------------------------------------- 1 | # 컴퓨터구조론 2 | 3 | ### chapter 01. 컴퓨터 시스템 개요 4 | 5 | ------ 6 | 7 | <컴퓨터 시스템> 8 | 9 | - 소프트웨어: 정보처리의 종류와 그 수행시간을 지정해주는 command 들의 집합 10 | - 하드웨어: 중앙처리장치(CPU), 기억장치(주, 보조), 입출력장치, power, fan, ect... 11 | 12 | ------ 13 | 14 | > 소프트웨어는 하드웨어에 의존적이다. 15 | > 16 | > 즉, 컴퓨터의 수행속도는 근본적으로는 하드웨어에 달려있고 소프트웨어의 질에 따라 하드웨어의 사용 효율이 더 향상될 수 있다. 17 | 18 | #### 1.1 컴퓨터의 기본 구조 _15~16 page. 19 | 20 | 컴퓨터는 프로그램 코드를 정해진 순서대로 실행(execute)한다. 그 과정에서 컴퓨터는 필요한 데이터를 read, processing, store 한다. 21 | 22 | 23 | 24 | ![컴퓨터의 기본구조](https://img1.daumcdn.net/thumb/R720x0.q80/?scode=mtistory&fname=http%3A%2F%2Fcfile24.uf.tistory.com%2Fimage%2F230ABC4252C55F002A8837) 25 | 26 | ​ <컴퓨터의 기본구조> 27 | 28 | 29 | 30 | - CPU(Processor): 프로그램 실행 및 데이터 처리 - 중추적인 기능 담당 31 | - 기억장치: 주 기억장치와 보조 기억 장치로 나뉜다. 32 | 33 | | 주 기억장치 | 보조기억장치 | 34 | | :--------------: | :------------: | 35 | | 빠른 액세스 | 느린 액세스 | 36 | | 가격이 비쌈 | 가격이 저렴함 | 37 | | 저장능력: 휘발성 | 저장능력: 영구 | 38 | 39 | - 입출력장치: 각 장치마다 있는 별도의 제어장치에 의해 동작. 유저와 컴퓨터간의 소통을 위한 도구. 40 | 41 | 42 | 43 | #### 1.2 정보의 표현과 저장 _ 17~20 page. 44 | 45 | 컴퓨터가 처리하는 정보의 종류: ***Code*** , ***Data*** -> bit의 조합으로 표현 46 | 47 | - 고급 언어(high-level language): 사람에게 편한 언어 48 | - 컴파일러(Compiler): 고급 언어를 기계어로 변환해주는 소프트웨어 49 | - 기계어(Mauchine language): 기계(컴퓨터의 하드웨어)가 이해할 수 있는 언어 50 | - 어셈블리 언어(Assembly language): 고급 언어를 기계어로 바꿔주는 중간 언어 51 | 52 | > CPU의 종류 마다 내부 구조가 다르기 때문에 서로 다른 종류의 CPU의 기계어는 달라진다. 따라서 고급 언어를 기계어로 바꿔주는 과정의 중간에 해당하는 어셈블리 언어가 이를 해결해준다. 53 | 54 | 고급-언어 프로그램이 기계어 프로그램으로 번역되는 과정은 다음과 같다. 55 | 56 | | 고급 언어 프로그램 | 어셈블리 프로그램 | 기계어 프로그램 | 57 | | :----------------- | ----------------------------------------------------- | ------------------------------ | 58 | | [예] Z = X + Y | LOAD A, X: 기억장치 X번지 값을 레지스터A에 적재 | 001 / 00101 | 59 | | - | ADD A, Y: 기억장치 Y번지 값을 A 와 더한 후 A에 적재 | 100 / 00110 | 60 | | - | STOR Z, A: A의 내용을 기억장치 Z번지에 저장 | 010 / 00111 | 61 | | - | ***LOAD, ADD, STOR*** 을 ***니모닉스*** 라고 부른다. | ***opcode 명령/operand 주소*** | 62 | 63 | - 기계어 프로그램에서 oprand는 0번지부터 저장되어있고 계산에 사용될 데이터는 X번지 부터 저장 64 | - CPU에서 한번에 처리될 수 있는 비트들의 그룹을 **WORD** 라고 한다 65 | 66 | 67 | 68 | #### 1.3 시스템의 구성 _ 21 ~ 27 page. 69 | 70 | ------ 71 | 72 | CPU와 기억장치 및 I/O 장치의 상호작용을 분석해보고 컴퓨터시스템의 구성방법 및 동작원리에 대해 알아본다. 73 | 74 | ------ 75 | 76 | **1.3.1 CPU와 기억장치의 접속** 77 | 78 | ![컴퓨터의 기본구조](https://t1.daumcdn.net/cfile/tistory/256A834E52C564C526) 79 | 80 | ​ 81 | 82 | 83 | 84 | - 시스템 버스: CPU와 시스템 내의 다른 요소들 사이에 정보를 교환하는 통로 85 | - 주소 버스: CPU가 외부로 발생하는 주소 정보를 전송하는 신호들의 집합 86 | - 데이터 버스: CPU가 기억장치 혹은 I/O장치 사이에 데이터를 전송하기 위한 신호 선들의 집합 87 | - 제어 버스: CPU가 시스템 내의 각종 요소들의 동작 제어에 필요한 신호 선들의 집합 88 | 89 | > 주소는 CPU에 의해 발생되어 기억장치 및 I/O 장치로 보내지는 정보이기 때문에 주소 버스는 단방향성이다. 90 | > 91 | > 데이터 버스는 읽기 및 쓰기를 지원하므로 양방향성이다. (제어 버스도 마찬가지) 92 | 93 | - 액세스: CPU가 기억장치에 데이터를 쓰거나, 저장된 내용을 읽는 동작 94 | 95 | 96 | 97 | ![CPU와 기억장치의 접속](img/CPU%EC%99%80%20%EA%B8%B0%EC%96%B5%EC%9E%A5%EC%B9%98%EC%9D%98%20%EC%A0%91%EC%86%8D.JPG) 98 | 99 | ​ 100 | 101 | 102 | 103 | - Read할 경우 CPU가 보내줘야 하는 정보: 주소, 읽기신호 104 | - Write할 경우 CPU가 보내줘야 하는 정보: 주소, 쓰기신호, 데이터(무엇을 쓸지에 대한) 105 | 106 | 따라서 CPU와 기억장치 사이에는 주소 버스, 데이터 버스, 제어(쓰기, 읽기 신호 제어) 버스가 필요하다. 107 | 108 | 109 | 110 | ![기억장치 액세스 동작의 시간 흐름도](http://mblogthumb4.phinf.naver.net/20121122_51/dufvndrnjs_1353591900999jMzC7_JPEG/%B1%E2%BE%EF%C0%E5%C4%A1_%BE%D7%BC%BC%BD%BA_%B5%BF%C0%DB%C0%C7_%BD%C3%B0%A3_%C8%E5%B8%A7%B5%B5.JPG?type=w2) 111 | 112 | ​ <기억장치 액세스 동작의 시간 흐름도> 113 | 114 | 115 | 116 | - 쓰기 동작의 경우 CPU가 주소, 데이터를 보내는 동시에 쓰기 신호를 활성화 한다. CPU가 주소와 데이터를 보낸 순간부터 기억장치에 저장이 완료될 때 까지의 시간을 **기억장치 쓰기시간**이라고 한다. 117 | - 읽기 동작의 경우 CPU가 주소를 보내는 동시에 읽기 신호를 활성화한다. 일정 **지연 시간**이 흐른 후 읽힌 데이터가 데이터 버스에 실리게 되며 CPU는 그 데이터를 버스 인터페이스 회로를 통하여 읽어들인다. CPU가 주소를 발생한 시간부터 읽기 동작이 완료될 때까지의 시간을 **기억장치 읽기 시간**이라고 한다. 118 | - **지연 시간**: 주소를 해독(decode)하는 시간 + 기억장치로 부터 데이터를 인출하는데 걸리는 시간 119 | 120 | 121 | 122 | **1.3.2 CPU와 I/O장치의 접속** 123 | 124 | I/O 장치와 보조저장장치는 CPU가 직접 제어하지 못하고 별도의 제어기(또는 인터페이스 회로)를 통해야 한다. 125 | 126 | ![기억장치 액세스 동작의 시간 흐름도](img/CPU%EC%99%80%20I_O%20%EC%9E%A5%EC%B9%98%EB%93%A4%20%EA%B0%84%EC%9D%98%20%EC%A0%91%EC%86%8D.JPG) 127 | 128 | ​ 129 | 130 | CPU가 키보드로부터 데이터를 읽어들이는 과정은 다음과 같다. 131 | 132 | - 키보드의 어느 한 키를 누른다 -> 그에 대응되는 데이터가 키보드 제어기의 데이터 레지스터에 저장된다. -> 상태 레지스터의 입력데이터가 준비되었다는 것을 의미하는 비트(예시에서는 In_RDY)가 활성화된다. 133 | - CPU는 In_RDY비트가 활성화되어 있는지를 검사한다. 134 | - In_RDY가 활성인 경우: 데이터 레지스터의 내용을 CPU로 읽어들인다. 135 | - In_RDY가 비활성인 경우: In_RDY가 활성화될 때까지 상태 레지스터를 검사하고 이를 반복한다. 136 | 137 | 138 | 139 | CPU가 데이터를 프린트하는 과정은 다음과 같다. 140 | 141 | - 데이터를 프린터로 보내기 전에 CPU는 프린터 제어기 내의 상태 레지스터를 읽어 데이터 출력 준비(Out_RDY)비트를 검사한다. -> Out_RDY비트가 활성상태라면 CPU는 데이터를 프린터 제어기의 데이터 레지스터(데이터 버퍼)로 Write 한다. 142 | 143 | 144 | 145 | CPU는 시스템에 접속되어 있는 I/O 장치들을 직접 제어하지는 않지만, 각 장치의 제어기가 수행할 동작을 지정하는 명령(Command)을 보내거나 상태 정보와 데이터를 주고 받을 수 있어야 한다. 따라서 CPU는 각 I/O 장치의 제어기를 구분하고 정보를 주고받을 수 있어야 한다. 146 | 147 | - 각 제어기 내부의 상태 레지스터와 데이터 레지스터를 각각 한 WORD 길이의 기억장치로 간주하면 가능하다. 즉, CPU가 제어기 내부 레지스터의 주소를 이용하여 I/O 장치를 제어할 수 있다. 148 | 149 | 150 | 151 | **1.3.3 전체 시스템의 구성** 152 | 153 | ![](http://cfile208.uf.daum.net/image/1220551F4B1D2EB905DBF0) 154 | 155 | ​ <컴퓨터시스템의 전체 구성도> 156 | 157 | 158 | 159 | - 프로그램 실행: CPU가 주기억장치로부터 프로그램 코드를 읽어서 실행한다. 160 | - 데이터 저장: 프로그램 실행 결과로서 얻어진 데이터를 주기억장치에 저장한다. 161 | - 데이터 이동: 디스크나 CD-ROM에 저장되어 있는 프로그램과 데이터 블록을 주기억장치로 이동한다. 162 | - 데이터 입력 및 출력: 사용자가 키보드를 통하여 보내는 명령이나 데이터를 읽어 들인다. 또한 CPU가 처리한결과 값이나 기억장치의 내용을 프린터(혹은 모니터)로 출력한다. 163 | - 제어: 프로그램이 순서대로 실행되도록 혹은 필요에 따라 실행 순서를 변경하도록 조정하며, 각종 제어 신호들을 발생한다. 164 | 165 | 166 | 167 | #### 1.4 컴퓨터 구조의 발전 과정 _ 28 ~ 36 page. 168 | 169 | ------ 170 | 171 | 초기의 컴퓨터들은 relay와 같은 기계식 부품들로 이루어 만들어졌다. 시간이 흘러 주요 부품들이 TR, IC 칩으로 대체되어 성능이 좋아지고 있다. CPU의 수를 증가시키거나 하나의 칩에 여러 CPU 코어를 포함시키기도 하며 많은 개선이 이루어지고 있다. 그럼에도 컴퓨터의 근본적인 설계 개념은 크게 바뀌지 않고있다. 172 | 173 | 174 | 175 | 컴퓨터의 근본적인 설계 개념은 누구에 의해 제안되었는가? 그 당시에 구현된 초기 컴퓨터의 구조를 분석하고 발전 경위를 살펴본다. 176 | 177 | ------ 178 | 179 | **1.4.1 초기 컴퓨터들의 구조** 180 | 181 | - 1642 Biaise Pascal: 덧셈, 뺄셈 182 | 183 | - 1671 Leibniz: 산술연산 184 | 185 | - 18xx Charles Babbage: Difference Engine(덧셈, 뺄셈 및 프린트 기능) 186 | 187 | ​ : Analytical Engine(산술연산 및 프린트 기능) 188 | 189 | ​ -> Mill(연산), Store(기억), 카드판독기(입력), 프린터와 카드천공기(출력) 190 | 191 | - 19xx von Neumann: ENIAC(진공관을 이용한 전자식 컴퓨터) 192 | 193 | - 단점: 프로그램을 저장하고 변경하는 것이 불가능 194 | - 위의 단점을 해결하기 위한 설계 개념: Stored-program 195 | - 2진수 체계 196 | - 프로그램과 데이터를 내부에 저장 197 | 198 | - 1952 von neumann: IAS 컴퓨터(위의 설계개념을 적용한 디지털 컴퓨터) 199 | 200 | - 프로그램 제어 유닛: 주기억장치로부터 명령어들을 한 개씩 가져와서 실행(IAS 작동)함. 201 | - 산술논리연산장치(ALU) 202 | - 주기억장치: 명령어와 데이터 모두 저장 203 | - 입출력장치 204 | - 특이사항: 한번에 두 개의 명령어가 인출된다. 하나의 명령어는 프로그램 제어 유닛으로 바로 들어가고 나머지 하나는 명령어 버퍼에 저장되어 있다가 다음 명령어 실행 사이클에 실핸된다. 이로 인해 기억장치 액세스 시간이 단축된다. 205 | 206 | ![](img\IAS 컴퓨터의 구조.JPG) 207 | 208 | ​ 209 | 210 | 이와 같이 폰노이만의 설계 개념을 따르는 컴퓨터들은 프로그램이 기억장치에 저장된 순서대로 실행된다. 그 기억장치의 주소는 PC(program counter)에 의해 지정된다. 211 | 212 | ***폰노이만 아키텍쳐***: 기억장치에 저장된 프로그램을 PC가 지정하는 순서대로 실행시킴. 데이터 메모리와 프로그램 메모리가 구분되어있지 않고 하나의 버스를 갖는 구조를 폰노이만 아키텍쳐라고 부른다. 213 | 214 | 215 | 216 | **1.4.2 주요 컴퓨터 부품들의 발전 경위** 217 | 218 | - 진공관 -> TR -> IC칩 219 | - IC칩의 제조과정: 220 | - Ingot 성장 -> 슬라이스 -> 실리콘웨이퍼 -> 조각내고 회로를 집적 -> IC칩 -> 패키징 221 | - 집적도에 따라 분류하면 다음과 같다 222 | - SSI(Small Scale IC): 소규모, 기본적인 디지털 게이트 223 | - MSI(Medium Scale IC): 수백 개의 TR들이 집적되어있음. counter, decoder, shift register 등. 224 | - LSI(Large Scale IC): 수천 개의 TR. 8bit 마이크로프로세서 칩 등. 225 | - VLSI(Very Large Scale IC): 수만~수십만 개의 TR. 마이크로프로세서 칩, 대용량 반도체 기억장치 등. 226 | - ULSI(Ultra Large Scale IC): 수백만 개 이상의 TR. 227 | 228 | 229 | 230 | 높은 집적도의 IC 칩들로 인해 시스템은 다음과 같은 이점을 얻을 수 있다 231 | 232 | - 회로들이 더 근접 -> 전기적 통로의 길이(버스 등)가 줄어들어 동작속도 향상 233 | - 컴퓨터의 크기가 감소 234 | - 회로들간의 연결이 칩 내부에서 발생 -> 불량(예를들면 냉납 등)률 감소 -> 부품들의 신뢰성 상승 235 | - 전력 소모 감소, 냉각장치가 간단해짐 236 | - 집적도와 상관없이 칩의 가격은 유지되어 컴퓨터 가격 하락 237 | 238 | 239 | 240 | **1.4.3 컴퓨터시스템의 분류와 발전 동향** 241 | 242 | 1970년 마이크로프로세서의 출현으로 미니컴퓨터의 시장이 성장했다. 243 | 244 | - 개인용 컴퓨터: 마이크로프로세서라는 획기적인 반도체 칩의 출현과 더불어 개발되기 시작한 컴퓨터. 245 | 246 | - 컴퓨터 구조상의 주요 동향은 다음과 같다. 247 | - 매 3~4년 마다 새로운 마이크로프로세서가 등장함. 248 | - 칩의 집적도 상승으로 속도와 신뢰성 향상. 249 | - CPU 내부 구조가 슈퍼스칼라 구조로 발전하며 명령어 실행 속도 향상. 250 | - 멀티-코어 프로세서의 출현으로 여러 프로그램의 동시 처리 가능. 251 | - 다양한 입출력이 가능해지면서 멀티미디어 PC로 발전. 252 | - GUI 제공 소프트웨어 탑재. 253 | - 고속 I/O 장치를 위한 새로운 버스 규격이 생김. 254 | - 기억장치의 용량이 크게 증가. 종류도 다양해짐. 255 | 256 | - 데스크탑 컴퓨터, 노트북 컴퓨터, 넷북, 태블릿 PC, 포켓 PC 등 다양한 제품이 출현함. 257 | 258 | - 임베디드 컴퓨터: 기계장치, 전자장치의 내부에 포함되어 그 장치들의 동작을 제어하는 컴퓨터들을 뜻한다. 임베디드 컴퓨터는 실시간으로 프로그램을 처리하는 경우가 많은데 이를 위하여 특수 설계된 하드웨어와 소프트웨어를 결합한 형태를 갖게된다. 또한 기억장치 용량을 줄이고 전력을 최소화 하는 등 자원을 최적화시키는 것이 특징 -> 유비쿼터스 컴퓨팅. 259 | 260 | - 중형급 컴퓨터시스템: 워크스테이션과 슈퍼미니컴퓨터로 구분된다. 261 | 262 | - 워크스테이션: 64비트 마이크로프로세서를 CPU로 갖으며 고속 그래픽 처리를 위한 하드웨어를 갖고있다. CAD, 동영상처리, 시뮬레이션 등에 사용함. 특징으로는 LINUX, UNIX를 OS로 사용한다. 263 | - 슈퍼미니컴퓨터: 미니컴퓨터보다 수십배의 성능을 내는 컴퓨터. 다중프로세서 시스템으로 구성되고 있다.일반적으로 하나의 시스템 버스에 다수의 프로세서와 주기억장치, I/O 장치들이 접속되어있다. 264 | - 대형 컴퓨터시스템을 사용하기 보다 여러 개의 중형급 컴퓨터시스템으로 컴퓨팅 환경을 구축하는 경향으로 가고있다. 이를 다운사이징이라 한다. 265 | 266 | - 대형 메인프레임 컴퓨터: 댱ㅅㅇ령 조정정차, 다중 I/O 채널을 이용한 고속 I/O 처리능력을 갖고있다. 정부기관, 은행, 대형 인터넷포털사이트 등에서 데이터베이스 저장 및 관리용으로 사용함. 267 | 268 | - 슈퍼컴퓨터: 현존하는 컴퓨터들 중 속도가 현저하게 높은 컴퓨터들을 슈퍼컴퓨터라 한다. 주로 대규모 과학계산 및 시뮬레이션에 사용. 269 | 270 | - 슈퍼컴퓨터는 구조적 특징에 따라 구분가능하다. 271 | - 파이프라인 슈퍼컴퓨터: CPU 내에 다수의 연산장치가 포함됨. 272 | - 대규모 병렬컴퓨터: 한 시스템 내에 수천~수만 개 이상의 프로세서를 포함. 하나의 큰 작업을 나누어 병렬처리함. 프로세서들 간의 통신 시간을 최소화할 수 있는 상호연결망 설계가 핵심이다. 273 | - 클러스터 컴퓨터: 고속 LAN이나 네트웨크 스위치에 의해 서로 연결된 PC들의 집합체를 뜻함. 각각의 PC를 노드라고 부르며 노드들에 포함된 모든 자원들을 통합하여 사용한다. 이를 단일 시스템 이미지라고 한다. 클러스터 컴퓨터는 시스템 신뢰도가 높다. 274 | 275 | 276 | 277 | ------ 278 | 279 | ------ 280 | 281 | --- 282 | 283 | -------------------------------------------------------------------------------- /chapter_2.md: -------------------------------------------------------------------------------- 1 | # 컴퓨터구조론 2 | 3 | ### chapter 02. CPU의 구조와 기능 4 | 5 | CPU는 기억장치에 저장되어 있는 프로그램 코드인 명령어들을 실행함으로써 프로그램 수행을 한다. 프로그램이 수행되는 과정은 다음과 같다. 6 | 7 | 8 | 9 | 1. 명령어 인출(fetch): 기억장치로부터 **명령어를 읽어온다**. 10 | 2. 명령어 해독(decode): 수행해야 할 동작을 결정하기 위하여 **명령어를 해독**한다. 11 | 12 | ------ 13 | 14 | 3. 데이터 인출(fetch): 명령어 실행을 위하여 데이터가 필요한 경우에는 기억장치 혹은 I/O 장치로부터 그 **데이터를 읽어온다**. 15 | 16 | 4. 데이터 처리(process): 데이터에 대한 산술적, 논리전 **연산을 수행**한다. 17 | 18 | 5. 데이터 저장(store): 수행한 결과를 **저장**한다. 19 | 20 | 21 | 22 | 1~2 는 모든 명령어들에 대하여 공통적으로 수행되며 3~5 는 명령어에 따라 필요한 경우에만 수행된다. CPU의 내부 구성요소를 살펴본 다음, 명령어 실행 과정의 분석을 통해 CPU의 동작원리를 설명한다. 그리고 파이프라이닝의 원리와 명령어 형식에 대해 분석한다. 23 | 24 | 25 | 26 | #### 2.1 CPU의 기본 구조 _ 53 page. 27 | 28 | 29 | 30 | ![](https://t1.daumcdn.net/cfile/tistory/1351F51F4C916CBD48) 31 | 32 | - 산술논리연산장치(ALU): 각종 산술/논리 연산을 수행하는 하드웨어 모듈. 33 | - 레지스터: CPU 내부의 기억장치. 액세스 속도가 컴퓨터의 기억장치중 가장 빠르지만 용량은 구조상 작을수 밖에 없다. 34 | - 제어 유닛: 명령어를 해석하고, 그것을 실행하기 위한 제어 신호들을 순차적으로 발생시키는 하드웨어 모듈. 명령어 실행에 필요한 각종 정보들의 전송통로와 방향을 지정하며 동작 시간을 결정해준다. 35 | 36 | 참고: RISC(Reduced Instruction Set Computer) - 명령어의 수를 최소화하고 명령어 형식을 단순화한 설계 개념. 37 | 38 | 39 | 40 | #### 2.2 명령어 실행 _ 55 ~ 71 page. 41 | 42 | CPU는 기억장치에 저장되어 있는 명령어들을 인출하여 실행함으로써 실제적인 작업을 수행하게 된다. 43 | 44 | - 명령어 사이클: 명령어를 실행하는데 필요한 전체 과정. 두 단계로 나누어져 있다. 45 | - 명령어 인출 단계: CPU가 기억장치로부터 명령어를 읽어오는 단계 46 | - 명령어 실행 단계: 인출된 명령어를 실행하는 단계 47 | 48 | 명령어 사이클은 CPU가 프로그램을 실행한 순간부터 전원을 끄거나 회복 불가능한 오류가 발생되어 중단될 때까지 반복하여 수행된다. 49 | 50 | 기본적으로 필요한 CPU 내부 레지스터들을 살펴보면 다음과 같다. 51 | 52 | - 프로그램 카운터(PC): 다음에 인출될 명령어의 주소를 가지고 있는 레지스터. 각 명령어가 인출된 후에는 그 내용이 자동적으로 1(혹은 명령어 길이에 해당하는 주소 단위의 수)가 증가되며, 분기(branch) 명령어가 실행되는 경우에는 그 목적지 주소로 갱신된다. 53 | - 누산기(AC): 데이터를 일시적으로 저장하는 레지스터. 이 레지스터는 Word 길이와 같다. 54 | - 명령어 레지스터(IR): 가장 최근에 인출된 명령어가 저장되어 있는 레지스터. 55 | - 기억장치 주소 레지스터(MAR): PC에 저장된 명령어 주소가 시스템 주소 버스로 출력되기 전에 일시적으로 저장되는 주소 레지스터. 즉, 주소 버스와 직접 접속됨. 56 | - 기억장치 버퍼 레지스터(MBR): 기억장치에 저장될 데이터 혹은 기억장치로부터 읽혀진 데이터가 일시적으로 저장되는 버퍼 레지스터. 데이터 버스와 직접 접속됨. 57 | 58 | 59 | 60 | ![](https://t1.daumcdn.net/cfile/tistory/1637B9234C916C7A30) 61 | 62 | ​ <주요 레지스터들과 데이터 통로가 표시된 CPU 내부구조> 63 | 64 | **2.2.1 인출 사이클** 65 | 66 | CPU는 각 명령어 사이클의 시작 단계에서 PC가 가리키는 기억장치의 위치로부터 명령어를 인출해온다. 그 후 CPU는 PC의 내용을 1 증가시킴으로써 명령어들을 기억장치에 저장되어 있는 순서대로 읽어올 수 있도록 해준다. 이를 마이크로 연산(CPU 클록의 각 주기동안 수행되는 기본적인 동작)으로 표현하면 다음과 같다. 67 | 68 | | t(주기) | 동작 | 비고 | 69 | | ------- | --------------------------- | --------------------------------------------------------- | 70 | | t0 | MAR <- PC | PC 내용을 내부 버스를 통해 MAR로 보냄 | 71 | | t1 | MBR <- M[MAR], PC <- PC + 1 | Memory의 MAR번지의 값이 MBR로 적재, PC = PC + 1(ins_size) | 72 | | t2 | IR <- MBR | MBR에 저장된 명령어가 레즈스터인 IR로 이동 | 73 | 74 | 명령어 인출에는 세 개 의 CPU 클록 주기 만큼의 시간이 걸린다. 그림으로 표현하면 다음과 같다. 75 | 76 | ![](https://slidesplayer.org/slide/14127708/86/images/13/Computer+Architecture.jpg) 77 | 78 | **2.2.2 실행 사이클** 79 | 80 | 실행 사이클에 대해 설명하기 이전에 명령어에 대해 간단하게 설명하겠다. 81 | 82 | - 명령어: 연산 코드 + 오퍼랜드(addr) 83 | - 연산 코드: CPU가 수행할 연산 84 | - 오퍼랜드: 명령어가 사용할 데이터가 저장되어 있는 기억장치의 주소 85 | 86 | 실행 사이클에서는 CPU가 인출된 명령어 코드를 해독(decode)하고, 그 결과에 따라 필요한 연산을 수행한다. CPU가 수행하는 연산들은 매우 다양한다, 그들은 크게 다음과 같은 네 가지로 분류할 수 있다. 87 | 88 | - 데이터 이동: CPU와 기억장치 간 혹은 CPU와 I/O 장치 간에 데이터를 이동한다. 89 | 90 | - ex) LOAD addr: 91 | 92 | | t(주기) | 동작 | 비고 | 93 | | ------- | --------------- | ---------------------------------------------------------- | 94 | | t0 | MAR <- IR(addr) | IR에 적재된 명령어의 오퍼랜드를 MAR을 통해 기억장치로 전달 | 95 | | t1 | MBR <- M[MAR] | addr이 지정하는 기억 장소로부터 데이터를 인출, MBR에 저장 | 96 | | t2 | AC <- MBR | MBR에 저장된 값을 AC에 적재 | 97 | 98 | - 데이터 처리: 데이터에 대하여 산술/논리 연산을 수행한다. 99 | 100 | - ex) ADD addr: 101 | 102 | | t(주기) | 동작 | 비고 | 103 | | ------- | --------------- | ---------------------------------------------------------- | 104 | | t0 | MAR <- IR(addr) | IR에 적재된 명령어의 오퍼랜드를 MAR을 통해 기억장치로 전달 | 105 | | t1 | MBR <- M[MAR] | addr이 지정하는 기억 장소로부터 데이터를 인출, MBR에 저장 | 106 | | t2 | AC <- AC + MBR | MBR의 값과 AC 레지스터의 값을 더하고 그 결과를 AC에 저장 | 107 | 108 | - 데이터 저장: 연산결과 데이터 혹은 입력장치로부터 읽어들인 데이터를 기억장치에 저장한다. 109 | 110 | - ex) STA addr: 111 | 112 | | t(주기) | 동작 | 비고 | 113 | | ------- | --------------- | --------------------------------------------- | 114 | | t0 | MAR <- IR(addr) | 데이터를 저장할 기억 장소의 주소를 MAR로 보냄 | 115 | | t1 | MBR <- AC | 저장할 데이터를 MBR로 이동 | 116 | | t2 | M[MAR] <- MBR | MBR의 값을 기억장치의 MAR주소에 저장 | 117 | 118 | - 프로그램 제어: 프로그램의 실행 순서를 결정한다. 119 | 120 | - ex) JUMP addr: 121 | 122 | | t(주기) | 동작 | 비고 | 123 | | ------- | -------------- | ----------------------------------------- | 124 | | t0 | PC <- IR(addr) | IR에 적재된 명령어의 오퍼랜드를 PC로 적재 | 125 | 126 | - 위와 같이 다른 위치의 명령어로 실행 순서를 바꾸도록 해주는 명령어를 분기(branch) 명령어라고 한다. 127 | 128 | ![](https://image3.slideserve.com/5971168/slide21-n.jpg) 129 | 130 | 131 | 132 | 위에서 설명한 과정들을 어셈블리 프로그램을 이용하여 나타내보면 다음과 같다. 133 | 134 | - 편의상 기계 코드를 10진수로 표현하였다. 135 | - LOAD 1, STA 2, ADD 5, JUMP 8로 가정하였다. 136 | - 즉, 기계 코드의 첫 숫자는 연산 코드이고 그 다음 세 숫자들은 오퍼랜드로서 기억장치 주소를 나타낸다. 137 | 138 | | 주소 | 명령어 | 기계 코드 | 139 | | ---- | -------- | --------- | 140 | | 100 | LOAD 250 | 1 250 | 141 | | 101 | ADD 251 | 5 251 | 142 | | 102 | STA 251 | 2 251 | 143 | | 103 | JUMP 170 | 8 170 | 144 | 145 | 위의 프로그램을 단계별로 분석하면 다음과 같다. 146 | 147 | - 단계 1: 첫 번째 명령어 인출(주소 100번지). 이 주소의 내용인 명령어 코드가 인출되어 IR에 저장된다. 148 | - 단계 2: 인출된 명령어의 연산 코드는 LOAD 즉, AC 레지스터에 데이터를 적재하는 것. 주소는 250번지. 따라서 250 번지의 데이터를 AC로 이동. PC <- PC + 1 149 | - 단계 3: 두 번째 명령어 인출(주소 101번지) . IR에 명령어 저장. 150 | - 단계 4: 연산 코드는 ADD이다. 즉, AC의 값과 251번지의 값을 ALU로 보내 더한 후 그 결과를 AC에 저장한다. PC <- PC + 1 151 | - 단계 5: 세 번째 명령어 인출(주소 102번지). IR에 명령어 저장. 152 | - 단계 6: 연산 코드 STA. 오퍼랜드 251. AC의 내용을 251 번지에 저장한다. PC <- PC + 1. 153 | - 단계 7: 네 번째 명령어 인출(주소 103번지). IR에 명령어 저장. 154 | - 단계 8: 연산 코드 JUMP. 오퍼랜드 170. PC <- addr(170). 155 | 156 | ![](img\프로그램 실행 과정의 예.JPG) 157 | 158 | 159 | 160 | **2.2.3 인터럽트 사이클** 161 | 162 | 프로그램 처리 중에 CPU로 하여금 순차적인 명령어 실행을 중단하고 다른 프로그램을 처리하도록 요구할 수 있는 메커니즘을 **인터럽트**라고 부른다. 163 | 164 | CPU가 어떤 프로그램을 순차적으로 수행하는 도중에 외부에서 인터럽트 요구가 들어오면 CPU는 원래의 작업을 중단하고 요구된 인터럽트를 처리해주기 위한 프로그램(인터럽트 서비스 루틴)을 먼저 수행한다. 그리고 인터럽트에 대한 처리가 끝나면 CPU는 원래의 프로그램으로 복귀하여 그 수행을 계속한다. 165 | 166 | ![](https://slidesplayer.org/slide/15492369/93/images/13/%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8%EC%97%90+%EC%9D%98%ED%95%9C+%EC%A0%9C%EC%96%B4+%EC%9D%B4%EB%8F%99+%5B%EA%B7%B8%EB%A6%BC+10-8%5D+%EC%9D%B8%ED%84%B0%EB%9F%BD%ED%8A%B8%EC%97%90+%EC%9D%98%ED%95%9C+%EC%A0%9C%EC%96%B4+%EC%9D%B4%EB%8F%99.jpg) 167 | 168 | 인터럽트 요구가 들어왔다면, CPU는 다음과 같은 동작을 수행한다. 169 | 170 | - 다음에 실행할 명령어의 주소가 가리키는 현재의 PC 값을 스택에 저장한다. 인터럽트 처리를 완료한 후 복귀할 주소를 저장해두기 위한 절차. 171 | - 해당 인터럽트 서비스 루틴을 호출하기 위해 그 루틴의 시작 주소를 PC에 적재한다. 시작 주소는 정해지거나 전송됨. 172 | 173 | 인터럽트 요구 신호를 검사하고, 현재의 PC내용을 스택에 저장한 다음에, PC에 해당 ISR의 시작 주소를 적재하는 과정을 인터럽트 사이클이라고 한다. 174 | 175 | 인터럽트 사이클을 시작하기 전에 CPU는 인터럽트가 가능한 상태로 세트되어 있는지를 먼저 확인해야 한다. 또한 중요한 프로그램이 실행되는 중이라서 CPU가 인터럽트를 받지 못하도록 세트되어 있는 경우라면, 인터럽트 사이클은 실행되지 않는다. 이 때, 인터럽트를 받을 수 있는 상태를 인터럽트 가능 상태라고 하며 그 반대를 인터럽트 불가능 상태라고 부른다. 176 | 177 | 인터럽트 요구가 들어온 경우를 마이크로 연산으로 표현하면 다음과 같다. 178 | 179 | | t(주기) | 동작 | 비고 | 180 | | ------- | -------------------------------------- | -------------------------------------------------- | 181 | | t0 | MBR <- PC | PC의 내용이 MBR로 보내짐 | 182 | | t1 | MAR <- SP(스택 포인터), PC <- ISR 주소 | SP값이 MAR을 통해 버스로 나감, PC에는 ISR주소 적재 | 183 | | t2 | M[MAR] <- MBR, SP <- SP - 1 | MBR에 저장된 값을 스택에 저장, SP값 수정(TOS) | 184 | 185 | SP는 CPU 내부의 특수 목적용 레지스터중 하나이다. SP의 내용은 항상 스택의 최상위 주소(Top Of Stack)를 가리킨다. 일반적으로 스택은 주기억장치의 끝 부분이 사용되기 때문에, SP의 초기값은 주기억장치의 마지막 주소로 세트된다. 186 | 187 | 인터럽트 사이클에서 유의해야 할 것이 있다. 이전 명령어에 의해 처리된 결과값이 AC 레지스터에 적재되어 있다고 하자. 이 때, 인터럽트 요구가 들어와 인터럽트 사이클이 실행되었다면 인터럽트 서비스 루틴이 수행되는 동안 AC 레지스터의 값이 바뀔 수 있다. 이럴 경우 문제가 발생할 수 있다. 따라서 인터럽트 서비스 루틴의 시작단계에서 레지스터들의 내용을 스택에 저장하였다가, 루틴의 마지막 단계에서 원래 프로그램으로 복귀하기 직전에 그들을 복원시켜주는 절차가 필요하다. 188 | 189 | 190 | 191 | 인터럽트 서비스 루틴이 수행되는 동안 다른 외부 장치로부터 인터럽트 요구를 발생할 수도 있는데, 이것을 다중 인터럽트 라고 한다. 이를 처리하는 방법으로는 두 가지가 있다. 192 | 193 | ​ 방법 1. CPU가 인터럽트 서비스 루틴을 수행하는 도중에는 새로운 인터럽트 요구가 들어오더라도 인터럽트 사이클을 수행하지 않도록 한다. 즉 인터럽트 불가능 상태. 194 | 195 | ​ 방법 2. 인터럽트 요구들 간에 우선순위를 정하고, 우선순위가 낮은 인터럽트 요구를 처리하고 있는 동안에 우 선순위가 더 높은 인터럽트 요구가 들어오면, 현재의 인터럽트 서비스 루틴의 수행을 중단하고 새로운 인터럽 트를 처리하도록 한다. 196 | 197 | ![](https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcSyjfyQFVNijSFZ9r5PGeXEdqna5qhy9eC01JBer0cFTfSJP4Nwbg) 198 | 199 | ​ <다중 인터럽트에서 프로그램이 실행되는 순서> 200 | 201 | 202 | 203 | **2.2.4 간접 사이클** 204 | 205 | 간접사이클이란 실행 사이클에서 사용될 데이터의 실제 주소를 기억장치로부터 읽어오는 과정이다. 실제 주소란 말의 의미는 연산에서 사용될 데이터가 주기억장치의 어딘가에 저장되어 있고, 명령어에 포함된 주소(addr)는 연산에서 사용될 데이터의 주소를 가리키고 있는 주소가 들어있을 때, 연산에서 사용될 데이터의 주소를 의미한다. 206 | 207 | | t(주기) | 동작 | 비고 | 208 | | ------- | --------------- | ------------------------------------------------------------ | 209 | | t0 | MAR <- IR(addr) | 명령어에 포함된 addr 주소를 MAR로 옮김 | 210 | | t1 | MBR <- M[MAR] | 주 기억 장치의 MAR번지에 저장되어 있는 값을 MBR로 옮김 | 211 | | t2 | IR(addr) <- MBR | MBR에 있는 값이 연산에 사용할 데이터가 있는 주소기 때문에 IR로 옮김 | 212 | 213 | 214 | 215 | #### 2.3 명령어 파이프라이닝 _ 72 ~ 84 page. 216 | 217 | 명령어 파이프라이닝이란 명령어 실행에 사용되는 하드웨어를 여러 단계로 분할하고, 동시에 서로 다른 명령어들을 처리함으로써 처리 속도를 높여주는 기술이다. 이는 분할되는 단계의 수가 많아질수록 처리 속도가 높아진다. 218 | 219 | 220 | 221 | **2.3.1 2-단계 명령어 파이프라인** 222 | 223 | 두 단계로 하드웨어를 나누어 두 개의 파이프라인 단계를 구성할 수 있다. 224 | 225 | - 인출 단계 226 | - 실행 단계 227 | 228 | 그 후 두 단계들에 하나의 클록 신호를 동시에 인가한다면, 그 단계들의 동작 시간을 일치시킬 수 있다. 그리고 각 단계는 서로 다른 명령어에 대하여 각자의 동작을 수행할 수 있게 된다. 229 | 230 | ![](https://image3.slideserve.com/5908279/slide37-n.jpg) 231 | 232 | - 첫 번째 클록 주기: 인출 단계가 첫 번째 명령어를 인출한다. 233 | - 두 번째 클록 주기: 실행 단계가 첫 번째 클록 주기에서 인출된 명령어를 실행한다. 인출 단계가 두 번째 명령어를 인출한다. 234 | - 세 번째 클록주기: 실행 단계가 두 번째 클록 주기에서 인출된 명령어를 실행한다. 인출 단계가 세 번째 명령어를 인출한다. 235 | 236 | 참고: 다음에 실행될 명령어를 미리 인출하는 것을 명령어 선인출(인출 중복)이라고 한다. 237 | 238 | 239 | 240 | 2 단계 명령어 파이프라인은 이론상 2배가 빠를 것 같지만 인출 단계와 실행 단계의 처리 속도가 차이가 나기 때문에 실제로 두 배만큼 빨라질 수 없다. 241 | 242 | 243 | 244 | **2.3.2 4-단계 명령어 파이프라인** 245 | 246 | 2-단계 명령어 파이프라인에서 실행 단계를 더 분할함으로써 각 단계들의 처리 시간을 거의 같아지도록 할 것 이다. 분할된 네 단계는 다음과 같다. 247 | 248 | - 명령어 인출(IF): 명령어를 기억장치로부터 인출한다. 249 | - 명령어 해독(ID): 해독기(decoder)를 이용하여 명령어를 해석한다. 250 | - 오퍼랜드 인출(OF): 기억장치로부터 오퍼랜드를 인출한다. 251 | - 실행(EX): 지정된 연산을 수행하고, 결과를 저장한다. 252 | 253 | 이와 같은 방식으로 단계들을 구성하면 각 단계에서 걸리는 시간들이 거의 같아질 수 있다. 254 | 255 | ![](https://image3.slideserve.com/5908279/slide40-n.jpg) 256 | 257 | 258 | 259 | 파이프라이닝을 이용하여 얻을 수 있는 속도 향상을 일반적인 관계식으로 표현하면 다음과 같다. 260 | 261 | | T = k + (N - 1) | 262 | | :----------------------------------------------------------: | 263 | | T: 전체 명령어 실행 시간, k: 파이프라인 단계의 수, N: 실행할 명령어들의 수 | 264 | 265 | | Sp = (k * N) / (k + (N - 1)) | 266 | | :----------------------------------------------------------: | 267 | | Sp: 속도 향상, k: 파이프라인 단계의 수, N: 실행할 명령어들의 수 | 268 | 269 | 이와 같이 4-단계 파이프라이닝을 이용하면 분명히 속도 향상을 얻을 수 있다. 그러나 여기에도 문제는 존재한다. 270 | 271 | - 문제 1: 모든 명령어가 4 개의 파이프라인 단계들을 모두 거치지는 않는다. 272 | 273 | - 문제 2: 모든 단계중 가장 처리 속도가 느린 단계를 기준으로 파이프라인 클록이 정해져야 한다. 274 | - 보완 방법: 파이프라인 단계들을 더욱 작게 분할함으로써 처리 시간의 차이를 최소화시켜주는 슈퍼파이프라이닝 기술을 사용한다. 275 | 276 | - 문제 3: 하나의 기억장치를 두 단계가 동시에 액세스할 수 없기 때문에 둘 중의 하나는 지연될 수밖에 없다. 277 | - 보완 방법: IF, OF 단계에서 직접 액세스하는 CPU 내부 캐시를 명령어 캐시와 데이터 캐시로 분리시키는 방법을 사용한다. 278 | 279 | - 문제 4: 분기 명령어가 실행된다면 미리 인출되어 파이프라인에서 처리되던 명령어들이 무효화될 수 있다. 280 | - 보완 방법 1. 분기 예측 : 분기가 일어날 것인지를 예측하고, 그에 따라 어느 경로의 명령어를 인출할 지를 결정하는 확률적 방법. 분기 역사 표를 참조하는 방법이 가장 널리 사용됨. 281 | - 보완 방법 2. 분기 목적지 선인출: 조건 분기가 인식되면, 분기 명령어의 다음 명령어뿐 아니라, 조건이 만족될 경우에 분기하게 될 목적지의 명령어도 함께 인출하는 방식. 명령어를 미리 인출해서 지연 시간을 줄일 수 있다. 282 | - 보완 방법 3. 루프 버퍼: 이 버퍼는 파이프라인의 명령어 인출 단계에 포함되어 있는 작은 고속 기억장치인데, 가장 최근 인출된 일정 개수의 명령어들이 순서대로 저장되어 있다. 분기가 발생하면, 하드웨어는 분기 목적지의 명령어가 버퍼에 있는지를 검사하고 있다면 다음 명령어는 버퍼로부터 인출된다. 작은 반복 루프들이 포함된 프로그램 처리에 효과가 높음. 283 | - 보완 방법 4. 지연 분기: 프로그램 내의 명령어들을 재배치함으로써 파이프라인의 성능을 개선함. 즉, 분기 명령어의 위치를 조정하여 성능 저하를 최소화함. 284 | 285 | 조건 분기 명령어에서 사용하는 조건들은 CPU 내부의 상태 레지스터에 저장되어 있다. 각각의 조건은 다음과 같다. 286 | 287 | - 부호(S): 부호를 의미. 288 | - 제로(Z): 연산 결과가 0. 289 | - 올림수(C): carry/borrow가 발생. 290 | - 동등(E): 두 수를 비교한 결과가 동일. 291 | - 오버플로우(V): 오버플로우 발생. 292 | - 인터럽트(I): 인터럽트 가능/불가능 표시. 293 | - 슈퍼바이저(P): 슈퍼바이저 모드일 경우 세팅됨. 294 | 295 | 296 | 297 | **2.3.3 슈퍼스칼라** 298 | 299 | 슈퍼스칼라는 CPU 내에 여러 개의 명령어 파이프라인들을 두어, 동시에 그 수만큼의 명령어들을 실행할 수 있도록 한 구조이다. 300 | 301 | 다음은 2-way 슈퍼스칼라의 예시이다. 302 | 303 | ![](http://farm5.staticflickr.com/4399/36493144603_f74634a326_b.jpg) 304 | 305 | 슈퍼스칼라의 유의할 점 으로는 동시에 처리할 명령어들이 서로 간에 영향을 받지 않고 독립적으로 실행될 수 있어야 한다는 것이다. 즉, 두 명령어들 사이에 데이터 의존성이 존재하지 않아야 한다. 306 | 307 | 308 | 309 | 슈퍼스칼라를 이용한 속도 향상 관계를 분석해보면 다음과 같다. 310 | 311 | | T(m) = k + (N - m) / m | 312 | | :----------------------------------------------------------: | 313 | | T(m): 전체 시간, k: 파이프라인의 단계들의 수, N: 명령어들의 수, m: m-way 슈퍼스칼라 | 314 | 315 | | Sp = T(1) / T(m) = (k + N - 1) / (k + (N - m) / m) | 316 | | :----------------------------------------------------------: | 317 | | T(m): 전체 시간, k: 파이프라인의 단계들의 수, N: 명령어들의 수, m: m-way 슈퍼스칼라 | 318 | 319 | 320 | 321 | **2.3.4 듀얼 코어 및 멀티 코어** 322 | 323 | 여러 개의 CPU 코어를 한 칩에 넣은 프로세서 칩을 멀티-코어 프로세서 라고 한다. 예를 들어 두 개의 CPU 코어를 넣은 프로세서 칩은 듀얼 코어 프로세서 라고 부르고, 네 개의 CPU 코어를 넣은 프로세서 칩은 쿼드 코어 프로세서라고 한다. 324 | 325 | 각 CPU 코어는 앞에서 설명한 슈퍼스칼라 구조로 구성된다. 그러나 각 CPU 코어는 슈퍼스칼라에 비하여 독립성이 더 높다. 즉, CPU 코어는 독립적으로 프로그램을 수행하며 필요한 경우에만 공유 캐시를 통해 정보를 교환한다. 이와 같은 프로그램 동시처리 기술을 멀티 태스킹, 멀티 스레딩 이라고 한다. 326 | 327 | 328 | 329 | 330 | 331 | #### 2.4 명령어 세트 _ 85 ~ 111 page. 332 | 333 | CPU의 기능은 명령어들에 의하여 결정된다. 명령어들의 종류와 수는 CPU마다 약간씩 다른데, 어떤 한 CPU를 위해 정의되어 있는 명령어들의 집합을 명령어 세트라 한다. 명령어 세트를 설계하기 위해서는 다음과 같은 사항들을 먼저 결정해야 한다. 334 | 335 | - 연산 종류: CPU가 수행할 연산들의 수와 종류 및 복잡도 -> 2.4.1 336 | - 데이터 형태: 연산이 수행될 데이터들의 형태. 즉, 데이터의 길이(비트 수)와 수의 표현방식(정수, 부동소수점) 등 -> chap. 3에서 분석할 예정 337 | - 명령어 형식: 명령어의 길이, 오퍼랜드 필드들의 개수와 길이 등 -> 2.4.2 338 | - 주소지정 방식: 오퍼랜드의 주소를 지정하는 방식 -> 2.4.3 339 | 340 | 341 | 342 | **2.4.1 연산의 종류** 343 | 344 | 어떤 컴퓨터든 반드시 수행 할 수 있어야 하는 기본적인 연산들이 있는데, 그들을 분류하여 설명하면 다음과 같다. 345 | 346 | - 데이터 전송: X2X 데이터를 이동하는 동작. 이 과정에서 기억장치의 주소를 계산해야 한다. 347 | 348 | - 산술 연산: 기본적인 산술 연산. 정수와 부동소수점 수에 대한 산술적 연상이 포함된다. 349 | 350 | - 논리 연산: 각 비트들 간의 논리적인 연산. 351 | 352 | - 입출력: CPU와 외부 장치들 간의 데이터 이동을 위한 동작들이 수행된다. 353 | 354 | - 프로그램 제어: 명령어 실행 순서를 변경하는 연산들이 필요하다. 이 분류의 연산들로는 분기와 서브루틴 호출 등이 있다. 서브루틴 호출을 수행하기 위해서는 두 가지 기본적인 명령어가 필요하다. 355 | 356 | - CALL: 서브루틴을 호출하는 명령어 357 | 358 | - RET: 서브루틴으로부터 원래 프로그램으로 복귀시키는 명령어. CALL 명령어 다음에 위치한 명령어부터 계속 실행하도록 해준다. 359 | 360 | ![](https://image3.slideserve.com/5908279/slide52-n.jpg) 361 | 362 | - CALL 및 RET 명령어들이 실행될 때는 스택을 반드시 사용해야 되기 때문에, 그 과정을 좀 더 자세히 살펴보기로 한다. 먼저 X번지에 위치한 서브루틴을 호출하는 CALL X 명령어의 실행 과정을 분석해본다. 363 | 364 | - CALL X 명령어의 마이크로 연산 365 | 366 | | t(주기) | 동작 | 비고 | 367 | | ------- | --------------------------- | -------------------------------------------------- | 368 | | t0 | MBR <- PC | PC의 주소를 TOS에 저장하기 위해 MBR로 값을 이동함. | 369 | | t1 | MAR <- SP, PC <- X | SP번지에 저장하기 위해 MAR로 값을 이동. PC는 X값. | 370 | | t2 | M[MAR] <- MBR, SP <- SP - 1 | M의 MAR번지에 MBR값 저장, 1스택 쌓였기 때문에 SP-1 | 371 | 372 | - RET 명령어의 마이크로 연산 373 | 374 | | t(주기) | 동작 | 비고 | 375 | | ------- | ------------ | --------------------------------------------------------- | 376 | | t0 | SP <- SP + 1 | SP의 값을 증가시켜 복귀 주소가 저장된 스택 위치를 가리킴. | 377 | | t1 | MAR <- SP | 복귀 주소를 스택으로부터 인출. | 378 | | t2 | PC <- M[MAR] | PC에 적재. | 379 | 380 | - 다음 그림은 CALL, RET 명령어가 수행되는 동안의 스택의 변화를 보여준다. 381 | 382 | ![](https://image3.slideserve.com/5908279/slide54-n.jpg) 383 | 384 | 385 | 386 | 387 | 388 | **2.4.2 명령어 형식** 389 | 390 | 각 명령어는 CPU에 의해 실행될 때 제공해야 할 모든 정보를 포함하고 있어야 하는데, 그들 중에서 가장 기본적인 요소들을 나열하면 다음과 같다. 391 | 392 | - 연산코드: 수행될 연산을 지정해줌.(ex. LOAD, ADD) 393 | - 오퍼랜드: 연산을 수행하는데 필요한 데이터 혹은 데이터의 주소를 나타낸다. 각 연산은 한 개 혹은 두 개의 입력 오퍼랜드들과 한 개의 결과 오퍼랜드를 가질 수 있다. 394 | - 다음 명령어 주소: 현재의 명령어 실행이 완료된 후 다음 명령어를 인출할 위치를 나타낸다. 분기 혹은 호출 명령어와 같이 실행순서를 변경하는 경우에만 필요. 395 | 396 | 각 명령어는 일련의 비트들에 의해 표현된다. 명령어를 구성하는 비트들은 용도에 맞게 몇개의 필드들로 나눌 수 있는데, 필드의 수와 배치 방식 및 각 필드에 포함되는 비트 수를 정의한 것을 명령어 형식이라 한다. 일반적으로 명령어의 길이는 Word의 길이와 같다(CPU에 따라 명령어의 길이가 Word의 n배일 수도 있음). 397 | 398 | 예를 들어 세 개의 필드로 구성된 경우를 고려해보자. 399 | 400 | ![](https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcTxbTKRglJKEIuhrcpvo1scvBHuRMoPzVf8y4yNOKdbGm5uHRGPVA) 401 | 402 | 연산 코드의 비트 수는 CPU가 수행할 수 있는 연산들의 수를 결정해준다. 위 예시에서는 연산 코드 필드의 길이가 4비트이므로, 16가지의 연산을 수행할 수 있다. 403 | 404 | 오퍼랜드 필드는 오퍼랜드가 아래와 같은 세 가지 중의 어떤 것인지에 따라 필요한 비트 수가 달라질 수 있으며, 배정되는 비트들의 수에 따라 각각의 범위가 결정된다. 405 | 406 | - 데이터: 표현 가능한 수의 크기가 결정됨. 407 | - 기억장치 주소: CPU가 오퍼랜드 인출을 위하여 직접 주소를 지정할 수 있는 기억장치 영역의 범위가 결정됨. 408 | - 레지스터 번호: 데이터 저장에 사용될 수 있는 내부 레지스터들의 수가 결정됨. 409 | 410 | 411 | 412 | 명령어 형식을 설계하는 방법은 다음과 같다. 먼저, 명령어의 비트들을 연산의 종류와 수에 따라 필요한 만큼 연산 코드 필드에 배정하고, 나머지 비트들은 오퍼랜드들을 위해 적절히 배정하면 된다. 413 | 414 | - ex) ADD X ; AC <- AC + M[X] , X는 데이터가 저장되어 있는 기억장치 주소를 나타냄. 415 | 416 | 위의 명령어는 해석하면, 417 | 418 | > 기억장치 X번지의 내용과 AC의 내용을 더하고, 그 결과를 다시 AC에 저장하라. 419 | 420 | 이다. 이와 같이 명령어가 한 개의 오퍼랜드만 포함하는 것을 1-주소 명령어라 한다. 421 | 422 | - ex 2) ADD R1, R2 ; R1 <- R1 + R2 423 | 424 | 위의 명령어는 해석하면 425 | 426 | > 레지스터 R1, 레지스터 R2에 적재되어 있는 데이터를 더하고, 결과값을 레지스터 R1에 저장하라. 427 | 428 | 이다. 명령어에 두개의 오퍼랜드가 필요한 이런 경우 2-주소 명령어라고 한다. 429 | 430 | - ex 3) ADD R1, X ; R1 <- R1 + M[X] 431 | 432 | 그런데 위와 같은 명령어의 경우 명령어 코드 내에 레지스터 번호와 기억장치 주소가 모두 포함되어야 하므로, 주소지정 할 수 있는 기억장치 영역이 상당히 제한된다. 433 | 434 | - ex 4) ADD R1, R2, R3 ; R1 <- R2 + R3 435 | 436 | 이 명령어는 세 개의 오퍼랜드들을 포함하지만, 각각은 레지스터이기 때문에 비트 수가 많이 소요되지는 않는다. 437 | 438 | 이렇게 명령어에 포함되는 오퍼랜드의 수에 따라 여러가지 명령어 형식들이 존재할 수 있는데, 이러한 형식은 프로그램의 길이에 직접적인 영향을 미친다. 이를 확인하기 위한 실제 예로 다음 문제를 앞에서 설명한 명령어 형식으로 풀어보자. 439 | 440 | - X = (A + B) * (C - D) 441 | - 사용할 니모닉스: 442 | - ADD 443 | - SUB 444 | - MUL 445 | - DIV 446 | - MOV 447 | - LOAD 448 | - STOR 449 | 450 | 1. 1-주소 명령어들을 사용한 프로그램 451 | 452 | | 니모닉스 | 동작 | 453 | | -------- | --------------- | 454 | | LOAD A | AC <- M[A] | 455 | | ADD B | AC <- AC + M[B] | 456 | | STOR T | M[T] <- AC | 457 | | LOAD C | AC <- M[C] | 458 | | SUB D | AC <- AC - M[D] | 459 | | MUL T | AC <- AC * M[T] | 460 | | STOR X | M[X] <- AC | 461 | 462 | 463 | 464 | 2. 2-주소 명령어들을 사용한 프로그램 465 | 466 | | 니모닉스 | 동작 | 467 | | ---------- | --------------- | 468 | | MOV R1, A | R1 <- M[A] | 469 | | ADD R1, B | R1 <- R1 + M[B] | 470 | | MOV R2, C | R2 <- M[C] | 471 | | SUB R2, D | R2 <- R2 - M[D] | 472 | | MUL R1, R2 | R1 <- R1 * R2 | 473 | | STOR X, R1 | M[X] <- R1 | 474 | 475 | 3. 3-주소 명령어를 사용한 프로그램 476 | 477 | | 니모닉스 | 동작 | 478 | | ------------- | ----------------- | 479 | | ADD R1, A, B | R1 <- M[A] + M[B] | 480 | | SUB R2, C, D | R2 <- M[C] - M[D] | 481 | | MUL X, R1, R2 | M[X] <- R1 * R2 | 482 | 483 | 레지스터의 수와 기억장치 용량이 고정된 상태에서 이 명령어 형식을 사용하면 명령어의 비트 수가 늘어나게 된다. 결과적으로 프로그램 길이는 줄어들지만 프로그램을 저장하기 위한 기억장치 용량은 별로 줄어들지 않으며, 명령어 해독 과정이 더 복잡해지는 단점도 있다. 484 | 485 | 486 | 487 | **2.4.3 주소지정방식** 488 | 489 | 일반적으로 명령어 비트의 수는 CPU가 처리하는 Word의 길이와 같도록 제한된다. 그와 같이 제한된 수의 명령어 비트들을 이용하여 사용자로 하여금 가능한 다양한 방법으로 오퍼랜드를 지정하고 더 큰 용량의 기억장치를 사용할 수 있도록 하기 위하여 여러가지 주소지정 방식(오퍼랜드의 유효 주소를 결정하는 방법)들이 제안되어 있다. 그 설명을 위해 다음과 같은 표기들을 사용한다. 490 | 491 | - EA: 유효주소, 즉 데이터가 저장된 기억장치의 실제 주소 492 | - A: 명령어 내의 주소 필드 내용(오퍼랜드가 기억장치 주소인 경우) 493 | - R: 명령어 내의 레지스터 번호(오퍼랜드가 레지스터 번호인 경우) 494 | - (A): 기억장치 A번지의 내용 495 | - (R): 레지스터 R의 내용 496 | 497 | 주소지정 방식에 따라 유효 주소인 EA가 결정되며, EA는 실제 데이터를 읽어오기 위한 주소로 사용된다. 주소지정 방식이 복잡해질 수록 EA를 결정하는데 걸리는 시간이 길어진다. 498 | 499 | 1. 직접 주소지정 방식: 명령어 내 오퍼랜드 필드의 내용이 데이터의 유효 주소로 사용되는 가장 간단한 방식. 즉, **EA = A** 500 | 501 | ![](https://t1.daumcdn.net/cfile/tistory/222ECB3B5720A54F25) 502 | 503 | - 장점: 이 방식을 이용하며 데이터 인출을 위하여 한 번의 기억장치 액세스만 필요하며, 유효 주소 결정을 위한 다른 절차나 계산이 필요없다. 504 | 505 | - 단점: 기억장치 주소 공간이 오퍼랜드 필드의 비트 수에 의해 제한된다. 506 | 507 | 2. 간접 주소지정 방식: 오퍼랜드가 가리키는 기억장치의 내용을 유효 주소로 사용하여 연산에 필요한 데이터를 인출하는 방식으로서, 두 번의 기억장치 액세스가 필요함. 즉, **EA = (A)** 508 | 509 | ![](https://t1.daumcdn.net/cfile/tistory/2740FC375720AD7E07) 510 | 511 | - 장점: 최대 기억장치 용량은 기억 장소에 저장된 전체 비트 수에 의해 결정되므로, 범위가 확장됨. 512 | - 단점: 실행 사이클 동안 두 번의 기억장치 액세스가 필요하다. 513 | 514 | ![](https://t1.daumcdn.net/cfile/tistory/275FA2355720B02821) 515 | 516 | - 명령어 형식에 간접 비트(I)가 포함되어야 한다. ((i == 1) ? 간접 주소방식 : 직접 주소방식) 517 | - 여러 단계의 간접 지정도 가능하다. 이러한 방식을 다단계 혹은 연속적 간접 주소 지정 방식이라고 부르며, 유효 주소는 EA = ((..(A)..)) 로 표현가능하다. 518 | 519 | 3. 묵시적 주소지정 방식: 명령어 실행에 사용될 데이터가 묵시적으로 지정되어 있는 방식. 예를 들면 shift 연산의 경우 오퍼랜드 필드가 없지만 자동적으로 누산기에 대하여 연산이 수행된다. 520 | 521 | - 장점: 오퍼랜드가 없거나 한 개뿐이기 때문에 명령어 길이가 짧다. 522 | 523 | 4. 즉시 주소지정 방식: 명령어 내에 포함되어 있는 데이터를 연산에 직접 사용하는 방식. 데이터의 인출 과정이 별도로 필요하지 않다. 524 | 525 | ![](https://t1.daumcdn.net/cfile/tistory/22417B4F5720B1151C) 526 | 527 | 이 방식은 주로 프로그램에서 레지스터나 변수의 초기 값을 어떤 상수값으로 세트하는데 주로 사용된다. 528 | 529 | - 장점: 기억장치에 액세스할 필요가 없기 때문에 실행 사이클이 짧아진다. 530 | - 단점: 사용할 수 있는 수의 크기가 오퍼랜드 필드의 비트 수에 의해 제한된다. 531 | 532 | 5. 레지스터 주소지정 방식: 명령어의 오퍼랜드가 가리키는 레지스터에 저장되어 있는 데이터를 연산에 사용하는 방식. 즉, 오퍼랜드 필드의 내용은 레지스터 번호로 사용되며, 그 번호가 가리키는 레지스터의 내용이 명령어 실행과정에서 데이터로 사용된다. **EA = R** 533 | 534 | ![](https://t1.daumcdn.net/cfile/tistory/240A474C5720B50E1E) 535 | 536 | - 장점: 기억장치에 액세스할 필요가 없다, 오퍼랜드 필드의 비트 수가 적어도 된다(레지스터 세트는 용량이작기 때문) 537 | - 단점: 데이터가 저장될 수 있는 위치가 CPU 내부 레지스터로 제한된다. 538 | 539 | 6. 레지스터 간접 주소지정 방식: 지정된 레지스터의 내용을 유효 주소로 사용하여, 그 주소가 가리키는 기억장치로부터 읽어온 데이터를 연산에 사용하는 방식. 즉, **EA = (R)** 540 | 541 | ![](https://t1.daumcdn.net/cfile/tistory/2341373F5720B7411A) 542 | 543 | 7. 변위 주소지정 방식: 지정된 레지스터의 내용과 명령어 내 오퍼랜드(변위)를 더하여 유효 주소를 결정하는 주소지정 방식. **EA = A + (R)** 544 | 545 | - 두 개의 오퍼랜드를 갖는다. 하나는 변위를 나타내는 주소 A, 나머지 하나는 레지스터 번호 R 546 | 547 | - EA는 R이 가리키는 레지스터의 내용을 A와 더함으로써 결정된다. 548 | 549 | - 사용되는 레지스터에 따라 여러 종류의 변위 주소지정 방식들이 정의될 수 있으며, 대표적인 것 세 가지를 알아본다. 550 | 551 | - 상대 주소지정 방식: PC의 내용과 명령어 내 오퍼랜드를 더하여 유효주소를 결정하는 주소지정 방식 552 | 553 | 레지스터로 PC가 사용된다. 따라서 **EA = A + (PC)**. 이 방식은 주로 분기 명령어에서 사용되는데, 변위(오퍼랜드)가 양수인 경우 앞 방향으로 분기, 음수인 경우에는 반대 방향으로 분기한다. 554 | 555 | ![](https://t1.daumcdn.net/cfile/tistory/2376FF495720BC271D) 556 | 557 | ​ < PC의 내용이 새로운 분기 목적지 주소인 EA로 갱신된다. > 558 | 559 | ​ 단점: 이 방식을 사용하면 변위의 범위가 오퍼랜드 필드의 비트 수에 의하여 제한된다. 560 | 561 | ​ 장점: 전체 기억장치 주소가 명령어에 포함되어야 하는 일반적인 분기 명령어보다 적은 수의 비 트만 있으면 된다. 또한 레지스터로서 PC가 묵시적으로 지정되므로 오퍼랜드 필드에서 이득. 562 | 563 | - 인덱스 주소지정 방식: 인덱스 레지스터(인덱스 값을 저장하는 특수 레지스터를 의미)의 내용과 명령어 내 오퍼랜드를 더하여 유효주소를 결정하는 주소지정 방식이다. 인덱스 레지스터를 IX라고 하면, **EA = A + (IX)** 564 | 565 | 일반적으로 주소 A는 기억장치에 저장된 데이터 배열의 시작 주소를 가리킨다. 인덱스 레지스터의 내용은 그 배열의 시작 주소로부터 각 데이터까지의 거리를 나타낸다. 따라서 데이터 배열을 처리하는 **프로그램 루프 내에서 인덱스 레지스터의 내용이 증감**한다면, **동일한 명령어를 사용하여 배열 내의 데이터들을 순차적으로 액세스하는 것이 가능**해진다. 566 | 567 | ![](https://t1.daumcdn.net/cfile/tistory/2177724B5720BD8027) 568 | 569 | 연속된 데이터들을 차례대로 액세스하는 경우를 위하여 명령어 사이클 동안에 인덱스 레지스터의 내용이 자동적으로 증감할 수도 있는데 이를 자동인덱싱이라 한다. 이 경우 유효 주소가 결정될 때마다 아래와 같은 두 연산들이 연속적으로 수행된다. 570 | 571 | **EA = A + (IX)** 572 | 573 | **IX <- IX + 1** 574 | 575 | 576 | 577 | - 베이스-레지스터 주소지정 방식: 베이스 레지스터의 내용과 명령어내 오퍼랜드를 더하여 유효 주소를 결정하는 주소지정 방식. 베이스 레지스터를 BR이라 한다면, **EA = A + (BR)** 578 | 579 | 이 방식은 인덱스 주소지정 방식과 유사하지만 레지스터의 사용되는 방법에 있어서 차이점이 있다. 베이스 레지스터에는 기준이 되는 명령어의 주소가 저장된다. 이 방식은 주로 프로그램의 시작 위치를 지정하는데 사용된다. 580 | 581 | 582 | 583 | **2.4.4 실제 상용 프로세서들의 명령어 형식** 584 | 585 | 1. PDP 계열 프로세서 586 | 587 | - PDP-10 588 | 589 | - Word: 36bit 590 | - 명령어: 36bit 591 | - 명령어의 형식: ![](https://docsplayer.org/docs-images/76/74246403/images/100-0.jpg) 592 | - 512 종류의 연산이 가능(실제로는 365개) 593 | - 명령어의 길이가 고정된 경우를 잘 보여준다. 594 | 595 | - PDP-11 596 | 597 | - Word: 16bit 598 | 599 | - 명령어: 대부분 16bit, 32bit, 48bit 600 | 601 | - 명령어의 형식: 602 | 603 | ![](https://slidesplayer.org/slide/14127708/86/images/85/Computer+Architecture.jpg) 604 | 605 | 2. 펜티엄 계열 프로세서 606 | 607 | CISC(Complex Instruction Set Computer)형으로 분류되는 펜티엄 계열 프로세서들은 다양한 명령어 형식을 사용하고 있다. 이를 이해하기 위해 주소지정 방식들을 살펴본다. 608 | 609 | - segmant: 기억장치 공간의 분류 단위 610 | - segmant register: 이 레지스터로 세그먼트가 구분됨. 6개의 세그먼트 레지스터. 각각의 SR은 해당 세그먼트의 시작 주소를 가지고 있다. 611 | - BR: 베이스 레지스터 612 | - IX: 인덱스 레지스터 613 | 614 | 펜티엄 계열 프로세서는 EA가 결정되면 해당 세그먼트의 시작 주소와 유효 주소를 더하여 실제 기억장치를 액세스하는 데 사용되는 선형 주소(LA)를 생성한다. 615 | 616 | - 펜티엄 계열 프로세서의 주소지정 방식: ![](https://slidesplayer.org/slide/14127708/86/images/86/Computer+Architecture.jpg) 617 | 618 | - 즉시방식: 데이터가 명령어에 포함. 619 | - 레지스터 방식: 유효 주소가 레지스터에 들어있다. 620 | - 변위 방식: 변위 값이 명령어의 한 부분으로 포함되어 있다. 621 | - 베이스 방식: 레지스터 간접 주소지정 방식과 동일 622 | - 변위를 가진 베이스 방식: 어떤 레지스터든 베이스 레지스터로 사용. 반복계산에 유용하다. 623 | - 변위를 가진 인덱스 방식: 명령어가 IX에 더해질 변위값을 포함. 데이터 배열 순차 검색에 유용. 624 | - 인덱스와 변위를 가진 베이스 방식: 다 더하여 유효 주소 결정. 특정 지역 내의 데이터 배열을 액세스하는 데 유용 625 | - 상대 방식: 변위값이 PC와 더해지고 그 값은 다음 명령어의 주소로 사용된다. 변위값은 sign bit, word, 이중 word 등이 사용될 수 있다. 626 | 627 | - 펜티엄 계열 프로세서의 명령어 형식은 다음과 같은 필드들을 포함하고 있다. 628 | 629 | - 연산 코드: 연산의 종류를 지정. 630 | - MOD R/M: 주소지정 방식을 지정해줌. 세 개의 필드들로 구성. 631 | - SIB: MOD R/M 필드와 결합하여 주소지정 방식을 완성시켜준다. 세 개의 필드들로 구성. 632 | - 변위: 변위 방식인 경우 부호화된 정수가 저장된다. 633 | - 즉시: 즉시 방식의 경우 데이터가 저장된다. 634 | 635 | ![](https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcRp2DwKpiAJB3Z1e_SfCC200HjfaZb0-a_FI-VW84jtJuckCsI9) 636 | 637 | ​ <펜티엄 계열 프로세서의 명령어 형식> 638 | 639 | 640 | 641 | 642 | 643 | ------ 644 | 645 | ------ 646 | 647 | ------ 648 | 649 | 650 | 651 | 652 | 653 | -------------------------------------------------------------------------------- /chapter_3_컴퓨터 산술과 논리연산.md: -------------------------------------------------------------------------------- 1 | ### chap.3 컴퓨터 산술과 논리연산 2 | 3 | --- 4 | 5 | 산술 및 논리 연산에 대해 알아본 후, ALU의 내부 조직에 대해 공부한다. 6 | 7 | #### 3.1 ALU의 구성요소 8 | 9 | ALU는 수치 및 논리데이터에 대해 실제적으로 연산을 수행하는 하드웨어 모듈이다. 다음 그림은 ALU의 내부 요소들을 보여주고 있다. 10 | 11 | ![](img/ch3_1.jpg) 12 | 13 | | 내부 요소 | 주요 기능 | 14 | | :-------------: | :----------------------------------------------: | 15 | | 산술연산장치 | 산술 연산들을 수행 | 16 | | 논리연산장치 | 논리 연산들을 수행 | 17 | | 시프트 레지스터 | 비트들을 좌/우로 이동시키는 기능을 가진 레지스터 | 18 | | 보수기 | 데이터에 대해 2의 보수를 취함 | 19 | | 상태 레지스터 | 연산 결과의 상태를 나타내는 플래그 레지스터 | 20 | 21 | 데이터들은 레지스터/기억장치 로부터 ALU로 입력되고, 그 결과는 일반적으로 레지스터의 어딘가에 저장된다. ALU는 연산의 결과에 따라 상태 레지스터내의 해당 플래그들을 세트하는데, 이 플래그들은 조건 분기 명령어/산술 명령어들에 의해 사용된다. 입력 데이터에 대하여 연산을 수행할 내부 요소의 선택과 ALU 내외로의 데이터 이동을 제어하는 신호는 제어 유닛으로부터 제공된다. 22 | 23 | 24 | 25 | #### 3.2 정수의 표현 26 | 27 | 컴퓨터가 데이터를 저장하는 과정에서는 2진수 체계를 사용한다. 2진수 계산법은 생략한다. 8bit 체제에서 2진수로 양수를 나타낼 경우 8개의 bit를 전부 사용하면 된다. 그러나 음수를 나타낼 경우 일반적으로 제일 좌측에 있는 bit를 부호 비트(sign bit)로 사용한다. 부호 비트가 0이면 양수, 1이면 음수를 나타낸다. 28 | 29 | 부호 비트를 사용하는 2진수 표현으로는 다음과 같은 세 가지 방법들이 있다. 30 | 31 | - 부호화-크기 표현 32 | - 1의 보수 표현 33 | - 2의 보수 표현 34 | 35 | **3.2.1 부호화-크기 표현** 36 | 37 | n개의 비트로 크기를 표현할 경우 가장 좌측의 비트는 부호를, 나머지 n - 1개의 비트들은 수의 크기를 나타내는 방법이다. 간단하지만 결점이 존재하는 방식. 38 | 39 | - 결점 1: 덧셈과 뺄셈을 하기 위해서는 부호 비트와 크기 부분을 별도로 처리해야 한다. 40 | - 결점 2: 0에 대한 표현이 두가지이다. (0 0000000, 1 0000000) 41 | 42 | 이러한 결점들로 인해 계산 과정이 더 복잡해지며, n개의 비트로 표현할 수 있는 수들의 가짓수가 1 줄어든다. 43 | 44 | **3.2.2 보수 표현** 45 | 46 | 보수 표현이란 0을 1로, 1을 0으로 바꾸는 표현방식이다. 보수 표현에는 두 가지 방식이 있다. 47 | 48 | - 1의 보수 표현: 모든 비트들을 반전한다. 49 | - 2의 보수 표현: 모든 비트들을 반전하고, 결과값에 1을 더한다. 50 | 51 | 변환하는 과정은 1의 보수 표현이 더 간단하지만 표현할 수 있는 수의 가짓수는 2의 보수 표현이 더 많다. 1의 보수 표현 방식은 0을 나타내는 방식이 두개이기 때문. 52 | 53 | | 명칭 | 표현법 | 범위 | 54 | | :------: | :---------------------------: | :-------: | 55 | | 1의 보수 | 모든 비트들을 반전 | -127~+127 | 56 | | 2의 보수 | 반전시킨 후 결과값에 1을 더함 | -128~+127 | 57 | 58 | **3.2.3 부호-비트 확장** 59 | 60 | 컴퓨터에서 어떤 수가 기억장치에 저장되어 있을 때 그 길이와 CPU 연산과정에서의 길이가 서로 다른 경우가 있다. 기억장치에 8bit로 저장된 데이터를 16bit레지스터로 옮겨올 경우 8bit 데이터의 길이를 확장시켜야 하는데 2의 보수 표현 방식은 다음과 같은 방식을 따라서 확장한다. 61 | 62 | - sign bit가 0일 경우: 빈 공간을 0으로 채운다. 63 | - sign bit가 1일 경우: 빈 공간을 1으로 채운다. 64 | 65 | 이 방식을 *부호-비트 확장* 이라고 한다. 66 | 67 | 68 | 69 | #### 3.3 논리 연산 70 | 71 | 다음은 두 개의 비트 A, B에 대해 처리될 수 있는 기본적인 논리 연산들을 나타낸다. 72 | 73 | ![](img/ch3_2.jpg) 74 | 75 | 비트 단위의 논리 연산들을 위한 하드웨어 모듈은 4 X 1 MUX등으로 만들 수 있다. 여러 비트의 경우 4 X 1 MUX를 여러개 이용하여 각각의 MUX에 공통으로 연산 선택 신호를 인가하는 방식으로 만들 수 있다. 76 | 77 | 78 | 79 | 대표적인 몇 가지 논리 연산들은 다음과 같다. 80 | 81 | 1. AND 연산: 두 개의 데이터에서 같은 위치에 있는 비트들이 모두 1인 경우 결과 데이터의 해당 비트가 1이 된다. 그 이외에는 결과 데이터의 해당 비트가 0이 된다. 82 | 2. OR 연산: 두 개의 데이터에서 같은 위치에 있는 비트들이 하나라도 1인 경우 결과 데이터의 해당 비트가 1이 된다. 두 비트가 모두 0일 경우 결과 데이터의 해당 비트가 0이 된다. 83 | 3. XOR 연산: 두 개의 데이터에서 같은 위치에 있는 비트들이 서로 다른 값을 가지면 결과 데이터의 해당 비트가 1이 되고, 같은 위치에 있는 비트들이 같은 값을 가지면 결과 데이터의 해당 비트가 0이 된다. 84 | 4. NOT 연산: Word의 모든 비트들이 반전된다. 85 | 5. 선택적-세트 연산: 데이터의 특정 비트들을 1로 세트해주는 동작이다. 데이터가 저장된 A 레지스터와 1로 세트될 비트들의 위치를 지정해주는 B 레지스터 간에 OR 연산을 수행하면 된다. 86 | 6. 선택적-보수 연산: 데이터의 특정 비트들의 값을 보수화하는 동작이다. 데이터가 저장된 A 레지스터와 보수화할 비트들의 위치를 지정해주는 B 레지스터 간에 XOR 연산을 수행하면 된다. 87 | 7. 마스크 연산: 데이터 내 특정 비트들의 값을 0으로 리셋 시키기 위한 동작이다. 데이터가 저장된 A 레지스터와 위치를 지정해주는 B 레지스터 간에 AND 연산을 수행하면 된다. 88 | 8. 삽입 연산: 데이터 내의 일부 비트들을 새로운 값들로 대체시키기 위한 동작이다. 89 | - 단계 1: 삽입하고자 하는 비트들에 대하여 마스크 연산을 수행, 그 값들을 0으로 초기화한다. 90 | - 단계 2: 새로이 삽입할 비트들과 그 결과 데이터 간에 OR 연산을 수행한다. 91 | 9. 비교 연산: A와 B 레지스터의 내용을 비교하고, 만약 두 레지스터에서 대응되는 비트들의 값이 같으면, A 레지스터의 해당 비트를 0으로 세트한다. 서로 다르다면 A 레지스터의 해당 비트를 1로 세트한다. 두 레지스터들 간에 XOR 연산을 수행함으로써 구현할 수 있다. 92 | 93 | 94 | 95 | #### 3.4 시프트 연산 96 | 97 | 1. 논리적 시프트 연산: 레지스터 내의 데이터 비트들을 좌or우 방향으로 한칸씩 이동시키는 것을 말한다. 어떤 방향으로 이동시키느냐에 따라서 최상위 혹은 최하위 비트가 drop out되며, 빈 비트는 0으로 채운다. 98 | 2. 순환 시프트(회전) 연산: 최상위 혹은 최하위 비트를 drop out하지 않고 반대편 끝에 있는 비트로 들어가게 하는 시프트 연산이다. 99 | 100 | 논리적 시프트 연산과 순환 시프트 연산을 이용하면, 두 레지스터들 간에 직렬 데이터 전송이 가능해진다. 원리는 다음 그림과 같다. 101 | 102 | ![](img/ch3_3.jpg) 103 | 104 | 3. 산술적 시프트 연산: 레지스터에 저장된 데이터가 부호를 가진 정수인 경우 부호 비트를 고려하여 수행되는 시프트를 말한다. 즉, 부호 비트는 그대로 두고, 수의 크기를 나타내는 비트들만 시프트 시킨다. 105 | 4. C 플래그를 포함한 시프트 연산: 실제 CPU 에서는 시프트 연산에 올림수(C) 플래그가 포함된다. 106 | - C 플래그를 포함한 시프트 연산: C 플래그까지 포함하여 논리적 시프트 연산을 하는 방식이다. 107 | - C 플래그를 포함한 순환 시프트 연산: C 플래그까지 포함한 순환 시프트 연산 방식이다. 108 | 109 | 110 | 111 | #### 3.5 정수의 산술 연산 112 | 113 | 2의 보수 표현에 대한 일반적인 산술 방법들과 그러한 연산들을 위한 회로의 구성에 대해 알아본다. 114 | 115 | **3.5.1 덧셈** 116 | 117 | - 2의 보수로 표현된 수들 간의 덧셈 방법: 먼저 두 수를 더하고, 올림수가 발생할 경우 그 값을 버린다. 118 | 119 | - 덧셈을 담당하는 하드웨어: 병렬 가산기(Full adder들로 구성됨) 120 | - 덤셈한 결과가 데이터의 표현 범위를 초과하는 경우: *오버플로우* 121 | - 오버플로우는 최상위 비트의 계산에서 발생하는 Carry 와 그 다음 비트의 계산에서 발생하는 Carry값이 서로 다른 경우에만 발생한다. 122 | 123 | **3.5.2 뺄셈** 124 | 125 | - 정수들의 뺄셈은 덧셈으로 할 수 있다. 2의 보수로 표현된 수들의 뺄셈도 같은 방법으로 처리할 수 있다. 감수(빼기를 하려는 수)에 대한 2의 보수를 구한 후 피감수와 더하면 된다. 126 | - 뺄셈을 담당하는 하드웨어: 병렬 가산기를 그대로 이용(보수를 구한 후 더하면 되니까) 127 | - 뺄셈한 결과가 데이터의 표현 범위를 초과: 오버플로우 128 | - 덧셈의 오버플로우 검출 방식과 동일한 방법으로 뺄셈의 오버플로우도 검출이 가능하다. 129 | 130 | ![](img/ch3_4.jpg) 131 | 132 | **3.5.3 곱셈** 133 | 134 | - 부호 없는 경우의 4bit 곱셈 알고리즘: 승수의 최하위 비트에 대한 검사부터 시작되는데, 그 비트의 값이 1이면 부분 적은 피승수와 같아지고, 0이면 부분 적은 0000이 된다. 승수의 각 비트에 대하여 한 자리씩 좌측으로 시프트 되면서 발생되는 부분 적들을 모두 더하면 최종 결과가 산출된다. 두 개의 n bit 정수들을 곱하면 결과값의 길이는 최대 2n bit가 된다. 135 | - ![](img/ch3_5.jpg) 136 | - 2의 보수들 간의 곱셈: Booth 알고리즘★ 137 | 138 | **3.5.4 나눗셈**★ 139 | 140 | 141 | 142 | #### 3.6 부동소수점 수의 표현 143 | 144 | 소수점의 위치를 필요에 따라 이동시키는 표현 방법을 부동소수점 표현이라고한다. 부동소수점의 일반적인 형태는 부호, 가수, 기수, 지수로 나타낼 수 있다. 145 | 146 | - 부호(S): (-1)^S 147 | - 가수(M): M 148 | - 기수(10): 10 149 | - 지수(E): e 150 | - (-1)^S * M * 10^e 151 | - 디지털 컴퓨터에서 지수를 나타내기 위한 전형적인 32비트 부동소수점 수의 형식은 다음 사진과 같다. 152 | 153 | ![](img/ch3_6.jpg) 154 | 155 | - M은 수의 정밀도를, E는 표현 가능한 수의 범위를 나타낸다. 156 | 157 | - 부동소수점은 정규화된 표현형식을 정하여 사용한다. 정규화된 표현 형식은 소수점의 바로 다음에 오는 비트는 1이 되도록 위치를 조정하는 방식이다. 158 | 159 | - 부동소수점 방식을 따라 수를 표기할 경우 지수를 바이어스된 수로 표현한다. 즉, 특정한 수를 더해 표현한다. 이는 지수가 매우 큰 음수를 갖을 수록 0에 가까워진다는 것에 착안하여 0 검사를 편하게 만들어준다. 160 | 161 | - 위의 방식으로 십진수 -13.625를 32비트 부동소수점으로 나타내면 다음과 같다. 162 | 163 | - 13.625(10) = 1101.101(2) = 0.1(hidden bit) 101101(M) * 2^4(E) 164 | - S bit: 1 165 | - E bit: 4 + 127 = 00000100 + 10000000 = 10000100 166 | - M bit: 1011010000....0000 167 | 168 | - 부동소수점은 다음 그림과 같은 범위의 수를 표현가능하다. 빈칸은 표현할 수 없는 수의 범위이다. 169 | 170 | ![](img/ch3_7.jpg) 171 | 172 | - 0의 좌우로 비어있는 부분은 언더플로우로 인해 생긴 빈칸이다. 언더플로우는 매우 작은 크기이기 때문에 별로 큰 문제는 아니다. 173 | 174 | - IEEE 754 표현은 위와 약간 다르다. 175 | 176 | - 가수는 1.M * 2^E 형태를 갖는다. 177 | - 소수점 위의 1은 생략된다. 이를 hidden bit라 한다. 178 | - 바이어스값은 127 179 | 180 | - -13.625를 IEE 754 단일 정밀도 표준 형식으로 표현하면 다음과 같다. 181 | 182 | - 13.625 = 1101.101 = 1.101101 * 2^3 183 | - S bit: -1 184 | - E: 00000011 + 01111111 = 10000010 185 | - M: 1011010000...00000 186 | 187 | 188 | 189 | #### 3.7 부동소수점 산술 연산 190 | 191 | 부동소수점간의 덧셈, 뺄셈은 소수점의 위치 조정이 필요하기 때문에 더 복잡해진다. 192 | 193 | **3.7.1 덧셈과 뺄셈** 194 | 195 | 알고리즘은 다음과 같다. 196 | 197 | 1. 두 수의 소수점 위치를 일치시킨다(지수가 같아지도록). 쉬프트 연산을 통해 지수를 일치시킨다. 단, 오차를 줄이기 위해 더 작은 수를 오른쪽으로 한 비트씩 쉬프트연산하며 그 때마다 지수를 1씩 증가시킨다. 198 | 2. 가수들 간에 더하기/빼기 를 수행한다. 199 | 3. 결과를 정규화 시킨다. 200 | 201 | 뺄셈도 같은 방식을 사용한다. 그러나 뺄셈을 위해 감수를 2의 보수로 변환한 다음에 더한다는 것이 다르다. 202 | 203 | 덧셈/뺄셈의 성능을 향상시키기 위해 지수조정, 가수 덧셈, 정규화 3단계에 대해 파이프라이닝을 적용시키기도 한다. 204 | 205 | **3.7.2 곱셈과 나눗셈** 206 | 207 | 곱셈의 알고리즘은 다음과 같다. 208 | 209 | 1. 가수들을 곱한다. 210 | 2. 지수들을 합한다. 단, 바이어스 값이 중복되어 있으므로 바이어스값을 한번 빼준다. 211 | 3. 결과값을 정규화한다. 212 | 213 | 나눗셈의 알고리즘은 다음과 같다. 214 | 215 | 1. 가수들을 나눈다. 216 | 2. 지수들을 뺀다. 단, 바이어스 값이 중복되어 있으므로 바이어스값을 한번 더한다. 217 | 3. 결과값을 정규화한다. 218 | 219 | 범위를 초과할 경우 다음과 같은 문제가 나타날 수 있다. 220 | 221 | - 지수 오버플로우 222 | - 지수 언더플로우 223 | - 가수 언더플로우 224 | - 가수 오버플로우 225 | 226 | -------------------------------------------------------------------------------- /chapter_4_제어 유니트.md: -------------------------------------------------------------------------------- 1 | ### chap4. 제어 유니트 2 | 3 | ------ 4 | 5 | 적절한 제어 신호들을 생성시키는 제어 유니트에 대해 알아본다. 6 | 7 | #### 4.1 제어 유니트의 기능 8 | 9 | 제어 유니트의 주요 기능은 다음과 같다. 10 | 11 | - 명령어 코드의 해독 12 | - 명령어 실행에 필요한 제어 신호들의 발생 13 | 14 | 즉, 제어 유니트는 명령어 사이클이 적절히 수행되도록 모든 동작들을 제어하는 장치이다. 15 | 16 | - 마이크로명령어: 마이크로연산을 2진 비트로 표현한 형태 17 | - 마이크로프로그램: 마이크로명령어의 집합 18 | - 루틴: CPU의 특정 기능을 수행하기 위한 마이크로프로그램 19 | 20 | 명령어 사이클을 위한 마이크로프로그램은 인출 사이클 루틴, 간접 사이클 루틴, 실행 사이클 루틴들로 구성된다. 21 | 22 | 23 | 24 | #### 4.2 제어 유니트의 구조 25 | 26 | 제어 유니트의 내부 구조는 다음과 같다. 27 | 28 | ![](img/ch4_1.jpg) 29 | 30 | - 명령어 해독기: 명령어 레지스터로부터 들어오는 명령어의 연산 코드를 해독하여 해당 연산을 수행하기 위한 루틴의 시작 주소를 결정 31 | - 제어 주소 레지스터(CAR): 다음에 실행할 마이크로명령어의 주소를 저장하는 레지스터이다. 이 주소는 제어 기억장치의 특정 위치를 가리킨다. 32 | - 제어 기억장치: 마이크로프로그램을 저장하는 내부 기억장치 33 | - 제어 버퍼 레지스터(CBR): 제어 기억장치로부터 읽혀진 마이크로명령어를 일시적으로 저장하는 레지스터 34 | - 서브 루틴 레지스터(SBR): 마이크로프로그램에서 서브루틴이 호출되는 경우, 현재의 CAR 내용을 일시적으로 저장하는 레지스터 35 | - 순서제어 모듈: 마이크로명령어의 실행 순서를 결정하는 회로들의 집합 36 | 37 | 38 | 39 | CPU 명령어 세트를 설계한다는 것은 40 | 41 | 1. 명령어들의 종류와 비트 패턴을 정의 42 | 2. 그 명령어들의 실행에 필요한 하드웨어를 설계하며 43 | 3. 각 명령어를 위한 실행 사이클 루틴을 마이크로프로그래밍함 44 | 45 | 를 의미한다. 마이크로프로그램은 그러한 루틴들의 집합이므로 CPU 설계 단계에서 확정되고, 그 후에는 변하지 않는다. 따라서 제어 기억장치는 ROM으로 만들어져 CPU 내부에 포함된다. 46 | 47 | 명령어 해독기는 연산 코드를 이용하여 제어 기억장치 내 해당 실행 사이클 루틴의 시작 주소를 찾아야 한다. 그 방법에는 몇 가지가 있으나, 그 중 사상(mapping)에 대해 설명한다. 48 | 49 | 50 | 51 | 사상 방식은 명령어의 연산 코드를 특정 비트 패턴과 혼합시켜 그 연산의 수행에 필요한 실행 사이클 루틴의 시작주소를 찾아낸다. **시작 주소: 1xxxx00** 52 | 53 | ![](img/ch4_2.jpg) 54 | 55 | 56 | 57 | #### 4.3 마이크로명령어의 형식 58 | 59 | ![](img/ch4_3.jpg) 60 | 61 | - 연산필드가 여러 개일 경우 그 수 만큼의 마이크로 연산들이 동시에 수행될 수 있다. 62 | - 조건 필드는 두 비트로 구성되며 다음에 위치한 분기 필드를 위한 조건을 나타낸다. 63 | - 분기 필드는 두 비트로 구성되며 분기의 종류와 다음에 어떤 마이크로명령어를 실행할 지를 결정한다. 64 | - 주소 필드는 분기가 발생하는 경우를 위해 목적지 마이크로명령어의 주소를 가지고 있다. 65 | 66 | #### 4.4 마이크로프로그래밍 67 | 68 | **4.4.1 인출 사이클 루틴** 69 | 70 | | | | | | | 71 | | ----------- | ---- | ---- | ---- | --------------------------- | 72 | | FETCH:PCTAR | U | JMP | NEXT | MAR <- PC | 73 | | READ, INCPC | U | JMP | NEXT | MBR <- M[MAR], PC <- PC + 1 | 74 | | BRTIR | U | MAP | | IR <- MBR | 75 | 76 | **4.4.2 간접 사이클 루틴**: i bit 가 1로 세트된다. 77 | 78 | | | | | | | 79 | | ----------- | ---- | ---- | ---- | --------------------------- | 80 | | INDRT:IRTAR | U | JMP | NEXT | MAR <- IR(addr) | 81 | | READ | U | JMP | NEXT | MBR <- M[MAR], PC <- PC + 1 | 82 | | BRTIR | U | RET | | IR(addr) <- MBR | 83 | 84 | **4.4.3 실행 사이클 루틴** 85 | 86 | 사상 방식을 이용하여 각 루틴의 시작 주소를 결정한다. 명령어는 NOP, LOAD, STORE(I), ADD, SUB, JUMP 등이 있으며 예제는 다음과 같다. 87 | 88 | | | | | | | | 89 | | ------ | ----- | ---- | ---- | ----- | --------------------- | 90 | | NOP: | INCPC | U | JMP | FETCH | PC <- PC + 1 | 91 | | LOAD: | NOP | I | CALL | INDRT | I = 1이면, 4.4.2 호출 | 92 | | | READ | U | JMP | NEXT | MAR <- IR(addr) | 93 | | | BRTAC | U | JMP | FETCH | AC <- MBR | 94 | | STORE: | NOP | I | CALL | INDRT | I = 1이면, 4.4.2 호출 | 95 | | | IRTAR | U | JMP | NEXT | MAR <- IR(addr) | 96 | | | ACTBR | U | JMP | NEXT | MBR <- AC | 97 | | | WRITE | U | JMP | FETCH | M[MAR] <- MBR | 98 | | ADD: | IRTAR | U | JMP | NEXT | MAR <- IR(addr) | 99 | | | READ | U | JMP | NEXT | MBR <- M[MAR] | 100 | | | ADD | U | JMP | FETCH | AC <- AC + MBR | 101 | | SUB: | IRTAR | U | JMP | NEXT | MAR <- IR(addr) | 102 | | | READ | U | JMP | NEXT | MBR <- M[MAR] | 103 | | | SUB | U | JMP | FETCH | AC <- AC - MBR | 104 | | JUMP: | IRTPC | U | JMP | FETCH | PC <- IR(addr) | 105 | 106 | 107 | 108 | #### 4.5 마이크로프로그램의 순서제어 109 | 110 | 제어 유니트가 명령어의 실행을 제어한다는 것은 제어 기억장치에 저장된 해당 마이크로명령어들을 순서대로 인출하는 동작이라고 할 수 있다. 111 | 112 | ![](img/ch4_4.jpg) 113 | 114 | - 순서제어: 제어 유니트에서 다음에 실행될 마이크로 명령어의 주소를 결정하는 기능 115 | 116 | 117 | 118 | 119 | 120 | CPU가 처음 동작을 시작하는 순간: CAR <- 0, 0번지에 있는 인출 사이클 루틴의 첫 번째 마이크로 명령어를 인출 121 | 122 | MUX2: 네 개의 조건 비트중 하나를 선택 123 | 124 | MUX1: BR필드의 두 비트와 MUX2의 출력비트의 조합으로 MUX1의 선택신호들과 SBR의 적재신호가 생성, 그에 따라 다음 주소들이 결정되어 CAR로 적재된다. 125 | 126 | 주소 선택 회로의 입력 및 출력 신호들: 127 | 128 | | BR | 조건 | MUX1 | SBR | CAR로 적재될 MUX1의 입력 | 설명 | 129 | | ----- | ---- | ----- | ---- | :----------------------: | :----------------------: | 130 | | I1 I0 | C | S1 S0 | L | - | - | 131 | | 0 0 | 0 | 0 0 | 0 | 0 | CAR <-CAR + 1 | 132 | | 0 0 | 1 | 0 1 | 0 | 1 | CAR<-ADF | 133 | | 0 1 | 0 | 0 0 | 0 | 0 | CAR<-CAR+1 | 134 | | 0 1 | 1 | 0 1 | 1 | 1 | SBR<-CAR ,CAR<-ADF | 135 | | 1 0 | x | 1 0 | 0 | 2 | CAR<-SBR | 136 | | 1 1 | x | 1 1 | 0 | 3 | CAR<-1XXXX00 | 137 | 138 | 139 | 140 | BR필드가 00 또는 01일 경우: 조건이 만족되지 않으면 (C가 0이면) CAR<-CAR+1 141 | 142 | ​ 조건이 만족 되면(C가 1이면) CAR<-ADF 143 | 144 | BR필드가 10인 경우: SBR이 다시 CAR로 복구 145 | 146 | BR필드가 11인 경우: Mapping에 의해 결정된 주소가 CAR로 적재 147 | 148 | 149 | 150 | 만약 마이크로 연산을 수행하는데 더 많은 제어 신호들이 필요하다면 decoder들을 이용해 그 수를 확대할 수 있다. 151 | 152 | 153 | 154 | - 수직적 마이크로프로그래밍: decoder들을 적극 활용하여 비트들을 필요한 수만큼의 제어 신호들로 확장시키는 방식, 연산 필드는 최소화 155 | - 수평적 마이크로프로그래밍: 마이크로명령어들의 연산 필드에 필요한 제어신호 수만큼의 비트들을 포함, 각 비트를 제어신호로 직접 사용하는 방식 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | -------------------------------------------------------------------------------- /chapter_5_기억장치.md: -------------------------------------------------------------------------------- 1 | ### chap5. 기억장치 2 | 3 | ------ 4 | 5 | - 데이터를 저장하는 장치: 주기억장치, 보조기억장치 6 | - 그러나 성능 및 가성비를 개선하기 위해 다양한 기억장치를 시스템에 포함하는 추세 7 | - 내부 기억장치: CPU가 직접 액세스 8 | - 외부 기억장치: 장치 제어기를 통해 접근 9 | 10 | chap5 에서는 내부 기억장치에 대해 알아본다. 11 | 12 | 13 | 14 | #### 5.1 기억장치의 분류와 특성 15 | 16 | - 액세스: cpu가 어떤 정보를 기억장치에 쓰거나 기억장치로부터 읽는 동작 17 | - 액세스는 다음과 같이 분류된다. 18 | - 순차적 액세스: 처음부터 순서대로 액세스하는 방식 19 | - 직접 액세스: 정보가 위치한 근처로 직접 이동시킨후, 순차적 검색으로 최종 위치에 도달하는 액세스 방식 20 | - 임의 액세스: 기억 장소들이 임의로 선택될 수 있으며, 기억장치 내의 어떤 위치든 액세스에 걸리는 시간이 동일 21 | - 연관 액세스: 각 기억 장소에 KEY값의 검색을 통하여 액세스할 위치를 찾아내는 방식 22 | 23 | 기억장치 시스템 설계에 있어 주요한 특성은 **용량**과 **액세스 속도**이다. 24 | 25 | 용량: 26 | 27 | - 기억 장치의 용량을 나타내는 단위: byte(혹은 word) 28 | 29 | - CPU가 한 번의 액세스로 접근 가능한 비트 수: 전송 단위, block 30 | 31 | - 하나의 주소에 의해 액세스되는 비트들의 그룹: 주소지정 단위 32 | 33 | 액세스 속도: 34 | 35 | - 액세스 시간: 주소와 읽기/쓰기 신호가 기억장치에 도착한 순간부터 데이터가 저장되거나 읽혀지는 동작이 완료될 때까지의 시간 36 | - 기억장치 사이클 시간: 액세스 시간과 데이터 복원 시간을 합한 시간 37 | - 데이터 전송률: 기억장치로부터 초당 읽혀지거나 쓰여질 수 있는 비트수 38 | 39 | 40 | 41 | 기억장치의 재료에 따른 분류: 42 | 43 | - 반도체 기억장치 44 | - 자기-표면 기억장치 45 | - 광 저장장치 46 | 47 | 기억장치의 성질에 따른 분류: 48 | 49 | - 휘발성 기억장치 50 | - 비휘발성 기억장치 51 | 52 | 53 | 54 | #### 5.2 계층적 기억장치시스템 55 | 56 | CPU와 기억장치간의 속도 차이에 의해 성능이 떨어질 수 있다. 이를 해결하기 위하여 여러 유형의 기억장치들을 계층적으로 구성하여 설치한다. 이를 계층적 기억장치 시스템이라 한다. 57 | 58 | **5.2.1 필요성 및 효과** 59 | 60 | 가격, 용량, 속도간에 적절한 tradeoff가 필요하다. 61 | 62 | 가격, 용량, 속도간의 관계: 속도 ∝ 가격, 용량 ∝ 1/가격, 용량 ∝ 1/속도 63 | 64 | 65 | 66 | CPU가 기억장치의 한정된 몇몇 영역들을 주로 액세스하며 작업을 수행한다(예를 들면 반복 루프). 이런 현상을 지역성의 원리라 하는데 이 원리로 인해 첫 번째 계층의 기억장치에 액세스 하는 횟수가 두 번째 계층의 기억장치에 액세스 하는 횟수보다 훨씬 더 많아진다. 첫 번째 계층에 액세스를 자주 할 수록 평균 액세스 시간은 비약적으로 짧아지기 때문에 기억장치를 계층적으로 구성하면 평균 액세스 시간을 크게 단축시킬 수 있다. 67 | 68 | 69 | 70 | **5.2.2 기억장치 계층** 71 | 72 | ![](img/ch5_1.jpg) 73 | 74 | - cache: CPU와 주기억장치 사이에 속도가 빠르지만 용량은 작은 메모리를 이용해 속도 차이를 보완해준다. 이 메모리는 프로그래머에게는 보이지 않으며(프로그램을 통해 접근 불가) 버퍼역할을 한다. 75 | - disk cache: 주기억장치와 디스크의 속도 차이를 줄이기 위하여 그 사이에 설치하는 기억장치. 버퍼역할을 한다. 76 | - 하위 계층으로 갈수록 용량이 더 커지고 비트당 가격을 떨어지는 반면에, 지역성의 원리로 인해 액세스 빈도는 더 낮아진다. 77 | - 결과적으로 계층적 방식을 이용하여 더 적은 비용으로 더 빠르고 더 용량이 큰 기억장치시스템을 구성할 수 있게 된다. 78 | 79 | #### 5.3 반도체 기억장치 80 | 81 | **5.3.1 RAM** 82 | 83 | 임의 액세스 방식을 사용하며 읽기와 쓰기가 가능한 기억장치이다. 휘발성이 있기 때문에 전원이 차단되면 데이터를 잃어버린다. 84 | 85 | - DRAM: 캐패시터에 전하를 충전하는 방식으로 데이터를 저장하는 RAM이다. refresh 가 필요하다. 86 | - SRAM: 플립-플롭형 기억 셀을 이용하며 전력이 공급되는 동안 데이터가 유지되는 RAM이다. 87 | - DRAM은 간단하며 작다. 따라서 가격이 싸다. -> 주기억장치 88 | - SRAM은 DRAM보다 속도가 빠르다. -> 캐시 메모리 89 | 90 | ![](img/ch5_2.jpg) 91 | 92 | - 기억소자 배열의 공간이 16M개 이므로 총 24개의 선이 필요하다. 그러나 타이밍을 이용해 시간차를 두고 데이터를 읽는 방식으로 12개의 선으로도 주소지정이 가능해진다. 이는 패키지의 크기를 줄이는데 많은 도움이 된다. 93 | - 기억장치 액세스가 일어나지 않는 사이클 동안에는 재충전 계수기가 0~4095까지의 주소를 순서대로 발생하며, 내부 MUX에 의해 각 행씩 전기를 인가하여 refresh를 한다. 94 | 95 | 96 | 97 | **5.3.2 ROM** 98 | 99 | Read Only Memory 즉, 읽기만 가능하다. 주로 변경될 수 없는 데이터를 저장하는 데 사용된다. 다음과 같은 내용이 저장된다. 100 | 101 | - 시스템 초기화 및 진단 프로그램 102 | - 빈번히 사용되는 함수 및 서브루틴 103 | - 제어 유니트의 마이크로프로그램 104 | 105 | 106 | 107 | ROM은 영구 저장이 가능한 저장장치이며 액세스 시간이 짧다. ROM의 종류로는 다음과 같다. 108 | 109 | - PROM: 단 한번만 쓰기가 가능한 ROM. 수정은 불가능하다. 110 | - EPROM: 자외선을 이용하여 내용 삭제가 가능하다. 내용을 삭제한 후에는 쓰기가 가능해진다. 삭제하는데에 시간이 오래 걸림. 111 | - EEPROM: 전기적으로 삭제할 수 있다. 읽기와 쓰기 동작에 걸리는 시간 차이가 크다. 112 | - 플래시 메모리: 속도가 매우 빠르며 전기적으로 삭제 또한 가능한 메모리. 단, 쓰기 동작에서 페이지 단위로만 동작한다. 113 | 114 | 115 | 116 | #### 5.4 기억장치 모듈의 설계 117 | 118 | 여러 개의 RAM(혹은 ROM)을 접속하여 원하는 용량 또는 원하는 처리 능력을 얻을 수 있다. 접속 방법은 두 가지가 있다. 119 | 120 | - 병렬 접속: 한번에 액세스하는 단어 길이를 키우기 위해서는 RAM을 병렬로 접속하면 된다. 121 | - 직렬 접속: 용량을 키우기 위해서는 RAM을 직렬로 접속하면 된다. 122 | - 병렬과 직렬을 조합하여 원하는 용량의 기억장치 모듈을 설계가능하다. 123 | 124 | 125 | 126 | #### 5.5 캐시 메모리 127 | 128 | CPU와 주기억장치의 속도차이를 보완하기 위해 그 사이에 설치하는 반도체 기억장치이다. 129 | 130 | CPU가 기억장치로부터 어떤 데이터를 읽으려고 할 때에는 먼저 그 데이터가 캐시에 있는지를 검사한다. 액세스 시간이 단축되기 때문. 131 | 132 | CPU가 원하는 데이터가 이미 캐시에 적재되어 있는 상태를 캐시 적중이라고 한다. 그 반대의 경우 캐시 미스. 133 | 134 | 캐시 적중률(H) = 캐시 적중 횟수/전체 액세스 횟수 135 | 136 | 캐시 미스율 = 1 - 캐시 적중률 = 1 - H 137 | 138 | 평균 기억장치 액세스 시간(Ta) = H * Tc(캐시 액세스 시간) + (1 - H) * Tm(주기억장치 액세스 시간) 139 | 140 | 141 | 142 | 캐시 적중률이 높아질 수록 캐시의 사용 효과가 더 커진다. 캐시 적중률은 지역성에 크게 의존하는데 여기서의 지역성이란 주기억장치의 특정 부분에 위치한 데이터를 빈번히 혹은 집중적으로 액세스하는 현상을 의미한다. 지역성은 특징에 따라 다음과 같이 분류가 가능하다. 143 | 144 | - 시간적 지역성: 최근에 액세스된 데이터가 가까운 미래에 다시 액세스될 가능성이 높아지는 특성. 반복 루프 프로그램, 서브루틴, 공통 변수 등. 145 | - 공간적 지역성: 기억장치 내에 서로 인접하여 저장되어 있는 데이터들이 연속적으로 액세스될 가능성이 높아지는 특성. 배열 데이터 등. 146 | - 순차적 지역성: 분기가 발생하지 않는 한, 명령어들은 기억장치에 저장된 순서대로 인출되어 실행된다. 순서되로 인출되는 특성을 의미. 147 | 148 | 149 | 150 | 캐시 설계 과정에서 공통적인 목표는 다음과 같다. 151 | 152 | - 캐시 적중률 극대화 153 | - 캐시 액세스 시간 최소화 154 | - 캐시 실패에 따른 지연시간 최소화 155 | - 주기억장치와 캐시간의 데이터 일관성 유지 156 | 157 | 다음과 같은 방법들로 목표를 달성가능하다. 158 | 159 | **5.5.1 캐시 용량** 160 | 161 | 캐시의 용량이 크면 적중률이 높아진다. 무작정 높이는 것은 가격 증가 및 회로의 복잡성 증가로 인해 불가능하기 때문에 최적의 용량을 찾는 것이 중요. 162 | 163 | **5.5.2 인출 방식** 164 | 165 | 주기억장치로부터 캐시로 정보를 어떻게 인출하는지에 따라서 캐시 적중률에 많은 영향을 준다. 166 | 167 | - 요구 인출: 필요한 정보만 인출 168 | - 선인출: 앞으로 필요할 것으로 예측되는 정보(근접한 데이터들 = 블록)도 같이 인출. 지역성이 높은 경우 효과적이다. 169 | 170 | 캐시는 tag로 구분하여 어떤 블록이 담겨있는지 가리킨다. 171 | 172 | **5.5.3 사상 방식** 173 | 174 | 어떤 주기억장치 블록들이 어느 캐시 라인을 공유할 것인지를 결정해주는 방법: 주기억장치와 캐시간의 사상방식 175 | 176 | 사상방식은 캐시 적중률에 많은 영향을 준다. 그 방식들은 다음과 같다. 177 | 178 | - 직접 사상: 각 블록은 지정된 특정 라인에만 적재될 수 있는 방식(모듈러 연산으로 특정 라인을 결정) 179 | - 장점: 간단하여 구현하는 비용이 적게 든다. 180 | - 단점: 같은 라인에 사상되는 두 개의 블록들로부터 데이터를 번갈아 읽어오는 경우 적중률이 낮아진다. 181 | - 완전-연관 사상: 주기억장치 블록이 캐시의 어느 라인이로든 적재될 수 있는 사상방식. 캐시가 모두 차 있을 경우 적절한 **교체 알고리즘**을 이용해 라인들 중 하나를 선택해 새로운 내용으로 덮어쓴다. 태그 검사가 복잡하여 거의 채택되지 않는 시스템. 182 | - 세트-연관 사상: 직접 사상 + 완전-연관 사상법. tag와 set, word 비트를 사용한다.![](img/ch5_3.jpg) 183 | 184 | 보통 2-way ~ 4-way 세트를 사용한다. 185 | 186 | 187 | 188 | **5.5.4 교체 알고리즘** 189 | 190 | 캐시 미스가 발생하여 새로운 블록을 적재할 경우 캐시가 이미 빈 공간이 없으면 기존 블록 위에 덮어 써야 한다. 어떤 블록을 덮을지에 대해 교체 알고리즘을 이용하여 선택해야한다. 191 | 192 | - 최소 최근 사용 알고리즘: 사용되지 않은 채로 가장 오래 적재되어있는 블록을 교체 193 | - FIFO 알고리즘: 캐시에 적재된 지 가장 오래된 블록을 교체 194 | - 최소 사용 빈도 알고리즘: 캐시에 적재된 이후 참조되었던 횟수가 가장 적은 블록을 교체 195 | - 임의 선택: 무작위로 블록을 선택하여 교체 196 | 197 | **5.5.5 쓰기 정책** 198 | 199 | 캐시에 적재된 데이터를 새로운 값으로 변경할 때 주기억장치에 갱신하는 시기와 방법을 결정하는 방식 200 | 201 | - write-through 방식: 모든 쓰기 동작이 캐시, 주기억장치로 동시에 행해진다. 202 | - 단점: 쓰기 동작에 걸리는 시간이 길어진다 203 | - write-back 방식: 쓰기 동작이 캐시까지만 이루어지는 방식, M bit를 사용하여 수정 여부를 기록 204 | - 단점: 특정한 경우 추가시간 발생, 수정된 내용이 갱신될 때 까지 주기억장치의 해당 블록이 무효 상태에 놓임, 캐시 제어회로 복잡, M bit를 갖고있어야 함. 205 | - 다중프로세서시스템에서 이 방식을 채택할 경우 데이터 불일치 문제가 발생한다. 206 | 207 | **5.5.6 다중 캐시** 208 | 209 | 계층적 구조로 캐시를 설치 혹은 기능별로 분리된 다수의 캐시를 사용하는것이 보편화되고 있다. 210 | 211 | - 슈퍼 세트: 내부 캐시 L1과 외부 캐시 L2가 있을 때 L2가 L1의 슈퍼-세트 라고 한다. 212 | 213 | 1. 온-칩 캐시와 계층적 캐시 214 | - CPU 내부에 포함시크는 캐시를 온-칩 캐시라 한다. 액세스 시간이 더욱 빠름. 215 | - CPU 외부에 캐시를 별도로 더 설치하여 계층적 구조를 갖는 캐시를 만든다. 216 | 2. 분리 캐시 217 | - 온-칩 캐시를 명령어 캐시와 데이터 캐시로 분리시켜 용도를 구분하여 저장하는 캐시를 의미한다. 218 | - 장점: 명령어 실행 파이프라인에서 명령어 인출 단계와 오퍼랜드 인출 단계 간에 캐시에 대한 충돌 현상을 제거할 수 있다. 219 | 220 | #### 5.6 최신 기억장치 기술 221 | 222 | - 성능 병목: CPU 속도 >>>>>>> 기억장치 액세스 속도 223 | 224 | **5.6.1 SDRAM**: 동기식 DRAM 225 | 226 | - DRAM의 액세스 속도를 극복 227 | - 여러 개의 bank들로 구성되어 동시에 서로 다른 주소에 액세스 가능(파이프라이닝) 228 | - 버스트 모드: 한 번의 액세스 동작 때 여러 바이트들을 연속적으로 전송 229 | - 버스트 길이: 버스트 모드에서 연속적으로 전송되는 바이트들의 수 230 | 231 | **5.6.2 DDR SDRAM** 232 | 233 | SDRAM에서 액세스된 데이터들을 전송할 때 버스 클록의 상승, 하강 각각의 에지마다 하나씩 전송함으로써 클럭 당 두 번 전송하는 기법. 234 | 235 | **DDR2 SDRAM**: 버스 클록 주파수만 두배로 높혀 퍼포먼스 상승. 236 | 237 | **5.6.3 차세대 비휘발성 기억장치** 238 | 239 | | 구분 | PRAM | FRAM | MRAM | 240 | | --------- | ---------------------- | ---------------------- | ---------------------- | 241 | | 동작 원리 | 특정 물질의 상태 변화 | 강유전체의 분극 특성 | 전극의 자화 방향 | 242 | | 쓰기 시간 | 500ns | 50ns | 10ns | 243 | | 장점 | 비휘발성, 고속, 고집적 | 비휘발성, 고속, 저전력 | 비휘발성, 고속, 내구성 | 244 | | 단점 | 느린 쓰기 속도 | 내구성 취약 | 상대적 고비용 | 245 | 246 | 247 | 248 | 249 | 250 | -------------------------------------------------------------------------------- /chapter_6.md: -------------------------------------------------------------------------------- 1 | ### chap.6 보조저장장치 2 | 3 | ------ 4 | 5 | #### 6.1 자기 디스크(하드 디스크) 6 | 7 | 자화될 수 있는 물질의 표면을 자화시킴으로써 데이터를 저장. 8 | 9 | **6.1.1 디스크의 구조** 10 | 11 | ![](img/ch6_1.jpg) 12 | 13 | 섹터들로 분리되어있으며 섹터간 갭에 의해 구분된다. 14 | 15 | 단점: 바깥쪽 트랙의 저장 밀도를 낮춰야 하기 때문에 저장공간이 낭비된다. 16 | 17 | 실린더: 서로 다른 디스크 표면들 위에 있지만 동일한 반경에 위치하고 있는 트랙들의 집합 18 | 19 | 20 | 21 | **6.1.2 디스크의 액세스 시간** 22 | 23 | 디스크의 액세스 시간 = 탐색 시간 + 회전 지연시간 + 데이터 전송 시간 24 | 25 | - 탐색시간: 헤드의 위치 변경에 걸리는 시간 26 | - 회전 지연시간: 디스크의 회전에 걸리는 시간 27 | - 데이터 전송 시간: 데이터 비트들을 전송하는데 걸리는 시간 28 | 29 | 30 | 31 | #### 6.2 RAID 32 | 33 | RAID(Redundant Array of Independant Disks): 다수의 작은 디스크들을 배열로 연결하여 용량을 늘리고 신뢰성도 향상시킨 대용량 디스크시스템 34 | 35 | **6.2.1 RAID 출현의 배경** 36 | 37 | 장점: 데이터 분산저장을 하게 될 경우 동시에 액세스가 가능하기 때문에 액세스 속도가 빨라진다. 또한 전체 데이터의 손상을 예방할 수 있다. 38 | 39 | 단점: MTTF(Mean Time To Failure)가(장치에 결함이 발생하는 평균 시간 간격이) 낮다. 40 | 41 | - 디스크 인터리빙: 데이터 블록들을 여러 개의 디스크들에 분산 저장하는 기술 42 | 43 | ![](img/ch6_2.jpg) 44 | 45 | **6.2.2 RAID의 종류** 46 | 47 | - RAID 1 (디스크 미러링): 스토리지에 저장되는 모든 데이터는 두 개의 물리적인 디스크에 각각 저장되고 모든 데이터는 중복된다. 48 | 49 | - 장점 : 드라이브 하나가 고장 나면 똑같은 내용의 다른 드라이브가 하나 더 있기 때문에 매우 안전하다. RAID 1은 읽기 성능이 단일 드라이브에서의 성능과 같거나 훨씬 좋다. 50 | - 단점 : 각 드라이브는 미러링되기 때문에 전체 용량의 절반밖에 사용하지 못한다. 드라이브 두 개에 동일한 데이터를 써야 하기 때문에 쓰기 성능이 나빠질 수 있지만 아직 다른 RAID 레벨의 쓰기 성능보다는 훨씬 낫다. 51 | 52 | - RAID 2: 데이터는 바이트 단위로 쪼개져서 모든 디스크에 균등하게 나뉘어 저장되고 패리티 정보는 별도의 전용 디스크에 저장된다. 53 | 54 | - 장점 : 한 개의 드라이브가 고장 나는 것을 허용하며 순차적 쓰기(sequential write) 성능과 순차적 읽기(sequential read) 성능이 우수하다. 55 | - 단점 : 잘 사용되지 않고 문제를 해결하는 것이 어려울 수 있다. 하드웨어 RAID가 되어야 실제로 쓸만하다. RAID 3은 보통 매우 효율적이지만 임의 쓰기(random write) 성능이 나쁘고 임의 읽기(random read) 성능은 꽤 좋다. 56 | 57 | - RAID 4 (각 디스크는 패리티 블럭을 공유한다): 모든 파일은 블럭으로 쪼개지고 각 블럭은 여러 디스크에 저장되지만 균등하진 않다. RAID 3처럼 RAID 4도 패리티를 처리하기 위해 별도의 디스크를 사용한다. 동시 트랜잭션 사용량이 많은 시스템에서 읽기 속도는 매우 중요한데 이런 시스템에 적합하다. 58 | 59 | - 장점 : 드라이브 하나가 고장 나는 것을 허용하고 읽기 성능이 매우 좋다. 60 | - 단점 : 쓰기 성능이 나쁘지만 블럭 읽기(block read) 성능은 괜찮다. 61 | 62 | - RAID 5(패리티를 순환시키는 것 없이 각 어레이에 접근한다): RAID 4처럼 데이터의 블럭은 모든 디스크에 나뉘어 저장되지만 항상 균등하진 않고 패리티 정보도 모든 디스크에 나뉘어 저장된다. 63 | 64 | - 장점 : 한 개의 드라이브가 고장 나는 것을 허용한다. 65 | - 단점 : 디스크 재구성(rebuild)이 매우 느리고 쓰기 성능은 패리티 정보를 끊임없이 갱신해야 하기 때문에 우수하다고 할 수는 없다. 66 | 67 | 68 | 69 | #### 6.3 플래시 메모리와 SSD 70 | 71 | **6.3.1 플래시 메모리** 72 | 73 | EEPROM의 일종으로서, 저장밀도가 높고 저전력 고신뢰성의 특징을 가진 메모리이다. 74 | 75 | 76 | 77 | **6.3.2 SSD** 78 | 79 | Solid-State Drive 대용량 비휘발성 반도체 저장장치이다. 기계장치가 없어서 안정성과 신뢰도가 높다. NOR 게이트를 이용한 방식 보다 NAND 게이트를 이용한 방식이 더 유리함. 80 | 81 | 82 | 83 | #### 6.4 광 저장장치 84 | 85 | **6.4.1 CD-ROM** 86 | 87 | 저장된 내용을 읽기만 할 수 있는 광디스크 88 | 89 | 90 | 91 | **6.4.2 CD-R/RW** 92 | 93 | - CD-R: 사용자가 단 한번만 기록할 수 있는 CD-ROM 94 | - CD-RW: 여러 번의 재기록이 가능한 CD-ROM 95 | 96 | 97 | 98 | **6.4.3 DVD** 99 | 100 | Digital Video(Versatile) Disk 101 | 102 | CD-ROM보다 데이터 용량을 더 많이 저장가능하다. 데이터 밀집력 큼. 103 | 104 | 105 | 106 | **6.4.4 블루-레이 디스크(BD)** 107 | 108 | 매우 짧은 파장의 레이저를 이용한 대용량 광디스크 저장장치 -------------------------------------------------------------------------------- /chapter_7.md: -------------------------------------------------------------------------------- 1 | ### chap.7 시스템 버스, I/O 및 인터럽트 2 | 3 | #### 7.1 시스템 버스 4 | 5 | **7.1.1 시스템 버스의 조직** 6 | 7 | 시스템 버스는 데이터버스, 주소 버스, 제어 버스로 구성되어있다. 8 | 9 | - 버스 마스터: 시스템 버스에 접속되는 요소들 중 버스 사용의 주체가 되는 요소들을 버스 마스터라 한다. 10 | - 버스 중재: 두 개 이상의 버스 마스터들이 동시에 버스 사용을 요청할 경우 순서를 결정해주는 시스템 동작. 11 | - 버스 요구 신호: 버스 마스터가 버스 사용을 원하고 있음을 나타냄 12 | - 버스 승인 신호: 버스 사용을 허가하는 신호 13 | - 버스 사용중 신호: 어떤 마스터가 버스를 사용하고 있는 중을 나타내는 신호 14 | - 버스 중재를 위한 신호 선들의 집합을 중재 버스라 함. 15 | 16 | 17 | 18 | **7.1.2 시스템 버스의 기본 동작** 19 | 20 | - 쓰기 동작: 21 | 1. 버스 마스터가 버스 사용권을 획득한다. 22 | 2. 버스를 통하여 주소와 데이터 및 쓰기 신호를 보낸다. 23 | - 읽기 동작: 24 | 1. 버스 마스터가 버스 사용권을 획득한다. 25 | 2. 주소와 읽기 신호를 보내고, 데이터가 전송되어 올 때까지 기다린다. 26 | 27 | 28 | 29 | 데이터 전송 방법: 30 | 31 | - 동기식 버스: 공통의 버스 클록을 기준으로 버스 동작들이 발생되는 버스 32 | - 단순, 낭비되는 시간이 있음. 33 | 34 | - 비동기식 버스: 버스 클록을 사용하지 않으며, 버스 동작들의 발생 시간이 다른 관련 동작의 발생에 따라 결정되는 버스 35 | - 복잡, 낭비되는 시간이 없음. 36 | 37 | 38 | 39 | #### 7.2 버스 중재 40 | 41 | 여러 개의 버스 마스터들이 동시에 버스 사용을 요구하는 경우 경쟁이 발생하는 상황에서 버스의 사용순서를 정해주는 동작을 버스 중재라 함. 42 | 43 | 버스 중재 방식은 여러 가지가 있다. 44 | 45 | - 병렬 중재 방식: 각 버스 마스터가 독립적인 버스 요구 신호를 갖고 있다. 46 | - 직렬 중재 방식: 버스 요구 및 승인 신호 선이 버스 마스터들 간에 직렬로 접속된다. 47 | - 중앙집중식 중재 방식: 한 개의 버스 중재기가 모든 버스 중재 기능을 수행. 48 | - 분산식 중재 방식: 버스 중재 동작이 각 버스 마스터가 별도로 가지고 있는 버스 중재기들에 의해 이루어지는 방식. 49 | 50 | 51 | 52 | **7.2.1 병렬 중재 방식** 53 | 54 | 1. 중앙집중식 고정-우선순위 방식 55 | 56 | - 고정-우선순위 방식: 57 | 1. 마스터3이 버스 요구 신호 set 58 | 2. 버스 중재기가 버스 승인 신호 set 59 | 3. 마스터1이 버스 사용중 신호 reset 60 | 4. 마스터3이 버스 사용중 신호 set, 버스 사용 시작, 버스 요구 신호 및 버스 승인 신호 reset 61 | 62 | 2. 분산식 고정-우선순위 방식 63 | 64 | 모든 버스 마스터들이 중재기를 한 개씩 갖고 있다. 각 버스 마스터의 중재기는 자신보다 더 높은 우선순위를 가진 버스 마스터들의 버스 요구 신호들을 입력으로 받아서 검사하고, 그들 중의 어느 것도 버스 사용 요구를 하지 않은 경우에만 자신의 버스 승인 신호를 set한다. 65 | 66 | 3. 가변 우선순위 방식 67 | 68 | 버스 중재기가 시스템의 상태에 따라 각 버스 마스터들의 우선순위를 계속 바꾸어 준다. 버스 사용 기회의 불균등이나 기근 현상을 방지해주지만 회로 구현이 어렵다. 69 | 70 | - 회전 우선순위 방식: 마스터들의 우선순위가 회전되는 방식으로 순환된다. 71 | - 임의 우선순위 방식: 마스터들의 우선순위가 계속적으로 무작위로 정해진다. 72 | - 동등 우선순위 방식: 비동기식 버스 시스템에서만 사용가능, 모든 마스터들이 동등한 우선순위. FIFO. 73 | - 최소-최근 사용 방식: 가장 오랫동안 버스를 사용하지 않은 버스 마스터에게 최상위 우선순위 부여. 74 | 75 | 76 | 77 | **7.2.2 직렬 중재 방식** 78 | 79 | 버스 요구 신호와 버스 승인 신호가 하나씩만 있다. 80 | 81 | 1. 중앙집중식 직렬 중재 방식: 버스요구가 들어오면 승인을 우선순위가 높은것부터 차례대로 검사하고, 요구한 마스터를 찾으면 승인한다. 82 | 2. 분산식 직렬 중재 방식: 각 버스 마스터당 중재기를 주어 서로 요구와 승인을 처리하고, 기아현상을 방지하기 위해 접근하는 중재신호를 루프 돌린다. 83 | 84 | 85 | 86 | **7.2.3 폴링 방식** 87 | 88 | 버스 중재기가 각 마스터들이 버스 사용을 원하는지를 주기적으로 검사하여 버스 승인 여부를 결정. 89 | 90 | 1. 하드웨어 폴링 방식 91 | 2. 소프트웨어 폴링 방식 92 | 93 | 94 | 95 | #### 7.3 I/O 장치의 접속 96 | 97 | **7.3.1 I/O 제어** 98 | 99 | 각종 I/O 장치들은 시스템 버스를 통해 CPU 혹은 주기억장치와 정보를 교환한다. 시스템 버스와 I/O 장치를 연결해주는 인터페이스 역할을 I/O 제어기가 해준다. 100 | 101 | **7.3.2 I/O 주소지정** 102 | 103 | 1. 기억장치-사상 I/O: I/O 제어기 내의 레지스터들에게 기억장치 주소 영역의 일부분을 할당하고, 기억장치와 같은 방법으로 액세스하는 방식 104 | 2. 분리형 I/O: I/O 장치들에 별도의 I/O 주소 영역을 지정하고, I/O 전용 명령어들을 이용하여 액세스하는 방식 105 | 106 | 107 | 108 | #### 7.4 인터럽트를 이용한 I/O 109 | 110 | 인터럽트 메커니즘을 이용하여 CPU와 I/O 장치간의 상호작용이 처리되는 방식. 111 | 112 | **7.4.1 다중 인터럽트 방식** 113 | 114 | 각 I/O 제어기와 CPU 사이에 별도의 인터럽트 요구, 인터럽트 확인 신호선이 한 개씩 존재하는 방식. 115 | 116 | ​ 장점: 별도의 인터럽트 선을 갖고 있기 때문에 CPU가 인터럽트를 요구한 장치를 쉽게 찾아낼 수 있다. 117 | 118 | ​ 단점: 하드웨어가 복잡하며 CPU 칩의 핀 수에 의해 접속 가능한 I/O 장치의 수가 제한된다. 119 | 120 | **7.4.2 데이지-체인 방식** 121 | 122 | 1개의 인터럽트요구신호, 체인방식인 1개의 인터럽트확인신호, 데이터버스를통해 인터럽트벡터(인터럽트 처리 루틴의 시작 주소)를 보냄 123 | 124 | ​ 장점: 하드웨어가 간단 125 | 126 | ​ 단점: 우선순위가 낮은 장치들의 대기시간이 길어짐 127 | 128 | **7.4.3 소프트웨어 폴링 방식** 129 | 130 | 1개의 인터럽트요구신호, 제어기 내 인터럽트플래그가 내장되어있고, TEST I/O로 요구한 I/O제어기를 찾는다. 131 | 132 | ​ 장점: 하드웨어가 간단 133 | 134 | ​ 단점: 검사를 위한 시간이 많이 걸림 135 | 136 | 137 | 138 | #### 7.5 DMA를 이용한 I/O 139 | 140 | DMA: CPU의 개입이 없는 데이터 전송 수행 메커니즘 141 | 142 | DMA 제어기: CPU 개입 없이 I/O 장치와 기억장치 간의 데이터 전송을 수행하는 DMA 동작을 지원하는 하드웨어 모듈을 말한다. 143 | 144 | CPU는 정보를 DMA 제어기로 보낸 후 다른 일을 계속한다. 즉, DMA 제어기가 I/O 동작을 전부 담당한다. CPU가 버스를 쓰지 않는 동안 DMA가 시스템 버스를 사용한다. 이를 사이클 스틸링이라 한다. 145 | 146 | - 단점: 147 | 1. 간단한 DMA 제어기로 지원하는데에 한계가 있다. (I/O장치의 다양성 + 복잡함때문) 148 | 2. 버퍼링을 위한 내부기억장치가 필요하다. 149 | 150 | 151 | 152 | -------------------------------------------------------------------------------- /chapter_8.md: -------------------------------------------------------------------------------- 1 | ### chap.8 고성능 컴퓨터 시스템 구조 2 | 3 | #### 8.1 병렬처리의 개념 및 필요성 4 | 5 | 병렬 처리: 다수의 프로세서들을 이용하여 여러 프로그램들을 분담하여 동시에 처리하는 기술. 6 | 7 | 필요 조건: 8 | 9 | - 많은 수의 프로세서들로 하나의 시스템을 구성할 수 있도록, 작고 저렴하며 고속인 프로세서들의 사용이 가능해야 한다. 10 | - 한 프로그램을 여러 개의 작은 부분들로 분할하는 것이 가능, 분할된 부분드를 병렬로 처리한 결과가 전체 프로그램을 순차적으로 처리한 경우와 동일한 결과를 얻을 수 있어야 함. 11 | - 하나의 문제를 여러 개로 나눌 수 없는(순차적인 작업이 필요한 경우) 근본적으로 병렬 처리가 불가능 한 경우도 있다. 12 | 13 | #### 8.2 병렬처리의 단위 14 | 15 | 병렬 처리를 하는 단위에 따라 나뉘어 진다. 16 | 17 | - 작업-단위 병렬성: 독립적인 작업 프로그램 단위 18 | - 테스크-단위 병렬성: 하나의 큰 작업 프로그램을 내부적으로 서로 다른 기능을 수행하는 더 작은 프로그램으로 구분하여 병렬처리 하는 단위 19 | - 스레드-단위 병렬성(멀티 스레딩): 동시에 처리될 수 있는 가장 작은 크기의 독립적인 단위 프로그램 20 | - 명령어-단위 병렬성: 슈퍼스칼라 21 | 22 | 23 | 24 | #### 8.3 병렬컴퓨터의 분류 25 | 26 | **8.3.1 Flynn의 분류** 27 | 28 | 1. 단일 명령어 스트림-단일 데이터 스트림(SISD): 한 번에 하나씩 명령어, 데이터 처리. 파이프라이닝. 29 | 2. 단일 명령어 스트림-복수 데이터 스트림(SIMD): 여러 개의 데이터들에 대한 연산을 동시에 처리 30 | 3. 복수 명령어 스트림-단일 데이터 스트림(MISD): 프로세서들이 배열 형태로 연결되고 한 프로세서가 처리한 결과가 다음 프로세서로 보내져 다른 연산이 수행되는 방식, 실제로 적용 X 31 | 4. 복수 명령어 스트림-복수 데이터 스트림(MIMD): 여러 프로세서가 여러 데이터들을 동시에 처리★ 32 | - 밀결합: 프로세서간의 상호작용이 많음. 33 | - 소결합: 프로세서간의 상호작용이 적음. 거의 독립적. 34 | 35 | 36 | 37 | **8.3.2 기억장치 액세스 모델에 따른 분류** 38 | 39 | - 균일 기억장치 액세스(UMA): 모든 프로세서들이 기억장치를 공유하며 액세스에 걸리는 시간도 같은 시스템 구조 40 | - 불균일 기억장치 액세스(NUMA): 공유 기억장치들과 프로세서들 간의 거리에 따라 액세스 시간이 달라지는 시스템 구조 41 | - 무-원격 기억장치 액세스: 프로게서들이 별도의 기억장치를 가지며, 공유 기억장치는 없는 구조. 42 | 43 | 44 | 45 | **8.3.3 시스템 구성 방법에 따른 분류** 46 | 47 | - 대칭적 다중프로세서: 프로세서들이 모든 시스템 자원들을 공유하며 동등한 권한을 가지는 시스템구조 48 | - 대규모 병렬프로세서: 프로세서와 기억장치로 이루어지는 많은 수의 노드들로 구성, 자원 공유가 없는 시스템 구조 49 | - 캐시-일관성 NUMA 시스템: 노드(UMA/NUMA)들에 포함된 모든 캐시들과 기억장치들 간에 데이터 일관성이 유지되는 분산-기억장치시스템 구조 50 | - 분산 시스템: 독립적인 컴퓨터시스템들이 전통적인 네트워크에 의해 연결된 컴퓨팅 환경 51 | - 클러스터 컴퓨터: 고속 네트워크로 접속된 컴퓨터들의 집합체로서 단일 시스템 이미지를 가짐. 52 | 53 | 54 | 55 | #### 8.4 다중프로세서시스템 구조 56 | 57 | MIMD★ 조직의 다중프로세서 구조는 두 가지로 나뉜다. 58 | 59 | **8.4.1 공유-기억장치 시스템 구조** 60 | 61 | 밀결합 형태, 주기억장치가 어느 한 프로세서에 속하지 않고 모든 프로세서에 의해 공유됨. 62 | 63 | - 장점: 64 | 1. 프로세서들이 공통으로 사용하는 데이터들이 공유 기억장치에 저장되므로, 별도의 프로세서 간 통신 메커니즘이 필요하지 않다. 65 | 2. 프로그램 실행시간 동안에 각 프로세서들이 처리할 작업들을 동적으로 균등하게 할당할 수 있기 때문에, 프로세서 이용률을 극대화할 수 있어서 시스템 효율이 높아진다. 66 | - 단점: 67 | 1. 프로세서들과 기억장치들 간의 버스에 통신량이 많아져서 지연시간 길어질 수 있다. 68 | 2. 두 개 이상의 프로세서들이 공유자원을 동시에 사용하려는 경우 대기해야함. 69 | - 결론: 프로세서 수가 증가하더라도 성능향상이 선형적으로 이루어지지 못함. 이를 해결하기 위해 여러 가지 방법들을 소개한다. 70 | - 버스: 71 | - 장점: 하드웨어 간단 72 | - 단점: 버스 경합 -> 지연시간 증가 73 | - 크로스바 스위치: 74 | - 장점: 기억장치들 사이에 완전 연결성을 제공 75 | - 단점: 비용이 많이 들고 하드웨어가 복잡 76 | - 다단계 상호연결망: 여러 단계들을 통하여 노드들을 연결해주는 네트워크 77 | - 크로스바 스위치의 개념을 적용, 하드웨어의 복잡성을 낮춰줌 78 | 79 | **8.4.2 분산-기억장치 시스템 구조** 80 | 81 | 1. 선형 배열 구조: ![](img/ch8_1.jpg) 82 | 2. 링 구조: ![](img/ch8_2.jpg) 83 | 3. 1. 트리 구조: ![](img/ch8_3.jpg) 84 | 2. 팻 트리 구조: ![](img/ch8_4.jpg) 85 | 4. 매시 구조: ![](img/ch8_5.jpg) 86 | 5. 하이퍼 큐브 구조: ![](img/ch8_6.jpg) 87 | 88 | 89 | 90 | 91 | 92 | #### 8.5 클러스터 컴퓨터 93 | 94 | 컴퓨터 클러스터링: 컴퓨터들을 네트워크와 미들웨어로 통합하여 병렬처리 노드들로 사용함으로써 프로세서 이용률을 높이는 기술 95 | 96 | **8.5.1 클러스터 컴퓨터의 기본 구조** 97 | 98 | ![](img/ch8_7.jpg) 99 | 100 | **8.5.2 클러스터 컴퓨터의 분류** 101 | 102 | - 하드웨어 구성에 따른 분류: 103 | - PC 클러스터 104 | - 워크스테이션 클러스터 105 | - 다주읖로세서 클러스터 106 | - 하드웨어, OS 에 따른 분류: 107 | - 동일형 클러스터: 모든 노드들이 유사한 하드웨어, 동일한 OS 탑재 108 | - 혼합형 클러스터: 혼합된 하드웨어, OS 탑재 109 | - 클러스터 연결 매체에 따른 분류: 110 | - 개방형 클러스터: 외부에서도 이용 가능 111 | - 폐쇄형 클러스터: 외부와 차단 112 | - 각 노드의 소유권에 따른 분류 113 | - 전용 클러스터: 모든 시스템 자원들이 병렬컴퓨팅을 위해서 통합적으로만 사용 114 | - 비전용 클러스터: 노드 컴퓨터들이 각각 별도로 사용될 수도, 통합적 사용도 가능 115 | 116 | 117 | 118 | **8.5.3 클러스터 미들웨어와 단일 시스템 이미지** 119 | 120 | - SSI 인프라: 모든 시스템 자원들이 하나의 통합시스템으로서 사용될 수 있게 해주는 미들웨어 하부조직 121 | - SA 인프라: 시스템의 부분적 결함 발생 시에도 계속 동작할 수 있게 해주는 미들웨어 하부조직 122 | 123 | -------------------------------------------------------------------------------- /img/CPU와 I_O 장치들 간의 접속.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/CPU와 I_O 장치들 간의 접속.JPG -------------------------------------------------------------------------------- /img/CPU와 기억장치의 접속.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/CPU와 기억장치의 접속.JPG -------------------------------------------------------------------------------- /img/IAS 컴퓨터의 구조.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/IAS 컴퓨터의 구조.JPG -------------------------------------------------------------------------------- /img/bookCover.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/bookCover.JPG -------------------------------------------------------------------------------- /img/ch3_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch3_1.jpg -------------------------------------------------------------------------------- /img/ch3_2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch3_2.jpg -------------------------------------------------------------------------------- /img/ch3_3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch3_3.jpg -------------------------------------------------------------------------------- /img/ch3_4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch3_4.jpg -------------------------------------------------------------------------------- /img/ch3_5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch3_5.jpg -------------------------------------------------------------------------------- /img/ch3_6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch3_6.jpg -------------------------------------------------------------------------------- /img/ch3_7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch3_7.jpg -------------------------------------------------------------------------------- /img/ch3_8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch3_8.jpg -------------------------------------------------------------------------------- /img/ch4_1.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch4_1.JPG -------------------------------------------------------------------------------- /img/ch4_2.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch4_2.JPG -------------------------------------------------------------------------------- /img/ch4_3.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch4_3.JPG -------------------------------------------------------------------------------- /img/ch4_4.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch4_4.JPG -------------------------------------------------------------------------------- /img/ch5_1.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch5_1.JPG -------------------------------------------------------------------------------- /img/ch5_2.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch5_2.JPG -------------------------------------------------------------------------------- /img/ch5_3.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch5_3.JPG -------------------------------------------------------------------------------- /img/ch6_1.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch6_1.JPG -------------------------------------------------------------------------------- /img/ch6_2.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch6_2.JPG -------------------------------------------------------------------------------- /img/ch8_1.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch8_1.JPG -------------------------------------------------------------------------------- /img/ch8_2.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch8_2.JPG -------------------------------------------------------------------------------- /img/ch8_3.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch8_3.JPG -------------------------------------------------------------------------------- /img/ch8_4.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch8_4.JPG -------------------------------------------------------------------------------- /img/ch8_5.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch8_5.JPG -------------------------------------------------------------------------------- /img/ch8_6.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch8_6.JPG -------------------------------------------------------------------------------- /img/ch8_7.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/ch8_7.JPG -------------------------------------------------------------------------------- /img/정답_1.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/정답_1.JPG -------------------------------------------------------------------------------- /img/프로그램 실행 과정의 예.JPG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/okskna/ComputerArchitecture_Summary/73c84bd9d63a268fec3e54e5a3c5e319ee0096d5/img/프로그램 실행 과정의 예.JPG --------------------------------------------------------------------------------