[혼공컴운 12기] week 1 컴퓨터 구조, 데이터 표현, 명령어

지애·2024년 7월 2일
1

혼공컴운

목록 보기
1/7

✏️ 1주차 진도: Chapter 01 ~ 03

  • 기본 숙제(필수): p. 51의 확인 문제 3번, p. 65의 확인 문제 3번 풀고 인증하기
  • 추가 숙제(선택): p. 100의 스택과 큐의 개념을 정리하기

Chapter 01 컴퓨터 구조 시작하기

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

실력있는 개발자가 되기 위해서는 컴퓨터 구조를 반드시 알아야 한다!

1. 문제 해결

같은 코드를 작성했는데도 컴퓨터 시스템에 따라 제대로 작동하지 않는 경우가 있을 수 있음!
컴퓨터 구조를 이해하고 있다면 문제 상황을 빠르게 진단할 수 있고, 문제 해결의 실마리를 다양하게 찾을 수 있다.

2. 성능, 용량, 비용

프로젝트에 알맞은 서버 컴퓨터나 클라우드 서비스를 선택하려면 컴퓨터 구조에 대해 알아야 함. 무조건 싸거나 비싼 것이 좋은 게 아님!

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

컴퓨터가 이해하는 정보

컴퓨터는 0과 1로 표현된 정보만을 이해 (데이터, 명령어)
데이터
컴퓨터가 이해하는 숫자, 문자, 이미지, 동영상과 같은 정적인 정보

명령어
데이터를 움직이고 컴퓨터를 작동시키는 정보

컴퓨터의 네 가지 핵심 부품

중앙처리장치(CPU)
메모리에 저장된 명령어를 읽고, 읽은 명령어를 해석, 실행하는 부품.

  • 산술논리연산장치(ALU, Arithmetic Logic Unit)
    - 컴퓨터 내부에서 수행되는 대부분의 계산을 ALU에서 수행함.

  • 레지스터
    - CPU 내부의 작은 임시 저장 장치.

    • 프로그램을 실행하는 데 필요한 값들을 임시로 저장.
    • 여러 개의 레지스터가 존재하고, 각기 다른 이름과 역할을 가지고 있음
  • 제어장치(CU, Control Unit)
    - 제어 신호(ex. 메모리 읽기, 메모리 쓰기)라는 전기 신호를 내보내고 명령어를 해석하는 장치.

주기억장치(메모리)
현재 실행되는 프로그램의 명령어와 데이터를 저장하는 부품
저장된 값에 빠르고 효율적으로 접근하기 위해 '주소'를 사용함.
가격이 비싸 저장 용량이 적고, 전원이 꺼지면 저장된 내용을 잃음.

보조기억장치
메모리보다 크기가 크고 전원이 꺼져도 저장된 내용을 잃지 않는 메모리를 보조하는 저장 장치 (하드 디스크, SSD, USB, DVD, CD-ROM)

입출력장치
마이크, 스피커, 프린터, 마우스, 키보드처럼 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환하는 장치
보조기억장치를 메모리를 보조하는 특별한 기능을 수행하는 입출력장치라고 볼 수도 있음.

메인보드와 시스템 버스
컴퓨터의 핵심 부품들은 모두 메인보드(마더보드)라는 판에 연결됨.
메인보드에 연결된 부품들은 버스라는 통로를 통해 서로 정보를 주고 받음. 컴퓨터의 핵심 부품을 연결하는 가장 중요한 버스는 시스템 버스이고, 시스템 버스는 주소 버스, 데이터 버스, 제어 버스로 구성되어 있음.

Chapter 02 데이터

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

정보 단위

비트
0과 1을 나타내는 가장 작은 정보 단위
n bit는 2^n 가지의 정보를 표현할 수 있음

1byte == 8bit
1KB == 1000byte
1MB == 1000kB
1GB == 1000MB
1TB == 1000GB

워드
CPU가 한 번에 처리할 수 있는 데이터 크기

이진법

0과 1만으로 모든 숫자를 표현하는 방법
1을 넘어가는 시점에서 자리 올림을 하여 숫자를 표현함

이진수 표기 방법
수학적 표기 : 1000_(2)
코드 상 표기 : 0b1000

이진수의 음수 표현

이진수로 음수를 표현하는 방법 중 가장 널리 사용되는 방법은 2의 보수(two's complement) 를 구해 이 값을 음수로 간주하는 방법.

2의 보수
어떤 수를 그보다 큰 2^n에서 뺀 값

0b11의 보수는
0b100에서 0b11을 뺀 값인 0b01

좀 더 쉽게 표현하자면,
모든 0과 1을 뒤집고 거기에 1을 더한 값

0b11

11 -> 00 -> 01

0b01

실제로 이진수만 봐서는 음수인지 양수인지 구분하기 어려움.
이를 구분하기 위해 사용하는 것이 flag

two's complement의 한계

  • 0에 2의 보수를 취하면 자리올림이 발생함. (0000 -> 10000)
    - 이 경우에는 자리 올림이 발생한 비트의 1을 버림.
  • 2^n에 2의 보수를 취하면 자기 자신이 나옴 (1000 -> 1000)
    - n bit로는 -2^n과 2^n을 동시에 표현할 수 없음.

십육진법

수가 15를 넘어가는 시점에 자리 올림을 하는 숫자 표현 방식.
10, 11, 12, 13, 14, 15 대신 A, B, C, D, E, F를 사용.

  • 이진수에 비해 더 적은 자릿수로 더 많은 정보를 표현할 수 있음.
  • 십육진수는 이진수로 변환하기 쉬움.

    십육진수 표기 방법
    수학적 표기 : 15_(16)
    코드 상 표기 : 0x15

십육진수 <-> 이진수

십육진수는 한 글자당 16(2^4)종류의 숫자를 표현가능하므로, 십육진수 한 자리를 이진수로 표현하려면 4bit가 필요함.
십육진수의 각 자리를 따로 따로 이진수로 변환한 후 그 비트들을 이어 붙이면 십육진수를 2진수로 바꿀 수 있음!

0x1A2B
0b 0001 1010 0010 1011

이진수를 십육진수로 바꿀 때는 이진수의 숫자들을 4개씩 끊어 십육진수로 변환한 후 이어 붙이면 됨.

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

문자 집합과 인코딩

문자 집합
컴퓨터가 인식하고 표현할 수 있는 문자의 모음

문자 인코딩
컴퓨터가 이해할 수 있도록 문자를 0과 1로 변환하는 과정
같은 문자 집합에 대해서도 다양한 인코딩 방법이 있을 수 있음.

문자 디코딩
인코딩의 반대 과정.
0과 1로 이루어진 문자 코드를 사람이 이해할 수 있는 문자로 변환하는 과정.

아스키 코드

초창기 문자 집합 중 하나로, 영어 알파벳, 아라비아 숫자, 일부 특수 문자, 제어 문자(space, Backspace, Escape 등)를 포함함.
각 문자들은 7bit로 표현됨.

  • 실제로는 8bit로 표현되지만, 8bit 중 1bit는 오류 검출을 위해 사용되는 비트(패리티 비트)

EUC-KR

대표적인 한글 완성형 인코딩 방식
한글 한 글자에 2byte 코드가 부여됨.
집합에 정의되지 않은 한글은 표현 불가.

완성형 인코딩 : 초성, 중성, 종성의 좋바으로 이루어진 완성된 하나의 글자에 고유한 코드를 부여하는 인코딩 방식
조합형 인코딩 : 초성을 위한 비트열, 중성을 위한 비트열, 종성을 위한 비트열을 할당하여 그것들의 조합으로 하나의 글자 코드를 완성하는 인코딩 방식

유니코드와 UTF-8

유니코드
현대 문자를 표현할 때 가장 많이 사용되는 표준 문자 집합.
여러 나라의 문자를 광범위하게 표현할 수 있음.

UTF-8
유니코드 문자에 부여된 값을 인코딩하는 방법 중 하나.

Chapter 03 명령어

03-1 소스 코드와 명령어

고급 언어와 저급 언어

고급 언어
우리가 프로그램을 만들 때 사용하는 프로그래밍 언어
사람을 위한 언어

저급 언어
컴퓨터가 직접 이해하고 실행할 수 있는 언어
명령어로 이루어져 있음.

  • 기계어
    - 0과 1의 명령어 비트로 이루어진 언어.

  • 어셈블리어
    - 0과 1로 표현된 명령어를 사람이 읽기 편한 형태로 번역한 언어

    • 하드웨어와 밀접하게 맞닿아 있는 프로그램을 개발하는 임베디드 개발자, 게임 개발자, 정보 보안 분야 등의 개발자는 어셈블리어를 많이 이용.

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

고급 언어가 저급 언어로 변환되는 방식에는 컴파일 방식과 인터프리트 방식이 있음.

컴파일 언어
컴파일 방식으로 작동하는 프로그래밍 언어
컴파일러에 의해 소스 코드 전체가 저급 언어로 변환되어 실행됨.
대표적인 컴파일 언어로는 C가 있음.
컴파일러가 소스 코드 내에서 오류를 하나라도 발견하면 해다 ㅇ소스 코드는 컴파일에 실패함.
컴파일러를 통해 저급 언어로 변환된 코드를 object code라고 함.

인터프리터 언어
인터프리트 방식으로 작동하는 프로그래밍 언어
인터프리터에 의해 소스 코드가 한 줄씩 실행되는 고급 언어.
대표적인 인터프리터 언어로 Python이 있음.
인터프리터 언어는 컴퓨터와 대화하듯 소스 코드를 한 줄씩 실행하기 때문에 소스 코드 전체를 저급 언어로 변환하는 시간을 기다릴 필요가 없음.
소스 코드 N번째 줄에 문법 오류가 있어도 N-1번째 줄까지는 올바르게 수행됨.

일반적으로 인터프리터 언어는 컴파일 언어보다 느림.
-> 한 번 컴파일을 실행해서 나온 object code는 바로 컴퓨터가 이해하고 실행할 수 있는데, 인터프리터 언어는 소스 코드를 한 줄 한 줄 해석하면서 실행해야 하기 때문.

Linking

목적 파일
object code로 이루어진 파일

실행 파일
실행 코드로 이루어진 파일
.exe 확장자를 가진 파일이 대표적인 실행 파일

목적 파일이 실행 파일이 되기 위해서는 linking이라는 작업을 거쳐야 함.
-> 목적 파일에 없는 외부 기능을 목적 파일과 연결 짓는 작업이 필요

03-2 명령어의 구조

연산 코드와 오퍼랜드

명령어는 연산 코드와 오퍼랜드로 구성되어 있음.

연산 코드(operation code)

  • 명령어가 수행할 연산
  • 연산자

    기본적인 연산 코드 유형

    1. 데이터 전송
    2. 산술/논리 연산
    3. 제어 흐름 변경
    4. 입출력 제어

오퍼랜드(operand)

  • 연산에 사용할 데이터(숫자나 문자 등을 나타내는 데이터) or 연산에 사용할 데이터가 저장된 위치(메모리나 레지스터 주소)
  • 피연산자
  • 오퍼랜드 필드를 주소 필드라 하기도 함.
  • 오퍼랜드가 하나도 없는 명령어를 0-주소 명령어 , 오퍼랜드가 1개인 명령어를 1-주소 명령어 , 2개인 명령어를 2-주소 명령어 , 3개인 명령어를 3-주소 명령어라고 함.

명령어의 구조
operation code | operand

주소 지정 방식

유효 주소(effective address)
연산 코드에 사용할 데이터가 저장된 위치

주소 지정 방식
연산에 사용할 데이터 위치를 찾는 방법
유효 주소를 찾는 방법

  1. 즉시 주소 지정 방식 (immediate addressing mode)
  • 연산에 사용할 데이터를 오퍼랜드 필드에 직접 명시하는 방식
  • 표현할 수 있는 데이터의 크기가 작아지는 단점이 있지만, 연산에 사용할 데이터를 메모리나 레지스터로부터 찾는 과정이 없기 때문에 속도가 빠름.
  1. 직접 주소 지정 방식 (direct addressing mode)
  • 오펴랜드 필드에 유효 주소를 직접적으로 명시하는 방식
  • 표현할 수 있는 유효 주소에 제한이 생길 수 있음.
  1. 간접 주소 지정 방식 (indirect addressing mode)
  • 유효 주소의 주소를 오퍼랜드 필드에 명시하는 방식.
  • 직접 주소 지정 방식보다 표현할 수 있는 유효 주소의 범위가 넓어짐.
  • 두 번의 메모리 접근이 필요해서 느림.(유효 주소의 주소에 접근, 유효 주소에 접근)
  1. 레지스터 주소 지정 방식 (register addressing mode)
  • 연산에 사용할 데이터를 저장한 레지스터를 오퍼랜드 필드에 직접 명시 하는 방법
  • 일반적으로 CPU 외부에 있는 메모리에 접근하는 것보다 CPU 내부에 있는 레지스터에 접근하는 것이 더 빠르므로, 직접 주소 지정 방식보다 빠르게 데이터데 접근 가능.
  • 표현할 수 있는 레지스터 크기에 제한이 생길 수 있음.
  1. 레지스터 간접 주소 지정 방식 (register indirect addressing mode)
  • 연산에 사용할 데이터를 메모리에 저장하고, 유효 주소를 저장한 레지스터를 오퍼랜드 필드에 명시하는 방법
  • 메모리에 접근하는 횟수는 1번

✏️ 기본 숙제

p. 51 확인 문제 3번

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

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

답: 메모리

p. 65 확인 문제 3번

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

1101 -> 0010 -> 0011

답: 0011

📖추가 숙제

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

스택

가장 나중에 저장한 데이터를 가장 먼저 빼내는 데이터 관리 방식 (LIFO)
데이터를 차곡 차곡 쌓는 형태로 저장하는 방식

  • push : 스택에 새로운 데이터를 저장하는 명령어
  • pop : 스택에 저장된 데이터를 꺼내는 명령어

가장 먼저 저장한 데이터를 가장 먼저 빼내는 데이터 관리 방식 (FIFO)
자동차 터널처럼 데이터를 저장하는 방식

참고 자료
혼자 공부하는 컴퓨터구조 + 운영체제 (강민철, 한빛미디어)

profile
차근차근

0개의 댓글