글
Technical Article/펌 2004. 11. 30. 16:11volatile 용도? (서버 유저 카운터)
작 성 자 用昇(dewy07) 첨부
파일
작성시각 2003-10-02 오후 1:02:06 조 회 수 297
글 분 류 VC++ 일반
http://www.kwak101.pe.kr/kwak101/main.html
---------------------------------------------------
*초기작성일 : 2003/03/22
*작성/저작: 곽용재(kwak101@hitel.net)
*최종수정일 : 2003/08/11
*수정에 도움 주신분:
- 강기현(testors@phantagram.com) 님
---------------------------------------------------
* volatile 이란?
말 그대로 따지면, "그 변수를 휘발성 메모리에 만들어라"라는 뜻입니다.
일반적으로 컴퓨터 분야에서 '휘발성(volatileness) 메모리'라고 하면, 전원을 끄면 데이터가 날아가는 메모리란 뜻을 의미합니다. 한데, 웃기죠? 우리가 사용하는 컴퓨터는 전원을 끄면 데이터가 모두 날아간단 말씀입니다. (물론 배터리 백업이 되는 S-RAM이나 반영구 저장이 가능한 플래쉬메모리 이야기는 제외합니다. 대부분 이들 메모리는 데이터 저장용으로만 쓰니까요.)
제가 10여년 전 C를 처음 공부하고 쓸 때, volatile이란 키워드는 register 키워드와 반대로 생각하라고 저는 배웠습니다. 즉, volatile로 선언한 변수는 절대로 레지스터 변수(register 키워드가 붙은 변수)로 만들어지지 않습니다.
그렇다면, 레지스터 변수에 대해 아셔야 겠죠? 레지스터 변수는 말 그대로 CPU가 사용하는 임시 저장용 고속 메모리인 레지스터를 저장 영역으로 사용하는 변수입니다. 요즘 나오는 컴파일러는 꽤 똑똑해서, 굳이 register라고 선언하지 않아도 빠른 데이터 교환이 필요한 코드에 사용되는 변수는 레지스터 변수로 바꿔줍니다.
예를 들어, 양변기 수온을 재는 센서(둔감한 센서)를 컴퓨터에 물리고, 이 센서가 측정한 값이 30도를 넘으면 누군가가 소변을 본다고 알려주고, 30도 아래이면 아무도 없음을 알려주는 코드를 작성한다고 합시다. 어떤 온도값을 담는 전역변수를 두고(뭐 간단하게 짜려고 하니까...^^) 메인 프로그램은 무한루프를 돌면서 어떤 온도값에 따라 적절한 메시지를 출력하고, 이차스레드는 역시 무한루프를 돌면서 끊임없이 이 센서의 측정값을 감시해서 온도값을 갱신합니다. (무지하게 비효율적인 코드이지만, 어쨌든...^^;)
// 메인 프로그램
...
double deg=20; // deg는 센서가 보내준 값
while(true)
{
if( deg>30)
messageOut("소변 봄");
else
messageOut("소변 안 봄");
}
...
// 이차 쓰레드
int monitorTemp()
{
while(true)
{
deg = getTemp(); // 온도 측정 후 온도값을 갱신함
}
...
}
이때 deg의 타입을 double로만 하면, 최적화에 목숨거는 컴파일러는 이렇게 바꾸기도 한답니다. 메인프로그램 부분이 어떻게 바뀌나 봐 주세요.
double deg=20; // deg는 센서가 보내주는 값
register_A__ = deg; // register_A__는 임의의 레지스터
while(true)
{
if( register_A__ >30)
messageOut("소변 봄");
else
messageOut("소변 안 봄");
}
...
메인프로그램만 보면, deg는 처음에 한번만 초기화되어서 계속 변경되지 않으므로 레지스터에 넣고 써도 된다는 억측을 부를 수 있습니다. 따라서 위와 같이 최적화 과정을 거칩니다.
이렇게 되면, 센서로 측정한 값이 30도의 경계를 들락거리든 센서가 망가지든 하등 상관없이 "소변 안 봄"만 출력됩니다.while 루프 안에서 20의 값을 가진 레지스터 변수만 사용된다는 것입니다. 이런 일이 생길지도 모르기 때문에 deg 변수를 volatile로 선언하는 것이죠. 쉽게 말해(약간 어폐가 있을지도 모르지만), volatile 타입은 어떤 값을 항상 감시하는 경우에 사용한다고 보면 됩니다. 인터럽트 핸들러나, 메모리맵 I/O, 아니면 다중스레드 프로그래밍, 기계 제어 등에 사용합니다.
단!
여기서 "이런 일이 생길지도 모르기 때문에"란 말에 집중하셔야 합니다. 컴파일러에 따라서는 이런 최적화가 일어나지 않을 수도 있기 때문입니다. 위에서 한 제 경험담처럼, 있으나 없으나 상관없이 잘 되는 경우도 있습니다. (register 키워드를 명시적으로 써주지 않으면 레지스터 변수로 만들지 않는 것이겠지요?)
출처 : 데브피아 VC++ 게시판
파일
작성시각 2003-10-02 오후 1:02:06 조 회 수 297
글 분 류 VC++ 일반
http://www.kwak101.pe.kr/kwak101/main.html
---------------------------------------------------
*초기작성일 : 2003/03/22
*작성/저작: 곽용재(kwak101@hitel.net)
*최종수정일 : 2003/08/11
*수정에 도움 주신분:
- 강기현(testors@phantagram.com) 님
---------------------------------------------------
* volatile 이란?
말 그대로 따지면, "그 변수를 휘발성 메모리에 만들어라"라는 뜻입니다.
일반적으로 컴퓨터 분야에서 '휘발성(volatileness) 메모리'라고 하면, 전원을 끄면 데이터가 날아가는 메모리란 뜻을 의미합니다. 한데, 웃기죠? 우리가 사용하는 컴퓨터는 전원을 끄면 데이터가 모두 날아간단 말씀입니다. (물론 배터리 백업이 되는 S-RAM이나 반영구 저장이 가능한 플래쉬메모리 이야기는 제외합니다. 대부분 이들 메모리는 데이터 저장용으로만 쓰니까요.)
제가 10여년 전 C를 처음 공부하고 쓸 때, volatile이란 키워드는 register 키워드와 반대로 생각하라고 저는 배웠습니다. 즉, volatile로 선언한 변수는 절대로 레지스터 변수(register 키워드가 붙은 변수)로 만들어지지 않습니다.
그렇다면, 레지스터 변수에 대해 아셔야 겠죠? 레지스터 변수는 말 그대로 CPU가 사용하는 임시 저장용 고속 메모리인 레지스터를 저장 영역으로 사용하는 변수입니다. 요즘 나오는 컴파일러는 꽤 똑똑해서, 굳이 register라고 선언하지 않아도 빠른 데이터 교환이 필요한 코드에 사용되는 변수는 레지스터 변수로 바꿔줍니다.
예를 들어, 양변기 수온을 재는 센서(둔감한 센서)를 컴퓨터에 물리고, 이 센서가 측정한 값이 30도를 넘으면 누군가가 소변을 본다고 알려주고, 30도 아래이면 아무도 없음을 알려주는 코드를 작성한다고 합시다. 어떤 온도값을 담는 전역변수를 두고(뭐 간단하게 짜려고 하니까...^^) 메인 프로그램은 무한루프를 돌면서 어떤 온도값에 따라 적절한 메시지를 출력하고, 이차스레드는 역시 무한루프를 돌면서 끊임없이 이 센서의 측정값을 감시해서 온도값을 갱신합니다. (무지하게 비효율적인 코드이지만, 어쨌든...^^;)
// 메인 프로그램
...
double deg=20; // deg는 센서가 보내준 값
while(true)
{
if( deg>30)
messageOut("소변 봄");
else
messageOut("소변 안 봄");
}
...
// 이차 쓰레드
int monitorTemp()
{
while(true)
{
deg = getTemp(); // 온도 측정 후 온도값을 갱신함
}
...
}
이때 deg의 타입을 double로만 하면, 최적화에 목숨거는 컴파일러는 이렇게 바꾸기도 한답니다. 메인프로그램 부분이 어떻게 바뀌나 봐 주세요.
double deg=20; // deg는 센서가 보내주는 값
register_A__ = deg; // register_A__는 임의의 레지스터
while(true)
{
if( register_A__ >30)
messageOut("소변 봄");
else
messageOut("소변 안 봄");
}
...
메인프로그램만 보면, deg는 처음에 한번만 초기화되어서 계속 변경되지 않으므로 레지스터에 넣고 써도 된다는 억측을 부를 수 있습니다. 따라서 위와 같이 최적화 과정을 거칩니다.
이렇게 되면, 센서로 측정한 값이 30도의 경계를 들락거리든 센서가 망가지든 하등 상관없이 "소변 안 봄"만 출력됩니다.while 루프 안에서 20의 값을 가진 레지스터 변수만 사용된다는 것입니다. 이런 일이 생길지도 모르기 때문에 deg 변수를 volatile로 선언하는 것이죠. 쉽게 말해(약간 어폐가 있을지도 모르지만), volatile 타입은 어떤 값을 항상 감시하는 경우에 사용한다고 보면 됩니다. 인터럽트 핸들러나, 메모리맵 I/O, 아니면 다중스레드 프로그래밍, 기계 제어 등에 사용합니다.
단!
여기서 "이런 일이 생길지도 모르기 때문에"란 말에 집중하셔야 합니다. 컴파일러에 따라서는 이런 최적화가 일어나지 않을 수도 있기 때문입니다. 위에서 한 제 경험담처럼, 있으나 없으나 상관없이 잘 되는 경우도 있습니다. (register 키워드를 명시적으로 써주지 않으면 레지스터 변수로 만들지 않는 것이겠지요?)
출처 : 데브피아 VC++ 게시판
RECENT COMMENT