Describe the cache hierarchy (L1, L2, L3) and explain how cache coherency is maintained in a multi-core processor environment.