Thuật toán thay thế bộ đệm hiệu quả nhất [đã đóng]


12

Wikipedia liệt kê 11 thuật toán thay thế bộ đệm . Giả sử tôi gần như không biết gì về ứng dụng mà tôi sẽ phát triển, tôi nên sử dụng thuật toán thay thế bộ đệm "mặc định" nào?

Nếu tôi nhớ lại chính xác từ khóa học HĐH của mình, thì LRU là thuật toán thay thế bộ đệm chung tốt nhất. Nhưng có lẽ tôi đã nhầm.

Ngoài ra, đây là một chút của một câu hỏi học thuật, vì, nói chung, bộ nhớ chính là rẻ và phong phú và tôi thực sự không cần phải lo lắng về kích thước bộ đệm quá nhiều.


1
Việc tìm nạp trước có liên quan đến ứng dụng của bạn không? Nếu vậy, chiến lược tìm nạp trước và giữ lại phải được xem xét cùng nhau khi chọn thuật toán.
rwong

Bạn sẽ cần lấy các dấu vết mẫu (danh sách các mẫu truy cập dữ liệu) đại diện cho miền ứng dụng dự định của bạn. Bạn có thể tìm thấy các bộ kiểm tra có sẵn công khai từ nghiên cứu học thuật. Sau đó, bạn có thể thực hiện từng thuật toán, thực hiện mô phỏng và báo cáo kết quả của mình. Không, sử dụng LRU với sự thay thế ngẫu nhiên.
rwong

1
Nếu bạn "biết hầu như không có gì về các ứng dụng", thì đến nay còn quá sớm để nghĩ về thuật toán "hiệu quả" thay thế bộ nhớ cache.
Anon

Bộ nhớ chính có thể rẻ, nhưng nếu hiệu suất là một vấn đề quan trọng, hiệu quả truy cập sẽ có vấn đề. Tôi không nghĩ bạn có thể chọn chiến lược thay thế bộ đệm của mình - cho dù bạn là kiến ​​trúc sư trưởng của một máy tính mới. Phần còn lại của chúng tôi nhận được bất cứ điều gì thị trường cung cấp. Nếu bạn cần đi nhanh, bạn cần tổ chức tính toán và cấu trúc dữ liệu để sử dụng hiệu quả hệ thống phân cấp bộ nhớ.
Omega Centauri

1
@Omega Centauri Bạn chỉ nghĩ về bộ nhớ CPU, nhưng còn nhiều hơn thế. Bộ nhớ cache hệ điều hành đã sử dụng các tệp và thư mục, cơ sở dữ liệu lưu trữ dữ liệu của họ, gần như mỗi ứng dụng thực hiện rất nhiều bộ đệm (ví dụ: kết quả đã được tính toán).
maaartinus

Câu trả lời:


15

Tôi đoán câu trả lời tốt nhất là nó phụ thuộc. Theo kinh nghiệm của tôi, có rất nhiều yếu tố đi vào việc chọn thuật toán lưu trữ.

Các yếu tố cần xem xét

  1. Đọc / ghi số dư. (Tỷ lệ truy cập được đọc so với ghi)
  2. Số lượng bộ nhớ cache.
  3. Loại phương tiện đằng sau bộ đệm. (Chúng có phải là ổ đĩa chậm SATA hay ổ SSD nhanh không?)
  4. Lượt vs hoa hậu. (Mức độ thường xuyên được viết lại hoặc đọc lại?)
  5. Kích thước truy cập trung bình (Điều này đi vào chọn kích thước trang)
  6. Làm thế nào đắt tiền được đọc và viết.

Khi bạn xem xét tất cả các yếu tố khác nhau, sau đó bạn cần tìm một thuật toán bộ đệm xử lý tốt nhất. Ví dụ, nói rằng bạn có một ứng dụng có rất nhiều ghi, một số viết lại, đọc dữ liệu được viết gần đây và một số loại phương tiện quay. Trong trường hợp này, bạn sẽ muốn một loại thuật toán bộ nhớ đệm lai. Để xử lý dữ liệu ghi, bạn có thể muốn một cái gì đó như Wise order of Writes (WOW) và thuật toán LRU cho dữ liệu đã được đọc từ đĩa. Lý do cho điều này là các truy cập đĩa rất tốn kém và thuật toán WOW sẽ giúp việc ghi dữ liệu hiệu quả hơn và LRU sẽ giữ dữ liệu thường xuyên truy cập luôn trong bộ nhớ cache.

Giả sử bạn có đĩa SSD, có thời gian truy cập rất nhanh, bạn có thể muốn đưa sự lựa chọn của mình vào thuật toán LRU vì truy cập đĩa tương đối rẻ.

Vì vậy, thực sự những gì tôi muốn nói là không có câu trả lời "tốt nhất". Câu trả lời tốt nhất là biết các yếu tố áp dụng cho bạn và chọn một thuật toán xử lý chúng tốt nhất.

Cách tìm thuật toán cho bạn

Hồ sơ hệ thống của bạn. Điều này thường liên quan đến việc thêm mã để giữ số liệu thống kê cho truy cập bộ nhớ. Bằng cách định hình bạn có thể thấy yếu tố nào là quan trọng nhất đối với bạn.

Trước đây tôi đã thêm mã để theo dõi tất cả các truy cập bộ nhớ trong một khoảng thời gian. Sau đó tôi tìm mẫu. Tôi tìm đọc lại, viết lại, truy cập tuần tự, truy cập ngẫu nhiên, v.v.

Một khi bạn đã xác định được những điều quan trọng, bạn cần xem xét tất cả các loại thuật toán lưu trữ khác nhau để xem xử lý nào là tốt nhất.


Sự phá vỡ lớn của các yếu tố. Nhưng tôi không chắc chắn làm thế nào để áp dụng chúng, vì tôi biết miền ứng dụng và các yếu tố.
tro999

@ashes: Có kỹ thuật kỹ thuật cũ: xây dựng một vài cách khác nhau và đo lường cái nào hoạt động tốt nhất.
Donal Fellows

Khi tôi nghe "cache", tôi nghĩ đến việc lưu trữ giữa bộ nhớ và các thanh ghi CPU. Ở đây bạn đang nói về bộ đệm đĩa, là một lớp nằm giữa bộ nhớ và một hoặc nhiều thiết bị i / o.
Omega Centauri

@ barrem23 Nếu bạn đang thực hiện lập trình phân tán, cũng cần xem xét "khoảng cách giữa bộ nhớ cache và bộ lưu trữ phía sau". Không thành vấn đề, nhiều lắm, nếu bạn có ổ SSD hoặc bị rỉ sét vì dung lượng lưu trữ lớn, ổn định của bạn nếu dung lượng lưu trữ cách xa 15 ms, bạn sẽ luôn phải chịu một chuyến đi khứ hồi tối thiểu 30 ms.
Vatine

9

Giả sử bạn gần như không biết gì về ứng dụng bạn sẽ phát triển, bạn nên biết thêm về nó trước khi thực sự chọn và triển khai hệ thống bộ đệm. Nói cách khác, không có triển khai mặc định: một số tốt cho một số mục đích và hoàn toàn xấu cho những mục đích khác .

Ví dụ, chỉ mất hai lần thực hiện: Ít nhất được sử dụng gần đây và ít được sử dụng nhất. Làm thế nào để quyết định sử dụng cái nào trước cái khác?

  • LRU rất tốt khi bạn khá chắc chắn rằng người dùng sẽ thường xuyên truy cập vào các mục gần đây nhất và không bao giờ hoặc hiếm khi quay lại các mục cũ. Một ví dụ: cách sử dụng chung của ứng dụng khách email. Trong hầu hết các trường hợp, người dùng liên tục truy cập các thư gần đây nhất. Họ đọc chúng, hoãn lại, quay lại sau vài phút, vài giờ hoặc vài ngày, v.v. Họ có thể thấy mình đang tìm kiếm một thư họ nhận được hai năm trước, nhưng nó xảy ra ít thường xuyên hơn so với việc truy cập thư họ nhận được trong hai giờ qua.

  • Mặt khác, LRU không có ý nghĩa gì trong bối cảnh người dùng sẽ truy cập một số mặt hàng thường xuyên hơn nhiều so với các mặt hàng khác. Một ví dụ: Tôi thường xuyên nghe nhạc tôi thích, và có thể xảy ra rằng trên 400 bài hát, tôi sẽ nghe cùng một năm ít nhất một lần mỗi tuần, trong khi tôi sẽ nghe nhiều nhất một lần mỗi năm 100 bài hát tôi không thích nhiều Trong trường hợp này, LFU thích hợp hơn nhiều.

Bằng cách chỉ thực hiện hai trong số các triển khai, bạn sẽ thấy rằng không có thuật toán "mặc định" nào bạn có thể sử dụng khi bạn không muốn nghĩ về cái nào tốt hơn hoặc không có đủ thông tin về ứng dụng. Cũng giống như hỏi theo mặc định, bạn phải cộng, trừ, nhân hoặc chia hai số để tìm kết quả của phép tính khi bạn không biết gì về nó.


Ok, vậy làm cách nào để chọn một thuật toán? Chạy qua danh sách của Wikipedia và xem điều gì làm cho phù hợp nhất?
tro999

@ tro999: chính xác! Đầu tiên, bạn tìm hiểu thêm về các yêu cầu của ứng dụng cần thực hiện, sau đó bạn phân tích ưu và nhược điểm của các thuật toán bộ đệm khác nhau và cuối cùng bạn chọn cái phù hợp hơn.
Arseni Mourzenko

3

Tại sao chỉ giới hạn lựa chọn của bạn cho Wikipedia? Nếu bạn có quyền truy cập vào cơ sở dữ liệu nghiên cứu như Thư viện số ACM, bạn sẽ tìm thấy nhiều thuật toán hơn nữa. Cũng cần lưu ý về việc gây rối với các bằng sáng chế. Ví dụ ARC là một thuật toán tốt nhưng thật không may, nó được cấp bằng sáng chế.


2

Bạn có thể dành nhiều thời gian để thống nhất thuật toán 'tốt nhất' hoặc bạn chỉ có thể thực hiện một thuật toán đơn giản và NHẬN ĐƯỢC VỚI REST CỦA HỆ THỐNG. Khi bạn có một cái gì đó có thể kiểm tra được thì lo lắng về thuật toán.

Tối ưu hóa sớm ...


0

Không có thuật toán bộ đệm hoàn hảo - bạn luôn có thể tìm thấy một trường hợp hành xử rất tệ.

Do đó, điều quan trọng là phải biết vấn đề đang được lưu trữ để xác định vấn đề sẽ hành xử ít tệ nhất.

Ngoài ra, bạn nên xem xét thời gian bạn cần lưu trữ bộ nhớ cache và thời gian bạn có thể lưu trữ bộ nhớ cache ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.