2017-04-12 3 views
0

세마포어로 비디오를 시청하고 더 자세한 정보를 얻기 위해 파기를 시도했습니다. 어셈블리 레벨에서 세마포어가 어떻게 작동하는지 잘 모르겠습니다.하위 레벨의 세마포를 이해하지 못함

P(s): 
    s = s - 1 
    if (s < 0) {wait on s} 

CRITICAL SECTION 

V(s): 
    s = s + 1 
    if(threads are waiting on s) {wake one} 

나는 그러나 나는이 주위에 내 머리를 포장하는 데 문제가 있어요 개념은 이러한 기능의 뒤에 무엇인지 이해합니다. 2

Thread One          Thread Two 
load s           load s 
subtract s,1         subtract s,1      
save s           save s 

그런 다음 거기 빼기 사이에 컨텍스트 스위치이며, 모두 설정의 0으로 모두를 위해 저축 스레드 1 스레드 :

는 S = 1 말을 당신은이 개 스레드가 있습니다. 두 스레드가 s를 0으로보고 임계 영역에 들어 가지 않습니다. 두 스레드가 모두 s = 0을 볼 수 있도록 어셈블리 레벨에서 컨텍스트 전환이 가능하면 스레드가 독점적으로되는 방법을 모르겠습니다.

+0

귀하의 분석에서 "대기 중"부분을 잊어 버렸습니다. –

+0

무슨 뜻인지 확실치 않습니다. S에 뮤텍스가 있습니까? – train55255

+0

아니요, 뮤텍스가 없지만 세마포가 있습니다. 이것은 다른 종류의 동기화 메커니즘이지만 뮤텍스와 마찬가지로 효율적인 * 차단 *을 제공합니다. 즉, OS 스케줄러와 상호 작용합니다. –

답변

2

중요한 점은 증분 및 감소가 원자 명령어를 어떤 방식으로 사용한다는 것입니다. x86 안에는 lock 접두어와 결합 된 add 명령어의 형태가있어 메모리 위치에 원자 적으로 추가를 수행 할 수 있습니다. 단일 명령이기 때문에 컨텍스트 전환은 실행 중에 발생할 수 없으며 잠금 접두사는 CPU가 증가 중에 다른 액세스가 발생하지 않도록합니다.

원자 추가 기능을 사용할 수없는 경우 다른 옵션이 있습니다. 한 가지 공통적 인 것은 원자 비교 및 ​​스왑 명령어입니다. 병렬 또는 동시 코드를 지원하는 대부분의 시스템에서 발견 할 수있는 것은 이전 값과 새 값이라는 두 값을 사용하고 메모리 위치가 이전 값과 같으면 새 값으로 설정하는 명령입니다. 이것은 원자 추가 구현 루프에서 사용될 수있다 :이 값을로드

l: 
load r0 s 
mov r1 r0 
add r0 -1 
cas s r1 r0 
jmpf l 

를, 그 값의 사본에서 1을 감산한다. 그런 다음 더 낮은 값을 저장하려고 시도하지만 변경된 경우 실패하고 다시 시작합니다.

+0

이것은 교수님이 지시 사항이 원자력이라는 것을 모호하게 기억해 주셔서 고맙게 생각합니다.하지만이 모든 것을 지우고 바로 머리에 맞 춥니 다. 정말 고맙습니다! – train55255

+0

제 교수가 저 레벨로 조금 더 파고 들기 위해 여분의 거리를 가길 원합니다. 다시 한번 감사드립니다. 그러나 이것이 비효율적이지 않습니까? 컨텍스트 스위치가 많으면 추가 또는 뺄 시도 중 4 개의 명령에 갇힐 수 있습니까? – train55255