here is what I’m writing in the book.

Let us image that we have the following two processes and one semaphore. 

[[[
| semaphore p1 p2 |
semaphore := Semaphore new.
p1 := [ semaphore wait.
                'p1' crTrace ] fork.
                
p2 := [ semaphore signal.
                'p2' crTrace ] fork.
]]]

- The first process is waiting on the semaphore. As soon as the semaphore will 
be signalled, ==p1== is signal also the semaphore.
- The second process is just signalling the semaphore and printing. 

Now the question is to understand what is the generated trace which is ==p2== 
then ==p1==. 

Let us explain why.
- ==p1== is scheduled and its execution starts to wait on the semaphore, so it 
is removed from the run queue of the scheduler and added to the waiting list of 
the semaphore.
- ==p2== is scheduled and it signals the semaphore. The semaphore takes the 
first waiting process (==p1==) and reschedules it by adding it to the end of 
the suspended lists. ==p2== continues its execution.


Let us slightly change the example to show how priorities are involved during 
the signalling process.

[[[
| semaphore p1 p2 |
semaphore := Semaphore new.
p1 := [ semaphore wait.
                'p1' crTrace ] forkAt: 30.

p2 := [semaphore signal.
        'p2' crTrace ] forkAt: 20.
]]

As a conclusion when the semaphore is signalled, the first waiting process of 
the semaphore is removed from the semaphore list,
and resumed following the preemption rules of the scheduler.



> On 9 Jan 2020, at 13:01, ducasse <[email protected]> wrote:
> 
> Hi
> 
> I wanted to explain
> 
> | semaphore p1 p2 |
> semaphore := Semaphore new.
> p1 := [ semaphore wait.
>       'p1' crTrace ] fork.
>               
> p2 := [semaphore signal.
>        'p2' crTrace ] fork.
> 
> displays p2 and p1. 
> but I would like explain clearly but it depends on the semantics of signal. 
> 
> 
> - ==p1== is scheduled and its execution starts to wait on the semaphore, so 
> it is removed from the run queue of the scheduler and added to the waiting 
> list of the semaphore.
> - ==p2== is scheduled and it signals the semaphore. The semaphore takes the 
> first waiting process (==p1==) and reschedule it by adding it to the end of 
> the suspended lists.
> 
> 
> Now this sentence "The semaphore takes the first waiting process (==p1==) and 
> reschedule it by adding it to the end of the suspended lists.” is super 
> naive. Is the semaphore signalling scheduled? or not?
> 
> 
> signal
>       "Primitive. Send a signal through the receiver. If one or more 
> processes 
>       have been suspended trying to receive a signal, allow the first one to 
>       proceed. If no process is waiting, remember the excess signal. 
> Essential. 
>       See Object documentation whatIsAPrimitive."
> 
>       <primitive: 85>
>       self primitiveFailed
> 
>       "self isEmpty    
>               ifTrue: [excessSignals := excessSignals+1]    
>               ifFalse: [Processor resume: self removeFirstLink]"
> 
> 
> I wanted to know what is really happening when a semaphore is signalled. 
> Now resume: does not exist on Processor. 
> 
> I will look in the VM code. 
> 
> 
> S
> 
> 
> 
> 
> 
> S.



Reply via email to