0과 1의 세계 - 컴퓨터는 기본적으로 0과 1밖에 이해하지 못한다.
정보 단위
비트(bit)
0과 1을 표현하는, 최소 정보 단위이다. 즉 n비트로 2ⁿ가지의 정보 표현이 가능하다.
1비트(1bit) | 1비트(1bit) |
1바이트(1byte) | 8비트(8bit) |
1킬로바이트(1kB) | 1,000바이트(1,000byte) |
1메가바이트(1MB) | 1,000킬로바이트(1,000kB) |
1기가바이트(1GB) | 1,000메가바이트(1,000MB) |
1테라바이트(1TB) | 1,000기가바이트(1,000GB) |
워드(word)
CPU가 한 번에 처리할 수 있는 정보의 크기 단위를 의미한다.
- 하프 워드 : 워드의 절반 크기
- 풀 워드 : 워드 크기
- 더블 워드 : 워드의 두 배 크기
이진법(binary)
0과 1로 수를 표현하는 방법으로, 숫자가 1을 넘어가는 시점에 자리 올림을 하는 것이다.
* 2의 보수 : 0과 1로 음수를 표현하는 방법으로, 어떤 수를 그보다 큰 2ⁿ에서 뺀 값을 의미한다. 이를 쉽게 하는 방법은 모든 0과 1을 반대로 하고 1을 더하는 것이다.
음수인지 양수인지 구별하는 법? cpu 내부에 플래그라고 하는 특별한 레지스터가 존재하여, 해당 레지스터가 양수인지 음수인지를 구분한다.즉 양수 음수가 같은 것처럼 보이지는 실질적으로는 플래그를 가지고 있다.
* 16진법
숫자가 15를 넘어가는 시점에 자리올림해주고, 10진수와 구분을 해주기 위해 코드상으로 숫자 앞에 0x를 붙여 준다.
0과 1로 문자를 표현하는 방법
* 문자 집합 (character set)
컴퓨터가 이해할 수 있는 코드에 사람이 이해할 수 있는 문자를 대응시킨 모음 표이다.
* 인코딩 (encoding)
의미 그대로 코드화하는 과정을 뜻한다. 풀어서 이야기하면 문자를 컴퓨터가 이해할 수 있는 0과 1 즉 이진수로 변환하는 과정을 의미한다.
* 디코딩 (decoding)
인코딩의 반대로 이진수로 된 0과 1을 사람이 이해할 수 있는 문자로 변환하는 과정이다.
* 한글 인코딩의 경우
알파벳을 이어 쓰면 단어가 되는 영어와는 달리, 한글의 경우 초성 중성 종성으로 이루어져 있기 때문에 완성형 인코딩 방식과 조합형 인코딩 두 가지 방식이 존재한다. 완성형의 경우 글자 하나 하나 그 자체를 인코딩하는 방식이고, 조합형의 경우 각 글자를 자음 모음으로 분해하여 장므 모음을 인코딩하는 방식이다. 대표적인 한글 인코딩 방식으로는 완성형 인코딩 방식의 일종인 EUC-KR이 존재한다.
* EUC-KR
완성형 인코딩 방식이며, 글자 하나 하나에 2바이트 즉 16비트 크기의 코드를 부여한다. 한 글자당 4자리씩 16진수로 되어있다. 2300 여개의 한글 표현이 가능하며, 쀏, 뙠 등의 글자는 표현이 불가능하다.
이와 같이 특정 국가의 언어에 국한된 인코딩 방식은 다국적인이 사용하는 프로그램 개발시 언어별 인코딩 방식을 달리해야 하는 어려움이 존재한다. 때문에 위와 같은 문제들을 극복하기 위해 등장한 것이 유니코드 문자 집합과 utf-8 인코딩 방식이다.
* UTF-8 인코딩
UTF-8 인코딩은 가변 길이 인코딩으로, 인코딩 결과가 1바이트에서 4바이트 사이가 된다.
명령어 (= 연산 코드 + 오퍼랜드)
명령어는 연산 코드와 오퍼랜드로 구성되며, 연산 코드는 수행할 연산을 의미하며, 오퍼랜드는 연산에 사용될 데이터 또는 해당 데이터가 저장된 주소를 의미한다.(=주소 필드) 연산 코드에는 데이터 전송, 산술/논리 연산, 제어 흐름 변경, 입출력 제어 수행 등 을 담당하는 코드가 존재한다.
ex) 연산 코드 예시
데이터 전송 | |
MOVE | 데이터를 옮겨라 |
STORE | 메모리에 저장하다 |
LOAD(FETCH) | 메모리에서 CPU로 데이터를 가져와라 |
PUSH | 스택에 데이터를 저장하라 |
POP | 스택의 최상단 데이터를 가져와라 |
* 스택 (LIFO: Last In First Out)
가장 마지막에 들어간 데이터가 가장 먼저 나오는 자료구조
* 큐 (FIFO: First In First Out)
가장 처음 들어간 데이터가 가장 처음 나오는 자료구조
산술/논리 연산 | |
ADD/SUBTRACT/MULTIPLY/DIVIDE | 덧셈/뺄셈/곱셈/나눗셈을 수행하라 |
INCREMENT/DECREMENT | 오퍼랜드에 1을 더하라 / 오퍼랜드에 1을 빠라 |
AND/OR/NOT | AND/OR/NOT 연산을 수행하라 |
COMPARE | 두 개의 숫자 또는 TRUE/FALSE 값을 비교하 |
제어 흐름 변경 | |
JUMP | 특정 주소로 실행 순서를 옮겨라 |
CONDITIONAL JUMP | 조건에 부할할 때 특정 주소로 실행 순서를 옮겨라 |
HALT | 프로그램의 실행을 멈춰라 |
CALL | 되돌아올 주소를 저장한 체 특정 주소로 실행 순서를 옮겨라 |
RETURN | CALL을 호출할 때 저장했던 주소로 돌아가라 |
입출력 제어 | |
READ(INPUT) | 특정 입출력 장치로부터 데이터를 읽어라 |
WRITE(OUTPUT) | 특정 입출력 장치로부터 데이터를 써라 |
ATART IO | 입출력 장치를 시작하라 |
TEST IO | 입출력 장치의 상태를 확인하라 |
~ 일반적으로 오퍼랜드에는 값 그 자체보다는 해당 값이 저장된 주소로 많이 사용되는데, 이는 주소 명령어에서 표현할 수 있는 데이터 크기에 한계가 있기 때문이다.
* 유효주소
연산에 사용할 데이터가 저장된 위치
* 명령어 주소 지정 방식
연산에 사용할 데이터가 저장된 위치 즉 유효 주소를 찾는 방법을 의미하며, 다양한 방식이 존재한다.
1) 즉시 주소 지정 방식 (immediate addessing mode)
연산에 사용할 데이터 자체를 오퍼랜드에 직접 명시하는 방식이다. 처리 속도가 빠르지만 연산에 사용 가능한 데이터의 크기에 제한이 있다.
2) 직접 주소 지정 방식 (direct addressing mode)
오퍼랜드 필드에 유효 주소를 직접적으로 명시하는 방식으로, 유효 주소를 표현할 수 있는 크기가 연산 코드만큼 줄어든다.
3) 간접 주소 지정 방식 (indirect addressing mode)
오퍼랜드 필드에 유효 주소의 주소를 명시하는 방식으로, 주소를 찾는 과정이 길어지기 때문에 상대적으로 처리 속도가 느리다.
4) 레지스터 주소 지정 방식 (register addressing mode)
연산에 사용할 데이터가 저장된 레지스터를 명시하는 방식이다. 일반적으로 cpu가 메모리에 접근하는 속도보다 레지스터에 접근하는 속도가 빠르기 때문에 처리 속도가 빨라진다.
5) 레지스터 간접 주소 지정 방식 (register indirect addressing mode)
연산에 사용할 데이터를 메모리에 저장하고, 해당 주소를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방식이다.
출처
https://www.youtube.com/watch?v=upoRINMqlrw&list=PLVsNizTWUw7FCS83JhC1vflK8OcLRG0Hl&index=7
참고
문자 인코딩 : https://mihee0703.tistory.com/72
'운영체제' 카테고리의 다른 글
[ 컴퓨터 구조와 운영 체제 ] - 혼자 공부하는 컴퓨터 구조 + 운영체제(책) (0) | 2023.05.31 |
---|---|
[ 운영체제 ] - 02) 프로세스란? (0) | 2022.07.20 |
[ 운영체제 ] - 01) 운영체제의 개요 (0) | 2022.07.15 |