volatile 에 관해서

UnShit의 이미지

수업시간에 volatile 에 관해서 잠시 언급했었는데 교수님께서
volatile 은 프로그램종료가 되어도 거기 저장되어있는 값이 그래도
남는다고 하셨습니다. 그래서 프로그램이 몇번 실행되었는지 체크할때도
volatile 을 쓴다고 하셨는데
아마도 너무 간단하게 설명하느라 이런식의 설명이 되어진것 같습니다.

여기서 검색을 해보니까 그런개념이 아닌것 같습니다.

실제로

volatile int a;
int main()
{
printf("%d",a++);
}

이렇게 해서 실행하면 매번 실행될때마다 0 이 됩니다.

실제로 프로그램이 종료되어도 기억하는 변수가 따로 있나요?

winner의 이미지

file 을 이용하세요.

OS 수업듣는 거 아닌가요?
thread 문제라면 이해하겠는데...

제대로 수업들으신 거라면 교수가 아무 것도 모르는 거라고 생각되네요.

mastercho의 이미지

파일로 저장되지 않는한......

그런건 없습니다

volatile 은 그런용도가 전혀 아닌데요

단지 메모리의 자료를 레지스터로 불러들여 케쉬처럼 사용되지 않도록 컴파일러에게

힌트를 주는 역활를 할 뿐입니다 , 이건 컴파일러 옵션에 따라 다르게 작용할수도 있지요

교수님들 수업을 들을떄마다 느끼는거지만
잘못되고 왜곡된 지식을 많이 가지고 있는듯보입니다

특히 옛날 표준이나 잘못된 지식을 권위?로 가르치는
분들이 많기때문에 충분히 사전 지직을 가지고 선별해서 받아들여야 할걸로 보입니다

물론 잘못된것을 지적했을때 교수님 치고 순순히 받아 들이는분은 적기때문에 , 누구한테 배운다는 생각보단

스스로 공부하다는 생각으로 공부하시며 , 학교 수업은
복습용으로 이용하시기 바랍니다

[참고로 volatile를 프로세스가 종료해도 , 저장할수 있는 수단으로 말했다면
그 교수님 수준은 C언어뿐 아니라 운영체제조차 전혀 모르시는분이라고 생각해도 좋습니다]

승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스

deisys의 이미지

헉... ;;
프로그램이 종료되어도 기억되는 변수라... -_-;
글쎄요, 그런건 없는 것 같은데요. 적어도 제 아는 범위에서는요.

일부 시스템에서는 프로그램 종료시에도 객체를 유지하곤 한다는 말을 들은것
같기는 하지만... ;;

volatile 이라는 키워드는: OS차원, 혹은 하드웨어적으로 언제든 바뀔 수 있는 값들을 - 다시말해 외부에서 바꿀 수있는 값들을 - Memory mapped I/O의 경우나 인터럽트 핸들러같은 경우에 자주 있지요 - 저장하는 변수들의 과도한 최적화를 막아주는정도.... 라고 알고 있는데요.

음... 더 정확하게 알고 계시는 분들이 많을것 같네요. =)

mastercho의 이미지

deisys wrote:
일부 시스템에서는 프로그램 종료시에도 객체를 유지하곤 한다는 말을 들은것
같기는 하지만... ;;

이건 OS에서 지원해주는 API나 POSIX API를 이용해야 되고
그것또한 결국 파일로 저장을 해 정보를 유지 합니다
[아마 공유 메모리에 관한 부분일것입니다]

C언어에서 표준적으로 [프로세스가 종료해도] 저장해주는 수단은 파일입니다

승자는 자기보다 우월한 사람을 보면 존경심을 갖고 그로부터 배울 점을 찾지만 패자는 자기보다 우월한 사람을 만나면 질투심을 갖고 어디 구멍난 곳이 없는지 찾는다.
- 하비스

akbar의 이미지

...

pyrasis의 이미지

그냥 변수들은 레지스터에 읽어 들여져서 캐시가 되서..

불러들일때 캐시된걸 불러 들일수 있어서 volatile을 쓴다고 들었습니다.

메모리에서 값이 변경되었지만 레지스터에 캐시된 값을 읽어올 수 있다고..

volatile을 쓰면 언제나 메모리에서 읽어오기 때문에

캐시가 되서 다른 값이 되는 경우는 없겠죠

확실히 값을 저장하고 불러오기 위해서 쓴다고 그러더군요.

http://gc.myscan.org/gc04/node1.html

jj의 이미지

deisys wrote:
일부 시스템에서는 프로그램 종료시에도 객체를 유지하곤 한다는 말을 들은것
같기는 하지만... ;;

아주 극단적인 예로 스마트카드에서 그런짓을 하곤하죠. 파일에 저장되지도 않고, 그냥 EEPROM에 써버리는... ㅋㅋ... 하지만, volatile과는 거리가 먼 얘기구요.

--
Life is short. damn short...

deisys의 이미지

DB 수업시간에 잠깐 들었던

Persistent Programming Language 라는게 기억속에서 알짱거리던 거였네요.

뭐... 어차피 파일을 사용한다는건 변함 없지만서도 ;; ^^

hb_kim의 이미지

waintman wrote:
수업시간에 volatile 에 관해서 잠시 언급했었는데 교수님께서
volatile 은 프로그램종료가 되어도 거기 저장되어있는 값이 그래도
남는다고 하셨습니다. 그래서 프로그램이 몇번 실행되었는지 체크할때도
volatile 을 쓴다고 하셨는데
아마도 너무 간단하게 설명하느라 이런식의 설명이 되어진것 같습니다.

'혹시 static은 서브루틴이 종료가 되어도 거기 저장되어 있는 값이 그래도 남는다' 이런 내용이 어디에선가(ie. 교수님의 기억속) 왜곡된 것 아닐까요?

pebiman의 이미지

oh shit!!!
:shock: :shock:
종료되도 남아있는 ...?
제가 알고있는 기본상식이 모조리 무너지는 순간이었습니다.
ㅡ,ㅡ :D

쓰레기는 쓰레기통에...

jinushun의 이미지

volatile [vltl, -til | vltil]L 「날고 있는」의 뜻에서 a. 1 휘발하는, 휘발성의

휘발성!!!!

없어진단 소리죠 -_-;;

ㅋㅋ

----------------------------
www.nate.com
----------------------------

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.