Gần đây tôi đã quan tâm đến vấn đề chung là tối ưu hóa việc sử dụng bộ nhớ trong tình huống có nhiều loại bộ nhớ khả dụng và có sự đánh đổi giữa dung lượng của một phân đoạn bộ nhớ nhất định và tốc độ truy cập của nó.
Ví dụ quen thuộc là một chương trình quyết định khi nào đọc / ghi vào bộ đệm, RAM và ổ cứng của bộ xử lý (thông qua bộ nhớ ảo).
Tôi đặc biệt quan tâm đến trường hợp đặc biệt khi lượng dữ liệu (bao gồm cả chính chương trình) cần được tải vượt quá khả năng lưu trữ nhanh nhất có sẵn (tức là giải pháp tầm thường của "chỉ cần tải lên mọi thứ" là không thể áp dụng được).
Tôi thấy rằng một trang Wikipedia mô tả một số thuật toán bộ đệm phổ biến, gần như là những gì tôi muốn. Thật không may, đây là một mức độ thấp:
- Nhiều, chẳng hạn như LRU hoặc MRU chỉ có ý nghĩa nếu bạn có chương trình con được truy cập nhiều lần. Nếu tôi có một chương trình có số lượng chương trình con lớn, một số chương trình không bao giờ được truy cập trong một lần chạy nhất định và một số trong số chúng được truy cập một hoặc hai lần, chiến lược này sẽ không bao giờ hoạt động vì nó không thể xây dựng đủ dữ liệu về những gì thường được sử dụng và những gì không.
- Những người khác, chẳng hạn như CLOCK, dường như đối phó với các đặc thù của việc thực hiện, thay vì thực sự tấn công vào gốc rễ của vấn đề.
- Tôi biết có một chiến lược trong đó lần đầu tiên cấu hình một chương trình trong quá trình chạy thử, sau đó cung cấp cấu hình cho hệ điều hành để tối ưu hóa cho phù hợp. Tuy nhiên, chúng ta vẫn phải giải quyết vấn đề cung cấp một "ví dụ sử dụng" thực sự đại diện trong khi xây dựng hồ sơ.
Điều tôi thực sự muốn tìm hiểu là: Khi chúng ta trừu tượng hóa tất cả các kỹ thuật của phần cứng và phần mềm, và nói trong một bối cảnh lý thuyết thuần túy, có thể bằng cách nào đó phân tích cấu trúc của một thuật toán, để đưa ra chiến lược bộ đệm hiệu quả cho nó dựa trên sự hiểu biết cấp cao về những gì thuật toán đang làm?