////
Search

2 : 컴퓨터가 이해하는 정보

0과 1만을 이해하는 컴퓨터가 어떻게 문자 & 숫자를 인식하는지
그렇게 표현된 정적 데이터가 명령어에 의해 어떻게 실행되는지
CPU는 기본적으로 0과 1만 이해
비트 : 0과 1을 나타내는 가장 작은 정보의 단위
N비트는 2^N개의 정보 표현 가능
바이트 : 여덟 비트를 묶은 단위
하나의 바이트로 표현 가능한 정보 : 2^8 = 256개
워드 : CPU 관점에서의 정보 단위
비트, 바이트 등의 단위는 모두 프로그램 크기를 나타낼 때 사용하는 정보 단위 (= 프로그램 관점에서 본 정보 단위)
즉, CPU가 한 번에 처리할 수 있는 데이터 크기 의미
CPU는 2GB 크기의 프로그램을 한 번에 2GB만큼 읽어 들여 처리하는 게 아니라, 프로그램을 워드 단위로 읽어 들이고 처리

데이터 - 0과 1로 숫자 표현하기

정수 표현

CPU는 0과 1만 이해할 수 있으므로 2진법을 사용해 수를 이해
0과 1 숫자만으로 모든 수를 표현

소수 표현

️ 핵심 : 표현하고자 하는 소수와 실제로 저장된 소수 간에 오차가 존재할 수 있다는 점
부동 소수점 표현 방식을 이용해 컴퓨터 내부에서 소수점을 나타내는데, 정밀도에 한계가 존재하기 때문
부동 소수점 : 소수점이 고정되어 있지 않은 수. 필요에 따라 소수점의 위치가 이동할 수 있고 유동적
IEEE 754 : 오늘날 대부분의 컴퓨터가 2진수로 부동 소수점(실수)을 표현하는 방식
3가지 구성 요소
1.
부호 비트 : 숫자 부호 결정
0이면 양수, 1이면 음수
2.
지수부 : 소수점의 위치를 나타내는 부분
지수부에 저장되는 값은 바이어스(bias)라는 특정 값을 더한 형태 (실제 지수 값은 저장된 지수 값에서 바이어스를 뺀 값)
Bias=2(k1)1Bias = 2^(k-1)-1
k = 지수의 비트 수
32비트의 경우 → 지수부에 8비트 할당
64비트의 경우 → 지수부에 11비트 할당
3.
가수부 : 유효 숫자를 나타내는 부분
정규화된 이진수 형태(1.xxxxx)에서 소수점 이하의 부분만 저장
 유의할 점 : 10진수 소수를 2진수로 표현할 때, 10진수 소수와 2진수 소수의 표현이 딱 맞아떨어지지 않을 수 있음
10진수 0.1은 2진수로 표현하려면 (1.m x 2^n) 형태로 무한하게 많은 소수점이 필요
즉, (m x 10^n)으로 표현 가능한 수 중에도 (m x 2^n)으로 딱 맞아떨어지지 않는 수가 존재 가능
컴퓨터 저장공간은 한정적 → 딱 맞아떨어지지 않는 경우, 일부 소수점을 생략해 저장 → 오차 발생

데이터 - 0과 1로 문자 표현하기

문자 집합 : 컴퓨터가 이해할 수 있는 문자들의 집합
컴퓨터가 처리할 수 있도록 문자에 이진수 값을 할당한 약속 or 규칙( = 사전)
컴퓨터는 특정 문자 집합(EX: 유니코드)의 규칙을 알고 있음. 특정 문자를 인코딩 or 디코딩할 때, 컴퓨터는 해당 문자를 문자 집합에서 찾아 그 번호를 확인 → 변환
문자 인코딩 : 문자 집합에 속한 문자를 컴퓨터가 이해하는 0과 1로 이뤄진 문자 코드로 변환하는 과정
문자 디코딩 : 0과 1로 표현된 문자를 사람이 이해하는 문자로 변환하는 과정
유니코드가 전 세계의 모든 문자를 하나의 거대한 문자 집합으로 통합
모든 문자에 고정 크기를 할당하면, 자주 사용되는 영어 문자도 불필요하게 많은 공간을 차지 → 이를 해결하기 위해 문자 인코딩 등장
영어 문자는 1바이트, 한글은 3바이트, 이모지는 4바이트를 사용하는 가변 길이 인코딩 방식을 채택 → 저장 공간 절약 & 호환성 증가

명령어

수행할 동작 & 수행할 대상으로 이뤄져 있음
수행할 대상 : 수행할 동작에 사용될 데이터 자체 or 동작에 사용될 데이터가 저장된 위치
연산 코드 : 명령어가 수행할 동작
CPU에 따라 연산 코드의 구체적인 생김새가 다르지만 대부분의 CPU가 공통적으로 이해하는 연산 코드의 유형 존재 : 데이터 전송, 산술/논리 연산, 제어 흐름 변경, 입출력 제어
오퍼랜드 : 동작에 사용될 데이터 or 동작에 사용될 데이터가 저장된 위치
️ 오퍼랜드와 관련해 기억해야할 점
오퍼랜드 필드에는 연산 코드에 사용될 데이터가 직접 명시되기보다는 많은 경우 연산 코드에 사용될 데이터가 저장된 위치, 즉 메모리 주소나 레지스터 이름이 명시된다는 점
그래서 주소 필드라고도 부름

기계어와 어셈블리어

기계어 : CPU가 이해할 수 있도록 0과 1로 표현된 정보를 있는 그대로 표현한 언어
어셈블리어 : 0과 1로 표현된 기계어를 읽기 편한 형태로 단순 번역한 언어
어셈블리어를 보면 CPU가 이해할 수 있는 명령어의 종류와 동작을 파악 가능
어떤 프로그래밍 언어로 어떤 프로그램을 만들든 컴퓨터 내부에서는 0과 1로 이뤄진 기계어로 변환해 프로그램 실행
유의할 점 : 구체적인 연산 코드의 종류, 레지스터 이름, 명령어 생김새가 CPU마다 다를 수 있음
같은 프로그램일지라도 CPU마다 이해하는 명령어가 다르면 실행이 불가할 수 있음
여러 플랫폼에서 실행되는 프로그램을 개발할 때는 특정 CPU에만 의존적인 코드로 작성하지 말 것

명령어 사이클

CPU가 명령어를 처리하는 과정에서 프로그램 속 각 명령어들이 일정하게 반복되며 실행되는 주기
1.
인출 사이클 : 메모리에 있는 명령어를 CPU로 가지고 오는 단계 (명령어 사이클의 첫 번째 단계)
2.
실행 사이클 : CPU로 가져온 명령어를 실행하는 단계
CPU는 메모리 속 명령어를 가져와 실행하기를 반복하며 프로그램을 실행 → 인출 & 실행 사이클을 반복
3.
간접 사이클 : 명령어를 실행하기 위해 한 번 더 메모리에 접근하는 단계 (EX : 인출된 명령어의 오퍼랜드 필드에 메모리 주소가 명시된 경우)
4.
인터럽트 사이클 : 인터럽트를 처리하는 단계
참고 자료