Horizontal and Vertical Shared Memory

Shared memory can be extended along two independent dimensions. Horizontal shared memory involves extending the concept to multiple address spaces, which may exist on the same or different computers; in essence, distributed shared memory. Vertical shared memory involves extending the concept between primary and secondary memory; in essence, giving the programmer the illusion that data on secondary storage is accessible in the same way as data in primary storage.

Ultra-high bandwidth communication make horizontal shared-memory feasible. In general, horizontal shared-memory may use more bandwidth than non-shared memory approaches, but the new communication technologies allow trading bandwidth for programmer productivity. This situation is similar to spending a million CPU cycles to drag a mouse cursor across a screen to increase programmer productivity. In essence, when excess capacity exists, and it is possible to converting it into increased human productivity, do so because human productivity is the largest cost in system development.

New hardware and operating system technology make vertical shared-memory feasible. While there are several ways to implement vertical shared-memory, memory-mapping is the primary approach. Vertical shared-memory using memory mapping was investigated as far back as the Multics system (1968); however, it has seen only limited use. With today's large address spaces (64 bits) and powerful memory-management capabilities, memory mapping of secondary storage makes excellent sense, and operating systems are providing access to this capability, e.g., the mmap system call in UNIX and general access to virtual memory in the Mach and Sun operating systems. Objectstore is an example of a commercial product that provides vertical shared-memory using memory-mapping.

In essence, horizontal and vertical shared memory have the potential to provide a significantly simpler programming model and environment for developing sophisticated applications in a complex development environment. A programmer can write an application that accesses data on secondary storage across a network as easily as accessing data in the local block of a program. Clearly, the programmer has to be aware that access time is non-uniform in the two cases, as for any traditional approach, but the shared-memory approach provides a significantly simpler and more familiar technique for accomplishing the access.