This paper looks at general software design principles for multicore and multiprocessor systems when working with processes or threads that share memory. Basic concepts about cache coherency are discussed. Synchronization is discussed but the talk will focus on how the cache organization can affect software performance and compare the techniques of functional decomposition and data decomposition and see how they apply when cores/processors share cache and when they don’t. Strategies using processor affinity are also covered.