본문 바로가기
해피 코딩/CS

[CS 컴퓨터 구조] 컴퓨터가 이해하는 정보

by happy-coding 2024. 9. 13.

Computer Science

🔥 컴퓨터가 이해하는 정보에 대하여 알아보도록 하자

  • 비트: 0과 1을 나타내는 가장 작은 정보의 단위
    • 1 byte: 8 bit,
    • 1 kB: 1,000 byte
    • 1 MB: 1,000 kB
    • 1 GB: 1,000 MB
    • 1 TB: 1,000 GB

[ 데이터 - 0과 1로 문자 표현하기 ]

  • 2진법: 1을 넘어가는 시점에 자리 올림을 하여 0과 1만으로 모든 숫자를 표현하는 방법 
  • 10진법: 숫자가 9를 넘어가는 시점에 자리 올림을 하여 0부터 9까지, 열 개의 숫자만으로 모든 수를 표현하는 방법

 

  • Encoding: 컴퓨터가 이해하는 0과 1로 이루어진 문자 코드로 변환하는 과정
  • Decoding: 0과 1로 표현된 문자를 사람이 이해하는 문조로 변환하는 과정
인코딩, 디코딩 실패 예시

 

  • ASCII(아스키): 초창기 컴퓨터에서 사용하던 문자 집합 중 하나로, 영어의 알파벳과, 아라비아 숫자, 일부 특수 문자를 포함
    • 아스키코드를 2진수로 표현함으로써 아스키 문자를 0과 1로 대응시킬 수 있습니다.
    • code point: 문자 인코딩에서 글자에 부여된 고유한 값
    • ex) 'A'는 10진수 65로 인코딩, 'a'는 10진수 97로 인코딩 됩니다.
  • 유니코드: 통일된 문자 집합. 현대에서 가장 많이 사용되는 표준 문자 집합이며, 문자 인코딩에 있어 매우 중요한 역할을 맡고 있습니다.
    • UTF-8: 유니코드가 문자의 집합이라면 UTF-8 은 유니코드 문자에 부여된 값을 인코딩하는 방식을 말합니다.
  • base64: 문자뿐만 아니라, 이진 데이터까지 변환할 수 있는 인코딩 방식
    • 사진 파일 등을 전송할 때 이메일 원문을 확인해 보면 base64로 인코딩 되어 있는 것을 확인할 수 있습니다.
    • base64는 사실 64진법을 의미

[ 명령어 ]

  • 명령어: 연산자와 피연산자로 이루어져 있습니다.
명령어 구조

  • 연산 코드 = 연산자: 명령어가 수행할 동작
  • 오퍼랜드 = 피연산자 = 주소 필드: 동작에 사용될 데이터가 저장된 위치

 

  • 기계어: CPU가 이해할 수 있도록 0과 1로 표현된 정보
  • 어셈블리어: 0과 1로 표현된 기계어를 읽기 편한 상태로 단순 번역한 언어
  • 정리: CPU가 읽고, 이해하고, 실행하는 기계어를 사람이 읽을 수 있도록 하기 위해 어셈블리어를 사용하여 번역한다.

[ 궁금증과 해결 ]

  • 문제 발생❗❗ 
    • CPU마다 각자 명령어의 종류와 생김새가 다르다고 한다
🤔 그렇다면, 왜 굳이 CPU마다 명령어를 다르게 사용하는 것일까? 명령어를 하나로 통일해 두면 모두가 편리한 거 아닐까? 라는 궁금증이 들었다
💁 1. 역사적 배경: 각 CPU 제조사와 아키텍처의 개발은 각기 다른 시점과 배경에서 이루어졌다고 한다. ex) 인텔과 AMD는 PC시장을 목표로 / ARM은 임베디드 및 모바일 시스템을 타겟으로 개발되었기 때문에 각자의 설계 목적에 따라 명령어가 다르게 개발 되었다고 한다.

2. 표준화의 어려움: 명령어를 하나로 통일하는 것은 이론적으로는 가능하나 현실적으로는 불가능하다고 한다. 이미 시장에 많은 종류의 CPU가 사용되고 있으며, 각 CPU가 실행하는 소프트웨어와 생태계도 매우 다양하다고 한다.
또한, 새로 개발된 명령어 집합이 기존의 "다양한 생태계의 모든 용도에 적합하지 않을 수 있다." 는 이유가 있다고 한다.

3. 정리: 이러한 이유들로 인하여 다양한 용도와 최적화를 위한 아키텍처가 존재하는 것이 오히려 전체적인 기술 발전과 효율성을 위해 필요할 수 있다고 볼 수 있다.

[ 명령어 사이클 ]

  • 인출 사이클: 메모리에 있는 명령어를 CPU로 가지고 오는 단계
  • 실행 사이클: CPU로 가져온 명령어를 실행하는 단계
  • 명령어 사이클: CPU는 메모리에서 명령어를 인출하고 실행하기를 반복하며 프로그램을 실행하기 때문에 인출 사이클과, 실행 사이클을 반복하게 됩니다. 바로 이 주기를 명령어 사이클이라고 합니다

간접 사이클 발생 예시

  • 간접 사이클: 명령어를 실행하기 위해 한 번 더 메모리에 접근하는 단계
    • 위와 같은 상황시 간접 사이클 발생 
명령어 사이클 구조


혹시 보면서 사이클 하나가 빠져 있다는 생각이 들수도 있다. 사실 명령어 사이클 중에서 아직 중요한 사이클이 하나 더 남아 있는데 그것은 바로 인터럽트 사이클!! 

인터럽트 사이클을 이해하려면 CPU와 레지스터에 대한 이해가 선행되어야 하므로 아직 다루지 못했다고 한다.

 

읽어 주셔서 감사합니다 😊