본문 바로가기
도서/혼공컴운

[혼공컴운] 1주차_컴퓨터구조, 데이터, 명령어

by ahrelee 2024. 7. 2.
1주차 
7/1 ~ 7/7
진도 Chapter 01 ~ 03
기본 숙제(필수) p. 51의 확인 문제 3번, p. 65의 확인 문제 3번 풀고 인증하기
추가 숙제(선택) p. 100의 스택과 큐의 개념을 정리하기

 

01. 컴퓨터 구조 시작하기

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

  • 코드를 잘 작성했으나 오류가 나는 경우에 대한 대책 강구 가능
  • 컴퓨터를 미지의 대상에서 분석의 대상으로 인식할 수 있음 -> 문제 해결 능력 상승
  • 직무 수행 시 필수 과목
  • 성능, 용량, 비용 고려 가능 (ex. 서버 컴퓨터, 클라우드 서비스 등 사용 시, 판단 능력)

 

01-2. 컴퓨터 구조의 큰 그림

1) 컴퓨터가 이해하는 정보: 데이터와 명령어

  • 데이터: 정적인 정보 (ex. 숫자, 문자, 이미지, 동영상 등)
  • 명령어: 컴퓨터를 실질적으로 작동시키는 정보 (이 과정에서 데이터를 사용)

2) 컴퓨터의 4가지 핵심 부품

  • 중앙처리장치(CPU)
  • 주기억장치(메모리; main memory): RAM, ROM
  • 보조기억장치
  • 입출력장치

 

(1) 메모리

  • 현재 실행되고 있는 프로그램(프로세스)의 데이터와 명령어를 저장하는 부품
  • 프로그램이 실행되려면 메모리에 저장되어 있어야 함.
  • 메모리에 저장된 정보의 위치는 '주소'를 통해 알 수 있음.

(2) CPU

  • 메모리에 저장된 명령어를 읽고, 해석하고, 실행하는 부품
  • ALU: 산술논리연산장치; 계산기
  • 제어장치: 제어신호(전기신호) 보내고, 명령어 해석 장치; CU
  • 레지스터: CPU 내부의 저장장치; register
  • 제어장치는 '메모리 읽기' 제어 신호를 보내서 메모리의 데이터 및 명령어를 CPU로 받아옵니다. 이 정보는 레지스터에 저장되고, 제어장치가 해당 정보를 해석한 뒤, ALU가 처리한 후, 그 값을 레지스터에 저장합니다. 이 결과는 필요 시 제어장치의 '메모리 쓰기' 제어신호와 함께 메모리에 저장됩니다.

(3) 보조기억장치

  • 보관할 프로그램을 저장하는 부품
  • 메모리보다 크기가 크고, 메모리와 달리 전원이 꺼져도 저장된 내용이 사라지지 않는 저장 장치
  • 하드 디스크, SSD, USB 메모리, DVD, CD-ROM

(4) 입출력장치

  • 컴퓨터 외부에 연결되어 컴퓨터 내부와 데이터를 교환하는 장치

(5) 메인보드

  • 컴퓨터의 핵심 부품이 연결되어 있는 장치
  • 메인보드에 연결된 부품은 서로 데이터를 주고 받을 수 있음.

(6) 시스템 버스

  • 메인보드 내부의 데이터가 지나다니는 통로
  • 컴퓨터의 핵심 부품을 연결하는 가장 중요한 버스
  • 주소 버스: 주소를 주고받는 통로
  • 데이터 버스: 데이터와 명령어를 주고받는 통로
  • 제어 버스: 제어 신호를 주고받는 통로

 

02. 데이터

02-1. 0과 1로 숫자를 표현하는 방법

1) 정보의 단위

  • 비트(bit): 컴퓨터가 이해할 수 있는 가장 작은 정보의 단위, 0과 1을 표현할 수 있음.
  • n비트 == 2^n개의 정보
  • 바이트(byte): 8개의 비트를 묶은 단위
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가 한번에 처리할 수 있는 정보의 크기 단위
  • 하프워드, 풀워드, 더블워드

2) 이진법(binary)
 
(1) 이진법

  • 0과 1로 수를 표현하는 방법
  • 숫자가 1을 넘어갈 때 자리올림
  • cf) 십진법(decimal): 0~9로 숫자를 표현, 숫자가 9를 넘어갈 때 자리올림

(2) 이진법 표기법

  • 수학적 표기 방식: 1000(2)
  • 코드상 표기 방식: 0b1000

(3) 음수 표현: 2의 보수 + 플래그 레지스터

  • 2의 보수: 어떤 수를 그보다 큰 2^n에서 뺀 값
    • ex) 11(2)의 2의 보수: 100(2)에서 11(2)를 뺀 01(2)
  • 1의 보수 + 1
    • 1의 보수: 모든 0과 1을 뒤집고, 거기에 1을 더한 값
  • 플래그 레지스터를 통해 음수인지 알 수 있음.

(4) 단점

  • 0이나 2^n 형태의 이진수는 2의 보수로 음수를 표현할 수 없음.
  • 숫자 표현의 길이가 긺.

 
3) 십육진법(hexadecimal)
 
(1) 십육진법

  • 숫자가 15를 넘어가는 시점에 자리올림을 하는 숫자 표현 방식
십진수 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
십육진수 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11
  • tip. 주먹을 쥐었을 때가 A (10)으로 생각하면 쉽다. B(11), C(12), ...

(2) 십육진법 표기법

  • 수학적 표기 방식: 15(16)
  • 코드상 표기 방식: 0x15

(3) 십육진수 이진수

  • 십육진수를 이진수로 표현할 때는 4비트가 필요
    • 십육진수 한 글자를 4비트의 이진수로 간주
    • 2^4 = 16
    • ex. 1A2B(16) == 0001 1010 0010 1011 (2)
  • 이진수를 십육진수로 변환할 때
    • 이진수 숫자를 4개씩 끊고, 하나의 십육진수로 변환한 뒤 이어붙임.
    • ex. 11010101(2) == D5(16)

 

02-2. 0과 1로 문자를 표현하는 방법

1) 문자 집합과 인코딩

  • 문자 집합(character set): 컴퓨터가 이해할 수 있는 문자의 모음
  • 인코딩(encoding): 문자를 0과 1로 이루어진 문자로 코드화하는 과정
  • 디코딩(decoding): 문자 코드를 문자로 변환하는 과정

2) 아스키 코드

  • 알파벳, 아라비아 숫자, 일부 특수 문자 및 제어 문자
  • 하나의 아스키 코드를 나타내기 위해 8비트(1바이트) 사용
  • 7비트로 하나의 문자를 표현, 1비트는 오류검출을 위해 사용되는 패리티 비트(parity bit)
  • cf) 코드 포인트: 문자에 부여된 고유한 값
  • 128개 보다 많은 문자를 표현할 수 없음. -> 8비트 확장 아스키 등장

3) EUC-KR

  • 한글 인코딩: 완성형 인코딩 vs 조합형 인코딩
  • 완성형 인코딩: 초성, 중성, 종성의 조합으로 이루어진 완성된 하나의 글자에 고유한 코드를 부여하는 인코딩 방식
  • 조합형 인코딩: 초성, 중성, 종성 각각을 위한 비트열을 할당하여 이것의 조합으로 글자 코드를 완성하는 인코딩 방식
  • KS X 1001, KS X 1003 문자집합 기반의 완성형 인코딩 방식

http://t2bot.com/hgcode/ksc_codepage.php

https://dencode.com/, '가' 입력 결과

  • 2,350개 정도의 한글 단어 표현 가능
  • 모든 한글을 표현할 수 없음. -> CP949

 
4) 유니코드와 UTF-8

https://unicode.org/charts/PDF/UAC00.pdf

  • UTF-8

https://en.wikipedia.org/wiki/UTF-8

 

  • 글자가 깨지는 경우: 인코딩 호환, 문자집합에 속하지 않는 문자를 사용한 경우

 

03. 명령어

03-1. 소스 코드와 명령어

1) 고급언어
 
(1) 고급 언어

  • 사람이 이해하고 작성하기 쉽게 만들어진 언어

(2) 컴파일 언어

  • 소스 코드(고급 언어) -> 컴파일러: 컴파일 -> 목적 코드(저급 언어)
  • 소스 코드 컴파일 중 오류 발생 시, 소스 코드 실행 불가능
  • https://godbolt.org/

c++
c

  • c언어 소스코드 (*.c)
    -> 전처리 과정 (gcc -E *.c -o *.i) : 전처리 완료된 소스 코드
    -> 컴파일 과정 (gcc -S *.i -o *.s) : 어셈블리어로 변환
    -> 어셈블 과정 (gcc -o *.o *.s) : 목적 파일 (xxd *.o 로 내용 확인 가능)
    ->  링킹 과정 : 실행 파일

(3) 인터프리터 언어

  • 인터프리터에 의해 한 줄씩 실행
  • 소스 코드 인터프리트 중 오류 발생 시, 오류 발생 전까지의 코드는 실행

2) 저급언어
 
(1) 저급언어

  • 컴퓨터가 직접 이해하고 실행할 수 있는 언어

(2) 기계어

  • 0과 1의 명령어 비트로 이루어진 언어 

(3) 어셈블리어

  • 기계어를 읽기 편한 형태로 번역한 저급 언어

 

03-2. 명령어의 구조

1) 연산 코드와 오퍼랜드

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

(1) 연산 코드

  • 명령어가 수행할 연산
  • 연산 코드의 종류
  • 연산 코드의 유형: 데이터 전송, 산술/논리 연산, 제어 흐름 변경, 입출력 제어

(2) 오퍼랜드

  • 연산에 사용할 데이터
  • 연산에 사용할 데이터가 저장된 위치
  • 오퍼랜드는 없는 경우도 있고, 하나 이상인 경우도 있음.

3) 주소 지정 방식
 
(1) 오퍼랜드 필드

  • 연산에 사용할 데이터가 저장된 위치 -> 오퍼랜드 필드 == 주소 필드
  • 왜 주소를 사용해서 나타내는가?
    • 오퍼랜드 필드로 표현할 수 있는 데이터 크기가 제한되기 때문
    • 주소로 넘겨주면 연산에 사용할 데이터의 크기를 2^16까지 사용할 수 있음.

(2) 유효 주소

  • 연산의 대상인 데이터가 저장된 위치

(3) 명령어 주소 지정 방식 (addressing modes)

  • 유효 주소를 찾는 방법
  • 즉시 주소 지정 방식: 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방법, 속도 빠름.
  • 직접 주소 지정 방식: 유효주소를 직접적으로 명시하는 방식
  • 간접 주소 지정 방식: 유효주소의 주소를 명시하는 방식, 속도 느림.
  • 레지스터 주소 지정 방식: 연산에 사용될 데이터가 저장된 레지스터(유효주소)를 명시하는 방식, 메모리 접근 속도보다 레지스터 접근 속도가 빠름.
  • 레지스터 간접 주소 지정 방식: 연산에 사용할 데이터를 메모리에 저장하고, 그 유효주소를 저장한 레지스터를 명시하는 방식 

 

기본 숙제(필수)

[p. 51의 확인 문제 3번]

더보기

3. 다음 설명의 빈칸에 들어갈 알맞은 내용을 써 보세요.

 

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

 

[p. 65의 확인 문제 3번]

더보기

3. 1101(2)의 음수를 2의 보수 표현법으로 구해보세요.

 

1101(2) -> 0010(2) -> 0011(2)

 

+

4. DA(16)을 이진수로 표현하면 무엇인가요?

 

1) 16진수의 한 글자마다 4비트의 이진수로 변환

D(16) == 1101(2)

A(16) == 1010(2)

 

2) 이진수로 변환한 결과를 이어붙임.

DA(16) == 11011010(2)

 

추가 숙제(선택)

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

 

더보기

1. 스택

  • 한쪽 끝이 막혀 있는 통과 같은 저장 공간
  • 후입선출(LIFO): 나중에 저장한 데이터를 가장 먼저 빼내는 데이터 관리 방식
  • PUSH: 스택에 새로운 데이터를 저장하는 명령어
  • POP: 스택에 저장된 데이터를 꺼내는 명령어

2. 큐

  • 양쪽이 뚫려 있는 통과 같은 저장 공간
  • 선입선출(FIFO): 가장 먼저 저장한 데이터부터 빼내는 데이터 관리 방식

 

[참고자료]

- 강민철.『혼자 공부하는 컴퓨터구조+운영체제』. 한빛미디어. pp. 28-101.
- "[컴퓨터 공학 기초 강의] 혼자 공부하는 컴퓨터 구조+운영체제." YouTube, 한빛미디어, 2023.07.04., https://www.youtube.com/watch?v=bls_GjX-4U8&list=PLVsNizTWUw7FCS83JhC1vflK8OcLRG0Hl&index=1&t=4s

- kangtegong. "Self-Learning CS." GitHub, 2024, https://github.com/kangtegong/self-learning-cs
 


1주 차 공부 완료!
 
나름 이것저것 공부했었다고, 이번 주차에 배운 내용에서 처음 듣는 내용은 없었다.
그럼에도, 동영상 강의를 들으면서 정말 좋다고 느꼈다.
 
특히, 컴퓨터의 핵심 부품의 구조도를 직접 그려보면서 이해할 수 있는 부분이랑 CPU의 동작 방식이 구체적인 예시로 주어진 것이 좋았다. ALU, 제어장치, 레지스터와 메모리가 어떻게 상호작용을 하는지 확실히 알 수 있었다.
 
16진수를 손가락을 사용해서 쉽게 이해하는 방식도 재미있었다. 16진수에서 9이후의 알파벳으로 가면 이게 무슨 숫자인지 헷갈리기 일쑤여서 외워야지하는 생각만 했었는데, 드디어 외웠다!
 
또한, '컴파일하는 과정에 대한 추가 강의'(8강)를 통해 전처리 완료된 소스 코드 파일, 어셈블리어로 변환된 파일, 목적 파일의 내용을 살펴볼 수 있었다. 이제 보니 과정만 알고, 직접 파일을 확인해 본 적이 없었다는 사실을 깨달았다. 내가 예전에 출력하려고 했던 내용이 목적 파일의 형태였다니...! 정말 놀라웠다.
 
알찬 내용으로 가득차서 굉장히 만족스러웠다. 흡족 :)
 
2주차도 너무 기대된다.
파이팅!