The common programming model on UNIX derived operating systems is usually called process model. Its active system component - the process - consists of several system ressources (memory, files, ...) and is the schedulable entity of the system. Only one activity per process acting on one address space can be launched in this model. This is directly derived from the underlying single processor machine model for which the process model was primarily designed. The process control interface normally consists of a few primitives allowing to create or terminate processes and wait for other processes' termination. POSIX compatible operating systems provide this interface via the fork, exit and wait system calls.
When extending the usual single processor model towards a multiprocessor one or even tend to use distributed systems (e.g. workstation networks), you have to rethink your programming model as well. A few current operating systems support running a couple of processes in parallel onto a multiprocessor machine. These processes have the ability to commucicate via IPC (inter process communication) mechanism in a message passing manner.
Current research operating systems enhance the process model to a more powerful one, allowing more than one activity to run in one address space. These activities are commonly called threads of control or simply threads, therefore this multiprocessor programming model is normally referred to as the multithread model. Example runtime systems implementing a multithreaded programming environment are:
The classification for multiprocessor architectures into UMA, NUMA, NORMA, etc. was first presented in "Michael Young, Avadis Tevanian, Jr., Richard Rashid, David Golub Jeffrey Eppinger, Jonathan Chew, William Bolosky, David Black, and Robert Baron, The Duality of Memory and Communication in the Implementation of a Multiprocessor Operating System", Proceedings of the 11th Symposium on Operating Systems Principles, November, 1987
For loosely coupled multiprocessor machines and distributed systems, there exist two main lines in programming paradigms:
This issue, normally addressed as distributed shared memory (DSM), has been widely thought by many researchers and a few implementations are available. DSM builds up the abstraction of a virtually global shared memory or regions of shared memory onto a loosely coupled multiprocessor or even a multicomputer environment.
An UCSTRI search with the keywords "distributed shared memory" gave these results.