새소식

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

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

2023.01.11
  • -
반응형

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

  • 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

 

  • 컴퓨터 구조란 무엇일까?
    • 소프트웨어와 하드웨어가 함께 결합하고 상호 작용하여 작동하는 방법을 시작하는 일련의 규칙
    • 사용자(프로그래머)가 바라보는 컴퓨터의 구조 및 동작
    • 시스템의 컴퓨터 플랫폼을 만들기 위해 하드웨어와 소프트웨어 기술이 상호 작용하는 방법을 설명하는 사양(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가 따로 있음

 


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

 

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

 

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

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

 

프로그램 코드는 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

 

 

반응형

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

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