2. 데이터

2.1 0과 1로 숫자를 표현하는 방법

컴퓨터는 0과 1밖에 이해하지 못한다.
1보다 큰수를 어떻게 이해할 수있을까

2.1.1 정보단위

컴퓨터가 이해하는 가장 작은 단위는 비트(bit)이다.
0과1을 표현하는 가장 작은 정보단위이다.

n비트로 2^n가지의 정보표현이 가능하다.
프로그램은 수많은 비트로 이루어져있다.
다만 평소 이파일은 8920120비트야라고 표현하지는 않는다.
비트보다 더 큰단위 바이트 키로바이트 메가바이트 기가바이트 테라바이트 등등으로 표현한다.

1바이트 = 8비트
1kb = 1000바이트
1000개씩 묶어나가면 메가바잍트 기가바이트 테라바이트가 된다.
1024씩묶은 것은 단위가 따로 있다.

워드(word)
CPU가 한번에 처리할 수있는 정보의 크기단위이다.
CPU가 한번에 32비트씩 처리할수잇으면 1워드가 32비트인것이다.
하프워드 워드의 절반크기
풀워드 워드크기
더블워드 워드의 두배 크기

2.1.2 이진법

0과1로 수를 표현하는 방법을 이진법이라고 한다.
숫자가 1로 넘어가는 시점에 자리올림한다.
우리가 일상적으로 상요하는 숫자가 9를 넘어갈때 자리올림하느 십진법이다.(decimal)

여기서 문제는
숫자 10만보고 이게 십진수인지 이진수인지 구분할 수 있나? 불가능하다.
이 수가 어떤 진법으로 표현된 수인지 알 수없다.
이런 혼동을 예방하기 위해 아래 첨자를 붙이거나 10(2) 이진수앞에 0b를 붙인다.
전자는 수학적으로 표기할때 후자는 코드상에서 이진수를 표기할 때 사용한다.

1000(2) or 0b1000

2.1.2.1 이진수의 음수표현

이진수의 음수를 어떻게 표현할지는 중요한 것이다.
십진수는 마이너스 부호만 붙이면되는데 컴퓨터는 부호를 인식할 수 없어서 0과 1만으로 음수를 표현해야한다.
현대 컴퓨터에서 가장 널리 사용되는게 2의 보수법이다.

2의 보수의 정의는 어떤 수를 그보다 큰 2^n에서 뺀값을 의미한다.
11(2) 보다큰 2^n = 100(2)
100(2) - 11(2) 01 11(2)를 음수로 표현한 값이다.

더 쉽게 구하는 방법은
0과 1을 뒤집고 1을 더하면 그 수의 보수가 된다.
00 -> 01

한가지 의문이 남는다.
보수값이 양수인지 음수인지 어케아나? 십진수를 변경해도 같게 나올 수 있다.
겉모습만 봐서는 구분이안되는게 맞다.

CPU는 CPU내부에 플래그(FLAG)레지스터에 현재값을 표기해서 가져간다.
모든 숫자가 이 플래그값을 들고다닌다고 생각하면된다.

2.1.3 16진법

이진법으론느 숫자의 길이가 너무 길어진다.
십진수 32 == 이진수 100000

그래서 컴퓨터의 데이터를 표현할때 16진법도 많이 사용한다.
수가 15를 넘어가는 시점에서 자리올림을 한다.

10 A 11 B 12 C 13 D 14 E 15 F 로하고 16에서 10으로 자리올림을 한다.

더쉬운방법

16진법 표기법은 (16)이라고 쓰거나 0x라고 표현한다.

16진수는 직접 코드에 써넣는 사례도 많아서 알아두면 좋다.
십육진수를 쓰는이유는 이진수 십육진수간 변환이 쉽기때문이다.
십진수로 변환보다 압도적으로 쉽다.

팁 : 십육진수를 이진수로 변환하면
숫자하나를 이진수 4비트라고 생각하고 각각을 떼어네서 붙이면된다.
1A2B(16)
->
0001
1010
0010
1011
을 합치면된다.

반대로 이진수 -> 십육진수 변환
이진수 4개를 16직수하나라고 이해하면된다.
11010101
->
D
5
D5

컴퓨터 내부구조를 이해하기 위해서는 이진수를 더 짧게 표현할수잇는 십진수와 십육진수를 알아두는 것이 좋다.

2.2 0과 1로 문자를 표현하는 방법

0과 1로 문자를 표현해보자.

컴퓨터가 문자를 이해하는 것을 알려면 세가지 용어를 알아야한다.

문자집합(Character set)
컴퓨터가 이해할 수 있는 문자의 모음

인코딩(encoding)
문자에서만 사용되는 것이 아니라 여러곳에서 사용되는 단어이다.
코드화하는과정
문자를 0과 1로 이러우전 문자코드로 변환하는 과정

디코딩(decoding)
코드를 해석하는 과정
0과1로 표현된 문자코드를 문자로 변환하는 과정

2.2.1 아스키코드

아스키코드는 초창기 문자집합 중 하나로 영어 알파벳과 아라비아숫자 그리고 일부 특수문잘르 포함한다.
아스키 문자집합에 속한 문자 들은 각각 7비트로 표현되는데 7비트로 표현할수있는 것은 2^7개 128개의 문자를 표현할 수있다.
실제로는 8비트가 쓰이는데 8비트 중 1비트는 오류검출을 위해 사용되는 패리티 비트(parity bit)이다.

A는 65 a는 97 32차이
문자하나하나에 부여된 값을 코드포인트라고한다.

인코딩방식은 그냥 부여된 숫자를 쓰면되서 편리한데
한글포함 다른 언어문자를 표현할 수없다.

그래서 확장된 8비트 확장 아스키가 등장햇는데 여전히 부족했다.

그래서 언어별로 인코딩방식이 등장하게 되었다.

2.2.2 한글 인코딩방식

완성형 vs 조합형 인코딩
한글을 위한 인코딩이 필요하다.
한글의 특징 알파벳을 이어쓰면 단어가 되는 영어
초성 중성 종성의 조합으로 이루어진 한글
완성형 인코딩방식과 조합형 인코딩방식이 존재한다.

완성형은 단어 하나자체에 코드를 부여한다. 박
조합형은 자음모음에 하나씩 코드를 부여한다. ㅂ ㅏ ㄱ

EUC-KR
단어하나하나에 코드를 부여하는 완성형인코딩이다.
글자하나하나에 2바이트 크기의 코드를 부여한다.
==16비트 4자리 십육진수로 표현한다.
2300여개를 표현할 수있다.

아스키코드보다 표현할 수 잇는 문자가 많아졌지만 이는 모든 한글 조합을 표현할 수는없다.
문자집합에 정의되지않은 뷁 믜 같은 글자는 표현할 수없다.

모든 한글을 표현할 수없다는 것은 때때로 문제를 발생시킨다.
웹사이트의 한글이 깨진다던지 표현할수없는 이름으로 인해 은행, 학교등에서 피해를 받는 사람이 생겨나기도 했따.

이러함 문제를 해결하기 위해 CP949같은 것이 만들어지기도 했다.

2.2.3 유니코드 문자집합과 UTF-8

그러나 이렇게 언어별로 인코딩을 하게되면 다국어를 지원하는 프로그램을 개발할때 언어별 인코딩방식을 모두 이해해야한다.
그래서 모든 언어 특수문자까지 통일된 문자집합을 사용하면어떨까?라는 욕구가생겨서 유니코드 문자집합과 UTF-8이생겨나게 되었다.

통일된 문자집합이다.
한글 영어 화살표와 같은 특수문자 심지어 이모티콘까지
현대 문자 표현에 있어 매우 중요한 위치에 있다.

유니코드를 인코딩방식이
UTF-8 UTF-16 UTF-32 등이 있다.

www.unicode.org/charts/PDF/UAC00.pdf에 들어가면 문자집합을 볼 수 있다.
유니코드 문자집합에서 아스키코드나 UEC-KR과 같이 각 문자마다 고유한 값이 부여된다.

코드포인트를 U+는 16진수임을 알리는것이고 뒤에 부여된 숫자가 코드포인트이다.
그냥 가져다 쓰는게 아니라 다양한 인코딩방식에 따라서 인코딩한다.

유니코드문자들에 16진수가잇고 이게 코드포인트이고
그대로 사용하는게 아니라 다양한 방식으로 컴퓨터가 이해하는 0 1 로 인코딩한다.
UTF-8등이 여기에 포함된다.

어떻게 인코딩하냐에 따라서 다른 문자가 되는 것이다.

가장 대중적인 UTF-8을알아보자.
UTF란 Unicode Transformaiton FOrmat 유니코드 ㅇ니코딩방법이다.
가변길이 인코딩이다. 인코딩 결과가 1바이트~4바이트이다.
인코딩결과가 몇 바이트가 될지는 유니코드에 부여된 값에 따라 다르다.(코드 포인트)

0000~ 007F일경우 1바이트
0080 ~ 07FF 2바이트
0800 ~ FFFF 3바이트
10000 ~ 10FFFF 4바이트

이런식으로 된다는 것만 이해하자.
외우지는 말자.

개발을하다가 글자가깨지는 경우가 발생한다.
이럴때 이 수업을 봣다면? 인코딩이 잘못되어잇는지 문자집합에 없는지
등을 의심할 수 있게 되는 것이다.

3. 명령어

3.1 소스코드와 명령어

명령어 하나하나 가아니라
소스코드가 어떻게 컴퓨터를 작동시키는가를 알아보자.
개발자가 작성한 소스코드를 직독직해해서 알아들을 수없다.

고급언어 -> 변환 -> 저급언어가 되어야한다.
고급언어는 개발자가 읽고쓰기 편하게 만들어진 것이다.

저급언어는 컴퓨터가 이해하고 실행하는 언어이다.
저급언어에는 기계어와 어셈블리어가 있다.

기계어는 01로 표현된 것이다. 십육진수로 표현하기도 한다.

사람입장에선 이 것이 어떤건지 이해할 수없다.

그래서 이 기계어를 사람들이 읽기편한 상태로 번역한것이 어셈블리어이다.
어셈블리어의 한줄 한줄이 컴퓨터를 동작시키는 명령어이다.

소스코드에 직접적으로 명시하면서 작성하는 경우도 있다. 알아두면 좋은 개발직군도 있다.

고급언어는 c c++ java 파이썬등이있다.

3.2 컴파일언어와 인터프리터 언어

고급언어로 작성된 소스코드가 저급언어로 변환되는 방식에 두가지 방식이 있다.

3.2.1 컴파일언어

소스코드 -> 컴파일러 -> 목적코드
특수한 프로그램에 의해서 컴파일되어서 저급언어인 목적코드가 생성된다.
대표적인 언어로는 C가 있다. 물론 이녀석들은 더 복잡합 과정이 있다.

3.2.2 인터프리터언어

인터프리터에 의해 한줄씩 실행한다.
소스코드 전체가 저급언어로 변홚되기까지 기다릴 필요가 없다.
파이썬이 여기에 포함된다.

실행되는 양상도 다르다.
컴파일은 중간에 오류가 발생하면 소스코드 전체가 실행되지 않는다.
인터프리터는 중간에 오류가 발생하면 그 직전까지는 실행되고 중지된다.

컴파일언어는 처음부터 해석해서 전체를 전달하는 것이고
인터프리터는 한줄씩 해석해주는 것이다.

cpu종류와 컴파일러에 따라서 변환모습이 달라질 수 있다.

이둘을 완벽하게 나눌 수는 없다.
파이썬도 컴파일을 하고 java도 컴파일과 인터프리트 를 동시에 수행한다.
그냥 이런방식이 있다고 이해하기만 하자.

3.3 명령어의 구조

명령어 하나하나에 집중해보자.

평소 사람이 명령어를 사용하는 방법과 같다.
누구야 뭐를 해

무엇을 대상으로 무엇을 수행하라고 한다.

더해라 100과 120을
빼라 메모리32번지의 값과 메모리 33번지 안의 값을

수행할연산 무엇을 대상으로(데이터, 데이터 저장된위치)로 나타낸다.
이런꼴을띄고있는게 명령어의 형태이다.

크게 연산코드와 오퍼랜드로 이루어져있다.
기계어 어셈블리어도 명령어이다.

오퍼랜드는 연산에 사용될 데이터 or 연산에 사용될 데이터가 저장된 위치이다.
후자가 훨씬더 자주 저장하게 된다.

오퍼랜드필드를 그래서 주소필드라고 하기도 한다.
오퍼랜드가 두개인경우 한개인경우 없는경우도 있다. 여러갤 수도 있는 것이다.

연산코드는 명령어가 수행할 연산이다.
cpu마다 생긴것이 다양하다.
각기 다른 코드를 가지고 있다.
크게는 데이터 전송, 산술/논리연산, 제어흐르변경, 입출력 제어가 있다.

외우지말고 이런 유형이 있다고만 이해하자.

1.데이터 전송
MOVE : 데이터옮기기
STORE : 메모리에저장
LOAD(FETCH) : 메모리 CPU로 데이터가져와라
PUSH : 스택에 데이터저장하라
POP : 스택최상단데이터가져와라

스택은 한쪽끝이 막혀잇는 자료구조 후입선출
큐는 양쪽끝이 뚫려잇다. 선입선출

2.산술/논리연산
ADD/ SUBTRACT / MULTIPLY / DIVIDE 사칙연산
INCRMEMNT / DECRMENT 1더해라 1빼라
AND / OR / NOT /연산
COMPARE 두개의 숫자 또는 TRUE / FALSE비교

3.제어흐름변경
특정메모리주소로 실행순서를 옮기는것들
JUMP : 특정 주소로 실행순서를 옮겨라
CONDITIONAL JUMP 특정조건에 부합할때 실행순서를 옮겨라
HALT 실행멈춰라
CALL 되돌아올 주소를 저장한체 특정주소로 실행 순서를 옮겨라 함수 실행과 비슷하다.
RETURN CALL을 호출할때 저장햇던 주소로 돌아가라 함수호출하고 돌아가는것이다.

4.입출력제어
read등 써라

3.3.2 주소지정방식

그냥 값을 저장하면될텐데 왜 굳이 위치를 사용하는 건가?
-> 명령어에서 표현할 수 있는데이터 크기가 제한되기 때문이다.
주소가 담긴다면 더 많은 오퍼랜드를 담을 수 있다.

유효주소 : 연산에 사용될 데이터가 저장된 위치
오퍼랜드 필드에 주소 레지스터주소가 담길수 있다.

cpu입장에서는 어디에 잇던 연산에 데이터를 가져다가 실행만 시키면된다.
이 방법이 명령어 주소지정방식이다.
연ㅇ산에 사용할 데이터가 저장된 위치를 찾는 방법이다.
유효주소를 찾는 방법이고
다양한 명령어 주소 지정 방식이 있다.

CPU마다 차이점이 있지만 대표적인 것들을 알아보자.

3.3.2.1 즉시주소지정방식

연산에 사용될 데이터를 오퍼랜드 필드에 직접명시
가장 간단한 형태의 주소지정방식이다.
연산에 사용할 데이터의 크기가 작아질수 있지만 빠르다.
주소를 찾을 필요가 없기때문에

3.3.2.2 직접주소지정방식

오퍼랜드 필드에 유효주소 직접적으로 명시
유효주소를 표현할 수 있는 크기가 연산코드만큼 줄어든다는 문제가잇다.

3.3.2.3 간접주소지정방식

앞선 문제를 해결하기 위한것이다.
오퍼랜드에 유효주소의 주소를 명시한다.
그러나 앞선 주소 지정방식들에 비해 속도가 느리다.

3.3.2.4 레지스터 주소지정방식

앞에는 메모리에 저장하는 거엿다면 이것은 레지스터에 지정하는 것이다.
연산에 사용할 데이터가 저장된 레지스터를 명시한다.
메모리에 접근하는 속도보다 레지스터에 접근하는 것이 빠르다.
레지스터는 CPU안에 있기때문이다.

3.3.2.5 레지스터 간접주소지정방식

연산에 사용할 데이터를 메모리에 저장
그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시한다.

특정 레지스터를 학습해야만 알 수 있는 방식들도 있는데 이는 후에 학습하도록 하자.

2023.08.25

컴퓨터 그 자체와는 좀 다를 수 있지만
자바에서 참조변수같은 것들을 왜 주소를 저장하나 했었다.
원시타입의 경우 범위가 한정되어 있어 byte가 한정되어 있는데
String같은 긴 문자열을 저장하려면 아주 크기가 커서 주소를 저장해두면 오히려 큰 값들을 저장할 수 있다는 것을 이해하게 되었다.

'개념정리 > 컴퓨터 구조 및 운영체제' 카테고리의 다른 글

2023.09.05 컴퓨터구조  (0) 2023.09.06
2023.09.01 컴퓨터구조  (0) 2023.09.02
2023.08.30 컴퓨터구조  (0) 2023.08.30
2023.08.26 컴퓨터구조  (0) 2023.08.27
2023.08.24 컴퓨터 구조  (1) 2023.08.24

+ Recent posts