volatile 은무엇을 말하는지요?

익명 사용자의 이미지

코드중에..
volatile a;
것을 보았는데
어떤 용도인지요?

익명 사용자의 이미지

뉴스그룹에서 검색한 volatile 키워드관한 글입니다.

글쓴이Jaeho Kang (onuri__at__kornet.net)
제목Re register와 volatile 키워드
뉴스그룹han.comp.lang.c
날짜2000/04/07

volatile의 경우 어떤 의미에서는 앞에서 설명한 컴파일러의 최적화와 관
계있습니다. 그 외에도 CPU 내, 외부의 캐쉬와 갈은 하드웨어적인 최적화
와도 관계가 있습니다.

volatile 키워드가 가장 많이 사용되는 경우의 하나가 memory-mapped I/O
인 경우입니다. 메모리의 특정 영역을 특정 장치와 연결하여 사용하는 방
법입니다. 가장 흔한 예가 비디오 메모리가 되겠고, 그 이외에도 많은 장
치들을 이러한 식으로 사용될 수 있습니다.

즉, 자신 엄밀하게 말한다면 컴파일러가 컴파일하고 있는 코드의 상황과
는 관계 없이 바뀔 수 있는 메모리 변수가 있다면, 해당 변수에 대해 특별
한 최적화를 하지 못하도록 컴파일러를 제약하는 키워드가 volatile입니
다.

예를 들어, 0x0C000000 번지에 특별한 장치가 있다고 하겠습니다. 이 장치
가 일종의 센서라고 하고 입력되는 센서값의 범위에 따라 다른 동작을 수
행하게 프로그래밍을 아래와 같이 하였다고 하면,

int *p = 0x0C000000;
while (1) {
if (*p == 0) {
break;
} else if (*p < lower_limit) {
action 1;
} else if (*p < upper_limit) {
action 2;
}
wait 10 mili-seconds
}
똑똑한 컴파일러는 위의 코드를 아래와 아래와 같이 바꿉니다.

int *p = 0x0C000000;
register int pvar = *p;
if (pvar == 0) {
} else if (pvar < lower_limit) {
while (1) {
action 1;
wait 10 mili-seconds;
}
} else if (pvar < upper_limit) {
while (1) {
action 2;
wait 10 mili-seconds;
}
}
위와 같이 코드가 변형된다면, 프로그래머가 의도한 바와는 다른 결과가
나타나게 됩니다. 이러한 최적화를 억제하는 목적으로 volatile을 사용합
니다. 컴파일러는 volatile 키워드가 선언된 변수에 대해서는 무조건 메모
리에 접근하여 됩니다. 이러한 memory-mapped I/O 이외에도, 쓰레드 등으
로 프로그램을 만들어서 공유변수를 한쪽에서 읽고, 한쪽에서 쓰는 경우
도 해당될 수 있으며, 시스템 시간과 같이 특정 위치의 변수값이 자신과
는 독립적으로 계속 변하는 경우에도 사용할 수 있습니다.

또는 CPU 내 외부의 캐쉬에 의해서도 이러한 최적화 효과가 나타날 수 있
습니다. 캐쉬내에 해당 메모리 번지 값이 저장되어 읽을 때마다 같은 값
이 읽히고, 또한 적을 때도 실제 메모리에 저장되지 않고 캐쉬에 임시 보
관될 수 있습니다. 다른 경우는 잘 모르겠지만 MIPS의 R 시리즈 CPU에서
는 (아마 2000 인가 3000 시리즈로 기억됩니다) 메모리를 두가지 방법으
로 접근할 수 있습니다. 메모리 주소의 최상위 비트가 0이면 캐쉬를 거친
일반적인 접근을, 최상위 비트가 1이면 똑같은 주소의 메모리를 캐쉬를 거
치지 않고 직접 접근할 수 있습니다. 당연히 이런 컴퓨터의 컴파일러에서
volatile로 선언하면 0C000000이 아니라 8C000000의 메모리를 접근하게 됩
니다.

register와 volatile 키워드의 역할을? (2000/4/7)
http//ai.ce.pusan.ac.kr/~jhkang/c/tips.html

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <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].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.