Nhiều bản sao dữ liệu, mở rộng trên toàn bộ Cache, dẫn đến vấn đề tương hợp trong các Cache. Các bản sao trong các Cache là tương hợp nếu tất cả chúng đều có giá trị như nhau. Tuy nhiên, nếu một trong những bộ vi xử lý viết lên giá trị của một trong các bản sao, thì bản sao sẽ khơng tương hợp bởi vì nó khơng cịn bằng với giá trị của các bản sao khác. Nếu dữ liệu được phép trở thành không phù hợp (khơng tương hợp), các kết quả khơng chính xác sẽ được truyền trong hệ thống, dẫn đến các kết quả cuối cùng khơng chính xác. Vì vậy, chúng ta cần các thuật tốn tương hợp cache để duy trì mức độ nhất quán trong toàn bộ hệ song song.
4.3.1 Sự tương hợp Bộ nhớ-Cache
Trong một hệ thống bộ nhớ cache đơn lẻ, sự tương hợp giữa bộ nhớ và cache được duy trì bằng cách sử dụng hai phương pháp: (1) write-through (ghi hoàn toàn), và (2) write- back (ghi lại, viết ngược). Chẳng hạn, khi một tác vụ đang chạy trên một bộ xử lý P yêu cầu dữ liệu ở vị trí nhớ X, nội dung của X được sao chép vào cache, ở đó nó được đưa vào P. Khi P cập nhật giá trị của X trong cache, bản sao còn lại trong bộ nhớ cũng cần được cập nhật để duy trì tính nhất qn. Trong write-through, bộ nhớ được cập nhật mỗi khi cache được cập nhật, trong khi trong chế độ write-back, bộ nhớ được cập nhật chỉ khi khối trong cache đang được thay thế. Bảng 4.1 biểu diễn các chế độ write-through và write-back.
4.3.2 Sự tương hợp cache-Cache
Trong hệ thống đa xử lý, chẳng hạn khi một tác vụ đang chạy trên bộ vi xử lý P yêu cầu dữ liệu trong vị trí nhớ tồn cục X, nội dung của X được sao chép vào cache cục bộ của bộ xử lý P, sau đó nó được chuyển sang P. Bây giờ, giả sử bộ xử lý Q cũng truy cập vào X. Điều gì xảy ra nếu Q muốn viết một giá trị mới lên giá trị X cũ?
Có hai phương pháp tương hợp cache cơ bản: (1) write-invalidate (ghi-vơ hiệu hóa), và (2) write-update (ghi- cập nhật). Write-invalidate duy trì tính tương hợp bằng cách đọc từ các cache cục bộ cho đến khi quá trình viết xuất hiện. Khi bất kỳ bộ vi xử lý nào cập nhật giá trị của X qua quá trình viết, đưa một bit dirty cho X làm mất hiệu lực tất cả các bản sao khác. Ví dụ, bộ vi xử lý Q làm mất hiệu lực tất cả các bản sao khác của X khi viết một giá trị mới vào cache của nó. Điều này thiết lập một dirty bit cho X. Q có thể tiếp tục thay đổi X mà khơng cần thơng báo thêm cho các cache khác bởi vì Q chỉ có một bản sao X có hiệu lực (có giá trị). Tuy nhiên, khi bộ xử lý P muốn đọc X, nó phải đợi cho đến khi X được cập nhật và dirty bit bị xóa. Viết cập nhật duy trì tính nhất qn bằng cách cập nhật ngay tất cả các bản sao trong tất cả các cache. Tất cả các dirty bit được thiết lập trong mỗi hoạt động viết. Sau khi tất cả các bản sao đã được cập nhật, tất cả dirty bit sẽ bị xóa. Bảng 4.2 biểu diễn chế độ write-update và write-invalidate.
BẢNG 4.1 Write-through và write-back
4.3.3 Tính tương hợp của hệ thống bộ nhớ dùng chung
Bốn sự kết hợp để duy trì tính tương hợp giữa tất cả các cache và bộ nhớ tồn cục là:
• Write-update và write-through; • Write-update và write-back;
• Write-invalidate và write-through; và • Write-invalidate và write-back.
Nếu chúng ta cho phép write-update và write-through trực tiếp trên vị trí nhớ tồn cục X, bus sẽ bắt đầu bận và cuối cùng tất cả các bộ vi xử lý sẽ được rỗi trong khi chờ q trình viết hồn thành. Trong write-update và write-back, chỉ có các bản sao trong tất cả các cache được cập nhật. Ngược lại, nếu hoạt động viết bị giới hạn trong bản sao X ở cache Q, các cache sẽ trở nên không nhất quán trên X. Thiết lập bit dirty ngăn chặn sự mở rộng các
giá trị không nhất quán của X, nhưng tại một số điểm, các bản sao không nhất quán phải được cập nhật.