본문 바로가기
BackEnd/Computer Architecture

1.2.8 어셈블리어로 태스크의 병렬처리

by 12312121 2022. 3. 8.

태스크의 병렬처리 시의 문제점
태스크가 서로 독립적일 때는 병렬처리가 쉽지만 서로 협력하는 태스크들은 병렬처리가 어렵다 왜냐하면 한 태스크를 처리하고나서 다른 태스크를 처리하고자 하면 이때 쓰이는 자원을 이전 태스크가 수정해서 제대로 쓸 수 없는 경우가 있다

해결책 : lock, unlock
이때 쓰이는 해결책을 '동기화'라고 부른다. 그중 하나인 lock, unlock 방식을 살펴 보겠다

lock : 한 태스크가 자원을 상요하는 동안 다른 태스크가 접근 못하도록 하는것
unlock : 접근 제한 조치를 해제하는 것

lock은 0이면 사용 가능하고 1이면 사용할 수 없음을 표시한다

실행 예 :
1. 프로세서는 레지스터에 있는 값 1과 메모리에 있는 lock의 0을 바꾸게 된다.
2. 하지만 이 연산을 이전에 한번 실행 했다면 메모리에는 1이 이미 들어있어서 다른 레지스터와 한번 더 lock연산을 진행한다면 레지스터는 1값을 받게 되어 사용 못함을 알 수 있다

해결책 : lr.d, sc.d
lr.d(load-reserved doubleword)
sc.d(store-conditional douleword)

실행 예 :
again :
lr.d x10, (x20) //메모리 값을 x20에 넣겠다
//이때 다른 태스크가 수행 될 수도 있음
sc.d x11, x23, (x20) //메모리 값이 여전히 x20에 잘 있다면 x11에 0 넣고 x23의 값을 x20에 넣기
없다면 x11에 1 넣고 끝
bne x11, x0, again //sc.d가 실패시 재실행
addi x23, x10, 0 //x23을 재사용을 위해 초기화

해결책의 요구사항
동기화의 구현을 위해 메모리 주소에서 읽고 수정하는 것을 *원자적으로 처리할 능력을 가진 'Hardware primitive'가 있어야 한다
원자적 행위 = 원자처럼 더 이상 나누어질 수 없는 행위 (실행 도중 중단이 된다면 나누어질 수 있다고 간주하기 때문에 원자성 유지를 위해 중단이 안되도록 한다)

댓글