시스템 프로그래밍 중 하나인 OS는 프로그램의 실행 시 이를 수행하기 위한 명령어 처리, 데이터(자원) 관리, 외부 디바이스(I/O 장치)와 컴퓨터 하드웨어와의 중재 역할, 파일 시스템 등 수많은 기능을 수행하는 시스템 소프트웨어이다. 간단하게 말해 특정 task를 위해 컴퓨터 하드웨어를 사용하며 보다 효율적으로 관리하기 위한 소프트웨어이다.
이 OS를 한 식당의 운영을 위한 방법이라 해보자. 음식의 레시피, 진상 대처 등 많은 매뉴얼들이 있을 것이다.
이 식당 운영을 위한 기계, 기구들이 필요할텐데 이들을 하드웨어라 하자.
컴퓨터 아키텍쳐
는 효율성을 위해 매뉴얼을 위해 기계, 기구의 배치를 변경하거나 또는 매뉴얼을 조금 변경해주는 하드웨어와 시스템 소프트웨어의 중재 역할을 한다. 그렇기 때문에 양쪽의 지식을 모두 알아야한다.
컴퓨터 아키텍쳐라 한다면 일반적으로 Instruction set Architecture(ISA)
를 의미한다. 이는 컴퓨터의 내부적 기능들을 선언한 명령어의 집합이다.
이 ISA을 기반으로 컴파일러, OS 등 시스템 소프트웨어를 개발하면 된다. 또한 이 명령어가 수행될 수 있는 환경의 하드웨어를 개발하면 된다. 이렇게 중간 다리 역할을 한다.
컴퓨터 아키텍쳐의 한 부분으로 Computer Organization(Microarchitecture)
이 있다.
이는 ISA의 명령어를 수행하기 위한 하드웨어 디자인을 다루는 영역이다. 하드웨어를 설계할 때 다음과 같은 조건들을 고려한다.
SSD, 하드 디스크(storage), I/O 등 모두 컴퓨터 아키텍쳐에서 다룬다.
전반적인 컴퓨터 구조를 배우기 위해 컴퓨터의 erformance에 대해 어떻게 정의, 측정하는 지 알아보자.
컴퓨터 아키텍쳐에서의 Performance가 무엇인지, 어떻게 측정하는지 알아보자.
컴퓨터 아키텍쳐에서의 성능에 영향을 미칠 수 있는 요소는 아래와 같다.
- Algorithm(연산의 수를 얼마나 줄이냐)
- Programming Language(low 레벨 언어가 빠름), Complier(기계어 처리), Architecture(명령어 구현)
- Processor and Memory system(microarchitecture의 관점, 컴퓨터 구성)
- I/O system(OS의 syscall 부분도 포함 얼마나 빨리 I/O 작업이 수행되는지)
컴퓨터를 만들 때 중요한 7가지
- 디자인을 간단하게 하기 위해 기능을 추상화한다.(기능만 생각해낸다. 예를 들어, 하드웨어 구성을 생각할 때 다른 것은 생각하지 않고 ISA만 지키는 것을 목표로한다.)
- 자주 일어나는 task를 빠르게 한다.
- 병렬성을 높힌다.(코어의 수를 늘린다.)
- Pipelining을 통해 성능을 높힌다.: 일을 여러 단계로 나눈다.(병렬성과 관련있음)
- 예측을 통해 성능을 높힌다: for문이 있을 경우 일단 for문을 탄다. 만약 ;condition; 부분이 false일 경우에 나가면 된다.(for문은 웬만하면 실행되기 떼문에 일단 탐 속도 향상.)
- 메모리 구성을 통해 성능을 높힌다.
- 중복에 의존한다: 연산기 두 개이상을 두고 결과를 비교하여 동일할 경우 이에 의존한다.(회로가 작고 빠르기 때문에 에러가 많이 난다.)
컴퓨터의 Performance를 정의하는 요소들을 알아보자.
- Response Time: 응답 시간, task를 수행하는데 얼마나 많은 시간이 걸리는가?
- Throughput: 시간당 얼마나 많은 일을 할 수 있는가?(여러 프로그램을 수행하면 쓰루풋이 높다.)
연산 수행속도가 빠른 프로세서는, Response Time이 짧아지고, Throughput도 그에 따라 좋아진다.
더 많은 프로세서를 사용한다면, Throughput이 좋아지고, 좋은 소프트웨어를 통해 일을 여러개의 프로세서에서 수행하게 되면 Response Time도 짧아진다.
여기서 Response Time을 성능으로 생각하자. 이게 짧아야 좋은 것이다.
Performance는 그렇다면 1/Excution Time이다.
"X 컴퓨터가 Y 컴퓨터보다 n배 빠르다"에서 다음과 같은 수식을 사용해 n값을 구한다.
Performance_x / Performance_y = ExecutionTime_y / ExecutionTime_x = n
Execution Time의 측정은 다음과 같다.
- Elapsed time: 프로그램의 실행부터 종료까지의 시간이다. I/O, OS 오버헤드, idle time 등이 모두 포함된다. 이는 시스템 전체의 performance를 위해 사용된다.
- CPU time: 순수하게 CPU가 하나의 작업을 수행하는 시간을 측정한다. 커널 모드의 시간, 시스템 콜 등 모두
포함한다.
CPU time을 정확하게 알아보자.
CPU clock이란 1, 0을 반복하는 회로 신호이다. 컴퓨터의 하드웨어들은 clock 신호에 맞춰 동작한다.(clock이 올라가면 일을 한다 생각하자.)
- Clock period: clock 한 cycle에 걸리는 시간이다.
- Clock frequency(rate): 1초 기준 cycle 수이다.
CPU Time을 그럼 다음과 같이 정리한다.
CPU TIME = CPUClockCycles x ClockCycleTime
CPU TIME = CPUClockCycles / ClockRate
- CPUClockCycles: 어떤 프로세스를 처리하기 위한 CPU에 필요한 clock cycle 수이다.
- ClockCycleTime: Clock period이다.
- ClockRate: Clock frequency이다.
그렇다면 Performance는 rate을 높히거나, clock cycles를 줄인다.