Halka tampon (ring buffer, circular buffer) sınırlı bellekli sistemlerde, cihaz sürücülerinde, ağlarda ve çoklu görevli sistemlerde sıkça kullanılmaktadır. Bu kavram, belleği optimum şekilde kullanmanın önemli olduğu işletim sistemlerinin erken aşamalarında kullanılmıştır; elemanların çıkarılmasının ardından kaydırılması için kaynak harcamaktan kaçınılmıştır.
Tipik zorluklar; "tamamlanmış tampon" ve "boş tampon" koşullarının doğru işlenmesi, veri üzerine yazmaya karşı koruma eksikliği, çoklu iş parçacığı durumlarında karmaşık senkronizasyon. Sınırların karışması ve indekslerin yanlış kontrolü durumunda hatalar mümkündür.
Halka tampon nesnesi, bir dizi, iki indeks (head ve tail) ile, gerekirse, "dolu" ve "boş" durumlarını ayırt etmek için bir sayıcı değişken veya ek mantık ile uygulanır. Okuma ve yazma işlemleri tampon boyutunun modülü ile yapılır.
#define BUF_SIZE 8 char buffer[BUF_SIZE]; int head = 0, tail = 0; // head - yazılan, tail - okunan // Yazma if (((head + 1) % BUF_SIZE) != tail) { buffer[head] = data; head = (head + 1) % BUF_SIZE; } else { // Tampon dolu } // Okuma if (head != tail) { char d = buffer[tail]; tail = (tail + 1) % BUF_SIZE; }
Anahtar özellikler:
Boş bir tampon ile tamamen dolu bir tamponu nasıl ayırt edersiniz?
Genellikle head == tail ile boş tampon belirlenir. Dolu tampona ise bir hücrenin kullanılmamasını sağlamak veya eleman sayısını açık bir sayıcıda saklamak gerekebilir.
Tamponu çoklu iş parçacığı ortamında kilitleme olmadan kullanabilir miyiz?
Hayır, standart durumda aynı anda okuma ve yazma işlemlerinde yarış koşulları mümkündür. Ya atomik işlemler kullanılmalı ya da kilitlemeler gereklidir.
Eğer head veya tail üzerinde taşma kontrolü yapılmazsa ne olur?
Taşma durumunda dizinin sınırlarının dışına çıkılır ki bu da tanımsız bir davranışa ve olası bellek bozulmasına yol açar.
Geliştirici, head == tail'ı hem "boş" hem de "dolu" olarak yorumlayan bir halka tampon uyguladı, bu da taşma sinyalinin kaybolmasına neden oldu.
Artılar:
Eksiler:
Bunun yerine, head'in asla tamamen tail'i yakalamaması için bir eleman sayıcı değişkeni veya bir slot ayırma eklendi.
Artılar:
Eksiler: