임베디드 레시피

Egloos | Log-in





캐시메모리(Cache Memory)가 뭐죠?

 
뭘 알아야 이해를 하지!
인터넷으로 웹 서핑을 하다보면 자주 방문하는 곳이 누구에게나 있을 거예요. 저는 축구를 무척 좋아해서 축구에 관련된 UCC나 신문기사를 읽을 때 매우 자주 가는 그곳이 있답니다. 이처럼 자주 방문하는 곳은 즐겨 찾기에 등록을 해 놓으시면 다음날 다시 웹 검색해서 새로 찾거나 웹 주소를 적지 않아도 쉽게 갈수가 있어요. 왜 갑자기 이런 이야기를 했을까요? 네 바로 캐시메모리(Cache Memory)를 설명 드리기 위해서랍니다.
시피유는 임베디드 시스템을 구동시키는 메인 프로그램을 에스디램에서 읽어와서 실행하는 것보다 시피유 내부에 있는 캐시 메모리에서 읽어와서 실행 한다면 더 빠른 동작을 할 수 겠죠?  마치 즐겨 찾기에 등록해서 빨리 웹사이트로 찾아서 내가 보고 싶은 기사를 보듯이 시피유 입장에서 자주 사용되는 인스트럭션(코드)이나 데이타를 캐시메모리에 두고 사용하는 것이지요.
방금 설명 드린 것처럼 캐시 메모리는 두 가지로 구별 되요. 인스트럭션 캐시 메모리와 데이타 캐시 메모리랍니다. 이 캐시 메모리는 용량이 작으며, 매우 비싸답니다. 

먼저 인스트럭션 캐시 메모리에 대해 알아 보아요.
인스트럭션 캐시 메모리는 메인 프로그램에 해당되는 실행코드를 저장하는 공간이죠. 일반적으로 시피유는 에스디램에서 실행 코드를 읽어와서 실행을 하지요. 이때 자주 실행되는 실행코드가 있다면 개발자가 프로그램 할 때 특정 영역을 인스트럭션 캐시 메모리를 사용한다고 정의만 해 준다면 그 영역에 있는 실행코드는 인스트럭션 캐시 메모리에 올라가게 된답니다. 하지만 캐시 메모리가 용량이 작아서 에스디램에 있는 실행코드를 모두 저장할 수 없기 때문에 일부분만 올리게 되는데, 그러다 보니 캐시 메모리에는 실행코드가 자주 바뀌게 된답니다. 시피유 입장에서는 캐시 메모리에 실행하고자 하는 실행코드가 있다면 '히트', 없다면 '미스' 됐다고 판단하게 되지요. 미스가 나게 되면 다시 에스디램으로 실행코드를 읽어 들이고 다시 캐시 메모리에 올리게 된답니다.
 


 다음으로 데이타 캐시 메모리는 데이타를 읽거나 저장할 때 사용하는 캐시죠. 인스트럭션 캐시 메모리와 마찬가지로 메모리를 올렸다 내렸다 하고 히트, 미스 모두 같은 방식으로 동작합니다. 그럼 인스트럭션 캐시메모리와 다르게 동작하는 뭔가가 있지 않을까요?
시피유는 데이타 캐시 메모리에 읽거나 저장할 때 두 가지 방식으로 동작이 되는데, 바로 라이트 쓰루(Write through)와 라이트백(Write Back)입니다. 라이트 쓰루는 시피유가 캐시 메모리와 에스디램을 동시에 저장하는 방식이고, 라이트 백은 캐시 메모리에 우선 저장을 하고 에스디램은 나중에 저장하는 방식입니다.  조금 더 자세히 설명하자면, 데이타 캐시 메모리와 에스디램 사이에 라이트 버퍼가 있어서 데이타 캐시메모리에 있는 데이타를 우선 라이트 버퍼에 쓰고 라이트 버퍼가 모두 차고 나면 에스디램에 저장하는 방식입니다.
 개발자가 캐시 메모리를 사용했을 때와 하지 않았을 때 프로그램 실행 속도는 얼마나 차이가 날까요?
하드웨어 디버기로 분석을 해 봤습니다.
시피유에 따라 다소 차이가 있겠지만 암9으로 비교 테스트한 내용을 알려 드릴께요. 보다 정확한 시간을 측정하기 위하여 리얼타임 측정이 가능한 하드웨어 디버거 툴을 사용해서 테스트를 했습니다. 
 

___addr/line__|source
              |
              | void func2d(void)
            44|{
              |        auto short autovar;     /* short stack variable */
              |        register short regvar;  /* short register variable */
              |
            48|        autovar = regvar  ;
            49|                autovar++;
              |
            51|        for ( regvar = 0; regvar < 52 ; regvar++ )
            52|                vlong += regvar*autovar;
            53|}
               


                   <인스트럭션 캐시 사용의 경우>
사용안함         105.862us
사용함              22.950us
 
** 약 5배 정도 차이가 나는 것을 확인 할 수가 있네요.

by 히언 | 2010/03/15 21:57 | SOTO Story | 트랙백 | 핑백(1) | 덧글(12)

Linked at 친절한 임베디드 시스템 개발자.. at 2010/03/15 22:20

... nbsp; 201 코프로세서가 하는 일이 뭐죠? 202 캐시메모리(Cache Memory)가 뭐죠? 203 노어플래시(NOR Flash)가 뭐죠? 204 낸드 ... more

Commented by 히언 at 2010/03/15 22:38
캐시를 켜는 방법 끄는 방법을 알려주셔야죠~ 으하하~
Commented by soto at 2010/03/15 22:41
3장에서 소개할 예정입니다.
기대하셔도 좋습니다. ^^
Commented by 임종희 at 2010/03/16 21:42
선배님!! 캐시메모리에 대한 기본적인 작동원리에 대해서는 잘 알았습니다. 하지만 밑에 인스트럭션 캐시를
사용 시 처리하는 시간 말고 또 다른 장점이나 단점이 있는지 궁금합니다.
Commented by soto at 2010/03/16 22:41
캐시는 말 그대로 보다 빨리 처리하기 위해서 사용을 해요.
단점은 캐시 메모리가 크지 않기 때문에 미스률이 많이 발생하지 않게 해야 합니다.
미스률이 많을 수록 오히려 속도 저하를 가져 옵니다.
Commented by 김홍빈 at 2010/03/16 22:21
3장 빨리 나왔으면 좋겠습니다 기대 하고 기다리겠습니다 선배님
Commented by soto at 2010/03/16 22:40
네...감사합니다.
Commented by wndi at 2010/03/25 22:26
잘 보고 있습니다.
역시나 다음 장이 기대되네요.
Commented by soto at 2010/03/27 05:36
네. 감사합니다.
Commented by guswn at 2010/03/31 01:28
이 장은 약간 짧은 감이 있네요.
다음 장이랑 합쳐서 해도 되지 않을까요?
Commented by soto at 2010/04/03 06:02
아..그런가요? 생각해 보겠습니다. ㅋㅋ
Commented by khan at 2010/03/31 01:38
역시 빠르군요...
Commented by soto at 2010/04/03 06:04
캐시 사이즈가 에스디램처럼 크면 얼마나 좋을까요? ㅋㅋ
※ 이 포스트는 더 이상 덧글을 남길 수 없습니다.

◀ 이전 페이지          다음 페이지 ▶