본문 바로가기

윈도우즈 시스템 프로그래밍

컴퓨터 구조 - 4

* 메모리의 범위와 종류


- 메인 메모리 : D램( D - RAM )계열의 메모리이다. 


참고로 메인 메모리가 반드시 램이어야 할 이유는 없다.


- 레지스터 : CPU 안에 내장되어 있어서 연산을 위한 저장소를 제공한다.


- 캐쉬 : S램 ( S -RAM )으로 구성된다.

캐쉬는 CPU와 램 사이에서 중간 저장소 역할을 하는 메모리이다. 캐쉬 메모리는 원래 CPU의 일부로 존재하는 메모리 개념이 아니다. CPU에 근접해 있는 메모리 개념이다. CPU의 일부로 존재하는 메모리는 레지스터이다.




- 하드디스크와 이외의 저장 장치들


하드디스크는 크고 작은 파일들을 저장하기 위한 용도로도 사용되지만, 프로그램 실행에 있어서도 중요한 의미를 지닌다. 그밖에 SD 카드, CD - ROM과 같은 I/O(Input/Output)장치들도 메모리에 해당한다.


* 메모리 계층 구조


- 프로그램이 실행되는 동안에 메모리가 하는 역할은 데이터의 입력 및 출력이다. 따라서 기본적인 역할은 모든 메모리가 동일하다. 그러나 차이점이 있다. 가장 큰 차이점은 CPU를 기준으로 얼마나 멀리 떨어져 있는냐이다. 

레지스터는 CPU에 가깝다 못해 CPU 안에 존재하는 메모리이다.

그 다음으로 가까이 있는 것은 캐쉬 메모리이고, 그 다음은 메인 메모리이다.

가장 멀리 있는 것은 하드디스크이다.


CPU와 가까이에 있을수록 빠르고 , 멀리 있을수록 속도가 느리다.


※ 메인 메모리를 제외한 L1 캐쉬와 L2 캐쉬에, 연산에 필요한 데이터가 존재할 확률이 90%이상 된다고 한다.


※ L1 캐쉬는 CPU 내부가 아니라 시스템 보드에 존재하는 메모리였다. 이것이 성능 향사을 위해 CPU 내부로 들어가게 된 것이다. 그리고 CPU외부에 또 다른 캐쉬가 등장하였다. 이게 L2이다.


(자세한 것은 윈도우즈 시스템 프로그래밍 책 506~509)


* 컴퓨터 프로그램의 일반적인 특성


- 템퍼럴 로컬리티 : 프로그램 실행 시 한번 접근이 이뤄진 주소의 메모리 영역은 자주 접근하게 된다는 프로그램 특성을 표현할 때 사용하는 말이다.


- 스페이셜 로컬리티 : 프로그램 실행 시 접근하는 메모리 영역은 이미 접근이 이루어진 영역의 근처일 확률이 높다는 프로그램 성격을 표현할 때 사용하는 말이다.


- 캐쉬 프렌드리 코드 (Cache Friendly Code) = 템퍼럴 로컬리티 + 스페이셜 로컬리티


* 캐쉬 알고리즘


- L1 캐슁에 해당 데이터가 존재할 경우 이를 캐쉬 힛(Cache Hit)이 발생했다고 한다. 반대인 경우는 캐쉬 미스 ( Cache Miss)가 발생했다고 한다.


-여기서 데이터의 이동은 블록 단위로 진행이 된다.

ex)  레지스터로 이동해야 되는 데이터의 주소 번지가 0x1000번지였는데 이 데이터가 L1캐쉬에 존재하지 않았다면, 그리고 L2 캐쉬에 존재하고 있다면, L2 캐쉬에서 L1캐쉬로 이동하는 데이터의 단위는 0x1000번지의 데이터를 포함하는 하나의 블록이 된다. 단순히 필요한 데이터만 보내는 것이 아니라, 블록 단위로 전송을 해서 스페이셜 로컬리티의 특성을 성능 향상에 활용하게 된다.


- 중요한 사실 한 가지가 더 있다. 메모리의 피라미드 구조상 아래로 내려갈수록 블록 크기는 커지게 된다. 이는 아래에 존재하는 메모리일수록 접근 횟수를 줄이는 효과를 가져다 준다.


- 블록 교체 알고리즘은 캐쉬 교체 정책에 따라서 달라질 수 있는데 , 대학의 운영체제 수업에서 가장 보편적으로 거론되는 것이 LRU (Least - Recently Used) 알고리즘이다. 단어의 의미대로 가장 오래 전에 참조된 블록을 밀어내는 알고리즘이다.



* 물리 주소 ( Physical Address)


- 실제 물리적인 메인 메모리의 주소 범위에 해당하며, 이렇게 주소를 할당하는 것을 가리켜 물리적 주소 지정이라 한다.


※ 임베디드 시스템과 범용 시스템의 가장 큰 차이점은 하드디스크의 존재 유무이다. 범용 시스템은 하드디스크가 존재하는 반면 임베디드 시스템은 하드디스크가 없다. 임베디드 시스템은 하드 디스크가 없는 문제점을 극복하기 위해 플래시 메모리를 쓴다. 


* 가상 주소 시스템


- 가상의 주소를 지정하는 것을 가리켜 가상 주소 지정이라 하며, 가상 주소 지정을 통해서 할당받게 되는 4G바이트를 가리켜 가상 메모리 공간이라 한다.


- 메인 메모리의 역할을 하드디스크라 해서 못하라는 법은 없다. 그저 많이 느릴뿐이다.


1) 선 할당으로 인한 부담

- 프로세스를 생성할 때마다 4G바이트씩 하드디스크 할당해 줄 것인가? 아주 조그마한 Hello World - 프로그램을 실행시킬 때에도 할당해 줄 것인가? 실제로 사용하는 메모리 공간은 1M바이트도 안되니 미리 할당하는 것은 메모리 낭비도 심하고 시간도 엄청 낭비된다.


2) 느린 속도의 개선 필요성


- 가상 메모리 시스템을 구현하는 방법은 표준으로 정해져 있지 않다. 그러나 대부분의 시스템에서 페이징이라는 기법을 사용한다.


ex)  가정 1) 16비트 시스템, 따라서 0부터 64K-1까지 주소 지정 가능

  가정 2) 프로세스별로 64K바이트 메모리 할당, 물론 가상 메모리 할당이다.

  가정 3) 메인 메모리 16K바이트, 즉 램 용량이 16K바이트



여기서 문제점은 실제 메모리는 16K바이트가 전부인데, 프로세스를 생성할 때마다 64K바이트를 할당하고자 하니 문제가 아닐 수 없다. 특히 16K번지 이상의 메모리는 접근조차 불가능하다. 최대 할당 가능한 메모리 번지는 16K-1번지이다.


이러한 문제를 해결해 줄 녀석은 MMU(Memory Management Unit)이라는 놈이다. MMU는 16K바이트밖에 존재하지 않는 메모리를 64K바이트가 존재하는 것처럼 CPU가 느끼도록 컨트롤하는 역할을 한다.(물론 32비트 시스템에서는 4G바이트의 메모리가 존재하는 것처럼 느끼게 한다.) 실제로 MMU는 CPU와 함께 하나로 패키징(Packaging)되는 장치이다. 


여기서 MMU는 가상의 메모리를 4K바이트로 쪼개고 필요한 주소만 물리 메모리가 사용하도록 도와준다. 이때 조깨진 블록을 하드웨어 입장에서는 페이지 프레임이라 하고, 소프트웨어 입장에서는 페이지라 한다. 즉, 페이지 프레임은 실제 메인 메모리 블록을 의미하고, 페이지는 가상 메모리 블록을 의미한다.


※ 페이지 테이블은 페이지의 프레임의 시작 번지가 저장되어 있는 곳이다.


그런데 아직도 문제가 남아있다. 만약 물리 메모리가 다 할당되어 버리면 어떻게 해야 되는 것인가?

=> 해결방법은 하드디스크에 있다.

앞에서도 언급했지만 하드디스크도 램과 비교해서 속도를 제외하면 그 기능에 있어서 조금도 부족함이 없는 메모리이다. 이러한 하드디스크를 메인 메모리로 확장해서 문제를 해결할 수 있다. 바로 스왑 파일(Swap File)이라는 개념을 도입해서 램에 해당하는 메인 메모리를 하드디스크로까지 확장한 것이다.

하드디스크는 스왑 파일을 통해서 메인 메모리를 보조해 주는 것이지, 램과 동일한 성격의 메인 메모리 역할을 하는 것은 아니다. 또 램과 하드디스크 사이의 데이터 이동 기본 단위는 페이지 프레임 크기와 동일하다는 점도 주목해야 한다.


(자세한 것은 윈도우즈 시스템 프로그래밍 516~526)






'윈도우즈 시스템 프로그래밍' 카테고리의 다른 글

컴퓨터 구조 - 3  (0) 2016.08.08
컴퓨터 구조 -2  (1) 2016.08.08
컴퓨터 구조 - 1  (1) 2016.08.07