Glossary

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.