2010-03-31 39 views
16

Một số ứng dụng của bộ đệm tròn là gì?Sử dụng bộ đệm tròn là gì?

Lợi ích của việc sử dụng bộ đệm tròn là gì?

đây có phải là giải pháp thay thế cho danh sách được liên kết kép không?

Trả lời

26

Tôi đã sử dụng nó cho nhật ký trong bộ nhớ có kích thước bị hạn chế. Ví dụ, ứng dụng sẽ viết các mục nhật ký trong khi xử lý các yêu cầu của người dùng. Bất cứ khi nào một ngoại lệ xảy ra (điều đó sẽ gây rối cho quá trình xử lý), các bản ghi nhật ký hiện tại trong bộ nhớ sẽ được bán cùng với nó.

Lợi ích của bộ đệm tròn là bạn không cần một lượng bộ nhớ vô hạn, vì các mục nhập cũ hơn bị tự động ghi đè. Các "challange" là, bạn cần phải tìm một kích thước phù hợp cho usecase của bạn. Trong ví dụ trên, sẽ rất không may khi bản ghi nhật ký có thông tin quan trọng nhất về ngoại lệ sẽ bị ghi đè.

Một số hệ thống/ứng dụng có công cụ để cho phép bạn trích xuất nội dung hiện tại của bộ đệm theo yêu cầu và không chỉ khi nó được trích xuất tự động (nếu có).

Tôi tin rằng ETW và CLRs stress log, trong số nhiều dấu vết/ghi nhật ký của hạt nhân hoặc hệ thống khác, được triển khai theo cách đó. Khái niệm về việc sử dụng bộ đệm như vậy để truy tìm/ghi trong bộ nhớ thực sự khá phổ biến (không phải là đây là sử dụng duy nhất - chắc chắn là không), bởi vì nó nhanh hơn so với bản ghi bằng văn bản cho một tệp/cơ sở dữ liệu bạn có thể không bao giờ quan tâm trừ khi xảy ra lỗi. Và trên một lưu ý liên quan, nó bảo tồn không gian đĩa cứng.

+8

+1 cho "Tôi đã sử dụng nó cho .. "thay vì" Bạn có thể sử dụng nó cho .. " – ryeguy

6

Tôi biết điều này là gian lận, nhưng wikipedia không có giải thích rất tốt.

http://en.wikipedia.org/wiki/Circular_buffer

Một đệm tròn, đệm cyclic hoặc vòng đệm là một cấu trúc dữ liệu mà sử dụng duy nhất, cố định kích thước bộ đệm như thể nó được kết nối end-to-end. cấu trúc này vay chính nó một cách dễ dàng để dữ liệu đệm suối

Một ví dụ mà có thể có thể sử dụng một ghi đè lên đệm tròn là với đa phương tiện. Nếu bộ đệm được sử dụng làm bộ đệm bị chặn trong số vấn đề người tiêu dùng sản xuất thì đó là có thể là mong muốn đối với nhà sản xuất (ví dụ: bộ tạo âm thanh) tới ghi đè dữ liệu cũ nếu người tiêu dùng (ví dụ: card âm thanh) không thể trong giây lát theo kịp. Ví dụ khác là phương pháp tổng hợp ống dẫn sóng kỹ thuật số phương pháp sử dụng bộ đệm tròn để mô phỏng hiệu quả âm thanh của chuỗi rung hoặc dụng cụ gió.

Liên quan so sánh với danh sách liên kết đôi, tôi tưởng tượng nó thực sự phụ thuộc vào những gì bạn đang sử dụng danh sách ... Thực hiện bộ đệm có vẻ phức tạp hơn, vui lòng tham khảo wiki trang; điều này giải thích việc thực hiện, cân nhắc vv và cũng cho thấy mã ví dụ.

Xin cảm ơn, Neil

+0

Câu trả lời cho câu hỏi SO đầu tiên của tôi đã sử dụng bộ đệm tròn cho trình tạo âm thanh http://stackoverflow.com/questions/664594/how-to-generate-a-guitar-note –

5

Đệm tròn là cơ chế tốt để duy trì danh sách giá trị/vật phẩm trượt/di chuyển một cách hiệu quả theo kiểu đặt hàng. Một ví dụ có thể là duy trì mức trượt trung bình của N mục cuối cùng. Giả sử bạn muốn theo dõi chi phí trung bình của 100 hoạt động tính toán một số giá trị cuối cùng. Để làm điều này, bạn sẽ cần phải loại bỏ chi phí lâu đời nhất và thêm vào chi phí mới nhất.

Nếu không có bộ đệm tròn, cơ chế tốn kém để thực hiện việc này (kiểu C) sẽ có một mảng gồm 100 phần tử. Mỗi khi một chi phí mới được tính toán, bạn có thể ghi nhớ 99 phần tử xuống và đặt phần tử mới vào vị trí cuối cùng. Điều này rõ ràng là tốn kém. Sử dụng ý tưởng bộ đệm tròn, bạn sẽ chỉ theo dõi “kết thúc” của bộ đệm (vị trí 0-99). Nó sẽ đánh dấu vị trí của vật phẩm lâu đời nhất (hoặc mới nhất ... bất cứ cái gì bạn chọn). Sau khi đọc giá trị cũ (để cập nhật giá trị trung bình đang chạy), bạn thay thế nó bằng giá trị mới nhất và tăng vị trí bộ đệm (nếu nó ở mức 99, bạn đặt nó về 0… do đó, phần tròn).

So sánh nó với danh sách được liên kết kép không thực sự hợp lý. Một bộ đệm vòng tròn chắc chắn có thể được thực hiện với một danh sách liên kết kép (hoặc thậm chí một danh sách liên kết đơn lẻ). Nhưng so sánh chúng là một chút giống như so sánh táo và cam để nói chuyện.

0

Tôi đã sử dụng nó như một cách dễ dàng để thực hiện lập kế hoạch round-robin. Về cơ bản tôi đã có một loạt các đối tượng khác nhau có thể tạo ra một giá trị mà người tiêu dùng có thể xử lý. Tôi mắc kẹt tất cả các nhà sản xuất trong một chiếc nhẫn và hỏi từng người một.

0

Tôi đã sử dụng bộ đệm vòng trong mã đa luồng. Về cơ bản, nếu tất cả các khe đều đầy (các) nhà sản xuất phải đợi. Người tiêu dùng chỉ cần xử lý các mục trong các khe có "đầy đủ".

Đây là chuỗi tôi đã bắt đầu. Nó có một số lời khuyên tốt về việc thực hiện.

.NET multi-threaded variable access

11

Thông tư vùng đệm là tốt cho dòng dữ liệu nối tiếp trong các hệ thống nhúng. Vi điều khiển thường có một UART để xử lý một byte nối tiếp đến, những cần phải được lưu trữ theo thứ tự và xử lý sau (byte thường đi vào với tốc độ nhanh hơn so với chúng có thể được xử lý).

Bộ đệm chia tách hiệu quả phản hồi thời gian quan trọng cần thiết (khi byte đến, tính bằng micro giây) đến phản hồi không đúng thời gian tới toàn bộ thông báo (ví dụ hiển thị thông báo xuất hiện, tính bằng mili giây), ví dụ: :

1) Khi nhận được byte, UART có thể tạo ra ngắt mà phần mềm phản hồi bằng cách lấy nhanh byte đã nhận và đẩy nó vào cuối bộ đệm.

2) Các thói quen phần mềm nền sau đó có thể thường xuyên kiểm tra xem bộ đệm có bất kỳ thứ gì trong đó chưa và làm trống nó theo yêu cầu.

Do kích thước bộ đệm tròn có thể được xác định trước khi biên dịch, kích thước sẽ bị giới hạn. Điều này giúp cải thiện hiệu quả không gian và nên loại bỏ tham nhũng bộ nhớ tại một giao dịch giảm đến mức có thể nhận được bao nhiêu byte trước khi dữ liệu bắt đầu bị mất.

Các vấn đề liên quan