Rengaspuskuri

Kohteesta Wikipedia
Loikkaa: valikkoon, hakuun

Rengaspuskuri on tapa käyttää tietokoneen muistia. Rengas-sanalla viitataan tapaan, jolla tiedon tallennus- ja lukupaikka kiertää puskuria. Tallennettaessa tietoa puskuriin kirjoituspaikka etenee kohti puskurin loppua. Kun kirjoituspaikka ylittää puskurin koon, se siirtyy takaisin alkuun. Tiedon lukukohta liikkuu samalla tavalla eteenpäin palaten alkuun puskurin lopussa.

Käyttökohteita[muokkaa | muokkaa wikitekstiä]

Rengaspuskuria voidaan käyttää esimerkiksi muuntamaan tietovirtaa, joka saadaan pakettiverkon yli vaihtelevalla nopeudella muotoon, josta kiinteällä nopeudella sitä kuluttava käsittelijä saa aina samalla viiveellä seuraavan alkion käsittelyyn.

Pakettiverkossa paketit voivat saapua eri järjestyksessä ja eri aikoina eri reittejä käyttäen, josta johtuen käytännön toteutukset voivat käyttää useita muistilohkoja rengaspuskurina.[1]

Esimerkkitoteutus[muokkaa | muokkaa wikitekstiä]

Esimerkissä on C-kielellä tehtynä yksinkertainen rengaspuskuritoteutus, jossa on käytetty kolmea apumuuttujaa (read_position, write_position ja buffer_len) rengaspuskurin sisäiseen kirjanpitoon. Esimerkkitoteutus lukee ja kirjoittaa tietoa merkki kerrallaan puskuriin.

#include <stdio.h>

#define BUFFER_SIZE 10

char buffer_data[BUFFER_SIZE];
int read_position=0;
int write_position=0;
int buffer_len=0;

int ringbuffer_insert(char data){
    if( buffer_len < BUFFER_SIZE){
      buffer_data[write_position]=data;
      buffer_len++;
      if(++write_position==BUFFER_SIZE){
        write_position=0;
      }
      return 1;
    }
    return 0;
  }

int ringbuffer_read(char* data){
    if(buffer_len>0){
        *data=buffer_data[read_position];
        buffer_len--;
        if(++read_position==BUFFER_SIZE){
          read_position=0;
        }
      return 1;
    }
    return 0;
}

Optimointi[muokkaa | muokkaa wikitekstiä]

Rengaspuskuritoteutuksesta saa puristettua pois muutaman if-lauseen ja apumuuttujan, jos puskurin koko on 2:n potenssi (2, 4, 8, 16, jne.). Tällöin ei tarvita ehtoa, jossa testataan, vuotaako puskuri seuraavaksi yli, vaan voidaan käyttää bittimaskia ja vapaasti eteenpäin juoksevia luku- ja kirjoituspaikkalaskureita.

Katso myös[muokkaa | muokkaa wikitekstiä]

Lähteet[muokkaa | muokkaa wikitekstiä]

  1. Dan Siemon: Queueing in the Linux Network Stack 23.9.2013. Linux Journal. Viitattu 26.3.2018.
Tämä tietotekniikkaan liittyvä artikkeli on tynkä. Voit auttaa Wikipediaa laajentamalla artikkelia.