Enhanced semaphore architecture

Abstract: An enhanced semaphore architecture, referred to herein as a "fullphore", combines the "P" and "V" opera­ tions of a semaphore into a single "S" operation capable of handling both consumer processes and producer process­ es. A fullphore has a count, a limit, a queue for waiting processes, a wait permitted flag, and a operation flag. The operation flag determines whether the count is incre­ mented or decremented by one. The architecture of the fullphore "S" operation is s(F,OP, WAIT_PERMITTED), where F is the fullphore to be operated on, OP is +1 for a producer process and -1 for a consumer process, and WAIT-PERMITTED is YES if the process will wait if neces­ sary and NO if it will not.

Description: This invention relates to the data processing field. More particularly, this invention is an enhanced semaphore architecture, referred to herein as a "fullphore", for efficiently enforcing mutual exclusion between a plurality of tasks in a multiprocessing computer system. A typical multiprocessing computer system has the capability to perform several tasks in parallel. However, some mechanism must be used to synchronize these parallel processes so that invalid results or race conditions do not occur. Traditionally, semaphores have been used to satisfy this synchronization requirement. The traditional semaphore known to those of skill in the art consists of a count, a limit, and a queue for tasks to wait on. Two types of semaphore instructions are required for normal operation. A "V" type of semaphore instruction is used by a "producer" process when it has produced information for use by a "consumer" process. A "P" type of semaphore instruction is used by a "consumer" process when it requests information produced by a "producer" process. The "P" operation is used to enter mutual exclusion, while the "V" operation is used to exit mutual exclusion. The traditional semaphore is described in more detail in "Structured Computer Organization" by Andrew Tanenbaum, Section 5.33, incorporated herein by reference. U.S. Patent 4,320,451 also describes the semaphore and is also incorporated herein by reference. An analogy of the semaphore operation is helpful to explain its operation. Imagine it is Halloween, it is just getting dark, and Harry the Homeowner has just filled up a candy dish with 3 pieces of candy. The candy dish is just big enough for 3 pieces of candy. Harry doesn't want to be bothered by trick or treaters all night, so he leaves the candy dish out on the porch next to the porch swing with a sign that says the following: "Take one piece of candy from the candy dish. If the candy is all gone, you may sit on the porch swing and wait for the dish to be refilled if you w<nt to." At the start of the evening, all 3 pieces of candy are available to be consumed (count = 3) and are stored in the candy dish (limit = 3). Each of the trick or treaters (processes) is capable of taking a piece of candy from the candy dish (consumer process) independent of the actions of the other trick or treaters (multiprocessing system). Harry is capable of refilling the candy dish with more candy (producer process). When the first trick or treater wants a piece of candy, he takes one from the candy dish (consumer process). There are now two pieces of candy available (count = 2). When 2 more trick or treaters want a piece of candy, they each take one from the candy dish. Now there are 0 pieces of candy available (count = 0). If a 4th trick or treater wants a piece of candy, he cannot get one (since count = 0) until Harry adds a piece of candy to the candy dish (incrementing the count to 1). If this fourth trick or treater can wait, he sits down on the porch swing and waits for Harry to refill the candy dish (count = -1 indicating one trick or treater waiting for a piece of candy). When Harry adds another piece of candy to the candy dish the waiting trick or treater takes it (count incremented to 0). If this fourth trick or treater cannot wait, he dejectedly moves on to the next house (consumer request fails). Harry thought that putting the candy dish out on the porch would give him some peace and quiet on Halloween, but he finds himself running out to the porch every few minutes to refill the candy dish. Harry figures out that he could be much more efficient if he could put some extra candy down in the porch swing next to the candy dish, where it would wait for the next trick or treater to take a piece of candy (count = 4 indicating one piece of candy waiting for a trick or treater). Harry is told by the Halloween Advisory Commission that he cannot do this, because the rules do not allow it. The above analogy shows one of the problems with the traditional semaphore architecture. Because the count cannot exceed the limit, "V" type semaphore instructions fail if the count is equal to the limit. Therefore a "producer" process cannot wait for a "consumer" process if the count is equal to the limit. This failure makes the "V" type semaphore instruction asymmetrical with the "P" type instruction, which permits a consumer process to wait for a producer process. This asymmetrical nature between the P and V instructions means that both are necessary in a normal multiprocessing environment. This requirement complicates the operational interface between the semaphore and the processors of the multiprocessing system. In an article "OPERATING SYSTEM PRINCIPLES" written by Per Brinch HANSEN in Prentice Hall Inc., 1973, New Jersey, USA, pages 89-94, the process cooperation between producer and consumer tasks has been described in general and more particularly in a semaphore. In such a system, the communication is subject to 2 resource constraints: the finite capacity of the buffer which stores the message to be consumed and the speed according to which the receiver cannot consume message faster than they are produced. The synchronizing rule enables then the sender to be delayed until the receiver has taken another message from the full buffer. Conversely, the receiver is delayed until the sender has put another message into the empty buffer. But the semaphore which implements such operations cannot operate symmetrically for the upper limit and for the lower limit, nor extend the upper and the lower limits according to the size of the waiting queue. It is a principal object of the invention to provide an enhanced semaphore architecture where only one instruction is needed to handle both producer processes and consumer processes. It is another object of the invention to provide an enhanced semaphore architecture where a producer process is permitted to wait for a consumer process if the count is greater than or equal to the limit. These and other objects are accomplished by the enhanced semaphore architecture disclosed herein. An enhanced semaphore architecture, referred to herein as a "fullphore", combines the "P" and "V" operations of a semaphore into a single "S" operation capable of handling both consumer processes and producer process es. A fullphore has a count, a limit, a queue for waiting processes, a wait permitted flag, and a operation flag. The operation flag determines whether the count is incremented or decremented by one. The architecture of the fullphore "S" operation is s(F,OP, WAIT_PERMITTED), where F is the fullphore to be operated on, OP is +1 for a producer process and -1 for a consumer process, and WAIT_PERMITTED is YES if the process will wait if necessary and NO if it will not. When a fullphore receives a consumer process request (indicated by OP=-1), it first checks to see if the count is less than or equal to zero. If so, the request fails unless the WAIT_PERMITTED flag was YES. If the WAIT_PERMITTED flag was YES, OP (-1) is added to the count, thereby decrementing the count. The process waits on the wait queue until dispatched by a producer process. If the count is not less than or equal to zero, and in addition the count does not exceed the limit, OP (-1) is added to the count, thereby decrementing the count, and the request completes successfully. If the count is greater than the limit, indicating a waiting producer process, the waiting producer process is dispatched, OP (-1) is added to the count, and both processes' requests are allowed to complete successfully. When a fullphore receives a producer process request (indicated by OP=+1), it first checks to see if the count is greater than or equal to the limit. If so, the request fails unless the WAIT_PERMITTED flag was YES. If the WAIT_PERMITTED flag was YES, OP (+1) is added to the count, thereby incrementing the count. The process waits on the wait queue until dispatched by a consumer process. If the count is not greater than or equal to the limit, and in addition the count is not less than zero, OP (+1) is added to the count, thereby incrementing the count, and the request completes successfully. If the count is less than zero, indicating a waiting consumer process, the waiting consumer process is dispatched, OP (+1) is added to the count, and both processes' requests are allowed to complete successfully. Fig. 1 shows a block diagram of the prior art semaphore P operation. Fig. 2 shows a block diagram of the prior art semaphore V operation. Fig. 3 shows a block diagram of the fullphore S operation of the subject invention. Fig. 1 shows a block diagram of the prior art semaphore P operation used by consumer processes (also known as consumer tasks). The architecture of the P operation is p(S,WAIT_PERMITTED), where S is the semaphore to be operated upon and WAIT_ PERMITTED is a flag used to indicate if the process will wait or not if it cannot be completed. When a P operation is received by the semaphore, block 11 checks to see if count C is less than or equal to zero. If not, the count is decremented in block 12 and the request succeeds in block 13. If so, block 14 checks to see if the WAIT_PERMITTED flag was YES or NO. If the flag was NO, the request fails in block 15. If the flag was YES, the count is decremented by one in block 16 and the process waits on the wait queue until dispatched by a producer process. Fig. 2 shows a block diagram of the prior art semaphore V operation used by producer processes (also known as producer tasks). The architecture of the V operation is v(S), where S is the semaphore to be operated upon. When a V operation is received by the semaphore, block 21 checks to see if count C is equal to limit L. If so, the request fails in block 22. Note that the process is not permitted to wait for the count to be less than limit L -- automatic failure of the request is the only possible result. If the count is not equal to L, block 22 checks to see if the count is less than zero. If not, the count is incremented in block 24 and the request succeeds in block 25. If the count is less than zero, a consumer process is waiting on the wait queue (see block 16 of Fig. 1), and block 26 dispatches the consumer process and allows it to complete successfully in block 13. The count is incremented by one in block 24 and the producer request completes successfully in block 25. Fig. 3 shows a block diagram of the fullphore "S" operation of the subject invention. The fullphore combines the "P" and "V" operations of a semaphore into a single "S" operation capable of handling both consumer processes and producer processes. A fullphore has a count, a limit, a queue for waiting processes, a WAIT_PERMITTED flag, and a OP (operation) flag. The operation flag determines whether the count is incremented or decremented by one. The architecture of the fullphore "S" operation is s(F, OP, WAIT_PERMITTED), where F is the fullphore to be operated upon, OP is +1 for a producer process and -1 for a consumer process, and WAIT_PERMITTED is YES if the process will wait if necessary and NO if it will not. When a fullphore receives a consumer process request (indicated by OP=-1), it first checks to see if the count is less than or equal to zero in block 31. If so, block 32 checks to see if the WAIT_PERMITTED flag was YES or NO. If the flag was NO, the request fails in block 33. If the WAIT_PERMITTED flag was YES, OP (-1) is added to the count in block 34, thereby decrementing the count. The process waits on the wait queue until dispatched by a producer process. If the count is not less than or equal to zero, block 35 checks to see if the count exceeds the limit. If the count does not exceed the limit, OP (-1) is added to the count in block 36, thereby decrementing the count, and the request completes successfully in block 37. If the count is greater than the limit, indicating a waiting producer process, the waiting producer process is dispatched in block 38 and allowed to complete successfully. OP (-1) is added to the count in block 36 and the consumer request completes successfully in block 37. Note that the traditional semaphore architecture does not allow a producer process to wait for a consumer process. As described above, this situation is allowed in the fullphore architecture. When a fullphore receives a producer process request (indicated by OP=+1), it first checks to see if the count is greater than or equal to the limit in block 31. If so, block 32 checks to see if the WAIT_PERMITTED flag was YES or NO. If the WAIT_PERMITTED flag was NO, the process fails in block 33. If the WAIT_PERMITTED flag was YES, OP (+1) is added to the count in block 34, thereby incrementing the count. The process waits on the wait queue until dispatched by a consumer process. If the count is not greater than or equal to the limit, block 35 checks to see if the count is less than zero. If not, OP (+1) is added to the count in block 36, thereby incrementing the count, and the request completes successfully in block 37. If the count is less than zero, indicating a waiting consumer process, the consumer process is dispatched in block 38 and allowed to complete successfully. OP (+1) is added to the count in block 36 and the producer process is allowed to complete successfully in block 37. The fullphore architecture greatly simplifies the operational interface between the fullphore and the processors of the multiprocessing system. A fullphore can be used anywhere a semaphore is used. In addition, a fullphore can be used in places where one semaphore is insufficient. A particularly good application for the fullphore is to synchronize access to a ring buffer. A ring buffer is used to house information as it is passed from an information producer to an information consumer. If the consumer can process the information faster than the producer provides it, the consumer must wait. Likewise, if the producer produces the information faster than the consumer processes it, then the producer must wait, because the ring buffer becomes full, and cannot hold any more unprocessed information. A single fullphore with a limit set equal to the number of pieces of information that can be held in the ring buffer and an initial count of zero will provide the required synchronization. The count represents the number of pieces of information in the ring buffer. The producer increments the count, waiting if the buffer is full, and the consumer will decrement the count, waiting if the buffer is empty. In order to accomplish this synchronization with only semaphore support requires three semaphores: one to serve as a Monitor, and two to support the wait mechanism for buffer full and buffer empty conditions. The Monitor is needed to synchronize changes to the two semaphores, since those changes must be made atomically. The fullphore needs no Monitor, since only one synchronization object does it all. Another use for a fullphore is to implement a parameterless ADA rendezvous. An ADA rendezvous is characterized by a single execution thread diverging into two threads, and the rendezvous occurs when the two threads have completed and the threads converge back into a single thread. By initializing a fullphore with a limit of zero and a count of zero, and having thread one request an increment operation on the fullphore and thread two request a decrement operation, the rendezvous will occur when both threads have completed. Which ever thread completes first will wait, since COUNT=LIMIT=0. The thread which completes second will not only not wait, but will dispatch the first thread ending its wait. The ADA rendezvous supports parameters passing at rendezvous time--this support could be added with enhancements to the fullphore invention. To implement the rendezvous without a fullphore would require a Monitor semaphore again, to decide which thread completed first, and a second semaphore to allow the thread finishing second to dispatch the thread finishing first.

Claims: An apparatus for an enhanced semaphore architecture for enforcing mutual exclusion between consumer tasks and producer tasks in a computer system, comprising a counter capable of incrementing and decrementing, a limit imposed on said counter and a wait queue for consumer tasks or producer tasks to wait on, said apparatus for an enhanced semaphore architecture characterized in that it comprises: an operation flag (OP) to enable the count either to increment (OP=+1) or to decrement (OP=-1) for both the consumer and the producer tasks beyond said limit and below zero; and a wait permit flag (WAIT_PERMITTED) is set off to force the consumer and the producer tasks to fail and set on to enable said consumer tasks to be placed on said wait queue if said count is less than or equal to zero and to enable said producer task to be placed on said wait queue if said count is greater than or equal to said limit; whereby said waiting producer or consumer tasks are dispatched and said counter is decremented or incremented respectively when the counter is greater than said limit or less than zero. A method for enforcing mutual exclusion between producer tasks and consumer tasks in a computer system having an enhanced semaphore comprising a count capable of incrementing and decrementing, a limit imposed on said counter and a wait queue for consumer tasks or producer tasks to wait on, said enhanced semaphore also comprising a wait permit flag (WAIT_PERMITTED) to force the consumer and the producer tasks to fail or to enable said tasks to wait on said waiting queue and an operation flag (OP), said method comprising the steps of: for said producer task: setting (31) said operation flag (OP) to an incrementing state (OP=+1); forcing (33) said producer task to fail if said count is greater than or equal to said limit and said wait permitted flag is off; incrementing (34) said count and allowing said producer task to wait on said wait queue if said count is greater than or equal to said limit and said wait permitted flag is on (32), wherein said producer task waits until dispatched by a dispatching step (38) for a waiting consumer task; incrementing (36) said count and completing (37) said producer task if said count is less than or equal to said limit (35); dispatching (38) a waiting consumer task if said count is greater than said limit (35), then incrementing (36) said count and completing (37) said producer task; for said consumer task: setting (31) said operation flag (OP) to a decrementing state (OP=-1); forcing (33) said consumer task to fail if said count is less than or equal to zero and said wait permitted flag is off; decrementing (34) said count and allowing said consumer task to wait on said wait queue if said count is less than or equal to zero and said wait permitted flag is on (32), wherein said consumer task waits until dispatched by a dispatching step (38) for a waiting producer task; decrementing (36) said count and completing (37) said consumer task if said count is greater than or equal to zero (35); dispatching (38) a waiting producer task if said count is less than zero (35), then decrementing (36) said count and completing (37) said consumer task.

Inventors: NIEMEYER ROBIN NEIL, VRIEZEN JOHN JOSEPH, NIEMEYER, ROBIN NEIL, VRIEZEN, JOHN JOSEPH
Applicants: IBM, INTERNATIONAL BUSINESS MACHINES CORPORATION
Application year: 1989
Main classification: G06F9
IPC codes: G06F9