- absolute timer
- A timer with an expiration point defined as a fixed time,
    for example, January 20, 2005 at 09:43:12 AM, EDT.  Contrast with
    relative timer.
- alignment
- The characteristic that accessing an N-byte data element
    must be performed only on an address that is a multiple of N.
    For example, to access a 4-byte integer, the address of the integer must
    be a multiple of 4 bytes (e.g., 0x2304B008, and not
    0x2304B009).
    On some CPU architectures, an alignment fault will occur if an attempt is
    made to perform a non-aligned access.
    On other CPU architectures (e.g., x86) a non-aligned access is simply
    slower than an aligned access.
- asynchronous
- Used to indicate that a given operation is not synchronized to another
    operation.  For example, the timer tick interrupt that is generated by
    the system's timer chip is said to be “asynchronous” to a
    thread that's requesting a delay of a certain amount of time, because
    the thread's request is not synchronized in any way to the arrival of
    the incoming timer tick interrupt.  Contrast with 
    synchronous.
- atomic (operation)
- An operation that is “indivisible,” that is to say, one that
    will not get interrupted by any other operation.
    Atomic operations are critical especially in interrupt service routines and
    multi-threaded programs, as often a “test and set” sequence
    of events must occur in one thread without the chance of another thread
    interrupting this sequence.
    A sequence can be made atomic from the perspective of multiple threads not
    interfering with each other through the use of mutexes
    or via
    InterruptLock()
    and
    InterruptUnlock()
    when used
    with Interrupt service routines.
    See the header file <atomic.h> as well.
- attribute (structure)
- A structure used within a resource manager that
    contains information relating to the device that the resource manager is
    manifesting in the pathname space.
    If the resource manager is manifesting multiple devices in the pathname space
    (for example, the serial port resource manager might manifest /dev/ser1
    and /dev/ser2) there will be an equal number of attribute
    structures in the resource manager.
    Contrast with OCB.
- barrier (synchronization object)
- A thread-level synchronization object with an associated count.  Threads that
    call the blocking barrier call
    (pthread_barrier_wait())
    will block until
    the number of threads specified by the count have all called the blocking
    barrier call, and then they will all be released.
    Contrast this with the operation of 
    semaphores.
- blocking
- A means for threads to synchronize to other threads or events.  In the
    blocking state (of which there are about a dozen), a thread doesn't
    consume any CPU — it's waiting on a list maintained within the
    kernel.  When the event occurs that the thread was waiting for, the thread
    is unblocked and is able to consume CPU again.
- channel
- An abstract object on which a server
    receives a message.
    This is the same object to which a 
    client
    creates a connection in order
    to send a message to the server.
    When the channel is created via
    ChannelCreate(),
    a “channel ID”
    is returned.  This channel ID (or “chid” for short) is what a
    resource manager will advertise as part of its registered
    mountpoint.
- client
- Neutrino's message-passing architecture is
    structured around a client/server relationship.
    In the case of the client, it's the one that is requesting services of
    a particular server.  The client generally accesses these services using
    standard file-descriptor-based function calls (e.g.,
    lseek()),
    which are synchronous, in that the client's
    call doesn't return until the request is completed by the server.
    A thread can be both a client and a server
    at the same time.
- condition variable
- A synchronization object used between multiple 
    threads,
    characterized by acting as a rendezvous point where multiple threads can
    block, waiting for a signal (not to be confused with
    a UNIX-style signal).  When the signal is
    delivered, one or more of the threads will unblock.
- connection
- The concept of a client being
    attached to a channel.
    A connection is established by the client either directly by calling
    ConnectAttach()
    or on behalf of the client by the client's C library function
    open().
    In either case, the connection ID returned is usable
    as a handle for all communications between the client and the 
    server.
- connection ID
- A “handle” returned by ConnectAttach() (on the
    client
    side) and used for all communications between the client and the 
    server.
    The connection ID is identical to the traditional C library's
    “file descriptor.”
    That is to say, when open() returns a file descriptor, it's really returning
    a connection ID.
- deadlock
- A failure condition reached when two threads are mutually 
    blocked
    on each other, with each thread waiting for the other to respond.
    This condition can be generated quite easily; simply have two threads
send
    each other a message — at this point, both threads are waiting for the
    other thread to reply to the request.
    Since each thread is blocked, it will not have a chance to reply, hence
    deadlock.
    To avoid deadlock, clients and
servers
    should be structured around a send hierarchy (see below).
    (Of course, deadlock can occur with more than two threads; A sends to B, B sends to C, and C
    sends back to A, for example.)
- FIFO (scheduling)
- In FIFO scheduling, a thread will consume CPU until
    a higher priority thread is ready to run, or until the thread voluntarily
    gives up CPU.
    If there are no higher priority threads, and the thread does not voluntarily
    give up CPU, it will run forever.
    Contrast with round robin scheduling.
- interrupt service routine
- Code that gets executed (in privileged mode) by the kernel as a result of a
    hardware interrupt.  This code cannot perform any kernel calls and should
    return as soon as possible, since it runs at a priority level effectively higher
    than any other thread priority in the system.  Neutrino's interrupt
    service routines can return a struct sigevent that indicates
    what event, if any, should be triggered.
- IOV (I/O Vector)
- A structure where each member contains a pointer and a length.
    Generally used as an array of IOVs, rather than as a single IOV.
    When used in the array form, this array of structures of pointers and lengths
    defines a scatter/gather list, which allows the
    message-passing operations to proceed much more
    efficiently (than would otherwise be accomplished by copying data individually
    so as to form one contiguous buffer).
- kernel callouts
- The Neutrino operating system can be customized to run on various hardware,
    without requiring a source license, by supplying kernel callouts to the startup
    program.
    Kernel callouts let the developer supply code that knows how to deal with the
    specifics of the hardware.  For example, how to ask an interrupt controller
    chip about which interrupt fired, or how to interface to the timer chip 
    to be able to arrange for periodic interrupts, etc.
    This is documented in great depth in the Building Embedded Systems
    book.
- message-passing
- The Neutrino operating system is based on a message passing model, where all
    services are provided in a synchronous manner by
    passing messages around from client to
    server.
    The client will send a message to the server and
    block.  The server will receive a message from
    the client, perform some amount of processing, and then reply
    to the client's message, which will unblock
    the client.
- MMU (Memory Management Unit)
- A piece of hardware (usually embedded within the CPU)
    that provides for virtual address
    to physical address translation, and can be
    used to implement a virtual memory system.
    Under Neutrino, the primary benefit of an MMU is the ability to detect when
    a thread has accessed a virtual address that is
    not mapped into the process's address space.
- mutex
- A Mutual Exclusion object used to serialize a number of
    threads so that only one thread at a time has access to the resources defined
    by the mutex.  By using a mutex every time (for example) that you access
    a given variable, you're ensuring that only one thread at a time has access
    to that variable, preventing race conditions.  See also 
    atomic (operation).
- Neutrino
- Quoting from the Sudbury Neutrino Observatory web pages (found at
    http://www.sno.phy.queensu.ca/):
    
    Neutrinos are tiny, possibly massless, neutral elementary particles which interact with matter via the weak
    nuclear force. The weakness of the weak force gives neutrinos the property that matter is almost transparent
    to them. The sun, and all other stars, produce neutrinos copiously due to nuclear fusion and decay processes
    within the core. Since they rarely interact, these neutrinos pass through the sun and the earth (and you)
    unhindered. Other sources of neutrinos include exploding stars (supernovae), relic neutrinos (from the birth
    of the universe) and nuclear power plants (in fact a lot of the fuel's energy is taken away by neutrinos). For
    example, the sun produces over two hundred trillion trillion trillion neutrinos every second, and a supernova
    blast can unleash 1000 times more neutrinos than our sun will produce in its 10-billion year lifetime. Billions
    of neutrinos stream through your body every second, yet only one or two of the higher energy neutrinos will
    scatter from you in your lifetime.
     
- OCB (open context block)
- A data structure used by a resource manager that contains
    information for each client's open() call.
    If a client has opened several files, there will exist a corresponding OCB for each
    file descriptor that the client has in the respective resource managers.
    Contrast with the attribute (structure).
- PDP-8
- An antique computer, “Programmable Data Processor,” manufactured between
    1965 and the mid 1970's
    by Digital Equipment Corporation (now Compaq) with the coolest front
    panel.  Also, the first computer I ever programmed.
  
    Unfortunately, this wonderful 12-bit machine does not run Neutrino :-(!
- periodic timer
- See Repeating timer
- physical address
- An address that is emitted by the CPU onto the bus connected to the memory subsystem.
    Since Neutrino runs in virtual address mode, this means
    that an MMU must translate the virtual addresses used by
    the threads into physical addresses usable by the
    memory subsystem.
    Contrast with virtual address
and virtual
    memory.
- process
- A non-schedulable entity that occupies memory, effectively acting as a container
    for one or more threads.
- pthreads
- Common name given to the set of function calls of the general form pthread_*().
    The vast majority of these function calls are defined by the POSIX committee, and
    are used with threads.
- pulse
- A non-blocking message which is received in a manner
    similar to a regular message.
    It is non-blocking for the sender, and can be waited upon by the receiver using
    the standard message-passing functions
    MsgReceive()
    and
    MsgReceivev()
    or the special pulse-only receive function
    MsgReceivePulse().
    While most messages are typically sent from client to
    server, pulses are generally sent in the opposite
    direction, so as not to break the send
hierarchy
    (breaking which would cause deadlock).
    Contrast with signal.
- QNX Software Systems
- The company responsible for the QNX 2, QNX 4, and Neutrino operating systems.
- QSS
- An abbreviation for QNX Software Systems.
- receive a message
- A thread can receive a message by calling MsgReceive() or MsgReceivev().
    If there is no message available, the thread will block, waiting for one.
    See Message passing.
    A thread that receives a message is said to be a Server.
- receive ID
- When a server receives a message
    from a client, the server's MsgReceive() or
    MsgReceivev() function returns a “receive ID” (often abbreviated
    in code as rcvid).  This rcvid then acts as a handle to the
    blocked client, allowing the server
to reply
    with the data back to the client, effectively unblocking the client.
    Once the rcvid has been used in a reply operation, the rcvid ceases to have any
    meaning for all function calls, except
    MsgDeliverEvent().
- relative timer
- A timer that has an expiration point defined as an offset from
    the current time, for example, 5 minutes from now.  Contrast with
    absolute timer.
- repeating timer
- An absolute or relative
    timer that, once expired, will automatically reload with another relative
    interval and will keep doing that until it is canceled.  Useful for
    receiving periodic notifications.
- reply to a message
- A server will reply to a client's
    message in order to deliver the results of the client's request back to the client.
- resource manager
- Also abbreviated “resmgr.”
    This is a server process which provides certain
    well-defined file-descriptor-based services to arbitrary clients.
    A resource manager supports a limited set of messages, which correspond to standard
    client C library functions such as open(), read(), write(),
    lseek(), devctl(), etc.
- round robin (scheduling)
- In Round Robin (or “RR”) scheduling, a thread
    will consume CPU until a higher priority thread is ready to run, until the thread voluntarily
    gives up CPU, or until the thread's timeslice expires.
    If there are no higher priority threads, the thread doesn't voluntarily
    give up CPU, and there are no other threads at the same priority, it will run forever.
    If all the above conditions are met except that a thread at the same priority is
    ready to run, then this thread will give up CPU after its timeslice expires, and
    the other thread will be given a chance to run.
    Contrast with FIFO scheduling.
- scatter/gather
- Used to define the operation of message
passing
    where a number of different pieces of data are “gathered” by the
    kernel (on either the client or
server
    side) and then “scattered” into a (possibly) different number of
    pieces of data on the other side.
    This is extremely useful when, for example, a header needs to be prepended to
    the client's data before it's sent to the server.
    The client would set up an IOV which would contain a pointer and
    length of the header as the first element, and a pointer and length of the data
    as the second element.  The kernel would then “gather” this
    data as if
    it were one contiguous piece and send it to the server.
    The server would operate analogously.
- semaphore
- A thread synchronization primitive characterized by having
    a count associated with it.  Threads may call the
    sem_wait()
    function and
    not block if the count was non-zero at the time of the call.
    Every thread that calls sem_wait() decrements the count.
    If a thread calls sem_wait() when the count is zero, the thread will
    block until some other thread calls
    sem_post()
    to increment the count.
    Contrast with barrier.
- send a message
- A thread can send a message to another thread.  The MsgSend*() series
    of functions are used to send the message; the sending thread blocks until
    the receiving thread replies to the message.
    See Message passing.
    A thread that sends a message is said to be a Client.
- send hierarchy
- A design paradigm whereby messages sent flow in one
    direction, and messages replied to flow in another
    direction.
    The primary purpose of having a send hierarchy is to avoid deadlock.
    A send hierarchy is accomplished by assigning clients
    and servers a “level,” and ensuring that
    messages that are being sent go only to a higher level.
    This avoids the potential for deadlock where two threads would send to each other,
    because it would violate the send hierarchy — one thread should not have
    sent to the other thread, as that other thread must have been at a lower level.
- server
- A server is a regular, user-level process that provides
    certain types of functionality (usually file-descriptor-based) to clients.
    Servers are typically Resource Managers, and there's an
    extensive library provided by QSS which performs much
    of the functionality of a resource manager for you.
    The server's job is to receive messages from clients,
    process them, and then reply to the messages, which
    unblocks the clients.
    A thread can be both a client and a server
    at the same time.
- signal
- A mechanism dating back to early UNIX systems that is used to send asynchronous
    notification of events from one thread to another.
    Signals are non-blocking for the sender.  The receiver of the signal may decide
    to treat the signal in a synchronous manner by explicitly
    waiting for it.  Contrast with pulse.
- sporadic
- A scheduling policy whereby a thread's priority can
  oscillate dynamically between a “foreground” or
  normal priority and a “background” or low priority.
  A thread is given an execution budget of time to be consumed
  within a certain replenishment period.
  See also
  FIFO
  and
  round robin.
- synchronous
- Used to indicate that a given operation has some synchronization to another
    operation.  For example, during a message-passing operation,
    when the server does a MsgReply() (to reply to
    the client), the unblocking of the client is said to be
    synchronous to the reply operation.
    Contrast with Asynchronous.
- thread
- A single, schedulable, flow of execution.  Threads are implemented directly within
    the Neutrino kernel and correspond to the POSIX pthread*() function
    calls.  A thread will need to synchronize with other threads (if any) by using
    various synchronization primitives such as mutexes,
    condition variables, semaphores,
    etc.
    Threads are scheduled in
    FIFO,
    Round Robin,
    or
    sporadic
    scheduling mode.
- unblock
- A thread that had been blocked will be unblocked
    when the condition it has been blocked on is met.  For example, a thread
    might be blocked waiting to receive a message.
    When the message is sent, the thread will be
    unblocked.
- virtual address
- An address that's not necessarily equivalent to a physical
    address.
    Under Neutrino, all threads operate in virtual addressing
    mode, where, through the magic of an MMU, the virtual
    addresses are translated into physical addresses.
    Contrast with physical address
and virtual
    memory.
- virtual memory
- A “virtual memory” system is one in which the virtual
    address space may not necessarily map on a one-to-one basis with the
    physical address space.
    The typical example (which Neutrino doesn't support as of this writing) is a “paged”
    system where, in the case of a lack of RAM, certain parts of a process's
    address space may be swapped out to disk.
    What Neutrino does support is the dynamic mapping of stack pages.