On this page:
6.1 Defining a Process Type
define-process-type
6.2 Defining a Process
define-process
6.3 Process Types
process-type-info
6.4 Creating and Accessing Processes
6.4.1 The process-info Structure
process-info
6.4.2 The process Structure
process
process-name
process-time
set-process-time!
6.4.3 Creating Processes
make-process
6.4.4 Process States
6.5 Example—Processes

6 Processes

    6.1 Defining a Process Type

    6.2 Defining a Process

    6.3 Process Types

    6.4 Creating and Accessing Processes

      6.4.1 The process-info Structure

      6.4.2 The process Structure

      6.4.3 Creating Processes

      6.4.4 Process States

    6.5 Example—Processes

In a simulation model, a process represents an entity in the simulation that has state and actively progresses through (simulated) time.

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).

6.1 Defining a Process Type

(define-process-type name [super-name]
  field ...+)
Defines a new process type with the specified name that is a subtype of super-name. If super-name is not supplied, the supertype is process.

6.2 Defining a Process

(define-process (name . arguments)
  body ...+)
Defines a new process with the specified name. Syntactically, the define-process macro is the same as define for a function—indeed, an unnamed procedural object is created and associated with the process. However, the simulation collection maintains references to process objects, thus allowing them to interact with each other and other simulation elements.

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.

6.3 Process Types

(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?
Contains the information needed to create process instances of the corresponding process type.

6.4 Creating and Accessing Processes

6.4.1 The process-info Structure

(struct process-info (name type body))
  name : symbol?
  type : process-type-info?
  body : any/c
Contains the information needed to instantiate a process instance.

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?
Represents a process instance.
  • process-infopoints to a structure that contains information from the process definition needed internally by the simulation collection.

  • eventcontains the event object that represents the execution of the body of the process.

  • statemaintains 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.

(process-name process)  symbol?
  process : process?
Returns the name of the process.

(process-time process)  (>=/c 0.0)
  process : process?
Returns the time of the next event associated with process. This is the value of the time fiels of the event field of process. This is useful in simulations using the interrupt and resume advanced simulation control functions.

(set-process-time! process time)  any
  process : process?
  time : (>=/c 0.0)
Sets the time of the next event associated with process. It sets the value of the time fiels of the event field of process. This is useful in simulations using the interrupt and resume advanced simulation control functions.

6.4.3 Creating 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?)
Creates a new instance of the process whose definition is process-def. The process instance event will have its function field set to the body function for the process with the specified arguments. The process instance is not added to an event list and remains in the PROCESS-CREATED state.

6.4.4 Process States

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:

6.5 Example—Processes

This example is the same as the simulation model in Chapter 5. Indeed, the only syntactic difference is the use of define-process instead of define for the generator and customer processes.

#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: