Hardware approaches to cache coherence in shared-memory multiprocessors, Part 1