본문 바로가기
College Computer Science/Computer Architecture

[컴퓨터구조] 컴퓨터 추상화와 기술 (Computer Abstractions and Technology)

by 2den 2020. 10. 22.
728x90

애플리케이션 소프트웨어

- HLL(high-level language)로 작성

시스템 소프트웨어

- 컴파일러 : HLL -> 기계어 (machine code)

- OS : 입출력 핸들링, 메모리 / 저장공간 관리, 태스크 스케쥴링, 자원 공유

하드웨어

- 프로세서, 메모리, I/O 컨트롤러

 

HLL : C언어 같은 것, 생산성 (자연어와 비슷함), 유연성 (어느 컴퓨터에서나 같음)

-> compile

어셈블리어 : 명령어의 textual한 표현

-> assemble

기계어 : 하드웨어 표기법, 이진수(비트), 인코딩된 명령어와 데이터

* 어셈블리어와 기계어는 일대일 매핑 가능 (줄 수가 같음)

 

<<그림>>

 

컴퓨터 구성요소 : (1) datapath (2) control (3) memory (4) input (5) output

입출력 (input / output) : 사용자 인터페이스 장치 (키보드, 디스플레이, 마우스), 저장장치 (하드디스크, CD/DVD, 플래쉬), 네트워크 어댑터 (다른 컴퓨터와의 통신을 위해)

 

CPU : 위 (1) datapath (2) control 포함, (3) cache memory (CPU 안에 있는 것, 램이랑 다름)

(1) datapath : 데이터 연산(operation)

(2) control : datapath, 메모리 등을 나열, 제어

(3) cache memory : 즉각적인 데이터 접근을 위한 SRAM 메모리 (작고 빠름)

 

추상화는 로우레벨의 복잡함을 모르고도 다룰 수 있도록 도움

ISA : Instruction Set Architecture

- 하드웨어와 low-level 소프트웨어 사이에 인터페이스

- 프로그래머가 binary 기계어 프로그램이 잘 작동하도록 만들기 위해 알아야 할 anything : ISA가 사용해도 된다고 하면 뭐든 사용할 수 있음

- 같은 architecture(ISA)의 다른 implementation(하드웨어) : 같은 ISA라면, 하드웨어가 달라도 같은 기계어, 같은 명령어

* implementation : 숨겨진 디테일과 인터페이스

- 버전 업그레이드 시 ISA가 수정되어 소프트웨어 컴파일러를 모두 수정해야 함 -> 가끔은 새로운 이노베이션 사용 막음

 

 

Performance 성능

 

알고리즘 (+ 자료구조 + 프로그래밍 스킬) : 실행할 연산(operation)의 수를 결정

프로그래밍 언어, 컴파일러, architecture(ISA) : 연산마다 실행할 machine instructions의 수를 결정

프로세서, 메모리 시스템 : 명령어가 실행되는 속도를 결정

I/O 시스템 (OS 포함) : I/O 연산이 실행되는 속도를 결정

 

무어의 법칙 : 반도체 직접회로의 성능이 24개월마다 2배로 증가 (2배의 속도를 의미하는 것은 아님)

- capacity, performance △

- 비용 ▽

 

response time (응답 시간, 지연 시간, 실행 시간) : 하나의 일을 하는 데 걸리는 시간

throughput (처리량) : 한번에 기계가 실행할 수 있는 일의 양, 즉 단위 시간 당 실행되는 일(task, transaction 등)의 양

* 더 빠른 버전의 프로세서로 대체 시 : 시간 ▽ 처리량

* 더 많은 프로세서 추가 시 (듀얼코어, 쿼드코어, 옥타코어) : 일 한개 시간 -- / 일 한개 이상 시간 ▽ 처리량 

* 실행 시간이든 처리량이든 변경될 경우 서로에게 영향을 미치곤 함

* 큰 작업일수록 성능 차이가 잘 느껴짐

 

* response time 기준

performance_x = 1 / execution time_x

x 프로그램이 y 프로그램보다 n배 빠를 경우 :

performance_x / performance_y = execution time_y / execution time_x = n

* ex> A에 10초, B에 15초의 실행 시간 : execution time_B / execution time_A = 15초 / 10초 = 1.5

∴ A는 B보다 1.5배 빠름

 

경과 시간 (elapsed time) : 모든 방면의 응답 시간(프로세싱, I/O, OS 오버헤드, idle 시간)의 총 시간

- 시스템 성능을 결정

- 쓸만 하지만 성능을 비교하기엔 별로

 

CPU 시간 : 주어진 일을 CPU가 프로세싱하는 데 걸린 시간 (I/O 시간이나 다른 프로그램 실행 시간은 제외)

- 사용자 CPU 시간(내 프로그램이 실제로 실행된 시간)과 시스템(OS) CPU 시간(시스템이 날 위해 일한 시간)으로 나뉨

- 서로 다른 프로그램들은 CPU나 시스템 성능에 따라 다르게 영향을 받음

* 내 프로그램의 코드 line들을 실행하는 데 걸리는 시간인 사용자 CPU 시간을 기준으로 계산 (물론 다른 것도 영향을 주긴 함)

 

CPU clocking : 일정한 속도의 'clock'에 의해 관리되는 디지털 하드웨어의 operation

<<그림>>

- clock frequency (clock rate) : 초 당 사이클 (4.0GHz = 4000MHz = 4.0x10^9Hz = 4.0x10^9cycles/sec)

- clock period (clock cycle time) : 사이클 당 duration(지속 시간) (250ps = 0.25ns = 250x10^-12s)

* 1 / (4.0x10^9) = (1/4)x10^-9 = 0.25x10^-9 = 0.25ns = 250x10^-12 = 250ps

 

performance는 실행 시간에 의해 결정 : CPU time과 performance는 반비례

 

CPU time = (CPU clock cycles) x (clock cycle time) = (CPU clock cycles) / (clock rate)

* CPU 시간 = (CPU가 돌리는 사이클 수) x (사이클 하나 당 걸리는 시간) = (사이클 수) x (사이클 당 시간의 역수)

<<계산 예시>>

 

- instruction 카운트 : 한 프로그램 당 명령어 개수 (프로그램, ISA, 컴파일러에 따라 결정, 컴파일러가 다르면 컴파일된 기계어가 달라서 명령어 개수가 상이)

- 평균 CPI (instruction 당 clock-cycle 개수) : CPU 하드웨어에 따라 결정, 명령어에 따라 cycle 개수가 달라서 평균으로

CPU clock cycles = (instruction count) x (CPI)

* (CPU가 돌리는 사이클 수) = (내 프로그램의 명령어 개수) x (명령어 당 사이클 수)

CPU time = (instruction count) x (CPI) x (clock cycle time) = { (instruction count) x (CPI) } / (clock rate)

* (CPU 시간) = (내 프로그램의 명령어 수) x (명령어 당 사이클 수) x (사이클 당 시간) = { (내 프로그램의 명령어 수) x (명령어 당 사이클 수 ) } / (시간 당 사이클)

<<계산 예시>>

 

relative frequency = i번째 instruction 카운트 / 전체 instruction 카운트

1~n번째 CPI x relative frequency = 총 clock cycle / 명령어 개수 = 평균 CPI

 

다른 컴파일러로 컴파일된 class A, B, C (sequence : 컴파일된 기계어의 시퀀스)

Class A B C
CPI for class 1 2 3
IC in sequence 1 2 1 2
IC in sequence 2 4 1 1

- sequence 1 : IC = 5, clock cycles = 1x2 + 2x1 + 3x2 = 2 + 2 + 6 = 10, 평균 CPI = 10 / 5 = 2

- sequence 2 : IC = 6, clock cycles = 1x4 + 2x1 + 3x1 = 4 + 2 + 3 = 9, 평균 CPI = 9 / 6 = 1.5

 

CPU time = IC x CPI x clock cycle time = (프로그램 당 명령어 수) x (명령어 당 사이클 수) x (사이클 당 시간)

<<표>>

 

1. 프로그램 실행 시 사이클의 수? x, 사이클 당 시간을 모름

2. 프로그램의 명령어 수? x, 명령어 당 사이클 수와 사이클 당 시간을 모름

3. 시간당 사이클 수? x, 프로그램의 명령어 수와 명령어 당 사이클 수 모름

4. 명령어 당 평균 사이클 수? x, 명령어 수와 사이클 당 시간 모름

5. 시간 당 명령어의 수? x, 프로그램의 명령어 수 모름 (프로그램의 명령어 수는 프로그램 뿐만 아니라 컴파일러에 따라 상이함, 다른 CPU -> 다른 컴파일러 -> 다른 명령어 수)

 

시간 당 사이클 수가 늘수록, 더 많은 파워가 사용됨

일정 수준에 도달하면 시간 당 사이클 수를 유지하고 파워 소모를 줄이는 것이 더 중요

power는 (1/2) x 로드 용량 x voltage^2 x frequency(performance와 유사)에 비례

볼트를 너무 줄이면 유동적인 digital circuit을 정확히 1과 0으로 구분하기 힘든 한계가 있음, 열이 더 발생함

<<계산 예시>>

 

암달의 법칙 (Amdahl's Law)

시스템 일부를 개선한다고 해서 전체 성능이 같은 비율로 향상하는 것은 아님

 

개선된 시간 = 영향을 받은 시간 / 개선 요인 + 영향 받지 않은 시간

* ex> 80s/100s의 영향을 줄 수 있는 요인은 전체를 5배 개선시키려면 : T_new = 20s = 80s / factor + 20s, factor = 무한대가 되어야 함, 불가능

 

<<MIPS>>

<<RISC, CISC>>

728x90

댓글