심심해서 하는 블로그 :: 'Computer Science/컴퓨터 구조' 카테고리의 글 목록

캐시와 성능

CPU에서 캐시로 접근하는 시간을 Tc, 메인 메모리에 접근하는 시간을 Tm이라고 하였을 때 

1) 캐시가 없는 경우 : Tm

2) 캐시가 있는 경우 : T = h x Tc + ( 1 - h )(Tm + Tc) = Tc + (1-h) Tm 으로 각각 표현이 가능하다. 


여기서 h는 hit ratio(적중률) CPU가 요청한 내용을 캐시 메모리가 가지고 있을 확률을 의미한다.

일반적으로 Tc와 Tm을 비교하면 10배이상 차이가 나므로 적중률을 높여서 전체 시간중에 메모리에 있는 시간을 줄여야한다. 


라인의 크기를 키우자

이미 데이터의 지역성을 통하여, 보통 원하는 Word외에 인접한 데이터까지 한꺼번에 가져와서 미리 준비를 하여 성능 향상을 노린다는 점이다.  처음에는 이 논리에 의하여 성능이 향상되지만 어느 정도 크기가 커지면 적중률이 오히려 떨어지는 현상이 발생한다. 캐시 내에 가져온 데이터를 재사용하기 전에 다른 데이터를 가져오기 위해서 캐시에서 제거해야 하기 때문이다.


다단계 캐시

회로의 밀도가 높아짐에 따라 캐시를 프로세서 안에 두는 것이 가능해졌다. 기존에는 공용 선인 버스를 활용하여 데이터를 주고 받았지만 이제 하나의 칩 안에서 프로세서와 공존하므로 버스를 사용할 필요가 없어 졌다. 따라서 캐시와 프로세서간의 데이터가 오가는 동안 버스는 다른 전송을 할 수 있어지고 캐시는 버스를 기다릴 필요가 없어져서 시스템의 성능을 향상시킬 수 있다. 보통 3단계 캐시를 사용하고 L1, L2 캐시는 내부에 L3 캐시는 외부에 존재한다. 이들을 사용하여 효율을 볼려면 L1, L2의 적중률이 달려있다.


분리 캐시

기존의 캐시는 명령어와 Data를 구별하지 않고 무조건 저장하는 통합 캐시를 사용하였으나 명령어 패치와 데이터 패치 사이에 경쟁이 발생하는 것을 줄이기 위해 L1캐시의 경우 Data와 명령어를 분리하는 캐시를 사용한다.  이는 CPI(Clock cycle Per Instruction)를 파이프라인을 통해 줄여서 컴퓨터의 성능을 높혀준다. 

,

1. 교체 알고리즘

필요성

직접 매핑하는 경우에는 라인 별로 들어 갈 수 있는 곳이 정해져서 필요하지 않지만 연관, 세트연관 매핑의 경우 임의로 블록이 들어가기 때문에 교체 알고리즘이 필요하다. 그리고 이 교체하는 과정을 빠르게 하기 위해 알고리즘이 하드웨어로 구현되어야 한다.


대표적인 알고리즘

1) LRU(Least Recently Used) : 캐시 내에서 가장 오랫동안 참조되지 않은 블록을 교체하는 방식으로 

                                         구현이 단순하여 가장 널리 사용되는 알고리즘

2) FIFO(First In First Out) : 캐시 내에서 가장 오랫동안 있던 블록을 먼저 교체하는 방식

3) LFU(Least Frequency Used) : 가장 적게 참조되었던 블록을 교체하는 알고리즘


 2. 쓰기 정책

필요성

캐시는 프로그램 속도를 빠르게 하기 위한 운송업체 같은 역할일 뿐 실제 프로그램은 메인 메모리에서 수행한다. 따라서 캐시의 데이터가 변화하면 메인 메모리에도 똑같이 반영이 되어야 프로그램을 완벽하게 수행할 수 있으므로 캐시의 내용을 메모리에 다시 반영하는 쓰기 정책이 필요하다.


Write Through

가장 간단한 기법으로 캐시에 생기는 변화가 즉각적으로 메인 메모리에 반영이 되어지는 것이다. 하지만 메인 메모리의 사용량이 증가하여 병목현상이 발생할 수 있다.


Write back

위의 방법을 보완하는 방법으로 캐시 내의 데이터만 갱신이 되고 메모리는 나중에 캐시에서 데이터를 다시 가져오는 과정에서 갱신이 되는 점이다. 따라서 캐시의 데이터와 메모리의 데이터가 서로 달라지는 모습을 자주 보이는데 이 상태를 Dirty, 더럽혀 졌다고 한다.  속도는 개선되는 방면에 회로가 복잡하고 디바이스를 제어하는 경우 캐시의 내용을 디바이스로 전달을 안하는 경우가 간혹 발생한다.

,

1. Cache Memory

빠른 CPU, 느린 Memory

프로그램을 CPU 혼자서 수행하는 것이 아니라 메모리도 같이 참여한다. 암달의 법칙을 통해서 CPU 혼자 개선되어야 할 문제가 아니라 메모리도 역시 빨라야 한다는 것도 알게 되었다. 

그래서 우리는 메모리에게 아래 3가지 바라는 점을 적어 보았다.


1) 빠른 속도 : 캐시 메모리는 일반 메모리보다 빠르다.. 하지만 4GB를 캐시 메모리로 사용하면 가격이...

2) 큰 용량 : 메모리의 용량을 키우면 좋지만 역시 가격이...

3) 저렴하게..

인간의 욕심은 끝이 없고...


가격을 비교적 저렴하면서도 속도와 용량을 만족할 수 있게 현대 컴퓨터는 다음과 같은 구조를 갖는다.


용량의 Cache < Main Memory < HDD 순이며 속도는 역순이다.

CPU와 메인 메모리 사이에 캐시 메모리를 두어 CPU가 요청하는 것은 빠른 캐시 메모리에서 바로 전달은 해주면서 속도를 개선하였다. 그리고 HDD의 일부분을 가상메모리로 사용하여 메모리의 부족한 용량을 확장시켜주며 가격은 메인 메모리 전체를 캐시로 바꾸는 것, 메인메모리의 용량을 키우는 것보다 저렴한 고객 맞춤 서비스가 완성되었다. 이러한 성능 개선의 비결은 참조의 지역성이라는 성질 덕분에 발생한다.


Locality of Reference(참조의 지역성)

커피를 자주 마시는 여자친구가 있다. 센스 있는 남자 친구라면 데이트 코스에 꼭 카페를 들려 여자친구와 커피를 마시는 시간을 갖을 것이다. 그리고 카페에서 커피랑 먹으면 맛있는 케이크도 함께 주문하여 건내 줄 것이다. 이처럼 참조의 지역성은 CPU가 한 번 참조한 데이터는 다시 참조할 가능성이 높고 주변의 데이터 역시 참조될 가능성이 높다는 이론이다. 따라서 자주 쓰는 데이터를 캐시에 두고 데이터를 전달할 때 미리 다음에 받을 데이터까지 빠른 저장장치에 둔다면 컴퓨터의 성능이 좋아진다. 그리고 비싼 캐시 메모리의 용량이 굳이 크지 않아도 되니까 가격도 비교적 저렴해지는 효과도 발생한다.


2. Mapping Function

주소가 다르자나??


CPU가 메모리 주소를 사용하여 메모리로 데이터를 받을려고 한다. 하지만 CPU가 쓰는 주소는 가상 메모리 주소로 메모리 입장에서는 외계어다. 따라서 중간에 메모리 관리 장치(MMU)가 가운데에서 번역을 하여 메모리가 알아 먹을 수 있는 물리 주소로 변환을 해준다. 그리고 캐시에 해당 주소에 대한 데이터가 있는지 확인을 하는데 캐시에 데이터를 저장하는 방식에 따라 물리주소를 다르게 해석을 할 수 있다. 


직접 매핑(Direct Mapping)


우선 메인 메모리에서 캐시로 데이터를 저장할 때 참조의 지역성 때문에 한번 퍼낼 때 인접한 곳까지 한꺼번에 캐시 메모리에 저장하고 이 때 단위를 블록(Block)라고 한다. 그리고 캐쉬는 메인 메모리의 몇번째 블록인지를 알려주는 태그(Tag)도 함께 저장한다. 


메모리 주소 중에 가장 뒷부분(붉은색)은 블럭의 크기를 의미한다. 지금 블럭의 크기가 4이므로 뒤의 두자리를 사용하여 블럭의 크기를 표현하였다. 그리고 이 영역은 블럭에 몇 번째에 원하는 데이터가 있는지 보여주는 지표가 되어 준다. 만일 위의 예에서 붉은 영역이 01이라면 블록의 두 번째 내용을 CPU에서 요청한 것이다.


같은 라인에 위치하는 데이터는 파란색 색칠한 영역에 의하여 구별이 가능하다.. 예를 들면 메모리의 첫번째 요소 00000과 다섯번째 주소 00100은 캐시내에 같은 위치에 자리잡고 있어서 구별이 필요로 한데, 앞의 세자리 000과 001로 구별을 할 수 있다. 


이와 같은 요소의 활용은 캐시 메모리에 저장된 데이터 중 내가 원하는 것이 있는지 없는지 확인이 가능하다. 

1. 캐시의 태그와 주소상의 태그가 동일한지 확인한 후 같으면 붉은 영역을 통해 데이터를 읽는다.

2. 만일 태그가 다르다면 메모리에서 데이터를 가지고 온다.


직접 매핑은 위의 사진처럼 캐시에 저장된 데이터들은 메인 메모리에서와 동일한 배열을 가지도록 매핑하는 방법을 말한다. 이와 같은 방식을 사용하기 때문에 매우 단순하고 탐색이 쉽다는 장점이 있다. 하지만 적중률(Hit ratio)가 낮다는 단점이 있다. 반복문을 사용할 건데 같은 라인의 00000을 불렀다가 그다음엔 00100을 부른다면 캐시에 빈번하게 변경이 발생할수 있기 때문이다..



연관 매핑(Associative Mapping)

연관 매핑은 직접 매핑의 단점을 보완하기 위해 등장하였다. 캐시에 저장된 데이터들은 메인 메모리의 순서와는 아무런 관련이 없다. 이와 같은 방식을 사용하기 때문에 캐시를 전부 뒤져서 태그가 같은 데이터가 있는지 확인해야한다. 따라서 병렬 검사를 위해 복잡한 회로를 가지고 있는 단점이 있지만 적중률이 높다는 장점이 있다. 


세트 연관 매핑


직접 매핑의 단순한 회로와 연관 매핑의 적중률 두 개의 장점만을 취하기 위해서 만들어진 방식이다.

각각의 라인들은 하나의 세트에 속해 있다. 세트 번호를 통해 영역을 탐색하므로 연관 매핑의 병렬 탐색을 줄일 수 있다. 그리고 모든 라인에 연관 매핑처럼 무작위로 위치하여 직접매핑의 단점도 보완하였다. 세트 안의 라인 수에 따라 n-way 연관 매핑이라고 한다.(위 그림은 2-way 연관 매핑)





,

1. Performance

처리 시간

여러분이 컴퓨터를 교체하는 대표적인 이유. 바로 프로그램이 실행하는데 걸리는 시간이다. 

간단한 워드 프로세서를 켜는데 하루 반나절이 걸리면 당장 컴퓨터를 교체하러 갈 것이다.

이처럼 컴퓨터의 성능을 측정하는 지표에서 시간이라는 개념은 중요한 개념이다.


그렇다면 처리시간을 어떻게 측정할까? 

우선 CPU에 클럭(Clock)이라는 시계가 존재한다. 우리가 생각하는 시침, 분침, 초침으로 구성된 시계가 아니지만 일정한 진동수(f)의 전기 신호를 통하여 CPU는 정해진 시간에 맞춰서 프로그램을 수행할 수 있다. 또한 이 클럭이 높다는 것은 1초에 CPU 내부의 일을 많이 처리한다는 것을 의미해 CPU의 성능이 좋다는 지표가 된다.


하지만 프로그램이 실행하는 동안 CPU 혼자서 일을 하는 것은 아니다.

Operand Fetch, Instruction Fetch 과정에서 데이터나 명령어를 메인 메모리로부터 반드시 받아 와야하므로

메모리도 프로그램이 실행하는 내내 큰 역할을 한다. 그리고 알다시피 CPU의 속도가 토끼면 메모리의 속도는 나무늘보 수준.. (쥬토피아 보고싶다..)  따라서 명령어를 수행하는 사이클동안 메모리에 접근하는 빈도에 따라프로그램을 처리하는 시간은 달라질 수 있다. 이것을 고려하여 수치적으로 표현 한 것이 CPI(Clock cycles per Instruction)이다. 명령어마다 메모리에 접근하는 빈도가 달라져서 실행시간이 다르기 때문에 프로그램이 실행한 모든 명령어에 대하여 평균값을 구한 것이다. 


위의 두가지 개념을 이용하면 컴퓨터가 프로그램을 수행한 시간은 다음과 같이 표현이 가능하다



여기서 클럭주기는 클럭의 역수이다. 클럭이 높다는 것은 프로그램 수행 시간을 줄이므로 반비례 관계라 역수인 클럭주기를 곱하여 표현하였다. 


MIPS

야구선수 특히 타자들을 비교하는 가장 기본적인 지표는 한 시즌동안 몇개의 안타를 쳤는지 보여주는 타율이다. 컴퓨터도 비슷한 개념으로 이 컴퓨터가 1초동안 몇 개의 프로그램을 처리할수 있는가를 보여주는 지표가 IPS이다. 하지만 컴퓨터의 성능이 좋아지만서 웬만한 컴퓨터는 초당 백만 단위의 계산이 가능해져 지표의 자릿수가 너무 비대해지자 백 만개씩 묶어서 계산하는 MIPS로 대체하였다.




2. Amdhal`s Law

컴퓨터 관련과 학생들에게 견적을 물어보는 이유

자신의 컴퓨터가 느려졌는데 학생이라 가난해서 부품 몇 개만 바꾸고 싶다.

'나 CPU를 지금보다 5배 좋은 걸로 바꾸면 컴퓨터 성능도 5배가 좋아질까?'

질문을 듣는 순간 이러한 질문을 듣는 '내가 어떻게 알아'하며 순간 혈압이 오르고 노이로제에 시달리는 컴퓨터학과 학생들.. 하지만 실은 Amdhal의 법칙을 아는 사람은 대충은 알 수 있다. 


어떤 프로그램이 실행하는 시간 중 CPU가 40% 사용하고 나머지 기기들이 60%를 사용한다고 가정하고

CPU의 성능을 5배 향상을 시켰다고 하고 아래의 Amdhal의 법칙 공식을 이용하여 보자


여기서 f는 프로그램 실행 시간 중 CPU가 사용한 비율이고 N은 성능 향상의 배수이다.


따라서 CPU 성능을 5배 좋은걸 사더라도 1.47배 정도 밖에 성능향상이 발생하지 않는다.

프로그램이 CPU 단독적으로 수행하는 것이 아니라 메모리 등 나머지 장치들도 함께 수행하기 때문에

CPU 혼자 성능이 좋아진다해서 큰 성능 향상을 보여주는 것이 아니다라는 점이다.


따라서 컴퓨터 공학도에게 나 이거 5배로 좋은건데 집에 사용하는 프로그램이 CPU를 사용하는 시간이 전체 사용시간에 xx%이래 성능이 얼마 만큼 향상될까? 이렇게 물어보면 한 1000명중에 1명은 대답해줄지도 모른다. (그 전에 혼자 계산기를 켜서 계산해보는게 좋지않을까..?)

,

1. Bus

앞서 CPU와 메모리, I/O 장치 3가지의 요소에 대해 정리해보았다. 이제 이들의 "연결고리" BUS에 대하여 알아보자. 버스는 크게 데이터 버스, 주소 버스, 제어 버스로 나누어진다. 

 

데이터 버스

데이터 버스는 시스템 모듈들 간의 데이터 이동 경로를 제공한다. 주로 32, 64, 128 또는 그 이상의 분리된 선들로 구성되어 있으며 선의 수는 한 번에 전송할수 있는 비트 수를 결정지어 주는데 이것은 CPU가 수용할 수 있는 데이터의 크기, Word와 밀접한 관계가 있다.


주소 버스

주소 버스는 데이터의 근원지나 목적지의 일정한 메모리 주소를 전달하는 버스이다. 

주소 버스의 폭은 최대 기억장치의 용량을 결정지어 주는데 32개의 주소 버스를 지닌 컴퓨터 시스템은 2^32개의 메모리 위치를 할당할 수 있다. 또한 I/O포트를 지정하기 위해서도 사용되어진다.


제어 버스

제어 버스는 데이터 버스와 주소 버스를 제어하기위해 사용되어 진다. 데이터 버스와 주소 버스는 공유하는 선들의 집합이므로 이들을 제어하는 수단이 반드시 필요하기 때문에 사용한다. 


2. 동기식 버스 vs 비동기식 버스

동기식 버스

동기식 버스는 정해진 시간에 데이터를 전송하는 방법이다. 이 때 시간은 버스가 가지고 있는 Clock을 기준으로 하며 빠르고 인터페이스 논리회로가 간단하다는 장점이 있지만 느린 장비도 이 Clock에 맞춰야 한다는 점에서 시간 낭비가 발생할 수 있다. 


비동기식 버스

비동기식 버스는 동기식 버스와 달리 시간을 따로 정하지 않는다. 단지 서로 데이터를 주고 받을 준비가 되어있는지 확인하는 핸드쉐이킹 프로토콜을 사용하여 수신측에서 준비가 되었으면 바로 전송을 하는 방식이다.

장점은 따로 정해진 시간이 없기 때문에 시간 낭비가 적다는 점이고 단점은 회로 구성이 복잡하고 핸드쉐이킹하는 과정이 필요해서 속도도 동기식에 비해 느리다.


3. PCIe

버스의 특징이 공용 선이라는 것인데 이 특징덕분에 한 쪽이 데이터 선을 점령하면 다른 쪽에서는 신호 중첩을 유발 시킬수 있어서 사용을 하면 안된다. 이 점을 보완하기 위해 점대점 상호연결방식이 등장하였다.


QPI(Quick Path Interconnect)

다른 구성요소와 직접연결하는 점대점 상호방식중 하나로 레이어로 구성된 프로토콜 구조이므로 물리적으로 연결되어 있는 부분부터 오류의 존재 여부를 점검하는 등 각각의 레이어에서 하는 일을 구분되어 있다. 고속, 고효율의 패킷 기반의 전송방식을 사용하며 인텔의 i7 데스크톱 프로세서 이후로 사용되어지는 방식이다.


PCIe(Peripheral Component Interconnect Express)

버스를 1대 1로 연결해서 택시로 만들어 버렸다. 높은 용량덕분에 기가이더넷과 같은 빠른 데이터 속도의 I/O 디바이스를 지원하는데 사용되어지며 각각의 버스마다  독립적인 데이터 흐름을 제공하여 많이 사용되어진다. 또한 핀수가 적고 물리적 면적이 작으며 상세한 오류검출 및 보고구조 등의 장점을 가지고 있다.

최근엔 I/O 가상화도 지원한다.


 

,

1. Interrupt

집에서 열심히 라면을 끓이고 있다. (가난한 학생이니까 ㅠㅠ) 라면 물을 끓이고 스프를 넣고 면을 넣고 이제 대망의 계란을 넣을려고 냉장고로 갈려는 순간 갑자기 물이 끓어 넘칠려고 한다. 여러분의 아래의 두 개의 선택지 중에 어떤 것을 선택하겠습니까?


1. 나는 나의 길을 간다. 계란 꺼내고 불을 낮추러 간다.

2. 엄마한테 뒤지게 혼나기 싫다. 불부터 낮춘다. 


대다수의 사람들은 2번을 선택하였을 것이다. 엄마한테 뒤지게 혼나는건 둘째치고 잘못되서 화재라도 나면 살기 위해서 라면 하나 먹다가 인생 하직할순 있으니까..ㅜㅜ 



인터럽트의 개념은 방금 제시한 상황과 비슷하다. CPU가 열심히 프로그램을 수행하는 과정에서

예외나 I/O 장치등 우선순위가 높은 사건이 발생하면 하던 걸 잠시 멈추고 접수받은 내용을 처리하는 과정을 인터럽트라고 한다. 이 때 예외라고 한다면 오버플로우, 0으로 나누기 등등이며 I/O 장치는 하드 디스크, 키보드, 마우스 등등을 의미한다. 컴퓨터 구조 과목에서는 I/O 장치에 대하여 더욱 중점을 둔다.


2. I/O 장치

하드디스크와 같은 I/O 장치들은  프로세서와 직접 데이터를 교환할 수 있고 프로세서는 I/O 모듈에 대하여 쓰기 또는 읽기를 할 수 있다. 프로세서는 I/O들을 구별하기 위해 주소를 사용한다. 

인터럽트가 발생하게 되면 I/O 장비의 상태를 점검하고 준비가 되면 전송하게끔 하는데 인터럽트를 신속 정확하게 처리하고 멈춘 프로그램을 다시 수행해야 하는 CPU에게는 기나긴 시간 낭비이다. 따라서 CPU는 이러한 과정을 I/O 장치에게 시킨다. "그냥 니가 점검해"


I/O 장치가 또 CPU에게 부담을 주는 것은 I/O 장치의 많은 데이터이다.

이 데이터들이 직접 CPU를 거치게 된다면 I/O 인터럽트가 많이 발생해서 CPU는 다른 일은 할 수가 없다.

따라서 CPU의 효율적인 운영을 위해서 DMA(직접 메모리 접근) 기법을 사용한다. 이 방법에서는 I/O장치들이 메인 메모리에 직접 접근하여 입출력을 할 때 CPU에게 시작 인터럽트, 데이터를 Block단위로 쓰고 읽으며 작업이 끝난 후에 CPU에게 종료를 알리는 인터럽트만 보내주면서 CPU의 부담을 확 줄였다.

더나아가 입출력 과정에서 CPU의 부담을 최소로 하면서 병렬적으로 입출력과 연산과정이 동시에 진행할 방법이 필요해지면서 입출력 프로세서(I/O Processor)가 등장하였다. 




,

1. 등장 인물(아니 부품?)

   1) PC (Program Counter) : 다음 실행할 명령어의 주소를 저장

   2) 기억장치 주소 레지스터(MAR) : 다음에 읽거나 쓸 기억장소의 주소를 지정

   3) 기억장치 버퍼 레지스터(MBR) : 기억장치에 저장될 데이터 혹은 기억장치로 부터 읽은 데이터를 임시 저장

   4) 명령어 레지스터(IR) : 현재 수행중인 명령어 저장

   5) 산술 논리 장치(ALU) : 산술연산과 논리연산을 수행 


2. 명령어 패치(Fetch Cycle)

   1) PC에서 다음 수행할 명령어 주소를 MAR에 저장하고 PC에 저장된 주소는 +1


   2) MAR에 저장된 주소에 해당되는 값을 메모리에서 가져와 MBR에 저장

      이 때 메모리에서 받아온 값은 Data 또는 Opcode

  3) Opcode(명령어) 라면  IR에서 명령어를 Decode한다.

   4) 1)~2) 과정으로 Data(Operand)를 메모리로부터 읽어온 후 ALU에서 연산을 수행한다.(Excute Cycle)

       그리고 연산 결과는 MBR을 거쳐 메모리로 다시 저장한다



,