문제 해결 컴퓨터 구조를 이해하고 있다면 문제 상황을 빠르게 진단할 수 있고, 문제 해결의 실마리를 다양하게 찾을 수 있다.
성능, 용량, 비용 컴퓨터 구조를 이해하면 입,출력 개발을 넘어선 성능, 용량, 비용등을 고려한 개발을 할수있게 된다.
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부품을 사용하려고 할 때 발생
슈퍼스칼라 : CPU 내부에 여러 개의 명령어 파이프라인을 포함한 구조
비순차적 명령어 처리 : 아래에서 3번 명령어를 처리하기 위해서는 1,2번 명령어가 실행이 끝날 때 까지 대기해야한다. 그러나 4~6번을 처리하기 위해서 위의 대기가 필요하진 않다.
그러므로 위와같이 효율적으로 순서를 변경할 수 있다. 이러한 기법을 '비순차적 명령어 처리 기법'이다.
05 - 3 / CISC와 RISC
ISA(Instruction Set Architecture) : 명령어 집합 구조
CISC(Complex Instruction Set Computer) : 복잡한 명령어 집합을 활용하는 컴퓨터