A distributed operating system should provide abstractions that make it easy to program applications, provide good performance and allow applications to scale. Operating systems structured around message passing kernels typically ensure good performance and are scalable. On the other hand, Distributed Shared Memory (DSM) systems are much easier to program. However, maintaining a consistent view of shared memory operations in a DSM system can be expensive. Early DSM implementations used variants of multiprocessor cache consistency algorithms that provided sequential consistency. These, however, do not perform very well in distributed systems where the message latencies are much higher. This thesis explores a memory consistency model called causal consistency which provides weaker consistency guarantees than sequential consistency. Many applications which execute correctly on a sequentially consistent DSM can run correctly without any change in code on a causal DSM. By programming applications that have a variety of data sharing patterns, it is shown that performance comparable to the message passing implementations of the applications can be achieved on the causal DSM system. The improved performance is due to a significant reduction (70 - 90%) in communication costs compared to the implementation of a sequentially consistent DSM system. These results show that causal memory can meet the consistency and performance requirements of many distributed and parallel applications.