본문 바로가기

Programming/C Programming

__read_mostly keyword

linux kernel source 를 분석중 생소한 keyword 가 눈에 띄어서 posting 해 본다.

원문 : http://pyun9998.springnote.com/pages/1318976?print=1



리눅스 커널 소스에서 전역변수 뒤에 __read_mostly 라고 선언한 코드를 볼 수 있습니다. 예를 들면 이런 식이죠.

static struct list_head ptype_all __read_mostly;

__read_mostly 로 선언한 변수들은 말 그대로 주로 읽히기만 하는 변수들로서 __read_mostly 를 사용한 전역변수들은 실행이미지에서 인접한 주소 영역에 그룹으로 위치하게 됩니다. 이렇게 되는 이유는 SMP 시스템에서 성능을 높이기 위해서입니다.

CPU 는 캐쉬라인 사이즈 만큼의 데이터를 한꺼번에 메모리에서 캐쉬로 올려놓고 사용하게 됩니다. 따라서 인접한 주소 영역에 있는 데이터들은 한꺼번에 캐쉬에 올라가게 됩니다.이때 캐시에 write 동작이 발생하게 되면 캐쉬와 메모리의 불일치가 생기게 됩니다. 이런 경우에 동일한 메모리 영역을 캐쉬에 올려놓고 사용하는 다른 CPU 에서는 캐쉬를 비우고 메모리에서 캐쉬로 데이터를 새로 읽어와야 합니다.

주 로 read 만 하는 변수와 write 도 가능한 변수들이 인접한 메모리 영역에 위치한다면 동일한 캐쉬라인에 올라가게 될 것이고 SMP 시스템에서 하나의 CPU가 변수에 write 를 하는 순간 동일한 변수를 사용하는 다른 CPU 에서는 캐쉬를 비우는 작업이 발생하기 때문에 캐쉬의 효율이 떨어져 성능이 저하됩니다. 이러한 현상을 cache bouncing 이라고 합니다. 따라서 cache bouncing을 최소화하기 위해서는 read 만 하는 변수와 read, write 를 함께 하는 변수는 서로 다른 캐쉬 라인에 올라갈 수 있도록 서로 다른 메모리 영역에 위치시키는 것이 SMP 시스템의 성능을 향상시키는데 도움이 됩니다