티스토리 뷰
리눅스 커널 소스를 보다보면 심심치 않게 __read_mostly 매크로를 마주하게된다.
unsigned long __per_cpu_offset[NR_CPUS] __read_mostly;
__read_mostly 매크로를 통해서 프로그래머는 컴파일러에게 " 이 데이터는 자주 수정되지 않으며 대부분 읽기 연산만 이루어진다" 라는 것을 알려준다. __read_mostly 는 다음과 같이 정의 되어있다.
#define __read_mostly __attribute__((__section__(".data.read_mostly")))
보통 SMP 를 고려한 코드 내에서 자주 볼수가 있는데, 컴파일러는 __read_mostly 로 선언 되어있는 데이터들을 바이너리 파일의 일정 부분에 모여있게 하여, 코어(core)들이 이러한 데이터들을 각각(복사본을) 캐시하도록 한다. 읽기 위주의 데이터들만을 동일 cacheline 에 위치시킴으로써 SMP 내에서 빈번히 발생할 수 있는 cacheline bouncing 문제를 방지하기 위함이다.
'etc' 카테고리의 다른 글
[개발환경] ST SW4STM32 환경에서 Semihosting 으로 디버그메시지 출력하기 (0) | 2018.03.01 |
---|---|
__init , __initdata, __exit, __exitdata (0) | 2013.07.26 |