컴퓨터구조를 배운지 거의 2년이 되어가면서 중요한 내용들을 잊어버린 것 같아 한번 쭉 복습해보는 시간을 가져봤다
우선 유튜브를 보면서 컴퓨터 구조 요약본들을 보면서 다시 기억해보려고 한다
앞으로 전공에서 배웠던 CS 공부를 복습해보려고 하는데 이 큰 그림을 따라서 진행할 예정이다!

컴퓨터 구조를 알아야 하는 이유
개발자는 코드만 잘 짜면 되는게 아니라
프로그래밍 언어뿐 아니라 컴퓨터의 "근간"을 알아야함
컴퓨터의 근간을 알게 된다면 컴퓨터 동작 원리를 알 수 있으니
문제 해결 능력이 좋아지고 과 성능, 용량, 비용을 고려할 수 있게 됨
1. 문제 해결 능력 : 소스 코드가 제대로 동작 안할때 한번 들여다 볼 수 있음 가장 밑단부터 이 명령어가 어떻게 해석되는지 알 수 있게됨 미지의 대상이 아닌 분석의 대상이 됨
2. 성능, 용량, 비용 : 개발에서 가장 중요한 이야기 중 하나임!

데이터
- 숫자, 문자, 이미지, 동영상과 같은 정적인 정보
- 컴퓨터와 주고 받는 / 내부에 저장된 정보를 데이터라 통칭하기도 함
명령어
- 컴퓨터는 결국 명령어를 처리하는 기계
- 컴퓨터를 실질적으로 움직이는 정보
- 데이터는 명령어를 위한 일종의 재료
실제로 명령어들은 모두 다 0과1로 바뀌어서 실행되는데 이걸 사람이 이해하기는 어려우니까 사람이 이해하기 쉽도록 정리한게 어셈블리어다

CPU
- 메모리에 저장된 명령어를 읽어 들이고, 해석하고, 실행하는 부품이다
CPU의 내부 구성
1. ALU : 산술 논리 연산 장치, 계산기
2. 레지스터 : CPU 내부의 작은 저장 장치 (임시)
3. 제어 장치 : 제어 신호를 내보내고, 명령어를 해석하는 장치
* 제어 신호 : 컴퓨터 부품들을 관리하고 작동시키기 위한 전기 신호 (e.g 메모리 읽기 신호, 메모리 쓰기 신호)
어떻게 메모리에 있는걸 읽어서 명령어를 실행하는지 한번 흐름을 살펴보자
1번지의 명령어(더하라, 3번지와 4번지)를 실행하고싶다면
1. 1번지에 있는 명령어를 읽어들여야하니까 1번지 메모리 읽기 제어 신호를 씀!
2. 그 명령어를 CPU내부의 작은 저장장치인 레지스터에 저장함
3. 이 명령어를 제어 장치를 통해 해석함 (아, 3번지와 4번지를 더하라는거구나)
4. 3번지와 4번지의 데이터를 메모리에서 읽어옴 by 제어신호
5. 3번지 4번지를 레지스터에 저장함
6. ALU가 계산을 하고 그 결과를 레지스터에 저장함
그럼 이제 2번지에 있는 명령어( 저장하라, 연산결과를) 이걸 실행하려면
메모리 읽기 해와서 명령어 해석해서 음 저장하라는거군 하면 아까 나온 3번지와 4번지 결과를 메모리에 저장함
특수 목적 레지스터
- PC : 다음 명령어 주소
- IR : 현재 명령어
- MAR : 메모리 주소
- MDR : 메모리 데이터
범용 레지스터
- 연산에 필요한 데이터 저장
- 변수 저장
- ALU 계산 결과 저장
- CPU가 가장 자주 사용하는 작업 공간
메모리와 캐시 메모리 (ROM이 아닌 RAM)
- 메모리는 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품이다!
- 프로그램이 실행되려면 메모리에 저장되어 있어야 한다
- 메모리에 저장된 값의 위치는 주소로 알 수 있다

보조 기억 장치
메모리의 특성에 대해서 먼저 알아보자면 RAM, ROM은 휘발성이고 보조기억장치에 비해 비싸다
전원이 꺼져도 저장이 가능하다!
용량이 크고 가격이 더 저렴함
입출력 장치
모니터, 키보드, 마우스 같은 컴퓨터 외부에 연결되어서 컴퓨터 내부와 정보를 주고 받는 것들
이것들에 대해서 인터럽트 개념이 존재함
인터럽트가 발생하면 CPU 내부에서 무슨 일이 일어날까?
프로그램 실행
↓
키보드 입력 발생
↓
인터럽트 요청
↓
현재 레지스터 저장
↓
ISR 실행
↓
레지스터 복구
↓
원래 프로그램 복귀
보통 저장하는 것들은 PC, 상태 레지스터, 범용 레지스터 -> 어디에 ? RAM의 Stack에!
인터럽트 발생
push PC
push FLAGS
push R1
push R2
push R3
인터럽트 처리 끝나면
pop R3
pop R2
pop R1
pop FLAGS
pop PC
메인보드 &시스템 버스
- 메인보드에 연결된 부품은 버스를 통해 정보를 주고 받음
- 버스는 컴퓨터 부품끼리 정보를 주고 받는 일종의 통로
- 다양한 종류의 버스가 있음
- 컴퓨터의 핵심 부품을 연결하는 버스는 시스템 버스
시스템 버스 내부 구성
- 주소 버스 : 주소를 주고 받는 통로
- 데이터 버스 : 명령어와 데이터를 주고 받는 통로
- 제어 버스 : 제어 신호를 주고 받는 통로
여기까지가 주로 컴퓨터 구조의 핵심적인 이야기라고 한다 그런데 나는 조금 더 깊게 들어가보고싶다 이렇게 봐도 시험때 막 엄청 어렵게 공부했던 내용이 기억이 잘 안나기때문에 시험 준비할때 복잡하게 회로를 그리면서까지 공부했던 기억까지 꺼내고싶다!
그래서 일단 컴퓨터구조 블로그를 찾아서 공부를 더 해보았다
https://developbear.tistory.com/23
[Chapter 1.1 컴퓨터 구조 및 설계] 컴퓨터의 종류와 추상화의 개념
본 정리는 CS422-컴퓨터 구조 및 설계 : 하드웨어/소프트웨어 인터페이스. David A. Patterson,존 헤네시 책을 바탕으로 하고 있음을 미리 알립니다. 컴퓨터의 응용 분야의 종류와 그 특성 임베디드 컴
developbear.tistory.com
해당 내용을 다시 한번 정리해봤는데 정리하고싶은 부분만 일단 정리해보려고한다
먼저 컴퓨터 구조에서 8가지의 아이디어가 중요하다
1. 무어의 법칙을 고려한 설계
2. 설계를 단순화하는 추상화
3. 자주 생기는 일을 빠르게
4. 병렬성을 통한 성능 개선
5. 파이프라이닝을 통한 성능 개선
6. 예측을 통한 성능 개선
7. 메모리 계층 구조
8. 여유분을 이용한 신용도 개선
나머지는 대충 컴퓨터공학 내용에서 중요한 부분이지만 무어의 법칙은 나중에 면접에 나올 수도 있으니 확실하게 이해하고자한다
무어의 법칙 : 반도체 칩이 집적되는 트랜지스터 수가 약 18~24개월 마다 2배로 증가한다는 경험적인 법칙이다
음 이게 무슨 말일까 ? 먼저 트랜지스터는 CPU를 구성하는 가장 기본적인 전자 부품을 의미한다 0과 1을 표현하는 스위치라고 생각하면 편하다 CPU안에는 수십억개의 트랜지스터들이 들어가있는데 이러한 0,1신호를 이용해서 덧셈, 곱셈, 비교, 데이터 저장 이런것들을 수행한다 트랜지스터가 많아지면 더 복잡한 CPU 설계가 가능하다는 것을 알아두자 그런데 CPU 설계 자체는 2-3년 걸리는 일인데 2년 3년 뒤에는 기술이 발전해서 계속 더 작은 트랜지스터들을 만들어두었을 예정이라 미래에 그때 트랜지스터들은 더 작을 예정이니 이걸 고려해서 CPU를 설계하자는 것이다
BUT 최근에는 트랜지스터를 계속 작게 만들 수 있을줄만 알았는데 발열 증가, 전력 문제, 물리적 한계 같은 문제가 발생하면서 최근엔 단순히 트렌지스터를 작게 만드는 일에만 주목하는 것이 아니라 멀티 코어와 병렬처리, AI 가속기를 합치는 방식으로 발전하고 있다
컴퓨터 성능
성능을 바라보는 관점은 크게 응답 시간(Response Time)과 처리량(Throughput)의 관점이 존재한다.
- 응답 시간(Response Time): 하나의 태스크를 수행하는 데 걸리는 시간
- 처리량(Throughput): 일정 시간 동안 처리하는 작업의 양
성능은 실행 시간과 반비례 관계에 있다.
Performance = 1 / Execution Time
CPU Time = Instruction Count × CPI × Clock Cycle Time
- Instruction Count: 실행된 명령어 수
- CPI(Cycles Per Instruction): 명령어 1개를 실행하는 데 필요한 평균 클럭 사이클 수
- Clock Cycle Time: 클럭 주기
성능 향상 방법
1. 명령어 수 줄이기
2. CPI 수 줄이기 : CPI란 명령어 1개 실행하는 데 평균 몇 사이클 필요한지
3. 클럭 속도 높이기 (= 클럭 주기 줄이기)
즉, CPU 성능은 단순히 클럭 속도만으로 결정되지 않고, 명령어 수와 CPI도 함께 고려해야 한다.
기억해야할 점
- 명령어 수를 줄인다고 해서 무조건 성능이 좋아지는 건 아님. 명령어 수 줄였는데 CPU 회로가 복잡해져서 CPI가 커질 수도 있기때문
- 명령어 수 , CPI 수 , 클럭 속도 중 하나만 안다고 성능이 좋아진다고 보장할 수가 없음 최종적으로는 실행 시간을 알아야한다는 점
MIPS
레지스터 매핑
$zero는 0번
$t0 – $t7는 8 – 15번
$t8 – $t9는 24 – 25번
$s0 – $s7는 16 – 23번
명령어 마다 32비트가 가지고 있는 형식이 정해져있는데
(1워드 = 4바이트 = 32비트)
MIPS의 경우 1 명령어 = 32비트이다
R포맷의 경우

- op : 6bit를 차지한다. 명령어가 실행할 연산의 종류로서 연산자(opcode)라고 부른다.
R포맷은 무조건 op가 000000이다 - rs : 5bit를 차지한다. 첫 번째 근원지(source) 피연산자 레지스터. ex) add $t1 $t2 $t3 이면 피연산자인 t2
- rt : 5bit를 차지한다. 두 번째 근원지(source) 피연산자 레지스터. ex) add $t1 $t2 $t3 이면 피연산자인 t3
- rd : 5bit를 차지한다. 목적지 레지스터. 연산 결과가 기억된다. ex) add $t1 $t2 $t3 이면 목적지인 t1
- shamt : 5bit를 차지한다. shift 연산 시 shift 양을 나타낸다. shift연산이 아닐 시에는 0으로 채워둔다.
- funct : 6bit를 차지한다. op필드에서 연산의 종류를 표시하고 funct 필드 애 서는 그중의 한 연산을 구체적으로 저장한다.
예를 들어 add $t0, $s1, $s2를 기계어로 표현하면 아래와 같다

I 포맷의 경우
상수나 메모리 주소를 사용한다

- op: R format과 동일하다
- rs : R format과 동일하다
- rt : rd를 대신해서 목적지 레지스터의 번호가 되거나 R format과 동일한 역할을 한다.
- constant : 말 그대로 상수가 들어가거나 lw나 sw에서 offset 값이 들어간다.
부동소수점

- S (부호 비트 - 1비트): 양수면 0, 음수면 1
- E (지수 비트 - 8비트): 소수점 이동 횟수 (2^y에서 y 값)
- F (가수 비트 - 23비트): 정규화하고 남은 소수점 아래 뒷자리들
-0.75를 32비트 부동 소수점으로 표현하기
-0.75 = -0.11(2)
-1.1 * 2^-1
S = 1
E= -1이니까 Bias 127를 더해서 126. 8비트로 바꾸면 0111110
F= 1이니까 23비트를 채워야해서 1000...00