[혼공학습단 9기] 혼자 공부하는 컴퓨터 구조+운영체제 : 1주차

김세린·2023년 1월 8일
0
post-thumbnail

Chapter 1. 컴퓨터 구조 시작하기

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

처음 프로그램은 시작할때 프로그래밍 언어의 문법과 함께 컴퓨터의 근간(컴퓨터 구조, 운영체제)을 알아야 한다.

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

  1. 문제해결능력 향상
    • 코드를 똑같이 작성함에도 불구하고 동작하지 않는 경우에 컴퓨터 내부를 들여다보는 것에 거리낌 없이 문제 해결 가능
    • 컴퓨터를 미지의 대상에서 분석의 대상으로
    • 컴퓨터를 내려다보며 문제를 해결할 수 있는 개발자
  2. 성능, 용량, 비용을 고려한 개발
    1. 성능, 용량, 비용을 고려하지 않고 개발하는 회사는 없다!
    2. 컴퓨터 구조는 결국 성능, 용량, 비용에 대한 이야기

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

컴퓨터가 이해하는 정보

  1. 데이터
    • 숫자, 문자, 이미지, 동영상과 같은 정적인 정보
    • 컴퓨터와 주고받는/내부에 저장된 정보
    • 0과 1로 숫자를 표현하는 방법
    • 0과 1로 문자를 표현하는 방법
  2. 명령어(컴퓨터는 명령어를 처리하는 기계)
    • 컴퓨터를 실질적으로 움직이는 정보
    • 데이터는 명령어를 위한 일종의 재료
    • 명령어 : 1과 2를 더하라 → 데이터 : 1, 2

컴퓨터의 4가지 핵심 부품

  1. CPU
    • 정의 : 컴퓨터의 두뇌
    • 메모리에 저장된 명령어를 읽어들이고, 해석하고, 실행하는 부품
    • 주요 내부 구성 부품
      • ALU(산술 논리 연산 장치) : 계산기
      • 제어장치 : 제어 신호(컴퓨터의 부품들을 관리하고 작동시키기 위한 전기 신호 - 메모리 읽기 신호, 메모리 쓰기 신호)를 내보내고, 명령어를 해석하는 장치
      • 레지스터 : CPU 내부의 작은 저장 장치
  2. 메모리(주기억장치 : RAM/ROM)
    • 현재 실행되는 프로그램(프로세서)의 명령어와 데이터를 저장하는 부품(연관 : 페이징)
    • 주소 : 필요한 메모리를 저장한 위치
    • 프로그램이 실행되기 위해서는 메모리에 저장되어 있어야 한다.
    • 메모리는 실행되는 프로그램의 명령어와 데이터를 저장한다.
    • 메모리에 저장된 값의 위치는 주소로 알 수 있다.
  3. 보조기억장치(USB, SSD, SD카드, CD롬, 하드디스크)
    • 대용량으로 저장가능한 저장장치
    • 메모리는 보조 기억장치에 비해 비싸고, 전원이 꺼지면 저장된 내용을 잃는다.
    • 전원이 꺼져도 보관될 프로그램을 저장하는 부품
    • 메모리는 실행할 정보를 저장하고, 보조기억장치는 보관할 정보를 저장한다.
  4. 입출력장치
    • 컴퓨터 외부에서 컴퓨터로 정보를 받아들일수 있는 장치
    • 컴퓨터 외부에 연결되어 컴퓨터 내부와 정보를 교환할 수 있는 부품
    • 보조기억장치 VS 입출력장치
      • 실제로 컴퓨터가 주고받는 양상이 비슷하기에 주변장치라 통칭하기도 한다.
      • 보조기억장치는 메모리를 보조하는 특별한 입출력장치다.
  5. 메인보드(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가 한 번에 처리할 수 있는 정보의 크기 단위
  • 하프워트 : 워드의 절반
  • 풀워드 : 워드 크기
  • 더블워드 : 워드의 두배

진법

  1. 이진법(binary)

    • 0과 1로 수를 표현하는 방법
    • 숫자가 1을 넘어가는 시점에 자리 올림
    • 일상적으로 사용하는 진법은 9가 넘어갈때 자리를 올리는 십진수
    • 이진수 표기
      • 1000(2)
      • 0b1000
    • 음수 표기
      • 2의 보수 표현
      • 정의 : 어떤 수를 그보다 큰 2의 n제곱에서 뺀 값
      • 방법 : 모든 0과 1을 뒤집고 1 더한 값
      • -1011(2)를 표현하기 위한 0101(2)와 십진수 5를 표현하기 위한 0101(2)의 구분 방법은?
        • CPU내부에 플래그(flag)레지스터가 있어, 여기서 양수와 음수 표기를 구분한다.
        • Q. 그럼 왜 굳이 2의 보수 표현으로? 그냥 플래그만 바뀌고 표현방법은 같으면 안되나? 예를들어 십진수 5가 1011이므로 -5도 -1011로 표기하는 것과 같이
  2. 16진법

    • 이진법으로는 숫자의 길이가 너무 길어지기 때문에 컴퓨터의 데이터 표현시 16진법을 많이 사용한다.
      • 십진수 32 == 이진수 100000
      • 수가 15를 넘어가는 시점에 자리 올림
    • 16진수 표기
      • 15(16)
      • 0x15
    💡 2진수 → 16진수 변환
    • 2진수 4자리를 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마다 연산코드의 종류와 생김새가 다르다)
      • 데이터 전송
        • MOVE : 데이터를 옮겨라

        • STORE : 메모리에 저장해라

        • LOAD(FETCH) : 메모리에서 CPU로 데이터 가져와라

        • PUSH : 스택에 데이터 저장해라

        • POP : 스택의 최상단 데이터를 가져와라

          💡 스택(Stack) : 나중에 들어간 값이 가장 먼저 나오는 자료구조(LIFO)
          💡 큐(Queue) : 먼저 들어간 값이 가장 먼저 나오는 자료구조(FIFO)

      • 산술/논리 연산
        • 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)입니다.

profile
성장하는 신입 개발자🌱

0개의 댓글