2015-01-01 4 views
1
follwing을 코드로

, 내가 기대스몰 토크 영상 작품 동시성

AA 
BB 
AA 
AA 
AA 
BB 

코드와 같은 출력 :

p1 := [ 1 to: 3000 do: [:i | Transcript show: 'AA';cr.] ] newProcess. 
p2 := [ 5000 to: 8100 do: [:i | Transcript show: 'BB';cr.] ] newProcess. 
p1 resume. 
p2 resume. 

그러나 첫째 인쇄 모든 AA 형하고 모든 게시판. Pharo에서는 제대로 작동하지만 VisualWorks에서는 제대로 작동하지 않습니다. 누군가가 버그를 말할 수 있습니까?

+1

나는 "버그"라고 말하지 않습니다. 내가 보는 것은 같은 우선 순위를 가진 두 프로세스입니다. 하나는 다른 프로세스 뒤에 대기합니다. 각 프로세스가 양보해야하며 다른 프로세스가 비 선점 환경에서 실행되도록해야한다고 생각하는 이유는 무엇입니까? –

답변

2

VisualWorks는 비 선점 형 멀티 태스킹을 사용합니다. 즉, 두 프로세스가 동일한 우선 순위를 가질 때 하나의 프로세스가 다른 프로세스가 실행되도록해야합니다. 차이를 확인하기 위해 다음 코드를 실행 해보십시오 :

p1 := [ 1 to: 3000 do: [:i | 
    Transcript show: 'AA';cr. 
    i \\ 10 = 0 ifTrue: [Processor activeProcess yield]] ] newProcess. 
p2 := [ 5001 to: 8101 do: [:i | 
    Transcript show: 'BB';cr. 
    i \\ 10 = 0 ifTrue: [Processor activeProcess yield]] ] newProcess. 
p1 resume. 
p2 resume. 
+0

Pharo는 다르게 작동합니다. 그것은 선제 적이기 때문입니까? –

+0

@LeandroCaniglia no, Squeak/Pharo도 선점 형 스케줄링이 없습니다. 어떤 형태의 상호 작용에서 온 것이 틀림 없습니다. (정확히 어디에서 언제 말할 수는 없습니다) - 내 대답을보십시오. –

1

데이비드 벅의 대답은 완벽 : 프로세스 스케줄러가 선제 아니므로 우선 순위가 같은 두 개의 프로세스가되지 않는 활성 한 것, 순차적이 아니라 동시에보다는 실행됩니다 준비되지 않은 세마포어를 기다리거나 명시 적으로 양보하십시오.

하지만 Pharo와 Squeak는 동일한 비선형 스케줄링을 사용합니다. 왜 그런 차이가 있습니까?
Morphic 상호 작용에서 온 것입니다. 정확히 모르겠다. Morphic 전문가가 아닙니다.
하지만 Transcript 대신 SharedQueue를 사용하면 Visualworks와 동일한 동작을 보입니다. 모두 'AA'다음에 모두 'BB':

q := SharedQueue new: 6101. 
s1 := Semaphore new. 
s2 := Semaphore new. 
p1 := [ 1 to: 3000 do: [:i | q nextPut: 'AA']. s1 signal ] newProcess. 
p2 := [ 5000 to: 8100 do: [:i | q nextPut: 'BB'.]. s2 signal ] newProcess. 
p1 resume. 
p2 resume. 
s1 wait. 
s2 wait. 
q inspect.