1. 데이터 처리의 근본 원리
데이터는 CPU의 ALU에 의해 산술 또는 논리연산되어 처리됨
가. 예제
•
CPU의 ALU는 '1 + 0 = 1' 연산을 어떻게 처리하는가?
→ R1(Register 1)에 이진수 1이 할당되고, R2(Register 2)에 이진수 0이 할당됨. R1의 값과 R2의 값을 bit adder로 더해서 R3(Register 3)에 할당함
나. 핵심 용어
•
ALU(arithmetic logic unit): 두 숫자의 산술연산과 논리연산을 계산하는 디지털 회로로, CPU의 가장 기본적인 부품임
•
Processor Register: CPU 내 존재하는 최상위의 메모리로, 현재 계산을 수행 중인 값을 임시 저장하는데 사용함
•
bit adder는 덧셈 연산을 수행하는 기초 논리부품으로, 입력신호 전압(0 or 1)을 받아서 결과값을 출력함
•
bit adder는 AND, OR, NOT의 세 가지 종류의 논리회로로 구성할 수 있음
•
bit adder를 조합하여 byte단위 이상의 데이터를 처리할 수 있는 adder로 만들 수 있음
다. 32bit register vs 64 bit register
•
bit의 크기는 CPU가 데이터를 처리할 때 사용하는 ‘레지스터’의 크기를 말한다.
1-1. ALU의 사칙연산
덧셈을 기반으로 뺄셈은 2의 보수, 곱셈과 나눗셈은 비트 시프트 연산 개념을 활용
가. 덧셈과 뺄셈
나. 곱셈과 나눗셈
다. 부동소수점 표현
IEEE 표준: 정규화, 부호, 지수부, 가수부 결정에 따라 변환
•
정규화: 10진수를 2진수로 변경 후, 다음의 형태로 변경, 1.xxx *
ex) 7.625 → 111.101 → 1.11101 * 2^2
•
부호 결정: 양수(0), 음수(1)
•
지수부 결정: bias + n을 2진수로 바꾼 값
ex) 32bit 체계의 경우, bias는 127 따라서 지수부의 십진수는 127 + 2 = 129
이진수로 바꾸면 10000001
참고) 32bit 체계는 java의 float에 해당하고 64bit 체계는 double에 해당함
•
가수부 결정: 1.xxxx에서 xxxx에 해당하는 부분
ex) 11101
•
부동소수점 변환 결과: 7.625 → 0 10000001 1110100000~
1-2. 데이터 흐름
Disk → Memory → CPU → Memory → Disk
가. Disk → Memory
→ 프로그램은 기계어(binary code) 형태로 Disk에 저장되어 있음
→ OS에 의해 프로그램이 실행되면 Disk에서 Memory로 이동됨
→ Process란 현재 실행중인 프로그램(= 메모리에 올라온 프로그램)
나. Memory → CPU
→ 메모리에 올라온 프로그램은 순차적으로 CPU의 Register에 저장되어 연산되기를 반복함
다. CPU → Memory → Disk
1-3. 폰 노이만 구조 vs 하버드 구조
가. 폰 노이만 구조
•
데이터 메모리와 프로그램 메모리가 하나의 메모리 유닛에 포함되어 있음
•
프로세스와 메모리 유닛 사이에 하나의 버스만 존재
•
단점: 하나의 버스로 프로그램 명령이 순차적으로 실행되고, 실행된 명령에 따라 메모리를 쓰고 읽기를 반복하면서 병목현상이 발생
image from https://ko.wikipedia.org/wiki/폰_노이만_구조
나. 하버드 구조
•
탄생 배경: 폰 노이만 구조의 메모리 병목 현상 개선
•
데이터 메모리와 명령어 메모리를 물리적으로 구분
•
프로세서는 데이터 메모리와 명령어 메모리에 각각의 버스를 통해 물리적으로 구분되어 연결됨
•
단점: CPU 코어 내 많은 버스가 사용되기 때문에 공간적 제약
다. 수정된 하버드 구조
•
탄생 배경: 하버드 구조의 CPU 공간적 제약 개선
•
물리적으로 폰 노이만의 구조(하나의 메모리 유닛에 프로그램 메모리와 데이터 메모리 포함)를 따라감
•
프로세서와 명령어 간 데이터는 명령어 캐쉬를 거침
•
프로세서와 데이터 간 데이터는 데이터 캐쉬를 거침
1-4. CPU Clock
가. CPU Clock이란
•
CPU가 초당 실행하는 사이클의 수
→ 1GHz(기가헤르츠)는 1초에 10억번의 사이클 실행
나. Clock Cycle이란
•
Clock Cycle이란 내부 주파수 발진기에 의해 동기화된 펄스
→ 한 번의 사이클에는 하나의 입력 신호에 대해 cpu가 에러 없이 특정 연산을 수행
•
CPU 설계에 따라 한 번의 사이클에서 다수의 명령이 완료되기도 하고 하나의 명령이 다수의 사이클에 걸쳐 완료되기도 함
2. 메모리 관리
2-1. 프로세서의 메모리 배치
가. 프로세서와 메모리의 관계
나. 메모리 영역
•
Code 영역(or Text 영역): 코드의 대부분이 저장되는 영역
→ 함수, 제어문, 상수 등등
→ int a, b 또는 printInt 내부의 if 등이 해당됨
•
Data영역: 전역변수와 Static변수가 할당되는 영역
→ 프로그램 종료 시 메모리에서 해당 변수 제거
→ 이하 예제의 ‘int C’가 해당됨
•
Stack영역: 함수 호출 시 생성되는 임시 메모리 영역
→ 함수 호출 시 생성되는 지역변수와 매개변수가 저장
→ 함수 호출 완료 시 제거
→ int firstNum, secondNm, sum이 해당됨
•
Heap 영역: 동적할당 영역, 프로그래머가 할당/해제함.
→ 객체 인스턴스가 생성되면 Heap 영역의 메모리를 할당 받음
: 클래스 자체의 속성(인스턴스 속성이 아닌)은 동적할당되기 전에 접근 가능해야 하므로 Code 영역에 존재함
→ Java는 가비지 컬렉터가 자동으로 해제
→ System도 일종의 class이므로 Heap 영역에 할당
→ ex) java String 클래스는 불가변성(immutable)이 있으므로 String 클래스의 인스턴스를 수시로 지우는 것은 Heap 영역의 메모리를 수시로 할당하게 되는 것
public static int C = 5; // data 영역
int a = 3; // code 영역
int b = 5; // code 영역
public void printInt(int firstNum, int secondNum){ // Stack 영역
int sum = 0; // Stack 영역
// code 영역
if(firstNum > 0 && secondNum > 0){
sum = firstNum + secondNum + C;
}
System.out.println(sum); // Heap 영역
}
Java
복사
3. 컴파일의 근본 원리
사람의 언어를 기계어(binary code)로 변환
가. 예제
•
십진법 연산 '4+ 5= 9'을 어떻게 처리하는가?
→ 4(10진법)는 기계어(2진법)로 변환하면 100(2진법), 5는 101(2진법)이 됨
→ 덧셈연산을하면 1001(2진법)이 되고, 이를 다시 10진법으로 변환하면 9가됨
나. Compile이란
•
사람의 언어를 컴퓨터의 언어로 변환하는 방식은 CPU의 설계방식이나 OS에 따라 다름
•
C언어의 등장에 따라 Compile의 과정을 거치면서 CPU나 OS에 독립적인 프로그램을 만들 수 있음
•
Compile: 사람의 언어(원시코드, 변환의 대상)를 컴퓨터의 언어(목적코드, 변환의 결과)로 옮기는 것
3-1. Compile 세부 과정
3-2. 문자 컴파일
3-3. 이미지 데이터 컴파일
3-4. 음성 데이터 컴파일
Reference
•
•
부동소수점 연산, https://gsmesie692.tistory.com/94