본문 바로가기
프로그래밍 언어

volatile & Cache

by 청운추월 2023. 7. 13.
반응형

Volatile

Microprocessor의 출력은 메모리상의 출력번지에 값을 쓰게 되면 그 값이 출력핀으로 나오게 됩니다.
메모리와 출력핀이 같이 연결되어 있다고 해서 Memory Mapped I/O라고 부르게 됩니다.
다시말해 출력은 메모리에 값을 쓰는것이다라고 할 수 있겠네요
(PC의 경우는 Isolated I/O 방식을 사용합니다.)

컴파일러는  프로그램을 해석해서 기계어로 변환하는 프로그램입니다. 
같은기능을 여러가지 방법으로 구현할 수 있습니다.
사람이 구현하다 보니 필요없는 기능을 넣는경우도 있고
컴파일러 입장에선 더 효율적인 방법을 찾게 됩니다. 이걸  옵티마이즈(Optimize)라고 합니다.

void outp(출력번지,mask,A);  //메모리에 쓰기함수

A=0;
outp(출력번지,mask,A);
A=1;
outp(출력번지,mask,A);

위의 코드에서 메모리(출력번지)에다 0을 집어넣고 다시 메모리에 1을 집어넣습니다.
결국은 메모리에 1을 집어넣을 거면서 왜 0을 집어넣는가 라고 컴파일러는 고민을 하게 됩니다.
컴파일러는 효율적으로 동작하기 위해 메모리에 0을 집어넣는 코드를 삭제해버립니다.

 

반응형


개발자의 의도는 0 다음 1을 출력하길 원하는데 컴파일러는 최적화를 위해
개발자의 의도와 다르게 동작하는것이죠

volatile void outp(출력번지,mask,A);  //메모리에 쓰기함수

따라서 volatile이라고 선언하게 되면 컴파일시 Optimize를 하지말고 그대로 출력하도록 코드를 만들게 됩니다. 

빠른 CPU가 상대적으로 느린 메모리에 접근을 하다보니 CPU가 메모리에 맞추어 늦게 동작을 하게 됩니다.
이런이유로 속도가 빠른 Cache를 CPU와 메모리 사이에 두어서 속도를 개선하게 됩니다.
CPU가 Cache에 Data를 쓰게 되면 나중에 메모리에 저장을 하게 되지요
이런이유로  출력번지에 Cache기능을 사용하게 되면 CPU에서 출력을 해도 Cache에 저장되어 있어
출력(메모리)으로 나오지 못하는 문제가 발생하게 됩니다.
따라서 I/O Port의 경우 Cache 기능을 사용하지 않습니다.

반응형