* System Structure
    ** agent
	- one master, many slaves
    	- one agent per participating machine
    	- master's responsibilities
	    - Track all hosts in system
    	    	- availability
    	    	- clients they'll accept jobs from			
    	    - allocate hosts to requesting agents
    	    - return information about registered hosts to requesting clients
    	    	- name
    	    	- clients they accept from
    	    	- availability
    	    	- last-allocated
	- all agents' responsibilities
    	    - determine availability of local machine and send same to master
    	    	periodically
    	    - run jobs for other machines as ordered by the master
    	    	- complete environment
    	    	    - all ids (user/group)
    	    	    - environment strings
    	    	    - current working directory
    	    	    - file-creation mask
    	    	- deliver signals
    	    	- return exit status
    	    - contact point for clients
    	    	- getting host for export
    	    	- finding location of master
    	    	- setting availability parameters
    	    	    - maximum number of imported jobs
    	    	    - maximum load average
    	    	    - minimum idle time of keyboard
    	    	    - minimum percentage of free swap space
    	    	    - interval at which availability determined
    	    	    - whether to refuse export if local machine available
    	    - provide system information to a single log server
    	    	- used to track entire network (logd)
    	    	- will be used to track local activity in window system
    ** clients
    	- export
    	    - exports a command from shell level
    	    - handles I/O and signals for other clients' exported jobs (e.g.
    	    	pmake)
    	    - attempts to exit with same status as remote job
    	- pmake
    	    - Local and remote concurrencies
    	    - Uses export to handle I/O
    	- reginfo
    	    - Provides information on currently available machines from the
    	    	shell level
    	- importquota
    	    - Simple interface to change how/when availability is determined
    	- logd
    	    - Logs usage of entire system into a single file
* RPC system
    - UDP-based with TCP support
    - Common presentation for protocol (big-indian byte order)
    - No interpretation of data (i.e. no byte swapping)
    - Call and broadcast
    - Numbered procedures
    - Program functions bound to <socket, procedure-number> pairs.
    - Reliable delivery (resends and cache -- no sequencing: not needed)
    - Implicit ACK (return) with explicit ACK on timeout
    - Support for arbitrary timeout events and multiple input sources
    - Multi-threaded, sort of.
    	- multiple calls pending on same socket (or multiple sockets)
    	- server functions callable any time control is passed to system
    	- serve and call on same socket
    - Same protocol used for TCP as UDP
    	- First destination for unconnected TCP socket forces connect
    - Insecure
    - Broadcast response cache needed
* Interface
    - export and pmake from shell level
    - customslib
    	- Front-ends to handle the various protocols and structures
* System Maintenance -- Election
    - Because master may crash at any time, need election algorithm to
    	determine new master
    - Based on Gusella et. al TEMPO/timed algorithm
    - Limited to single network
    - Heterogeneous network supported by transmission of integer indicating
    	byte order.
    	- Could be altered to indicate machine type or subnet to allow
    	    partitioning of network beyond specifying clients
    - Algorithm broadcast-based
    	- On start-up or master-failure, broadcast wish to be master (Campaign)
            - If no response, become master
        	- Broadcast NewMaster call with integer indicating byte order
    	    - If receive FALSE return
    	    	- Responder is master
    	    	- Register with responder
    	    - If receive TRUE return
    	    	- Responder denies permission
    	    	    - Also desires to become master
    	    	    - Knows of some other agent that desires it
    	    	- If receive no FALSE return during broadcast
    	    	    - Perform exponential backoff and try again
    	- Receive Campaign call
    	    - If campaigning, or know some agent that is, return TRUE
    	    - If master, return FALSE
    	    - Else, note campaigner and ignore call.
    	    	- Knowledge of other campaigner lasts 10 seconds (election time)
    	- Receive NewMaster call
    	    - If master, cancel mastery
    	    - Change recorded address of master to caller's address
* Performance
    - 20-40 ms to find host to use
    - 200-300 ms for complete transaction exporting null process
* Security
    - Authentication of uid of sender
    	- Can be done by reading of kernel structures by local agent
    	- Use public-key encryption and authentication as described in
    	    UCB/CSD 87/375
    	    - Not completely appropriate because only one job executed at
    	    	a time (system is more-or-less stateless)
    	- Doesn't protect against modified software that allows one to become
    	    who one wants
    - Local network of *cooperating* workstations
    	- Non-hostile environment
    	- Small network (< 256 machines)
    - Logging
* Improvements
    - Even greater control of availability
    - Greater security
    - More services to allow parallel things like PMake to limit concurrency
    	automatically
