kernel source를 보면 volatile이란 게 눈에 띄는 데
"unsigned long volatile" 또는 "volatile unsigned long" 처럼
data type의 앞 또는 뒤에 붙어 변수 선언에 사용되는 것 같습니다.
이 volatile은 어떤 역할을 하는 것입니까?
volatile은 그 변수에 대해서 최적화하지 말란 뜻입니다..
예를 들면,
unsigned long a=1; main() { while(a); }
이런코드를 -O2옵션을 줘서 gcc로 컴파일 하면..
a의 값을 어떤 레지스터에 복사한후 while문을 반복할때..
그 레지스터 값으로만 참,거짓을 판단합니다..
만약에 while문 동안에 저 a라는 변수가 다른 쓰레드에 의해서 0으로 바뀌 어져도..
이미 레지스터에 로드된 값만으로 판단을 하므로 무조건 무한루프가 되겠 죠...
이런걸 방지하기 위해서 volatile을 붙여줍니다..
volatile을 쓰면 a라는 변수가 참조될때마다 직접 그 변수가 실제로
위치해 있는 메모리상의 주소에서 값을 가져오죠..
참고로 spinlock같은 경우에 volatile이 많이 쓰이죠..
최성익 wrote.. kernel source를 보면 volatile이란 게 눈에 띄는 데 "unsigned long volatile" 또는 "volatile unsigned long" 처럼 data type의 앞 또는 뒤에 붙어 변수 선언에 사용되는 것 같습니다. 이 volatile은 어떤 역할을 하는 것입니까?
텍스트 포맷에 대한 자세한 정보
<code>
<blockcode>
<apache>
<applescript>
<autoconf>
<awk>
<bash>
<c>
<cpp>
<css>
<diff>
<drupal5>
<drupal6>
<gdb>
<html>
<html5>
<java>
<javascript>
<ldif>
<lua>
<make>
<mysql>
<perl>
<perl6>
<php>
<pgsql>
<proftpd>
<python>
<reg>
<spec>
<ruby>
<foo>
[foo]
Re: [질문]volatile
volatile은 그 변수에 대해서 최적화하지 말란 뜻입니다..
예를 들면,
unsigned long a=1;
main()
{
while(a);
}
이런코드를 -O2옵션을 줘서 gcc로 컴파일 하면..
a의 값을 어떤 레지스터에 복사한후 while문을 반복할때..
그 레지스터 값으로만 참,거짓을 판단합니다..
만약에 while문 동안에 저 a라는 변수가 다른 쓰레드에 의해서 0으로 바뀌
어져도..
이미 레지스터에 로드된 값만으로 판단을 하므로 무조건 무한루프가 되겠
죠...
이런걸 방지하기 위해서 volatile을 붙여줍니다..
volatile을 쓰면 a라는 변수가 참조될때마다 직접 그 변수가 실제로
위치해 있는 메모리상의 주소에서 값을 가져오죠..
참고로 spinlock같은 경우에 volatile이 많이 쓰이죠..
최성익 wrote..
kernel source를 보면 volatile이란 게 눈에 띄는 데
"unsigned long volatile" 또는 "volatile unsigned long" 처럼
data type의 앞 또는 뒤에 붙어 변수 선언에 사용되는 것 같습니다.
이 volatile은 어떤 역할을 하는 것입니까?
댓글 달기