Ch1. 컴퓨터 구조
01 - 1 / 컴퓨터 구조를 알아야 하는 이유
- 문제 해결
컴퓨터 구조를 이해하고 있다면 문제 상황을 빠르게 진단할 수 있고, 문제 해결의 실마리를 다양하게 찾을 수 있다. - 성능, 용량, 비용
컴퓨터 구조를 이해하면 입,출력 개발을 넘어선 성능, 용량, 비용등을 고려한 개발을 할수있게 된다.
01 - 2 컴퓨터 구조의 큰 그림
- 컴퓨터가 이해하는 정보
- 데이터
- 명령어
- 컴퓨터의 네가지 핵심 부품
□ CPU : 메모리에 저장된 명령어를 읽고, 해석하고, 실행하는 부품(ALU, 레지스터, 제어장치로 구성)
→ ALU : 계산기
→ 레지스터 : CPU 내부의 작은 저장장치
→ 제어장치 : 제어 신호를 내보내고, 명령어를 해석하는 장치
□ 메모리(주기억장치) : 현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품
→ 프로그램이 실행되기 위해서는 메모리에 저장되어 있어야 한다.
→ 메모리는 실행되는 프로그램의 명령어와 데이터를 저장한다.
→ 메모리에 저장된 값의 위치는 주소로 알 수 있다.
□ 보조기억장치 : 전원이 꺼져도 보관될 프로그램을 저장하는 부품
□ 입출력장치 : 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환할 수 있는 부품
※ 메인보드(시스템 버스) : 네 가지 핵심 부품들이 서로 정보를 주고받는 통로
Ch2. 데이터
02 - 1 / 0과 1로 숫자를 표현하는 방법
- 정보단위 : 0과 1을 나타내는 가장 작은 정보를 비트(bit) 라고 하며 n비트는 2^n개의 정보를 표현 할 수 있다.
※ 워드(word) : CPU가 한번에 처리 할 수 있는 데이터 크기 - 이진법 : 0과 1만으로 숫자를 표현하는 방법
※ 이진수 음수 표시 방법 : 모든 이진수를 반전시키고 1을 더함
ex) 1001의 음수 는 0110 + 1 = 0111이다. - 십육진법 : 십진법에서 10~15를 A~F로 표현
십육진수 이진수 전환 : 십육진수는 16가지를 표현할 수있으므로 한글자당 4비트를 할당한다.
02 - 2 / 0과 1로 문자를 표현하는 방법
- 문자 집합: 컴퓨터가 인식하고 표현할 수 있는 문자의 모음
- 인코딩 : 문자를 컴퓨터가 이해할 수 있는 0과 1로 변환하는 과정
- 디코딩 : 0과 1을 문자로 변환하는 과정
Ch3. 명령어
03 - 1 / 소스 코드와 명령어
- 고급언어 : 사람을 위한 컴퓨터 언어
- 컴파일 언어 : 컴파일러를 통해 저급언어로 변환
- 인터프리터 언어 : 인터프리트를 통해 저급언어로 변환
- 저급언어 : 컴퓨터가 직접 이해하고 실행할 수 있는 언어
고급언어로 작성된 소스코드를 컴파일러를 통해 컴파일 하여 저급언어로 작성된 목적코드로 변환한다.
- 인터프리터 언어 : 인터프리터에 의해 소스코드 가 한 줄씩 실행되는 고급 언어 ex)Python
03 - 2 / 명령어의 구조
- 오퍼랜드 : 연산에 사용될 데이터 혹은 연산에 사용될 데이터가 저장된 위치(주소필드)
- 연산코드 : 명령어가 수행할 연산
- 데이터 전송
- 산술/논리 연산
- 제어 흐름 변경
- 입출력 제어
- 주소 지정 방식
- 즉시 주소 지정 방식
- 직접 주소 지정 방식
- 간접 주소 지정 방식
- 레지스터 주소 지정 방식
- 레시즈터 간접 주소 지정 방식
※ C언어의 컴파일 과정
- 전처리 과정(preprocessing)
- 컴파일 전 처리할 작업들
- 외부에 선언된 다양한 소스코드, 라이브러리 포함
- 프로그래밍의 편의를 위해 작성된 매크로 변환
- 컴파일할 영역 명시
- 컴파일 과정(compiling)
- 전처리가 완료 되어도 여전히 소스코드 형태
- 전처리 완료된 소스코드를 저급언어(어셈블리 언어)로 변환
- 어셈블 과정(assembling)
- 어셈블리어를 기계어로 변환
- 목적코드(object file)를 포함하는 목적파일이 됨
- 링킹(linking)
여러개의 object file을 하나로 합치는 과정
Ch4. CPU의 작동 원리
04 - 1 / ALU와 제어장치
- ALU - 내보내는 정보
- ALU는 레지스터를 통해 피연산자를 받아들이고, 제어장치로 부터 제어 신호를 받아들인다.
- 플래그(flag) : 연산 결과에 대한 추가적인 상태 정보
- 제어장치
- 받아들이는 정보 : 클럭, 플래그, 해석할 명령어
- 내보내는 정보 : CPU 내부에 보내는 제어신호(레지스터, ALU)
CPU 외부에 보내는 제어신호(메모리, 입출력장치)
04 - 2 / 레지스터
- 프로그램 카운터 : 메모리에서 가져올 명령어의 주소(메모리에서 읽어 들일 명령어의 주소)
- 명령어 레지스터 : 해석할 명령어(방금 메모리에서 읽어 들인 명령어)
- 메모리 주소 레지스터 : 메모리의 주소
- 메모리 버퍼 레지스터 : 메모리와 주고받을 값(데이터와 명령어)
- 플래그 레지스터 : 연산 결과 또는 CPU 상태에 대한 부가적인 정보
- 범용 레지스터 : 다양하고 일반적인 상황에서 자유롭게 사용
- 스택 포인터 : 스택과 스택 포인터를 이요한 주소 지정 방식
※ 스택 포인터 : 스택의 꼭대기를 가리키는 레지스터(스택이 어디까지 차 있는지에 대한 표시) - 베이스 레지스터 : 변위 주소 지정 방식에 사용하는 레지스터
→ 오퍼랜드 필드의 값(변위)과 특정 레지스터(프로그램 카운터, 베이스 레지스터)의 값을 더하여 유효 주소 얻기
04 - 3 / 명령어 사이클과 인터럽트
- 명령어 사이클 : 하나의 명령어를 처리하는 정형화된 흐름
- 인터럽트 : 위 흐름이 끊어지는 상황
- 동기 인터럽트(예외)
- 비동기 인터럽트(하드웨어 인터럽트)
- 입출력장치는 CPU에 인터럽트 요청 신호를 보냄
- CPU는 실행 사이클이 끝나고 명령어를 인출하기 전 항상 인터럽트 여부를 확인
- CPU는 인터럽트 요청을 확인하고 인터럽트 프래그를 통해 현재 인터럽트를 받아들일 수 있는지 여부를 확인
- 인터럽트를 받아들일 수 있다면 CPU는 지금까지의 작업을 백업
- CPU는 인터럽트 벡터를 참조하여 인터럽트 서비스 루틴을 실행
- 인터럽트 서비스 루틴 실행이 끝나면 백업해 둔 작업을 복구하여 실행을 재개
※ 인터럽트 요청 신호 : CPU의 작업을 방해하는 인터럽트에 대한 요청
인터럽트 플래그 : 인터럽트 요청 신호를 받아들일지 무시할지를 결정하는 비트
인터럽트 벡터 : 인터럽트 서비스 루틴의 시작 주소를 포함하는 인터럽트 서비스 루틴의 식별 정보
인터럽트 서비스 루틴 : 인터럽트를 처리하는 프로그램
Ch5. CPU 성능 향상 기법
05 - 1 / 빠른 CPU를 위한 설계 기법
- 코어와 멀티코어
- 스레드와 멀티스레드
05 - 2 / 명령어 병렬 처리 기법
- 명령어 파이프라이닝 : CPU는 각 단계를 동시에 실행 할 수 있다.(t0에 인출이 2번일 수는 없다)
※ 파이프 라인 위험
- 데이터 위험 : 아래 명령어에서 명령어 1이 실행되기 전에는 2가 실행될 수 없다. 이처럼 데이터 의존적인
두 명령어를 무작정 동시에 실행하려고 하면 파이프라인이 제대로 작동하지 않는 것을
'데이터 위험' 이라고 한다.
명령어 1 : R1 = R2 + R3(R1에 R2,R3 더한값을 저장하라)
명령어 2 : R4 = R1+ R5 (R4에 R1,R5 더한값을 저장하라) - 제어 위험 : '프로그램 카운터의 갑작스러운 변화'에 의해 발생
- 구조적 위험 : 명령어들을 겹쳐 실행하는 과정에서 서로 다른 명령어가 동시에 CPU부품을 사용하려고 할 때 발생
- 데이터 위험 : 아래 명령어에서 명령어 1이 실행되기 전에는 2가 실행될 수 없다. 이처럼 데이터 의존적인
- 슈퍼스칼라 : CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조
- 비순차적 명령어 처리 : 아래에서 3번 명령어를 처리하기 위해서는 1,2번 명령어가 실행이 끝날 때 까지 대기해야한다.
그러나 4~6번을 처리하기 위해서 위의 대기가 필요하진 않다.
그러므로 위와같이 효율적으로 순서를 변경할 수 있다.
이러한 기법을 '비순차적 명령어 처리 기법'이다.
05 - 3 / CISC와 RISC
- ISA(Instruction Set Architecture) : 명령어 집합 구조
- CISC(Complex Instruction Set Computer) : 복잡한 명령어 집합을 활용하는 컴퓨터
- RISC(Reduce Instruction Set Computer) : 고정 길이 명령어
CISC | RISC |
복잡하고 다양한 명령어 | 단순하고 적은 명령어 |
가변 길이 명령어 | 고정 길이 명령어 |
다양한 주소 지정 방식 | 적은 주소 지정 방식 |
프로그램을 이루는 명령어의 수가 적음 | 프로그램을 이루는 명령어의 수가 많음 |
여러 클럭에 걸쳐 명령어 수행 | 1클럭 내외로 명령어 수행 |
파이프라이닝하기 어려움 | 파이프라이닝하기 쉬움 |
'이론공부' 카테고리의 다른 글
프록시(Proxy)란? (0) | 2024.09.05 |
---|---|
기술면접 준비(1) (1) | 2024.09.05 |
개발로드1. 인터넷의 작동원리 (0) | 2024.05.09 |
자료구조 - 힙(heap) (0) | 2024.03.18 |
자료구조 - 트리(tree) (0) | 2024.03.17 |