In the simulation collection, a process encapsulates an event that executes the body of the process; provides state information for the process; and, most importantly, provides a handle that allows the process to interact with other simulation elements (e.g. resources or other processes).
(define-process-type name [super-name] field ...+)
(define-process (name . arguments) body ...+)
The symbol name is bound to the process definition for the process. This is used in creating process instances.
The variable self is bound to the process instance during the execution of a process.
(struct process-type-info (name super-info parameters inits make)) name : symbol? super-info : (or/c process-type-info? false/c) parameters : list? inits : list? make : procedure?
6.4.1 The process-info Structure
6.4.2 The process Structure
(struct process ( process-info event state monitor continuous-variables terminating-condition differentiating-function queue acceptors) #:mutable) process-info : (or/c process-info? false/c) event : event? state : (and/c exact-integer? (integer-in -1 6)) monitor : (or/c procedure? false/c) continuous-variables : (list-of variable?) terminating-condition : any/c differentiating-function : (or/c procedure false/c) queue : event-list? acceptors : list?
points to a structure that contains information from the process definition needed internally by the simulation collection.
contains the event object that represents the execution of the body of the process.
maintains the state of the process.
Note that there are other fields used for continuous processes. These are described in Chapter 10, Continuous Simulation Models.
There are a few short-cut functions that return information from the other structures pointed to by a processes.
The normal way to create a process is using the schedule macro as described in Section 4.1, Scheduling Events and Processes. This creates and schedules a process for execution.
(make-process process-def arguments) → process? process-def : process-def? arguments : (listof any?)
Each process instance is in a specific state ar amy point in its life. The current state is available using the process-state function. The process states are:
the body of the process has finished execution.
the process has been created, but the body of the process has not begun executing. If the process instance was created using the schedule macro, the initial execution of the body of the process is scheduled, but has not yet executed.
the body of the process is executing.
the process is current in a wait/work.
the process is currently in a work/continuously.
the process is delayed waiting for a resource.
the process has been interrupted by another process via an interrupt call.
the process has suspended itself via a suspend call.
#lang scheme/base ; Example 1 - Processes (require (planet williams/simulation/simulation)) (define-process (generator n) (for ((i (in-range n))) (wait (random-exponential 4.0)) (schedule #:now (customer i)))) (define-process (customer i) (printf "~a: customer ~a enters~n" (current-simulation-time) i) (work (random-flat 2.0 10.0)) (printf "~a: customer ~a leaves~n" (current-simulation-time) i)) (define (run-simulation n) (with-new-simulation-environment (schedule #:at 0.0 (generator n)) (start-simulation))) (run-simulation 10)
Produces the following output.
0.6153910608822503: customer 0 enters
5.599485116393393: customer 1 enters
6.411843645405005: customer 2 enters
8.48917994426752: customer 0 leaves
10.275428842274628: customer 1 leaves
14.749397986170655: customer 2 leaves
23.525886616767437: customer 3 enters
27.18604340910279: customer 3 leaves
32.1644631797164: customer 4 enters
33.14558760001698: customer 5 enters
39.67682614849173: customer 4 leaves
40.486553934113665: customer 6 enters
41.168084930967424: customer 5 leaves
45.72670063299798: customer 6 leaves
46.747675912143016: customer 7 enters
49.212327970772435: customer 8 enters
50.556538752352886: customer 9 enters
51.46738784004611: customer 8 leaves
52.514846525674855: customer 7 leaves
56.11635302397275: customer 9 leaves
A few things to note at this point are:
The output of this example is identical to that of the example in Section 5.3, Example—
Functions as Events. Once again, this is due to the default behavior of repeatable random sources.
For many simple processes, an event may be used instead. Events are lighter-weight than processes. For example, in subsequent simulation models we will use an event for the generator function since it does not require any interaction with other processes—
other than scheduling the customer processes.