local exclusive monitor & global exclusive monitor

Exclusive Monitor 는 메모리 접근에 대한 동기화를 위해서 ARM 에서 제공하는 방식입니다. ARM Information Center 에 가보면 아래와 같은 예제 그림이 나와 있네요.

local exclusive monitor, global exclusive monitor

Exclusive Monitor 는 위와 같이 Local Monitor 와 Global Monitor 가 존재하는데, 그림에는 나와있지 않지만 Exclusive 접근을 관리하기 위해 내부적으로 Tagging Memory 와 State Machine 으로 이루어져 있습니다.
이는 각각 접근하는 메모리의 주소를 기록(Tagging)해두고, 현재의 접근 상태 머신(Finite State Machine)을 관리하기 위한 용도입니다.
즉, 어떤 한놈이 메모리 영역에 LDREX 접근하게 되면 해당 메모리의 주소를 Tag 해두고, 상태 머신을 Exclusive 라는 상태로 해둡니다. 그리고, 자신이 또 다시 해당 메모리에 접근하여 STREX 를 수행하면 Tag 된 것은 Clear 하고 상태 머신은 원래 상태(Open)로 되돌려놓게 됩니다.
동기화 과정이 이렇게 깔끔하게 동작하면 아무 문제가 없겠죠.
하지만, 문제는 항상 다른 놈들이 중간에 끼어들 때 발생합니다.
뭐 동기화 자체가 여러 놈들 사이의 문제니까요.
즉, 한놈이 LDREX 연산을 수행하면서 표시를 해두고, 조금 있다가 변경한 결과를 다시 저장하려고 STREX 를 수행하러 갔더니 그 표시가 변경되어 있다면, 무언가 다른 놈이 중간에 끼어들었다는 것을 알아채게 되는 방식인거죠.

동기화 관련하여 Local Monitor 와 더불어 중요한 요소가 메모리의 공유 속성(Shareable Attribute)입니다.
위와 같은 Exclusive Monitor 를 이용한 동기화의 방법도 접근하는 메모리 영역이 Core 사이에 공유될 수 있게 설정되어 있느냐, 또는 공유될 수 없게 설정되어 있느냐에 따라 아무래도 동기화 방법이 다르겠죠.
메모리의 경우 Shareable 또는 Non-shareable 속성으로 설정될 수 있습니다.
물론, Shareable 도 Inner-Shareable 이냐 Outer-Shareable 이냐로 또 나뉘기는 하는데 이는 별도로 다음에 살펴보겠습니다.

Non-shareable 로 설정된 메모리 위치에 대한 exclusive 접근은 Local Monitor 를 통해 검사됩니다.
Shareable 로 마크된 메모리 위치에 대한 exclusive 접근은 Local Monitor 와 Global Monitor 모두을 통해 검사됩니다.

다음은 Local Exclusive Monitor 의 State Machine 을 나타냅니다.

Local Exclusive Monitor State Machine

상태가 Open Access 와 Exclusive Access 두가지가 있는 것을 볼 수 있습니다.
간단한 흐름만을 살펴보면, 초기에 Open 상태였다가 LoadExcl 연산이 발생하면 Exclusive 상태로 변경되고 x 주소가 Tag 되는 것입니다.
Exclusive 상태에서 StoreExcl 연산이 발생하면 다시 Open 상태로 돌아오게 됩니다.
물론 StoreExcl 이 발생할 때는 그림과 같이 Tag 된 주소일 수도 있고 아닐 수도 있는데, 아닐 경우는 원래 LoadExcl 을 발생시킨 놈이 이에 대한 쌍으로 StoreExcl 연산을 수행할 때 중간에 누가 끼어들었다는 것을 눈치채게 되겠죠.
그림을 보면 Exclusive 상태에서 CLREX 연산을 통해 State Machine 과 Tag Memory 의 상태를 초기화할 수도 있습니다.
Local Monitor 가 Exclusive 상태일 때 만약 STREX 연산이 발생하면 다음과 같이 처리한다는 것을 알아야 합니다.

  • STREX 의 주소가 Tag 된 주소와 같다면 Store 연산이 정상적으로 수행됩니다.
  • Store 가 정상적으로 수행되었으면, status value 값을 0 으로 레지스터에 리턴합니다.
  • Store 가 수행되지 않았으면, statue value 값을 1 로 레지스터에 리턴합니다.

아래 그림은 Global Exclusive Monitor 의 State Machine 입니다. Local Monitor 의 것보다 좀더 복잡한데, 이는 멀티프로세서 시스템 환경에서 프로세서 번호(n)까지 고려해야하기 때문입니다. 이러한 Global Monitor State Machine 은 프로세서 코어마다 다른 것을 사용합니다.

global exclusive monitor state machine

당연한 것이지만, Local Monitor 와 Global Monitor 를 둘다 사용할 때는, STREX 연산은 접근되는 메모리가 해당 프로세서를 위해 Tag 되었고, 해당 프로세서에 대한 두 개의 Monitor 상태가 Exclusive 상태일 때만 성공합니다.
이럴 때 위의 Local Monitor 에서 본 것처럼, status 값을 0 으로 레지스터에 리턴하고 Store 연산은 성공하게 됩니다.
커널의 atomic 코드를 살펴보면 나오는데, atomic_add 등의 inline assembly 를 보면 항상 이 status 값을 검사하는 부분이 있습니다.
atomic 한 연산을 위해 이 값이 0 이 아닐 경우는 LDREX 부터 다시 수행하는 로직을 볼 수 있습니다. 이 코드들은 별도로 살펴볼 것입니다.

References:
1. ARM Information Center
2. ARM Architecture Reference Manual. A3.4 Synchronization and semaphores
3. http://www.iamroot.org/xe/Kernel_8_ARM/66152
4. http://manseok.blogspot.kr/2013_09_01_archive.html
5. ARM Community

You may also like...

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x