Chapter 1. 컴퓨터 구조 시작하기
01-1. 컴퓨터 구조를 알아야 하는 이유
처음 프로그램은 시작할때 프로그래밍 언어의 문법과 함께 컴퓨터의 근간(컴퓨터 구조, 운영체제)을 알아야 한다.
컴퓨터 구조를 알아야 하는 이유
- 문제해결능력 향상
- 코드를 똑같이 작성함에도 불구하고 동작하지 않는 경우에 컴퓨터 내부를 들여다보는 것에 거리낌 없이 문제 해결 가능
- 컴퓨터를 미지의 대상에서 분석의 대상으로
- 컴퓨터를 내려다보며 문제를 해결할 수 있는 개발자
- 성능, 용량, 비용을 고려한 개발
- 성능, 용량, 비용을 고려하지 않고 개발하는 회사는 없다!
- 컴퓨터 구조는 결국 성능, 용량, 비용에 대한 이야기
01-2. 컴퓨터 구조의 큰 그림
컴퓨터가 이해하는 정보
- 데이터
- 숫자, 문자, 이미지, 동영상과 같은 정적인 정보
- 컴퓨터와 주고받는/내부에 저장된 정보
- 0과 1로 숫자를 표현하는 방법
- 0과 1로 문자를 표현하는 방법
- 명령어(컴퓨터는 명령어를 처리하는 기계)
- 컴퓨터를 실질적으로 움직이는 정보
- 데이터는 명령어를 위한 일종의 재료
- 명령어 : 1과 2를 더하라 → 데이터 : 1, 2
컴퓨터의 4가지 핵심 부품
- CPU
- 정의 : 컴퓨터의 두뇌
- 메모리에 저장된 명령어를 읽어들이고, 해석하고, 실행하는 부품
- 주요 내부 구성 부품
- ALU(산술 논리 연산 장치) : 계산기
- 제어장치 : 제어 신호(컴퓨터의 부품들을 관리하고 작동시키기 위한 전기 신호 - 메모리 읽기 신호, 메모리 쓰기 신호)를 내보내고, 명령어를 해석하는 장치
- 레지스터 : CPU 내부의 작은 저장 장치
- 메모리(주기억장치 : RAM/ROM)
- 현재 실행되는 프로그램(프로세서)의 명령어와 데이터를 저장하는 부품(연관 : 페이징)
- 주소 : 필요한 메모리를 저장한 위치
- 프로그램이 실행되기 위해서는 메모리에 저장되어 있어야 한다.
- 메모리는 실행되는 프로그램의 명령어와 데이터를 저장한다.
- 메모리에 저장된 값의 위치는 주소로 알 수 있다.
- 보조기억장치(USB, SSD, SD카드, CD롬, 하드디스크)
- 대용량으로 저장가능한 저장장치
- 메모리는 보조 기억장치에 비해 비싸고, 전원이 꺼지면 저장된 내용을 잃는다.
- 전원이 꺼져도 보관될 프로그램을 저장하는 부품
- 메모리는 실행할 정보를 저장하고, 보조기억장치는 보관할 정보를 저장한다.
- 입출력장치
- 컴퓨터 외부에서 컴퓨터로 정보를 받아들일수 있는 장치
- 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환할 수 있는 부품
- 보조기억장치 VS 입출력장치
- 실제로 컴퓨터가 주고받는 양상이 비슷하기에 주변장치라 통칭하기도 한다.
- 보조기억장치는 메모리를 보조하는 특별한 입출력장치다.
- 메인보드(mother board)
- 위 4개의 부품을 연결하는 곳을 말한다.
- 메인보드 내에 있는 버스는 컴퓨터의 부품끼리 정보를 주고받는 일종의 통로이다.
- 다양한 종류의 버스가 존재한다.
- 시스템 버스
- 컴퓨터의 핵심 부품을 연결하는 버스
- 시스템 버스의 내부 구성
- 주소버스 : 주소를 주고받는 통로
- 데이터버스 : 명령어와 데이터를 주고받는 통로
- 제어버스 : 제어신호를 주고받는 통로
Chapter 2. 데이터
02-1. 0과 1로 숫자를 표현하는 방법
정보 단위
- 비트(bit)
- 0과 1을 표현하는 가장 작은 정보 단위
- n비트로 2의 n제곱까지의 정보 표현 가능
- 프로그램은 수많은 비트로 이루어져 있음
- 큰수의 비트를 말한땐 비트보다 더 큰 단위를 사용
1바이트 | 8비트 |
---|
1킬로바이트 | 1000바이트 |
1메가바이트 | 1000킬로바이트 |
1기가바이트 | 1000메가바이트 |
1테라바이트 | 1000기가바이트 |
- 1024개씩 묶은 단위는 KiB, MiB, GiB
워드(word)
- CPU가 한 번에 처리할 수 있는 정보의 크기 단위
- 하프워트 : 워드의 절반
- 풀워드 : 워드 크기
- 더블워드 : 워드의 두배
진법
-
이진법(binary)
- 0과 1로 수를 표현하는 방법
- 숫자가 1을 넘어가는 시점에 자리 올림
- 일상적으로 사용하는 진법은 9가 넘어갈때 자리를 올리는 십진수
- 이진수 표기
- 음수 표기
- 2의 보수 표현
- 정의 : 어떤 수를 그보다 큰 2의 n제곱에서 뺀 값
- 방법 : 모든 0과 1을 뒤집고 1 더한 값
- -1011(2)를 표현하기 위한 0101(2)와 십진수 5를 표현하기 위한 0101(2)의 구분 방법은?
- CPU내부에 플래그(flag)레지스터가 있어, 여기서 양수와 음수 표기를 구분한다.
- Q. 그럼 왜 굳이 2의 보수 표현으로? 그냥 플래그만 바뀌고 표현방법은 같으면 안되나? 예를들어 십진수 5가 1011이므로 -5도 -1011로 표기하는 것과 같이
-
16진법
- 이진법으로는 숫자의 길이가 너무 길어지기 때문에 컴퓨터의 데이터 표현시 16진법을 많이 사용한다.
- 십진수 32 == 이진수 100000
- 수가 15를 넘어가는 시점에 자리 올림
- 16진수 표기
💡 2진수 → 16진수 변환
16진수 → 2진수 변환
- 16진수의 각 값을 2진수 4자리로 표현하여 변환
02-2. 0과 1로 문자를 표현하는 방법
문자집합과 인코딩
- 문자집합(character set)
- 인코딩(encoding)
- 코드화 하는 과정
- 문자를 0과 1로 이루어진 문자 코드로 변환하는 과정
- 디코딩(decoding)
- 코드를 해석하는 과정
- 0과 1로 표현된 문자 코드로 문자로 변환하는 과정
인코딩 방법
- 아스키 코드
- 초창기 문자 집합 중 하나
- 알파벳 아라비아 숫자, 일부 특수 문자 및 제어 문자
- 7비트로 하나의 문자 표현
- 8비트 중 1비트는 오류 검출을 위해 사용되는 패리티 비트(parity bit)
- 128(2의 7제곱)개 정도의 문자를 표현 가능
- 코드포인트 : 문자에 부여된 값
- 간단한 인코딩
- 한글을 포함한 다른 언어문자, 다양한 특수문자 표현 불가
- 7비트로 하나의 문자를 표현하므로 128개의 문자만 표현할 수 있다는 한계가 발생
한글 인코딩
- 한글의 특징
- 영어는 알파벳을 이어쓰면 단어가 된다.
- 한글은 초성, 중성, 종성의 조합으로 이루어진다.
- 한글 인코딩 방식
- 완성형 인코딩 방식
- 초성, 중성, 종성의 조합 하나하나에 코드 부여
- 조합형 인코딩 방식
- 한글 인코딩 방식의 종류
- EUC-KR
- 완성형 인코딩
- 각 글자에 2바이트(16진수 4개) 크기의 코드 부여
- 한글 인코딩 테스트 웹사이트
- 2300여개의 한글 표현 가능하지만 모든 한글을 표현하기엔 한계가 존재
- 언어별 인코딩은 다국어를 지원하는 프로그램을 개발할때 언어별 이코딩 방식을 모두 이해해야한다.
- 유니코드
- 통일된 문자 집합
- 한글, 영어, 화살표, 이모티콘 모두 표현 가능
- 현대 문자 표현에 있어 매우 중요한 위치
- 유니코드 인코딩 테스트 웹사이트
- 유니코드 코드포인트 : 각 문자별로 고유한 16진수(4자리)가 부여됨
- 유니코드의 인코딩 방식 UTF : 유니코드 인코딩 방법
Chapter 3. 명령어
03-1. 소스 코드와 명령어
컴퓨터 내부에서 고급언어 → 저급언어로 변환되어 실행된다.
저급언어와 고급언어
저급언어 : 컴퓨터가 이해하고 실행하는 언어
- 기계어
- 0과 1로 이루어진 명령어로 구성된 저급 언어
- 어셈블리어
- 0과 1로 이루어진 기계어를 읽기 편한 형태로 번역한 저급 언어
고급언어 : 개발자가 이해하기 쉽게 만든 언어
- 컴파일 언어
- 컴파일러에 의해 전체 코드가 컴파일이 되어 저급언어(목적코드)로 변환
- 소스코드 중간에 오류가 하나라도 있으면 소스 코드 전체가 실행되지 않음
- 인터프리터 언어
- 인터프리터에 의해 한 줄씩 실행
- 소스코드가 저급 언어로 변환되기까지 기다릴 필요가 없음
- 소스코드 중간에 오류가 있으면 오류 전까지의 코드는 잘 실행되고, 해당 오류가 있는 시점부터 코드가 실행되지 않음
단순히 고급언어가 컴파일과 인터프리터언어로 나뉘는 개념은 아니다.
03-2. 명령어의 구조
명령어의 구조
- 연산 코드
- 수행할 연산
- 연산코드의 종류(CPU마다 연산코드의 종류와 생김새가 다르다)
- 데이터 전송
- 산술/논리 연산
- ADD/SUBTRACT/MULTIPLY/DIVIDE : 덧셈/뺼셈/곱셈/나눗셈을 수행하라
- INCREMENT/DECREMENT: 오퍼랜드에 1을 더하라/오퍼랜드에 1을 뺴라
- AND/OR/NOT : 해당 연산을 수행하라
- COMPARE : 두 숫자 혹은 TRUE/FALSE 값을 비교하라
- 제어 흐름 변경
- JUMP : 특정 주소로 실행 순서를 옮겨라
- CONDITIONAL JUMP : 조건에 부합할 때 특정 주소로 실행 순서를 옮겨라
- HALT : 프로그램의 실행을 멈춰라
- CALL : 되돌아올 주소를 저장할 채 특정 주소로 실행 순서를 옮겨라
- RETURN : CALL을 호출할 때 저장했던 주소로 돌아가라
- 입출력 제어
- READ(INPUT) : 특정 입출력 장치로부터 데이터를 읽어라
- WRITE(OUTPUT) : 특정 입출력 장치로 데이터를 써라
- START IO : 입출력 장치를 시작하라
- TEST IO : 입출력 장치의 상태를 확인하라
- 오퍼랜드
- 연산에 사용될 데이터 혹은 연산에 사용될 데이터가 저장된 위치(주소필드)
명령어 주소 지정 방식(addressing modes)
- 유효주소(effective address)
- 연산에 사용할 데이터가 저장된 위치(유효주소)를 찾는 방법
- 유효 주소를 찾는 방법
- 명령어 주소 지정 방식 종류
- 즉시 주소 지정 방식(immediate addressing mode)
- 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시
- 가장 간단한 형태의 주소 지정 방식
- 연산에 사용할 데이터의 크기가 작아질 수 있지만, 빠름
- 직접 주소 지정 방식(direct addressing mode)
- 오퍼랜드 필드에 유효 주소 직접적으로 명시
- 유효 주소를 표현할 수 있는 크기가 연산 코드만큼 줄어듦
- 간접 주소 지정 방식(indirect addressing mode)
- 오퍼랜드 필드에 유효 주소의 주소를 명시
- 앞선 주소 지정 방식들에 비해 속도가 느림
- 레지스터 주소 지정 방식(register addressing mode)
- 연산에 사용할 데이터가 저장된 레지스터 명시
- 메모리에 접그하는 속도보다 레지스터에 접근하는 것이 빠름
- 레지스터 간접 주소 지정 방식(register indirect address mode)
- 연산에 사용할 데이터를 메모리에 저장
- 그 주소를 저장한 레지스터를 오퍼랜드 필드에 명시
MISSION
P51 - 3번 문제
(답) 프로그램이 실행되려면 반드시 메모리에 저장되어 있어야 합니다.
P65 - 3번 문제
(답) 1101 → 0010 → 0011 : 1101(2)을 음수로 표현한 값은 0011(2)입니다.