새소식

반응형
CS 지식/컴퓨터구조

[컴퓨터 구조] 1. 컴퓨터 구조 시작

2023.01.11
  • -
반응형

Intro

컴퓨터 구조에 대해 자세히 알아보기 전 자주 사용되는 용어를 정리해 보도록 하겠습니다.

용어

  • instruction(명령어): 컴퓨터가 알아듣도록 컴퓨터에게 내리는 명령, 기계가 알아듣도록 하는 기본 function(기능 단위)
    • turn left, turn right, ...(기본적인 동작부터 복잡한 동작까지 있음)
    • 이것이 명령어
  • hareware: processor가 어떻게 만들어져있는지
  • instruction set (spec,스펙) or Instruction Set Architecture(ISA): 하드웨어가 어떻게 만들어져 있는지
    • 말 그대로 명령어의 집합이다.
    • 컴퓨터의 추상체
    • Hardware와 Software의 bridge 역할
  • microarchitecture
    • ISA를 이해하고 명령어의 의도대로 실행되는 CPU 내부의 하드웨어 구조를 의미한다.

 

RISC-V라는 architecture가 비교적 최근에 나왔는데 이는 Open source로 공개 되어 있어 최근 핫한 기술입니다. 이 구조의 장점은 원하는만큼 processor를 만들 수 있다는 것입니다.

 

하지만 제 블로그 포스팅에서는 주로 MIPS를 기준으로 동작하는 컴퓨터에 대해 설명할 것입니다.


 

중요 개념

아래 큰 틀에서 우리는 컴퓨터 구조를 살펴볼 것입니다.

  1. Performance(중요)
    • 하드웨어가 얼마나 잘 만들어져 있는지, 잘 만든다는 게 무엇일까?
  2. Instruction Set(명령어 집합)
  3. Micro Architecture(Hardware)
  4. Memory
  5. I/O
  6. Parallel-computer

 

Computer Architecture (컴퓨터 구조)

  • 컴퓨터 구조란 무엇일까?
    • 소프트웨어와 하드웨어가 함께 결합하고 상호 작용하여 작동하는 방법을 시작하는 일련의 규칙
    • 사용자(프로그래머)가 바라보는 컴퓨터의 구조 및 동작
    • 시스템의 컴퓨터 플랫폼을 만들기 위해 하드웨어와 소프트웨어 기술이 상호 작용하는 방법을 설명하는 사양(specification; spec)
  • Computer architecture에는 세 가지 카테고리가 존재
    • lSA (instrsuction set architecture)
    • Microarchitecture (computer organization): ISA가 어떻게 구현되는지 알려줌(hardware)
    • System design: 다른 모든 hardware 구성 요소를 포함한다.(DMA, virtualization, multiprocessing, GPU, memory controller, etc.)
  • CISC and RISC ?
    • CISC (complex instruction set architecture)
      • 말 그대로 많은 복잡한 명령어
      • 코드 행이 필요하고 메모리가 적지만 명령어를 완료하는 데 시간이 오래 걸림
      • 자주 쓰이는 것이 있고 자주 쓰이지 않는 것이 공존하기 때문에 굉장히 복잡한 구조를 갖는다.
      • ex) x86
    • RISC (reduced instruction set architecture)
      • hardware를 최대한 단순하고 빠르게 유지하는 구조
      • 복잡한 명령은 더 간단한 명령으로 수행할 수 있음
      • 자주 쓰이지 않는 것은 만들지 않고 자주(많이) 쓰이는 것들로만 구성한 것
        • 그럼 자주 쓰이지 않는 것은 어떻게 만들까?
        • ->이미 있는 간단한 instruction들을 합쳐서 복잡한 것을 만든다.
      • 명령어들이 x86에 비해 set이 훨씬 작음
      • 복잡하고 간단한 명령들이 나열되어 있음
      • ex) ARM, MIPS, RISC -V
  • Von Neumann architecture and Harvard architecture(폰노이만 아키텍쳐와 하버드 아키텍쳐)
    • Von Neumann : 명령(instruction)과 데이터(data)가 모두 동일한 메모리 장치에 로드.
      • 우리가 사용하는 컴퓨터는 아직까지도 폰노이만 아키텍쳐를 따르고 있음
    • Harvard : 명령 및 데이터를 별도의 메모리(분리된 buses)에 보관함

 

// data 부분(선언(declare) 부분)
int a,b,c

//program 부분(text, code)
main()
...
a=b+c;
...

위 코드는 컴퓨터에서 어떻게 실행될까요?

  • 만일, CPU를 통해 +, -, *, /, and, or 등의 연산을 하고 싶음 -> ALU에서 연산하면 됨.

 

앞서 살펴봤듯, 폰노이만 구조는 data와 프로그램(명령)이 한 구조(memory) 안에 있습니다. 또한 위 코드에서처럼 변수와 같은 데이터가 선언되기 위해서는 메모리가 필요하게 됩니다.

그 구조 속에 존재하는 메모리는 일반적으로 세 부분으로 나뉘어집니다. 위치는 사실상 없다고 봐도 무방하지만 우리가 흔히 보는 메모리 형태에서 위, 중간, 아래에 따라 저장되는 데이터가 다릅니다.

  • 맨 위 : fff...f 번지, stack memory
    • 스택 = temporary
    • 즉, 임시로 잠깐 저장할 때 사용하는 공간
  • 중간: data memory
    • 데이터가 들어가는 자리.
    • 컴파일이 되면, a, b, c와 같은 선언한 변수들의 방을 잡아준다.(선언 부분이라 어디에 잡아줄 지는 compiler가 결정)
  • 맨 아래: 0번지, program memory(code memory)
    • 프로그램이 들어있음
      • 즉, instruction set(명령어 집합)이 들어있는 곳
    • instruction에 따라서 수행할 연산을 이 위치에서 가져와 program counter에 의해 decode(해석)되어 전달한다.
    • 컴파일러에 의해 코드는 high level language에서 컴퓨터가 알아들을 수 있는 assembly language로 변환된 후 이곳(program memory)으로 들어온다.

 

위 예제에서는 b와 c에 대해 연산을 하고 싶은 것이기 때문에 이를 ALU에 연결하여 전달해야 하나, RISC에서는 이를 직접 바로 연결하지 못하고, register file(여러개의 register를 모아둔 곳)을 거쳐서 ALU로 넘겨주게 된다.

또한 이 결과는 다시 register file을 거쳐서 memory로 들어간다.

  • load: memory의 데이터를 사용하기 위해 register로 가져오는 행위
  • store: register에서 ALU로 보내 연산을 마친 결과 데이터를 저장하기 위해 다시 memory로 보내는 행위


CISC에서는 다양한 방법을 제공하지만 RISC는 무조건 register를 통해서 들어가야 한다.

그래서 RISC를 load-store architecture라고도 한다.

 

컴파일러가 high-level language를 machine이 이해하는 assembly language로 변환된 모습은 아래와 같다.

load b -> rf1 #register file_1
load c -> rf3
addf rf1 + rf3 -> rf5
store rf5 -> a

이처럼 하나하나의 instruction으로 바뀌게 되는 것이다.

 

 

 

  • data path (register file + ALU)
    • data memory에 위치해 있던 data가 register로 들어가고(load) ALU로 가서 산출된 연산 결과를 다시 register로 보내서 이를 다시 data memory로 전달하는 일련의 경로(store)
  • control(Instruction Register + Decoder)
    • instruction을 하나씩 control 부분의 IR(Instruction Register)에 가져와서 무슨 명령어인지 분석을 진행한다.(decoding)
    • 근데 instruction을 하나씩 가져오려면 그것들의 위치를 알아야 하는데 이 위치를 알려주는 장치가
      Program Counter(PC)이다.
      • 주소는 4씩 차지하는 공간이기 때문에 현재 PC가 가르키는 주소에 4씩 더해가면서 접근하면 instruction을 순서대로 하나하나씩 접근할 수 있는 것이다.
    • program memory에서 instruction들을 가져오는 행위를 fetch라 한다.
  • 그래서 load와 fetch는 둘 다 memory에서 CPU로 object를 가져오는 행위로 같아보이지만 그것의 원천이 data memory냐 program memory냐에 따라 다르다.
  • CPU와 memory 사이에는 cache라는 것이 존재
    • cache는 CPU chip 안에 들어있음
    • data용 Cache와 instruction용 Cache가 따로 있음

 


Classes of Computer (컴퓨터 종류)

  1. Personal computers
    • 범용, 다양한 소프트웨어
    • cost/performance tradeoff의 영향을 받는다.
  2. Server computers
    • 네트워크 기반(Google 서버, 스토리지 서버 등)
    • 대용량, 성능, 신뢰성
    • 소규모 서버부터 건물 크기 컴퓨터까지 다양
  3. Super computers
    • 기상청에서 사용
    • 서버 유형
      • 고급 과학 및 엔지니어링 계산
      • 최고의 기능을 제공하지만 전체 컴퓨터 시장의 극히 일부를 차지
  4. Embedded computer
    • 휴대폰, 냉장고 등에 들어있는 프로세서
    • 시스템의 구성 요소로 숨김
    • 기능이 엄격함(유연하지 않음)

 

컴퓨터의 중요 3요소

power / performance / cost constraints

  • 모든 전자 기기는 배터리로 동작하기 때문에 power가 매우 중요
    • ARM processor가 power가 좋기 때문에 전세계적으로 사용하는 되는 것임
  • cost와 size는 서로 직결되어 있음
  • power ∝ Vdd2 * f * CL
  • 하지만 컴퓨터 구조 과목에서 cost, power는 다루지 않을 것임(중요하긴 하지만 범위를 벗어난 내용이기 때문)
    • power는 사실 컴퓨터에서 굉장히 중요하지만 hardware적 측면이 강한 부분으로 이곳에서는 다루지 않을 것이다.

 

무엇을 배울 것인지

  • 프로그램이 기계어로 번역되는 방법
    • 그리고 하드웨어가 이들을 어떻게 실행하는지
  • hardware/software 인터페이스
  • 무엇이 프로그램 performance(성능) 을 결정하는 지
    • 그리고 그것이 어떻게 개선될 수 있는지
  • hardware designers가 performance를 향상시키는 방법
  • parallel processing이 무엇인가

 

 

Performance

컴퓨터 구조에서 제일 중요하게 다뤄질 부분이다.

 

 

아래는 performance를 결정하는 중요한 요인들이다.

  • performance는 1/실행시간(execution time)로 정의된다.
    • 실행시간에 반비례, 즉 speed와 관련된 것
  • Algorithm
    • Sorting(퀵 정렬, 버블 정렬,...) , Graph 등... 어떤 알고리즘으로 구성되었는지에 따라 성능의 차이가 발생함.
    • 실행되어지는 연산들의 갯수를 결정
  • 프로그래밍 언어, 컴파일러, 아키텍쳐
    • 연산 당 실행되어지는 machine instruction의 개수를 결정
  • 프로세스와 메모리 시스템
    • 얼마나 빠르게 명령이 실행되는지를 결정
  • I/O system(including OS)
    • I/O 연산(입출력)이 얼마나 빠르게 실행되는지를 결정

 

Seven Great Ideas

high speed CPU를 이루어 낼 수 있던 motivation(동기)은 무엇일까?

  • 추상화(abstraction)를 사용하여 설계 단순화
  • 공통 사례(common case)를 신속하게 작성
    • 많이 사용되는 것들을 가장 빠르도록 하는 것이 key idea
  • 병렬 처리를 통한 성능 향상
    • 부족하면 여러개를 이어붙여서 사용하는 것
  • 파이프라인을 통한 성능 향상
    • 나중에 포스팅 될 내용
  • 예측을 통한 성능 향상
    • 다음 가져올 데이터를 미리 예측하여 미리 가져오는 것
  • 메모리 계층 구조
    • 하드디스크, main memory, cache memory, cpu
  • 이중화(redundancy)를 통한 신뢰성
    • 데이터의 speed도 중요하지만 서버가 날라가면 큰일 나기 때문에 서버에 있는 컴퓨터들은 보통 하드디스크를 하나만 쓰지 않고 여러개 나눠 사용한다.

 

Levels of Program Code

프로그램 코드는 Compiler에 의해 language를 machine이 알아듣도록 계속 변환 시킨다.

 

  • High-level language
    • 인간이 읽기 쉬운 human-friendly language
    • problem domain에 가까운 추상화 레벨
    • 생산성 및 휴대성 제공
    • compiler에 의해 assembly language로 변환됨
swap(int v[], int k)
{
    int temp;
    temp = v[k];
    v[k] = v[k+1];
    v[k+1] = temp;
}

 

  • Assembly lanuage
    • 명령어의 텍스트적 표현
    • compiler에 의해 machine language(Hardware representation)으로 변환해 줌
    • 하드웨어와 연관될 수 있는 표현들을 사용함
swap:
    muli $2, $5.4
    add $2, $4.$2
    lw $15, 0($2)
    lw $16, 4($2)
    sw $16, 0($2)
    sw $15, 4($2)
    jr $31

 

  • Hardware representation
    • Binary digits(bits) - 이진수 
    • 인코딩된 명령 및 데이터
    • 실제로 컴퓨터가 이해하는 단어는 0과 1뿐
00000000000000000000011010100000100000000000100110
101000000000000001111111000000000001111111000001
010100000000000111111101010010

 

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.