Có điều gì đó làm tôi nhớ đến mô hình bộ nhớ Java (nếu tôi thậm chí hiểu mọi thứ một cách chính xác). Nếu có hai luồng A và B, không có gì đảm bảo rằng B sẽ thấy giá trị được viết bởi A, trừ khi cả A và B đồng bộ trên cùng một màn hình.Mô hình bộ nhớ Java (JSR-133) có ngụ ý rằng việc nhập một màn hình sẽ xóa bộ nhớ cache dữ liệu CPU không?
Đối với bất kỳ kiến trúc hệ thống nào đảm bảo sự kết hợp bộ đệm giữa các luồng, không có vấn đề gì. Nhưng nếu kiến trúc không hỗ trợ kết nối bộ nhớ cache trong phần cứng, điều này về cơ bản có nghĩa là bất cứ khi nào một luồng vào màn hình, tất cả các thay đổi bộ nhớ được thực hiện trước đó phải được cam kết với bộ nhớ chính và bộ nhớ cache phải bị vô hiệu. Và nó cần phải là toàn bộ bộ nhớ cache dữ liệu, không chỉ là một vài dòng, vì màn hình không có thông tin mà các biến trong bộ nhớ mà nó bảo vệ. Nhưng điều đó chắc chắn sẽ tác động đến hiệu suất của bất kỳ ứng dụng nào cần phải đồng bộ hóa thường xuyên (đặc biệt là những thứ như hàng đợi công việc với các công việc ngắn). Vì vậy, Java có thể làm việc hợp lý tốt trên kiến trúc mà không có phần cứng cache-coherency? Nếu không, tại sao mô hình bộ nhớ không đảm bảo mạnh hơn về khả năng hiển thị? Nó sẽ không hiệu quả hơn nếu ngôn ngữ yêu cầu thông tin được bảo vệ bởi một màn hình?
Như tôi thấy, mô hình bộ nhớ cho chúng ta điều tồi tệ nhất của cả hai thế giới, nhu cầu tuyệt đối để đồng bộ hóa, ngay cả khi sự kết hợp bộ nhớ cache được đảm bảo trong phần cứng và mặt khác hiệu suất kém trên kiến trúc không mạch lạc (bộ nhớ cache đầy đủ). Vì vậy, không nên nó nghiêm ngặt hơn (yêu cầu thông tin được bảo vệ bởi một màn hình) hoặc mất nhiều hơn và hạn chế nền tảng tiềm năng để kiến trúc cache-mạch lạc?
Hiện tại, nó không có ý nghĩa gì đối với tôi. Ai đó có thể giải thích lý do tại sao mô hình bộ nhớ cụ thể này được chọn không?
EDIT: Việc sử dụng nghiêm ngặt và mất của tôi là một lựa chọn không tốt khi nhìn lại. Tôi đã sử dụng "nghiêm ngặt" đối với trường hợp có ít bảo lãnh hơn và "thua" đối diện. Để tránh nhầm lẫn, nó có thể tốt hơn để nói về đảm bảo mạnh hơn hoặc yếu hơn.
Một điều cần được nhận xét là câu lệnh "đồng bộ hóa trên cùng một màn hình". Khi tôi hiểu nó đồng bộ hóa trên cùng một màn hình đảm bảo trật tự thực hiện xung quanh màn hình đó. Tuy nhiên, về mặt bộ nhớ cache, việc thu thập khối _any_ đồng bộ buộc tải lại bộ đệm và giải phóng _any_ lock làm cho tất cả các ghi được ghi lại từ bộ nhớ CPU hoạt động. – Gray
Bạn đã lưu ý đến kiến trúc cụ thể nào? – curiousguy