Системы с общей памятью в простейшей реализации используют для подключения всех процессоров общую шину памяти. Такая конфигурация называется Uniform Memory Access (UMA) - равноправный доступ к памяти. Производительность многопроцессорных систем этого типа лимитируется пропускной способностью общей шины памяти и при увеличении числа процессоров, начиная с некоторого их числа, производительность системы перестает расти. Это связано с тем, что резко возрастает время ожидания доступа к общей шине памяти. Обычно, число процессоров в таких системах не превышает 8-16 шт. Более того, для современных высокопроизводительных процессоров пропускной способности шины памяти не хватает даже в 2-4 процессорных конфигурациях. Для улучшения масштабируемости систем с общей памятью используется Non-Uniform Memory Access (NUMA) архитектура. В системах этого типа каждый процессор по-прежнему имеет доступ ко всей памяти, однако она разделена на блоки, к каждому из которых напрямую подключено небольшое число процессоров (обычно 4), а блоки объединяются с помощью высокоскоростного коммуникационного оборудования. При этом доступ к памяти других блоков происходит в несколько раз медленнее, чем к локальной памяти. Кроме того, поскольку все микропроцессоры в настоящее время оснащаются кэш-памятью, то требуется аппаратная поддержка когерентности всей кэш-памяти. Такие системы называются cc-NUMA (cache coherent NUMA). Системы этого типа масштабируются до нескольких сотен процессоров. Недавно, общепризнанный лидер в производстве вычислительных систем с общей памятью, фирма SGI представила самую большую систему с общей памятью объемом 4 Терабайта, состоящую из 1024 двухядерных процессоров.
В системах с общей памятью, как правило, единственная копия операционной системы управляет работой всех процессоров и всей памятью. Основная модель программирования - "fork-join" (Ветвление - Объединение). Любая программа стартует как обычная однопроцессорная программа. При достижении параллельной части программы, головная программа (мастер) порождает некоторое число дополнительных процессов (ветвей), которые завершаются по окончании параллельной части.
Для организации такой модели вычислений могут использоваться стандартные средства операционной системы, такие как процесс, нить (thread) или высокоуровневые средства параллельного программирования, например, OpenMP.