컴파일러가 빌드할 때 최적화를 막음
즉 예를 들면
for(int i=0; i<size; i++)에서
i는 CPU의 특정 레지스터에서 계속 증가됨
즉 메모리에 i를 위해 공간을 할당해서 i를 증가시키는 게 아니라
CPU의 특정 레지스터에서 증가시킴
이런 것을 컴파일러가 수행하는 최적화라고 함
그런데 말입니다
volite int i 라고 선언을 해 버리면
컴파일러는 volite라는 키워드를 인지하고
위에서 말한 최적화를 수행하지 않고
메모리에 i를 위해 할당한 공간에서 인크리먼트 연산을 수행하도록 컴파일 합니다
volite가 유용하게 쓰이는 분야는
ARM Core를 베이스로 한 Application Processor를 탑재한
임베디드 디바이스 펌웨어 코드(커널 또는 디바이스 드라이버)에서 흔하게 사용합니다
즉 하드웨어 레지스터 주소를 액세스해서 값을 읽어 오거나 써야 할 때
volite 키워드를 선언합니다
그래야 컴파일러가 최적화 작업을 못해
실제 레지스터 주소에 실시간?으로 액세스할 수 있도록 하는 것입니다
도움이 좀 되셨기를 ㅎㅎ
java에서는 어떤가요?
몇년전에 자바의 버라이트는 어떨까해서 찾아본적 있는데 얼추 비슷한 걸로 기억함 물론 안드로이드(ARM코어 기반)에서는 데이터 캐시에서 데이터가 업데이트되는 거 막는 용도로 해석했었음 ㅎㅎ 즉 위 글과 비슷한 내용임
간단히 얘기하면, volatile 은 "이 변수는 프로그램 외부(자바는 다른 스레드)의 영향으로 값이 바뀔 수 있음다." 라는걸 컴파일러한테 힌트주는거임. 이걸 왜 주느냐면, 예를들어 char *p = 값이 막바뀌는 영역; while (...) { buffer[i] = *p; } 가 있다고 해보자. 컴파일러가 이 코드를 보면 일단 루프 안에서 p 나 *p 의 값이 바뀌는 부분이 있는지 확인함. 없지? 그럼 컴파일러는 프로그래머 이새끼 또 개적화 코드 만들어놨네 내가 최적화해주지 하면서 *p 를 최초 한번만 메모리에서 읽어오고 그걸 캐싱해다가 buffer 전체에 그대로 카피함. 이때 volatile char *p 로 선언해주면 캐싱 안하고 정직하게 매번 메모리에서 읽어옴.
컴파일러가 최적화를 안하도록 설정해주는 키워드인데 사용하는 이유가 스레드간의 동기화 때문은 맞는거지?
그리고 볼라타일이 아니고 버라이트라고 읽는거임? ㅎㅎ 창피
? 나한테 무러보는거임? ㅎㅎㅎ
알면 대답해줭 ㅎㅎ
한줄요약 : 이 변수는 다른 스레드에 의하여 값이 바뀔수도 있다는것을 컴파일러에 명시함으로써, 컴파일러가 해당 변수를 리오더링하지 않도록하여 변수의 원자성을 보장하므로, 스레드 세이프하다.
데이터 캐시는 AP[Application Processor]의 ARM Core 옆에 붙어 있는 하드웨어 데이터 캐시를 말함 ㅎㅎ 보통 CPU한테 인스트럭션 캐시 그리고 데이터 캐시가 따라 붙잔어 프로그램 구동되면 컴파일된 코드들은 인스트럭션 캐시에 로드되고 전역변수나 문자열 상수같은 것들은 데이터 캐시에 로드됨 물론 일차적으로 메모리에 실행파일의 코드 섹션과 데이터 섹션이 로드되고 나서 그 중 일부분들이 실행될때 CPU의 캐시들에 캐싱되는거지만 이때 volatile로 선언된 변수는 데이터 캐시에 로드되지 않고 메모리의 데이터 섹션 영역에서 업데이트 될 꺼임 휴우 상세하게 적을라니까 힘드네 데이터 캐시에 로드된 변수가 데이터 일관성[데이터 캐시의 내용이 메모리 내용과 일치되게 하는 행위?]이
이루어져야 할 때 메모리의 데이타 섹션과 싱크? 되는 것이 volatile이 선언되지 않은 것들이고 적다보니 말이 되는 건지 아닌건지 몰겠네
이게 원초적?인 volatile의 기능이고 자바의 volatile는 음ㅁ횽이 말한게 정확할듯 ㅎㅎㅎㅎ
아 글고 볼라타일인지 버라이트인지는 ㅋㅋㅋ 울덜들은 버라이트라고 발음햇음 ㅋㅋㅋㅋㅋㅋ
어렵네 ㅋㅋㅋ 자세한 설명 고맙 읽는 방법이 제일 고민이군 ㅋㅋㅋ
데이터 일관성이란 건 CPU의 데이터 캐시가 고작 수십 KByte 밖[요즘 AP의 데이터 캐시는 어느정도인지 모름 ㅋ]에 안되니 실행 도중 딴 함수로 점프하거나 더 이상의 가용한 데이터 캐시 공간이 없을 때 이전에 있던 애들을 더 이상 데이터 캐시에 못두니 실제 메모리의 데이터 섹션을 데이터 캐시의 내용과 일치시켜야 하는 것을 말함 휴유 ㅋㅋㅋ
영어 공부 좀 해라. 얼마나 영어 공부를 안했으면 volatile 발음 유추 하나 제대로 못하냐. volatile 발음을 제대로 몰랐다고 하더라도 [발러타일] 정도로 읽었다면 애교로 봐줄 수도 있는데 [버라이트]는 씨발 발음 파괴자 수준이네. 정확한 발음은 [발러틀].