개발 Dev

혼공단 1주차 정리: 혼자 공부하는 컴퓨터 구조+운영체제

BoBooBoo 2023. 1. 8. 19:12
반응형

 

 

1강. 컴퓨터 구조를 알아야 하는 이유

 

프로그래밍 언어의 문법과 함께 컴퓨터의 근간을 알아야한다.

근간: 컴퓨터 구조와 운영체제

 

1. 문제 해결 능력 상승

  • 잘 구현한 것 같은데 제대로 동작하지 않은 경우... 컴퓨터 내부를 한번 들여다볼까?
  • 컴퓨터는 미지의 대상이 아니라 분석의 대상이다!!

 

2. 성능, 비용, 용량을 생각한 구현이 가능

 

 

 

2강. 컴퓨터 구조의 큰 그림

 

컴퓨터 구조는 컴퓨터가 이해하는 정보인 데이터, 명령어와 4 가지의 핵심 부품으로 구성

데이터

숫자, 문자, 이미지, 동영상과 같은 정적인 정보

컴퓨터와 주고 받는, 내부에 저장된 정보를 통칭하기도

0, 1로 숫자나 문자를 표현하는 방법

명령어

컴퓨터는 명령어를 처리하는 기계

명령어는 컴퓨터를 실질적으로 움직이는 정보

데이터는 명령어를 위한 일종의 재료

생김새와 동작 방식을 공부해보자

 

(예) "안녕하세요" (데이터) 를 출력하기 (명령)

(예) 1 (데이터) 과 2 (데이터) 를 더하기 (명령)

 

4가지 핵심 부품: CPU, 메모리, 보조기억장치, 입출력장치

이 부품들은 메인 보드라는 판대기(?)에 장착되어 서로 데이터를 주고 받음

데이터를 주고 받는 통로를 (시스템) 버스라고 함

 

메모리

프로그램이 실행되려면 메모리에 저장되어 있어야 함

현재 실행되는 프로그램 (프로세스) 의 명령어와 데이터를 저장하는 부품

* 페이징 기법을 이용하면 현재 실행되는 프로그램을 저장하지 않아도 되긴 함

명령어와 데이터가 어디에 저장되어 있는지 알기 위해 주소를 가지고 있음

 

CPU

메모리에 저장된 명령어를 읽어 들이고 해석하고 실행함

CPU 의 핵심 구성

- ALU, 산술 논리 연산 장치

레지스터 : CPU 내 작은 저장 장치

제어 장치 : 제어 신호를 내보내고 명령어를 해석

제어신호? 컴퓨터 부품들을 관리하고 작동시키기 위한 전기 신호 (메모리 읽기, 쓰기 신호)

 

보조기억장치

전원이 꺼져도 보관될 프로그램을 저장

 

입출력장치

키보드, 마우스 등 여러가지 주변 장치

USB 저장장치 등은 보조기억장치인가 입출력장치인가?

보조기억장치는 입출력장치 중 특별히 저장하는 일을 하는 것이라고 보면 될 듯

보조기억장치와 입출력장치를 합쳐서 주변장치라고 통칭하기도 함

 

--

메인보드

CPU, 메모리, 보조기억장치, 입출력장치 들이 장착됨

시스템 버스라는 통로를 통해 부품들이 정보를 주고 받을 수 있음

 

시스템 버스

- 주소버스: 주소를 주고 받음

- 데이터 버스: 명령어와 데이터를 주고 받음

- 제어 버스: 제어 신호를 주고 받

 

 

정보 단위

비트 (bit)

0, 1 을 표현할 수 있는 가장 작은 정보 단위

n 비트로 2^n 가지의 정보 표현 가능

프로그램은 수 많은 비트로 이루어짐

큰 단위로 묶어 포현

1 byte = 8 bit

1 KB = 1,000 byte

1 MB = 1,000 KB

..

1024 개씩 묶은 단위는 kiB, MiB, GiB, ... 로 표현

 

워드, word

CPU 가 한 번에 처리할 수 있는 정보의 크기 단위

파생된 단위로 Half word , Full word , Double word 가 있음

 

2진법

0, 1로 음수를 표현할 때는 2의 보수 방법으로 표현함

2의 보수는 2^n - C (특정 값) 으로 표현

쉽게 모든 bit 를 0 이면 1 로, 1 이면 0 으로 바꾸고 1을 더하면 됨

 

 

문자 집합과 인코딩

문자 집합, character set

컴퓨터가 이해할 수 있는 문자의 모음

인코딩, encoding

문자를 0, 1 로 코드화하는 과정

디코딩, decoding

0, 1 로 표현된 코드를 문자로 해석하는 과정

 

아스키 코드, ascii code

1 bit 의 parity bit 와 7 bit 로 하나의 문자를 표현

아스키 코드표 참고

총 2^7 (= 128) 개의 문자를 표현할 수 있음

너무 적어서 새로운 언어들을 표현하기 위한 인코딩들이 생김

 

한글 인코딩 

초성, 중성, 종성 조합으로 이루어진 한글을 표현

완성형 / 조합형 방식이 있음

완성형은 글자 자체를 코드화 함

조합협은 자음 모음 각각에 코드를 부여해서 초성, 중성, 종성을 각각 표기

 

EUC-KR

KS X 1001, KS X 1003 문자 집합 기반의 한글 인코딩 방식

완성형 인코딩

글자 하나 하나에 2 byte (= 16 bit)크기의 코드 부여

2300 여개의 한글 표현 가능하지만 여전히 부족

언어별 인코딩을 지원하다보면 각 언어별로 다시 매핑해야되는 번거로운 문제가 생김

 

유니코드 문자 집합과 utf-8

유니코드

통일된 문자 집합

한글, 영어, 화살표 등 특수 문자나 이모티콘도 표현

utf-8, utf-16, utf-32 등이 존재

 

utf-8, Unicode Transformation Format

가변 길이 인코딩으로 1 ~ 4 byte 를 사용

아래 표를 참고해서 utf-8 을 적용해보면,

한 → D55C → 1101 0101 0101 1100 →  11101101 10010101 10011100 (3 byte 로 표현)

글 → AE00 → 1010 1110 0000 0000 →  11101010 10111000 10000000 (3 byte 로 표현) 

 

 

컴파일 언어

고급 언어로 작성된 소스코드는 컴파일러가 컴파일하면 저급 언어인 목적 코드가 됨

소스 코드 중간에 오류가 있으면 전체가 실행되지 않음 (컴파일 에러)

아래 사이트를 이용하면 어떻게 컴파일되는지 확인해볼 수 있음

 

 

Compiler Explorer

 

godbolt.org

 

인터프리터 언어

인터프리터에 의해 한 줄씩 실행

소스 코드 전체가 저급 언어로 변환되는 것을 기다릴 필요가 없

소스 코드 중간에 오류가 있어도 실행되다가 중단함

 

 

 

명령어는 연산 코드와 오퍼랜드로 구성

 

연산 코드는 수행할 연산, 오퍼랜드는 수행할 데이터 (의 위치) 를 담음

오퍼랜드에는 데이터의 위치가 훨씬 자주 담기기 때문에 주소 필드라고 부르기도 함

왜 데이터의 위치를 넣느냐?

데이터를 직접 넣으면 오퍼랜드의 크기 만큼 넣을 수 있음

데이터가 저장된 위치인 주소를 담게 되면 더 많은 데이터를 가지고 있는 메모리를 참조할 수 있어서 효율적임

 

연산코드의 종류 (CPU 마다 다름)

1. 데이터 전송

MOVE, STORE, LOAD (FETCH), PUSH, POP

2. 산술/논리 연산

ADD, SUBSRACT, MULTIPLY, DIVIDE

INCREMENT. DECREMENT

AND, OR, NOT

COMPARE

3. 제어 흐름 변경

JUMP, CONDITIONAL JUMP, HALT, CALL, RETURN

4. 입출력 제어

READ (INPUT), WRITE (OUTPUT), START IO, TEST IO

 

유효 주소, Effective Address

연산에 사용할 데이터가 저장된 위치

아래 그림에서 보면 R1.

 

명령어 주소 지정 방식, Addressing Modes

유효주소를 찾는 방법으로 다양한 방법이 있음

 

즉시 주소 지정 방식, Immediate addressing mode

유효 주소를 오퍼랜드에 직접 명시

연산에 사용할 데이터 크기가 제한되지만 가장 빠름

 

직접 주소 지정 방식, Direct Addressing Mode

오퍼랜드에 유효 주소를 직접적으로 명시

어퍼랜드에 유효주소를 표현할 수 있는 크기가 제한되어 있음

 

간접 주소 지정 방식, Indirect Addressing Mode

오퍼랜드에 유효 주소의 주소를 명시

앞의 방법들보다 메모리를 뒤적거리는 양이 많아 속도는 느림

 

레지스터 주소 지정 방식, Register Addressing Mode

레지스터를 명시

메모리에 접근하는 속도보다 레지스터에 접근하는 것이 훨씬 빠

 

레지스터 간접 주소 지정 방식, Register Indirect Addressing Mode

연산에 사용할 데이터를 메모리에 저장하고 그 주소를 저장한 레지스터의 주소를 오퍼랜드에 명

 

 

기본 미션

p. 51 확인 문제 3번

프로그램이 실행되려면 반드시 메모리에 저장되어 있어야 한다.

 

p. 65 확인 문제 3번

2진수 1101의 음수를 2의 보수 표현법으로 구해보시오.

 

답:  1101 → 0010 → 0011

풀이: (1)  0 은 1 로, 1은 0으로 바꾼 후 (2) 1을 더하기

 

 

선택 미션

p. 100의 스택과 큐의 개념을 정리하기

Stack

바구니에 데이터를 넣고 뺀다고 생각하면 됨

먼저 들어간 자료가 마지막에 나옴 (Last In First Out, LIFO)

데이터를 넣을 때는 Push, 뺄 때는 Pop 이라는 용어를 주로 사용

 

Queue

서로 다른 들어가는 입구와 나가는 입구가 정해진 통로

먼저 들어가면 먼저 나옴 (First In First Out, FIFO)

데이터를 넣을 때는 Enqueue, 뺄 때는 Dequeue 이라는 용어를 주로 사용

 

 

 

 

 

 

반응형