Circular Buffer Uygulaması: Sabit Bellek ile Hızlı Veri Depolama
Circular buffer, sabit boyutlu bir dizide verileri döngüsel olarak depolayan bir veri yapısıdır. Bellek kullanımı önceden belli olduğu için gömülü sistemlerde ve yüksek performans gerektiren uygulamalarda sıkça kullanılır. Yeni veri geldiğinde en eski veriyi otomatik olarak üzerine yazar.
Bu teknik özellikle ses işleme, ağ paketleme ve sensör verilerinde işe yarar. Dinamik bellek ayırma olmadığı için bellek parçalanması sorunu yaşanmaz.
1#include <stdio.h>2#include <stdlib.h>3#include <string.h>45typedef struct {6int *buffer;7int capacity;8int head; // yazma konumu9int tail; // okuma konumu10int count; // dolu eleman sayısı11} CircularBuffer;1213CircularBuffer* create_buffer(int size) {14CircularBuffer *cb = malloc(sizeof(CircularBuffer));15cb->buffer = malloc(size * sizeof(int));16cb->capacity = size;17cb->head = 0;18cb->tail = 0;19cb->count = 0;20return cb;21}2223void enqueue(CircularBuffer *cb, int value) {24cb->buffer[cb->head] = value;25cb->head = (cb->head + 1) % cb->capacity;2627if (cb->count < cb->capacity) {28cb->count++;29} else {30cb->tail = (cb->tail + 1) % cb->capacity;31}32}3334int dequeue(CircularBuffer *cb) {35if (cb->count == 0) {36printf("Buffer boş!\n");37return -1;38}3940int value = cb->buffer[cb->tail];41cb->tail = (cb->tail + 1) % cb->capacity;42cb->count--;43return value;44}4546void print_buffer(CircularBuffer *cb) {47printf("Buffer içeriği: ");48for (int i = 0; i < cb->count; i++) {49int idx = (cb->tail + i) % cb->capacity;50printf("%d ", cb->buffer[idx]);51}52printf("\n");53}5455int main() {56CircularBuffer *cb = create_buffer(5);5758enqueue(cb, 10);59enqueue(cb, 20);60enqueue(cb, 30);61enqueue(cb, 40);62enqueue(cb, 50);63print_buffer(cb); // 10 20 30 40 506465enqueue(cb, 60); // 10 üzerine yazılır66print_buffer(cb); // 20 30 40 50 606768printf("Çıkış: %d\n", dequeue(cb)); // 2069print_buffer(cb); // 30 40 50 607071free(cb->buffer);72free(cb);73return 0;74}Beklenen çıktı:
1Buffer içeriği: 10 20 30 40 502Buffer içeriği: 20 30 40 50 603Çıkış: 204Buffer içeriği: 30 40 50 60Kodda `head` yazma, `tail` okuma konumunu gösterir. Modulo operatörü (%) ile dizinin sonuna ulaşınca başa döneriz. Buffer doluyken yeni veri gelirse en eski veri otomatik silinir.
Sık yapılan hata: Kapasite kontrolü yapmadan `enqueue` çağrısı yapıp buffer overflow'a neden olmak. Yukarıdaki kod bunu otomatik yönetir, ama gerçek uygulamada hata kontrolleri ekleyin.
0 yorum