×
Crocus
공부한 내용을 정리하는 블로그로 시작한
Crocus는 2014년 1월 14일 부터 시작하여
현재 월 6만명, 총 1,175,433명의 방문자 수를 기록하고 있습니다.
Donation
이제 많은 사용자들이 이용하는 만큼
더 다양한 서비스 개발/제공을 위해 후원금을 모금하고자 합니다.
후원을 해주시는 분들은 Donators 명단에 성명, 후원금을 기입해드리며
Crocus 블로그가 아닌 다른 곳에 정리해둔 저만의 내용을 공유해 드리고자 합니다.
Account
예금주 : 고관우
신한은행 : 110-334-866541
카카오뱅크 : 3333-01-7888060

👉 후원 페이지 바로가기 Donators
익명 : 5000원(Crocus응원합니다.)

아래 그림을 통해 컴퓨터 하드웨어 구성에 대해 그림으로 알아보자.



이처럼 컴퓨터 하드웨어는 크게 프로세서, 메모리(기억장치), 주변장치로 구성되며 서로 시스템 버스로 연결된다.




시스템 버스


시스템 버스는 하드웨어를 물리적으로 연결하여 서로 데이터를 주고받을 수 있게하는 통로 역할을 한다.

이때 버스는 데이터 버스, 주소 버스, 제어 버스로 나뉜다.


데이터 버스 :: 프로세서와 메인 메모리 그리고 주변 장치들 사이에서 데이터를 전송할 때 쓰인다.

이때 버스는 데이터를 주고받아야 하므로 양방향이다.


주소 버스 ::  프로세서에서 메모리의 주소를 지정할 때, 그 주소가 어디인지에 대한 정보를 보내는 버스이다. 

즉, 프로세서에서 01110011이라는 위치에 데이터를 보내려면 데이터 뿐만 아니라 데이터의 목적지인 01110011도 버스를 통해 보내는데 이를 주소 버스를 통해 보낸다. 결국 프로세서가 주소를 지정하면서 보내는 버스이다.

이 버스는 주소를 보내면 되니 단방향이다.


제어 버스 :: 프로세서가 메모리나 I/O에 제어 신호를 전송하거나 반대로 프로세서에 동작을 지시할 수 있다. 그러므로 이는 단방향일수도 양방향일수도 있다.



위의 회로가 모두 버스이다.



프로세서


CPU(Central Processing Unit)라고 알고있는 프로세서는 컴퓨터 하드웨어에 장착된 모든 장치의 동작을 제어하고 하드웨어에 명령을 실행한다.


아래 그림과 같이 프로세서는 연산장치, 제어장치, 레지스터로 구성되고 이 장치들은 내부 버스로 서로 연결된다.

(이때 프로세서는 CPU임을 알고 있어야 한다.)


Registers :: 레지스터

Control Unit :: 제어장치

Combinational Logic :: 연산장치


이때 레지스터와 연산장치 부분데이터 부분에 속하고

제어장치제어 부분에 속한다.


검정색 선은 데이터 흐름을 표현하고, 빨간색 선 부분은 제어 흐름을 표현한다.


(이때 사실상 CPU가 Processor과 엄연히 다르다는 것도 보고 넘어가면 좋을 듯 하다. 

하지만 요즘은 프로세서 = CPU라 칭하기에 이 글에서는 CPU == 프로세서라고 말하려 한다.)



레지스터


프로세서 내부에 레지스터들이 존재하고 레지스터는 가시 레지스터와 불가시 레지스터로 구분 할 수 있다.


이때 가시 레지스터는  사용자가 운영체제와 애플리케이션을 통해 정보를 변경 할 수 있는 레지스터이다.


불가시 레지스터는 사용자가 정보를 변경 할 수 없고 오직 내부에서만 다루는 레지스터이다.


아래 표를 통해 확인해보자.


사용자 가시 레지스터

종류 

설명 

데이터 레지스터(Data Register, DR) 

함수 연산에 필요한 데이터를 저장하여 산술, 논리 연산에 사용 

주소 레지스터(Address Register, AR) 

주소를 계산하는데 필요한 주소의 일부분을 저장.


기준 주소 레지스터 : 프로그램을 실행할 때 사용하는 기준 주소 값을 저장. 관련된 정보들을 연속된 저장 공간으로 지정한다.

인덱스 레지스터 : 유효 주소를 계산하는데 필요한 주소 정보 저장

스택 포인터 레지스터 : 메모리에 프로세서 스택을 구현하여 현재 스택 위치를 사용하는데 이용


사용자 불가시 레지스터

종류

설명 

프로그램 카운터(PC) 

다음 실행할 코드 위치를 저장하는 레지스터이다. 

명령어 레지스터(IR) 

현재 실행하는 명령어를 보관하는 레지스터이다. 

누산기(AC) 

데이터를 일시적으로 저장하는 레지스터이다. 

메모리 주소 레지스터(MAR) 

유효 번지를 상대적으로 계산할 때 사용한다.

메모리 버퍼 레지스터(MBR) 

주기억 장치에서 연산에 필요한 자료를 호출하여 저장한다.






메모리


메모리 계층 구조는 아래와 같다.




최상위에는 속도가 가장 빠른 레지스터가 있고 이는 CPU에 장착되어있다.


프로그램을 실행하거나 데이터를 참조하기 위해서는 모든 것이 메인 메모리에 있어야 하는데 

이때 불필요한 프로그램이지만 저장되어야 할 것들은 보조 기억장치에 저장되고 당장 실행되어야 할 것들을 메인 메모리로 옮긴다.


현실적으로 모든 것을 다 레지스터로 하기에는 가격이 너무 비싸니 서로 다른 메모리를 적재적소에 이용하여 시스템 성능 향상을 시켜야한다.


이때 메인 메모리와 프로세서의 속도 차이를 보완하기 위해 캐시라는 것이 존재한다.


위의 메인 메모리는 프로세서에서 현재 실행중인 프로그램의 데이터를 저장하거나 프로세서에서 처리한 결과를 저장하는데 이용한다.


이는 DRAM을 많이 사용하고 주기억장치 혹은 1차 기억장치라고 말한다.


이때 메인 메모리는 수많은 셀로 구성되는데 이때 셀은 비트로 구성된다.


즉, 셀이 K비트이면 셀에는 2^K(0혹은 1이 저장될 수 있으니)값을 저장 할 수 있고 주소 범위는 0~(2^K)-1이 된다.



메모리 매핑


앞서 말했듯이 주소 범위는 셀의 개수에 따라 0~(2^k) -1가 되는데 이때 이 주소는 물리적 주소가 된다.


하지만 프로그래머는 물리적 주소 대신 변수, 함수를 이용하고 이 내용을 컴파일러가 기계어로 변환 할 때 변수와 명령어에 주소를 할당하게 된다. 이때 주소는 가상 주소(논리 주소, 프로그램 주소)라고 하며 이 논리 주소는 매모리 매핑을 통해 실제 주소와 연결된다.


이때 메인 메모리의 실제 주소 크기는 프로그램의 크기에 따라 부족할 수 있는데 가상 메모리를 이용하여 메인 메모리의 사용 범위를 늘릴 수 있다.





메모리 접근/사이클 시간



메모리 속도메모리 접근시간메모리 사이클 시간으로 나타낸다.


메모리 접근시간 :: 명령을 통해 목표 주소를 검색하여 데이터를 읽기/쓰기를 시작할 때 까지 걸린시간이다.

예를들면 쓰기 제어 신호를 통해 데이터를 메모리 버퍼 레지스터에 저장 할 때 까지 걸린시간이다.


메모리 사이클 시간 :: 연속적인 메모리 동작 사이에 필요한 최소 지연시간이다.
위의 그림을 보면 메모리 접근 시간이 메모리 사이클 시간보다 짧다. 즉, 메모리 사이클시간은 메모리 접근시간 + 준비시간이다.



캐시


메인 메모리는 프로세서와 보조기억장치 사이에 존재하고 이때 둘 사이의 속도 향상을 위해 관여한다.


이때 프로세서와 메인 메모리간에도 속도 향상을 위해 관여하는 것이 존재하는데 그것은 캐시이다.



프로세서 <-> 캐시 <-> 메인 메모리 <-> 보조기억장치 및 주변장치






이때 캐시는 보통 프로세서 내부에 존재하고(외부에 있기도 하다) 속도가 빠른 프로세서와 상대적으로 느린 메인메모리 사이의 속도를 보완하고자 하는 고속 버퍼이다.


이때 캐시는 메인 메모리에서 데이터를 블록 단위로 가져와서 프로세서에 워드 단위로 전달하여 속도를 높인다.



캐시의 동작 원리


프로세서에서 필요한 데이터를 메인 메모리에서 찾기 전에 캐시에 해당 주소의 자료가 있는지 먼저 검색한다.


이때 해당하는 주소의 비트 24비트 중 22비트를 우선 캐시의 모든 라인과 비교하여 일치하는 라인들을 찾는다.


즉, 찾으려는 비트가 1010 1111 0000 1100 0001 0110일때 1010 1111 0000 1100 0001 01를 먼저 검색하고

존재한다면 00, 01, 10, 11을 검색하여 일치하면 가져오게 된다.


캐시의 성능은 프로세서가 참조할 주소 자료가 얼마나 들어있냐로 좌우되고

이때 프로세서가 찾으려는 주소의 자료가 캐시에 많이 존재한다면 캐시 히트율이 높다고 한다.



지역성 


캐시가 효율적으로 동작하려면, 캐시에 저장할 데이터가 지역성을 가져야 한다. 

지역성이란 데이터 접근이 시간적, 혹은 공간적으로 가깝게 일어나는 것을 의미한다. 


시간적 지역성 

특정 데이터가 한번 접근되었을 경우, 가까운 미래에 또 한번 데이터에 접근할 가능성이 높은 것을 시간적 지역성이라고 한다. 

메모리 상의 같은 주소에 여러 차례 읽기 쓰기를 수행할 경우 상대적으로 작은 크기의 캐시를 사용해도 효율성을 꾀할 수 있다. 


공간적 지역성 

특정 데이터와 가까운 주소가 순서대로 접근되었을 경우를 공간적 지역성이라고 한다. 

CPU 캐시나 디스크 캐시의 경우 한 메모리 주소에 접근할 때 그 주소뿐 아니라 해당 블록을 전부 캐시에 가져오게 된다. 

이때 메모리 주소를 오름차순이나 내림차순으로 접근한다면, 캐시에 이미 저장된 같은 블록의 데이터를 접근하게 되므로 캐시의 효율성이 크게 향상된다.