Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

보근은 참고 있다

2.10 병렬성과 명령어: 동기화 본문

CS/컴퓨터 구조

2.10 병렬성과 명령어: 동기화

보근 2020. 10. 14. 22:21

 

 

 

 

 

 

 태스크가 서로 독립적일 때는 병렬처리가 필요가 없지만, 서로 협력해야 하는 경우 매우 중요하다. 협력이란 어떤 태스크들이 읽어야 할 값을 다른 태스크들이 쓰는 것을 의미한다. 그들 사이에 동기화가 되지 않으면 데이터 경쟁관계(data race)의 위험이 있다. 

 

 

 

 컴퓨팅에 있어서 동기화 메커니즘은 일반적으로는 사용자 수준의 소프트웨어 루틴에서 제공되는데, 이 소프트웨어 루틴들은 하드웨어가 제공하는 동기화 명령을 이용한다. 이 절에서는 lockunlock 동기화 연산의 구현에 집중한다. lock과 unlock을 이용하여 단 하나의 프로세서만이 작업할 수 있는 영역(상호배제(mutual exclusion))을 생성하며, 더 복잡한 동기화 메커니즘을 구현할 수 있다.

 

 

 

 멀티 프로세서에서 효율적으로 기본 동기화 프리미티브를 구현하기 위해선 메모리 주소에서 읽고 수정하는 것을 원자적으로(atomically) 처리할 능력을 가진 하드웨어 프리미티브가 있어야 한다. 즉, 메모리를 읽고 쓰는 중간에 아무것도 끼어들 수 없어야 한다. MIPS에서는 원자적 교환(atomic swap)을 위한 하드웨어 프리미티브로 SWP 명령어를 가지고 있다.

 

 

 

 단일 원자적 메모리 연산을 구현하기 위해선 프로세서 설계 시에 몇 가지 문제를 극복해야 하는데 이 연산은 메모리 읽기와 쓰기를 인터럽트가 불가능한 단일 명령에서 처리해야한다. 그 외에 방법으로 한 쌍의 명령어를 갖도록 하여 두번째 명령어는 한 쌍의 명령어가 마치 원자적인 것처럼 실행되었는지를 나타내는 값을 반환해야 한다. 모든 연산들이 이 명령어 쌍의 전이나 후에 실행되는 것처럼 보인다면 이 한 쌍의 명령어는 실질적으로 원자적이라 할 수 있다.

 

 

 

 MIPS에서는 이러한 명령어의 쌍으로 load linked라는 특수 적재 명령어와 store conditional이라는 특수 저장 명령어가 있다.

 

1. 이 명령어 쌍은 순차적으로 사용되는데 load linked 명령어에 의해 명시된 메모리 주소의 내용이 같은 주소에 대한 store conditional 명령어가 실행되기 전에 바뀐다면 store conditional 명령은 실패하게 된다. 

 

2. load linked 명령어가 실행되고 같은 명시된 메모리 주소의 내용이 바뀌지 않은 상태에서 store conditional 명령어는 레지스터 값을 메모리에 저장한다.

 

3. load linked 명령어는 초깃값을 반환하고 store conditional은 성공할 때는 1, 실패할 때는 0을 반환한다.

 

 

ex)  

  again : addi $t0, $zero, 1

            ll     $t1, 0($s1)          // load linked

            sc    $t0, 0($s1)          // store conditional

            beq $t0, $zero, again   // 읽어온 값이 0이라면 성공, 1이면 실패.

            add $s4, $zero, $t1

 

 

 

 

 

 

 위 과정을 좀 더 추상화하여 본다면, 

 

1. 프로세서는 레지스터에 있는 값 1과 메모리에 있는 lock을 맞바꿈으로써 lock을 1로 만들고, lock의 값을 레지스터로 받아온다.

 

2. 받아온 lock의 값이 1이라면 사용 불가능한 상태이다. (이때, 다시 값 swap이 필요없다. 1이 유지되기 때문)

 

3. 받아온 lock의 값이 0이라면 사용이 가능하다. (레지스터의 1과 swap함으로써 메모리에는 lock이 걸린다.)

 

 

 이런 과정을 겪으면서 원자성을 지켜내지만 동시에 교환을 하려는 두 프로세서의 경우를 생각해 보자. 결론부터 말하면 한 프로세서만이 교환을 먼저 수행해 0을 읽어갈 것이다. 동기화의 핵심은 원자성이다. 즉, 교환은 나뉠 수 없는 것이라서 두 개의 동시 교환은 하드웨어에 의해 순서가 결정된다.

 

 

 

 

 

 

 

 

 

 

 

 

 

Comments