Search
🖥️

컴퓨터구조

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 * 2n2^n
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 하버드 구조

가. 폰 노이만 구조

데이터 메모리와 프로그램 메모리가 하나의 메모리 유닛에 포함되어 있음
프로세스와 메모리 유닛 사이에 하나의 버스만 존재
단점: 하나의 버스로 프로그램 명령이 순차적으로 실행되고, 실행된 명령에 따라 메모리를 쓰고 읽기를 반복하면서 병목현상이 발생

나. 하버드 구조

탄생 배경: 폰 노이만 구조의 메모리 병목 현상 개선
데이터 메모리와 명령어 메모리를 물리적으로 구분
프로세서는 데이터 메모리와 명령어 메모리에 각각의 버스를 통해 물리적으로 구분되어 연결됨
단점: 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://jinshine.github.io/2018/05/17/컴퓨터 기초/메모리구조/
CPU Clock
부동소수점 연산, https://gsmesie692.tistory.com/94