태스크의 병렬처리 시의 문제점
태스크가 서로 독립적일 때는 병렬처리가 쉽지만 서로 협력하는 태스크들은 병렬처리가 어렵다 왜냐하면 한 태스크를 처리하고나서 다른 태스크를 처리하고자 하면 이때 쓰이는 자원을 이전 태스크가 수정해서 제대로 쓸 수 없는 경우가 있다
해결책 : 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'가 있어야 한다
원자적 행위 = 원자처럼 더 이상 나누어질 수 없는 행위 (실행 도중 중단이 된다면 나누어질 수 있다고 간주하기 때문에 원자성 유지를 위해 중단이 안되도록 한다)
'BackEnd > Computer Architecture' 카테고리의 다른 글
레지스터 구조 (2) | 2024.04.13 |
---|---|
OPCODE + ADDRESS : 16진수 4자리를 이용한 기계어 표현법 (0) | 2024.03.28 |
1.2.7 기계어의 어셈블리어로 번역 (0) | 2022.03.04 |
1.2.6 어셈블리어로 긴 수치와 주소를 쓰는 법 (0) | 2022.03.02 |
1.2.5 어셈블리어로 문자와 문자열 사용해보기 (0) | 2022.02.27 |
댓글