Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > pl.comp.programming > #28146 > unrolled thread

Struktura do przydzielania numerków

Started byBorneq <borneq@antyspam.hidden.pl>
First post2015-12-04 15:04 +0100
Last post2015-12-06 11:29 +0100
Articles 20 on this page of 25 — 5 participants

Back to article view | Back to pl.comp.programming


Contents

  Struktura do przydzielania numerków Borneq <borneq@antyspam.hidden.pl> - 2015-12-04 15:04 +0100
    Re: Struktura do przydzielania numerków Adam M <amorawski@magna-power.com> - 2015-12-04 06:16 -0800
    Re: Struktura do przydzielania numerków Borneq <borneq@antyspam.hidden.pl> - 2015-12-04 15:19 +0100
      Re: Struktura do przydzielania numerków Adam M <amorawski@magna-power.com> - 2015-12-04 06:51 -0800
        Re: Struktura do przydzielania numerków Borneq <borneq@antyspam.hidden.pl> - 2015-12-04 16:17 +0100
          Re: Struktura do przydzielania numerków Adam M <amorawski@magna-power.com> - 2015-12-04 11:10 -0800
            Re: Struktura do przydzielania numerków "M.M." <mmarszik@gmail.com> - 2015-12-04 11:17 -0800
            Re: Struktura do przydzielania numerków Borneq <borneq@antyspam.hidden.pl> - 2015-12-04 23:30 +0100
              Re: Struktura do przydzielania numerków bartekltg <bartekltg@gmail.com> - 2015-12-05 00:49 +0100
                Re: Struktura do przydzielania numerków Borneq <borneq@antyspam.hidden.pl> - 2015-12-05 09:37 +0100
                  Re: Struktura do przydzielania numerków bartekltg <bartekltg@gmail.com> - 2015-12-06 17:26 +0100
                    Re: Struktura do przydzielania numerków Borneq <borneq@antyspam.hidden.pl> - 2015-12-06 19:47 +0100
                      Re: Struktura do przydzielania numerków bartekltg <bartekltg@gmail.com> - 2015-12-07 03:09 +0100
                        Re: Struktura do przydzielania numerków Borneq <borneq@antyspam.hidden.pl> - 2015-12-07 10:31 +0100
                    Re: Struktura do przydzielania numerków Borneq <borneq@antyspam.hidden.pl> - 2015-12-07 01:05 +0100
                      Re: Struktura do przydzielania numerków bartekltg <bartekltg@gmail.com> - 2015-12-07 03:13 +0100
    Re: Struktura do przydzielania numerków "M.M." <mmarszik@gmail.com> - 2015-12-04 08:21 -0800
    Re: Struktura do przydzielania numerków Adam Klobukowski <adamklobukowski@gmail.com> - 2015-12-04 08:31 -0800
      Re: Struktura do przydzielania numerków "M.M." <mmarszik@gmail.com> - 2015-12-04 09:13 -0800
      Re: Struktura do przydzielania numerków Adam M <amorawski@magna-power.com> - 2015-12-04 10:58 -0800
    Re: Struktura do przydzielania numerków bartekltg <bartekltg@gmail.com> - 2015-12-05 00:45 +0100
      Re: Struktura do przydzielania numerków "M.M." <mmarszik@gmail.com> - 2015-12-05 03:44 -0800
    Re: Struktura do przydzielania numerków Borneq <borneq@antyspam.hidden.pl> - 2015-12-06 10:12 +0100
      Re: Struktura do przydzielania numerków Borneq <borneq@antyspam.hidden.pl> - 2015-12-06 10:21 +0100
      Re: Struktura do przydzielania numerków Borneq <borneq@antyspam.hidden.pl> - 2015-12-06 11:29 +0100

Page 1 of 2  [1] 2  Next page →


#28146 — Struktura do przydzielania numerków

FromBorneq <borneq@antyspam.hidden.pl>
Date2015-12-04 15:04 +0100
SubjectStruktura do przydzielania numerków
Message-ID<n3s6h0$itv$1@node2.news.atman.pl>
Każdy zasób określony jest przez numer z zakresu <a,b), bez miany 
ogólności możemy przyjąć że zakres jest <0,n) gdzie n=b-a.
N jest duże, np. dwa miliony, więc nie ma obaw że zabraknie zasobów, n 
to ilość ile może być zasobów JEDNOCZEŚNIE. Ale gdy zwolnimy jakiś 
zasób, jego numer może zostać przydzielony znowu.
Choć duże n, to może się skończyć, gdy będziemy przydzielać, zwalniać i 
zwiększać k.
Są dwie strategie: albo przydzielać zawsze najniższy wolny numer, albo 
cały czas inkrementować k, przydzielać najwyższy numer, aż gdy k 
osiągnie n, wtedy zawinie się od początku. Jak jest lepiej?
Jaka struktura? Czy trzymać listę raczej wolnych czy raczej zajętych 
numerów? Gdy będzie mało wykorzystane, oszczędniej trzymać raczej listę 
zajętych, ale listę wolnych może lepiej szukać?
Dodatkowo potrzebne jeszcze mutexy, aby nie przydzielić dwa razy tego 
samego numeru przy pracy na wątkach.
Jaka struktura i algorytm wydajnie wyszuka wolny numer?

[toc] | [next] | [standalone]


#28147

FromAdam M <amorawski@magna-power.com>
Date2015-12-04 06:16 -0800
Message-ID<fb7b8b8e-326f-4d7a-951f-f914d26928d8@googlegroups.com>
In reply to#28146
Do trzymania informacji o zajetych numerach (zasobach) nie potrzeba zadnej listy - wystarczy int lub long int. Kazdy bit identyfikuje zajety zasob. Binarne sprawdzanie zajetosci bitu. Jesli system ma bardzo malo pamieci trzeba sobie jakos radzic - lista zjadla by cale zasoby ;-)

Do wyszukiwania wolnego miejsca - wyszukiwanie polowkowe i rolowanie bitow w prawo lub lewo jak kto woli ;-)

On Friday, December 4, 2015 at 9:04:17 AM UTC-5, Borneq wrote:
> Każdy zasób określony jest przez numer z zakresu <a,b), bez miany 
> ogólności możemy przyjąć że zakres jest <0,n) gdzie n=b-a.
> N jest duże, np. dwa miliony, więc nie ma obaw że zabraknie zasobów, n 
> to ilość ile może być zasobów JEDNOCZEŚNIE. Ale gdy zwolnimy jakiś 
> zasób, jego numer może zostać przydzielony znowu.
> Choć duże n, to może się skończyć, gdy będziemy przydzielać, zwalniać i 
> zwiększać k.
> Są dwie strategie: albo przydzielać zawsze najniższy wolny numer, albo 
> cały czas inkrementować k, przydzielać najwyższy numer, aż gdy k 
> osiągnie n, wtedy zawinie się od początku. Jak jest lepiej?
> Jaka struktura? Czy trzymać listę raczej wolnych czy raczej zajętych 
> numerów? Gdy będzie mało wykorzystane, oszczędniej trzymać raczej listę 
> zajętych, ale listę wolnych może lepiej szukać?
> Dodatkowo potrzebne jeszcze mutexy, aby nie przydzielić dwa razy tego 
> samego numeru przy pracy na wątkach.
> Jaka struktura i algorytm wydajnie wyszuka wolny numer?

[toc] | [prev] | [next] | [standalone]


#28148

FromBorneq <borneq@antyspam.hidden.pl>
Date2015-12-04 15:19 +0100
Message-ID<n3s7d4$js6$1@node2.news.atman.pl>
In reply to#28146
W dniu 2015-12-04 o 15:04, Borneq pisze:
> Jaka struktura i algorytm wydajnie wyszuka wolny numer?

Nasuwa się struktura bitowa, choć dużo numerów, to tylko po bicie na 
jeden. Gdy dużo wolnego, to szybko znajdzie wolne, gdy prawie cała 
zajęta będzie musiał przeszukiwać tablicę aby znaleźć zero.
Może to zależeć od aktualnej liczy użytych:
- gdy mało użytych - wtedy lista użytych
- gdy dużo,ale mniej niż np. połowa - tablica bitowo
- gdy więcej niż połowa - lista wolnych

[toc] | [prev] | [next] | [standalone]


#28149

FromAdam M <amorawski@magna-power.com>
Date2015-12-04 06:51 -0800
Message-ID<304e402f-18c6-406c-901a-b412811bfcc9@googlegroups.com>
In reply to#28148
Dlaczego struktura bitowa raczej unia struktory bitowej z odpowiadajacym unsigned int lub unsigned long - to jest standardowe rozwiazanie np przy programowaniu MCUs
Aby znalezc wolny bit niezaleznie od zajetosci potrzeba cztery podzialy 32, 16, 8, 4 i 4 rolowania w najgorszym przypadku przy 32 bit int i 5 podzialow  i 4 rolowania przy 64 bit long.

On Friday, December 4, 2015 at 9:19:18 AM UTC-5, Borneq wrote:
> W dniu 2015-12-04 o 15:04, Borneq pisze:
> > Jaka struktura i algorytm wydajnie wyszuka wolny numer?
> 
> Nasuwa się struktura bitowa, choć dużo numerów, to tylko po bicie na 
> jeden. Gdy dużo wolnego, to szybko znajdzie wolne, gdy prawie cała 
> zajęta będzie musiał przeszukiwać tablicę aby znaleźć zero.
> Może to zależeć od aktualnej liczy użytych:
> - gdy mało użytych - wtedy lista użytych
> - gdy dużo,ale mniej niż np. połowa - tablica bitowo
> - gdy więcej niż połowa - lista wolnych

[toc] | [prev] | [next] | [standalone]


#28150

FromBorneq <borneq@antyspam.hidden.pl>
Date2015-12-04 16:17 +0100
Message-ID<n3sapd$trt$1@node1.news.atman.pl>
In reply to#28149
W dniu 2015-12-04 o 15:51, Adam M pisze:
> Dlaczego struktura bitowa raczej unia struktory bitowej z odpowiadajacym unsigned int lub unsigned long - to jest standardowe rozwiazanie np przy programowaniu MCUs
> Aby znalezc wolny bit niezaleznie od zajetosci potrzeba cztery podzialy 32, 16, 8, 4 i 4 rolowania w najgorszym przypadku przy 32 bit int i 5 podzialow  i 4 rolowania przy 64 bit long.

Jak wykonywać te podziały? zwykle przy połowie słowa liczy się tylko to 
młodsze.
czy będzie to tak a wewnątrz procedura inline szukaj_przesuwajac 
używająca << maksymalnie 4 razy?
uint32_t mask
if(mask)
{
   if (mask & 0x0000ffff) //16 młodszych
   {
     if (mask & 0x000000ff) //8 najmłodszych
     {
       if (mask & 0x0000000f) szukaj_przesuwajac
       else szukaj_przesuwajac
     }
     else
     {
       if (mask & 0x00000f00) szukaj_przesuwajac
       else szukaj_przesuwajac
     }
   }
   else
   {
     if (mask & 0x00ff0000) //8 najmłodszych
     {
       if (mask & 0x000f0000) szukaj_przesuwajac
       else szukaj_przesuwajac
     }
     else
     {
       if (mask & 0x0f000000) szukaj_przesuwajac
       else szukaj_przesuwajac
     }
   }
}

[toc] | [prev] | [next] | [standalone]


#28155

FromAdam M <amorawski@magna-power.com>
Date2015-12-04 11:10 -0800
Message-ID<f7d94ec9-21df-4757-82c7-6b5e7ca807f1@googlegroups.com>
In reply to#28150
On Friday, December 4, 2015 at 10:17:02 AM UTC-5, Borneq wrote:
> W dniu 2015-12-04 o 15:51, Adam M pisze:
> > Dlaczego struktura bitowa raczej unia struktory bitowej z odpowiadajacym unsigned int lub unsigned long - to jest standardowe rozwiazanie np przy programowaniu MCUs
> > Aby znalezc wolny bit niezaleznie od zajetosci potrzeba cztery podzialy 32, 16, 8, 4 i 4 rolowania w najgorszym przypadku przy 32 bit int i 5 podzialow  i 4 rolowania przy 64 bit long.
> 
> Jak wykonywać te podziały? zwykle przy połowie słowa liczy się tylko to 
> młodsze.
> czy będzie to tak a wewnątrz procedura inline szukaj_przesuwajac 
> używająca << maksymalnie 4 razy?
> uint32_t mask
> if(mask)
> {
>    if (mask & 0x0000ffff) //16 młodszych
>    {
>      if (mask & 0x000000ff) //8 najmłodszych
>      {
>        if (mask & 0x0000000f) szukaj_przesuwajac
>        else szukaj_przesuwajac
>      }
>      else
>      {
>        if (mask & 0x00000f00) szukaj_przesuwajac
>        else szukaj_przesuwajac
>      }
>    }
>    else
>    {
>      if (mask & 0x00ff0000) //8 najmłodszych
>      {
>        if (mask & 0x000f0000) szukaj_przesuwajac
>        else szukaj_przesuwajac
>      }
>      else
>      {
>        if (mask & 0x0f000000) szukaj_przesuwajac
>        else szukaj_przesuwajac
>      }
>    }
> }

Tka przy okazji, z czystej ciekawosci sie pytam na jakim systemie to mam byc implementowane - czy to tylko teoretyczne dewagacje - za wyjatkiem duzych web-serwerow i baz danych obslugujacych bardzo duze firmy (w tym przypadku sa dobrze znane rozwiazania jak radzic sobie z problemem) ciezko mi wyobrazic sobie system ktory uruchamia miliony watkow - nie mowiac juz o milionach zadan.

[toc] | [prev] | [next] | [standalone]


#28156

From"M.M." <mmarszik@gmail.com>
Date2015-12-04 11:17 -0800
Message-ID<f0a4dca1-6dda-45ed-8574-fc78c3308abc@googlegroups.com>
In reply to#28155
On Friday, December 4, 2015 at 8:11:03 PM UTC+1, Adam M wrote:
> On Friday, December 4, 2015 at 10:17:02 AM UTC-5, Borneq wrote:
> > W dniu 2015-12-04 o 15:51, Adam M pisze:
> > > Dlaczego struktura bitowa raczej unia struktory bitowej z odpowiadajacym unsigned int lub unsigned long - to jest standardowe rozwiazanie np przy programowaniu MCUs
> > > Aby znalezc wolny bit niezaleznie od zajetosci potrzeba cztery podzialy 32, 16, 8, 4 i 4 rolowania w najgorszym przypadku przy 32 bit int i 5 podzialow  i 4 rolowania przy 64 bit long.
> > 
> > Jak wykonywać te podziały? zwykle przy połowie słowa liczy się tylko to 
> > młodsze.
> > czy będzie to tak a wewnątrz procedura inline szukaj_przesuwajac 
> > używająca << maksymalnie 4 razy?
> > uint32_t mask
> > if(mask)
> > {
> >    if (mask & 0x0000ffff) //16 młodszych
> >    {
> >      if (mask & 0x000000ff) //8 najmłodszych
> >      {
> >        if (mask & 0x0000000f) szukaj_przesuwajac
> >        else szukaj_przesuwajac
> >      }
> >      else
> >      {
> >        if (mask & 0x00000f00) szukaj_przesuwajac
> >        else szukaj_przesuwajac
> >      }
> >    }
> >    else
> >    {
> >      if (mask & 0x00ff0000) //8 najmłodszych
> >      {
> >        if (mask & 0x000f0000) szukaj_przesuwajac
> >        else szukaj_przesuwajac
> >      }
> >      else
> >      {
> >        if (mask & 0x0f000000) szukaj_przesuwajac
> >        else szukaj_przesuwajac
> >      }
> >    }
> > }
> 
> Tka przy okazji, z czystej ciekawosci sie pytam na jakim systemie to mam byc implementowane - czy to tylko teoretyczne dewagacje - za wyjatkiem duzych web-serwerow i baz danych obslugujacych bardzo duze firmy (w tym przypadku sa dobrze znane rozwiazania jak radzic sobie z problemem) ciezko mi wyobrazic sobie system ktory uruchamia miliony watkow - nie mowiac juz o milionach zadan.

Może jeden wątek dostaje listę zasobów, potem część z tej listy zwalnia, a
zwolnione powinny pójść do innych/nowych wątków? Może średnio działa 10 
wątków i każdy dostaje średnio 200tys numerków?

Pozdrawiam

[toc] | [prev] | [next] | [standalone]


#28158

FromBorneq <borneq@antyspam.hidden.pl>
Date2015-12-04 23:30 +0100
Message-ID<n3t46b$ol1$1@node1.news.atman.pl>
In reply to#28155
W dniu 2015-12-04 o 20:10, Adam M pisze:
> Tka przy okazji, z czystej ciekawosci sie pytam na jakim systemie to mam byc implementowane - czy to tylko teoretyczne dewagacje - za wyjatkiem duzych web-serwerow i baz danych obslugujacych bardzo duze firmy (w tym przypadku sa dobrze znane rozwiazania jak radzic sobie z problemem) ciezko mi wyobrazic sobie system ktory uruchamia miliony watkow - nie mowiac juz o milionach zadan.

Na Linuxie, zasoby te to akurat nie wątki, ale np. okna i inne.
Chcę oprogramować korzystanie z czystego protokołu X11. Tam gdy chcę 
utworzyć okno to wypełniam strukturę i wysyłam do socketu do pliku typu 
specjalnego w /tmp. W tej strukturze muszę podać numer uchwytu, a ten 
numer wiem, że może być >= numerowi bazowemu i dostępnych jest ok 2 mln 
(akurat w mojej konfiguracji). Nie utworzę tyle okien i innych zasobów, 
ale gdy będę tworzył i niszczył okno w pętli to nie mogę brać cały czas 
najwyższego numeru, musi być recykling.

[toc] | [prev] | [next] | [standalone]


#28160

Frombartekltg <bartekltg@gmail.com>
Date2015-12-05 00:49 +0100
Message-ID<n3t8qq$tv4$1@node1.news.atman.pl>
In reply to#28158
On 04.12.2015 23:30, Borneq wrote:
> W dniu 2015-12-04 o 20:10, Adam M pisze:
>> Tka przy okazji, z czystej ciekawosci sie pytam na jakim systemie to
>> mam byc implementowane - czy to tylko teoretyczne dewagacje - za
>> wyjatkiem duzych web-serwerow i baz danych obslugujacych bardzo duze
>> firmy (w tym przypadku sa dobrze znane rozwiazania jak radzic sobie z
>> problemem) ciezko mi wyobrazic sobie system ktory uruchamia miliony
>> watkow - nie mowiac juz o milionach zadan.
>
> Na Linuxie, zasoby te to akurat nie wątki, ale np. okna i inne.
> Chcę oprogramować korzystanie z czystego protokołu X11. Tam gdy chcę
> utworzyć okno to wypełniam strukturę i wysyłam do socketu do pliku typu
> specjalnego w /tmp. W tej strukturze muszę podać numer uchwytu, a ten
> numer wiem, że może być >= numerowi bazowemu i dostępnych jest ok 2 mln
> (akurat w mojej konfiguracji). Nie utworzę tyle okien i innych zasobów,
> ale gdy będę tworzył i niszczył okno w pętli to nie mogę brać cały czas
> najwyższego numeru, musi być recykling.

No to nie potrzebujesz wcale trzymać wszystkich N numerów.

Jak opisałem poprzednio, kolejka fifo w cyklicznym buforze.
Ale inicjalizowana małą ilośćią liczb na początek.
Jeśli kolejka opustoszje, realokujesz dla niej dwa raz wiekszą
pamieć (tzn powiekszasz vectror, w którym to trzymasz:)
i dodajesz kolejne liczby.

pzdr
bartekltg

[toc] | [prev] | [next] | [standalone]


#28161

FromBorneq <borneq@antyspam.hidden.pl>
Date2015-12-05 09:37 +0100
Message-ID<n3u7o7$rbe$1@node1.news.atman.pl>
In reply to#28160
W dniu 2015-12-05 o 00:49, bartekltg pisze:
> Jak opisałem poprzednio, kolejka fifo w cyklicznym buforze.
> Ale inicjalizowana małą ilośćią liczb na początek.
> Jeśli kolejka opustoszje, realokujesz dla niej dwa raz wiekszą
> pamieć (tzn powiekszasz vectror, w którym to trzymasz:)
> i dodajesz kolejne liczby.

Pomysł ciekawy, zwłaszcza to, że jest inicjowana małą ilością liczb na 
początek, a potem można zwiększać. Kolejkę FIFO rozumiem jako dwa 
indeksy wskazujące na bufor, aby nie trzeba było przemieszczać danych?
Na razie zaangażowałem się w maski potrójnego poziomu - maska maks. 256 
bitów, drugiego poziomu miała być 65 K  a trzeciego 16 M. To raczej 
skomplikowana sprawa, więc, jak będą trudności zrobię powiększające się 
FIFO.
Wracając do szukania bitu w słowie:
zrobiłem testy, tam m.in. dwie metody z Uczty Programistów, które 
przesuwają kolejno o 18,8,4 i 2 bity. Metoda połówkowania całkowita do 
bitu i do czterech bitów; dodałem również dla porządku najoczywistszą 
metodę pętli.
Co się okazało: wszystkie mniej więcej w tym samym czasie, a najszybsza 
była metoda w pętli: (co dziwne, bo czas miał być proporcjonalny do 
liczby bitów a nie logarytmu z nich)
int ntz5_15(unsigned x)
{
	int n;
	x = ~x & (x - 1);
	n = 0;
	while (x != 0)
	{
		n = n + 1;
		x = x >> 1;
	}
	return n;
}
Tutaj jest jeden myk: "x = ~x & (x - 1)" wypełnia bity aż do napotkania 
pierwszej jedynki od dołu. Dzięki temu nie trzeba w pętli stosować AND.
W gruncie rzeczy potrzebowałem szukać zer, więc:
int findZero32(uint32_t x)
{
	int n;
	x = x & (~x - 1);
	n = 0;
	while (x != 0)
	{
		n = n + 1;
		x = x >> 1;
	}
	return n;
}
Lecz dla 64 bitów pętla to przesada, więc połówkuję go:
int findZero64(uint64_t x)
{
	if ((x | 0xffffffff00000000)!= 0xffffffffffffffff)
		return findZero32((uint32_t)x); //this branch must be first
	else
		return findZero32((uint32_t)(x >> 32)) + 32;		
}


Jeszcze o testach: test jednorodny odpada, bo połowa przypadków to były 
by pomiędzy 2 miliardy a 4 miliardy. Wybieram więc liczbę jedynek od 1 
do trzech, potem dla bitu losuję pozycję od 0 do 31 i ustawiam.

Pozdrawiam


[toc] | [prev] | [next] | [standalone]


#28174

Frombartekltg <bartekltg@gmail.com>
Date2015-12-06 17:26 +0100
Message-ID<n41nka$cvu$1@node1.news.atman.pl>
In reply to#28161
On 05.12.2015 09:37, Borneq wrote:
> W dniu 2015-12-05 o 00:49, bartekltg pisze:
>> Jak opisałem poprzednio, kolejka fifo w cyklicznym buforze.
>> Ale inicjalizowana małą ilośćią liczb na początek.
>> Jeśli kolejka opustoszje, realokujesz dla niej dwa raz wiekszą
>> pamieć (tzn powiekszasz vectror, w którym to trzymasz:)
>> i dodajesz kolejne liczby.
>
> Pomysł ciekawy, zwłaszcza to, że jest inicjowana małą ilością liczb na
> początek, a potem można zwiększać. Kolejkę FIFO rozumiem jako dwa
> indeksy wskazujące na bufor, aby nie trzeba było przemieszczać danych?

Tak. W booście jest chyba nawet gotowiec. A jak nie ma, zbudujesz
to na bazie vektor w 10 minut.


> Na razie zaangażowałem się w maski potrójnego poziomu - maska maks. 256
> bitów, drugiego poziomu miała być 65 K  a trzeciego 16 M. To raczej
> skomplikowana sprawa, więc, jak będą trudności zrobię powiększające się
> FIFO.

I jaką z tego będzeisz miał korzyść?
Potrzebujesz tam jakiś dodatkowych operacjji, o których nie wiem?

Czasowo jest gorsze.
Pamięćiowo najprawdopoobnij też (ile na raz okien będzie otwartych?),
a te dodatkowe 32 bity chyba nie są takim wqielkim narzutem, skoro
jadna liczba przyopada na okno (bardziej skomplikowaną strukturę).

Nie mówiąc o tym, że trudniejsze do napsiania;-)

pzdr
bartekltg

[toc] | [prev] | [next] | [standalone]


#28175

FromBorneq <borneq@antyspam.hidden.pl>
Date2015-12-06 19:47 +0100
Message-ID<n41vqp$77h$1@node2.news.atman.pl>
In reply to#28174
W dniu 2015-12-06 o 17:26, bartekltg pisze:
> Czasowo jest gorsze.
> Pamięćiowo najprawdopoobnij też (ile na raz okien będzie otwartych?),
> a te dodatkowe 32 bity chyba nie są takim wqielkim narzutem, skoro
> jadna liczba przyopada na okno (bardziej skomplikowaną strukturę).

Jak to dokładnie będzie wyglądało? Przypuśćmy że mamy tablicę 256 
wartości uint32_t, na razie pustą. Poza tym jedną liczbę oznaczającą 
numer uchwytu do pobrania, gdy nic nie będzie w kolejce. Na początku ta 
liczba jest 0, potem 1,2..99. zwalniamy 5, potem 2, potem 7.
W kolejce jest 5,2,7 w takiej kolejności, nie koniecznie kolejności 
wzrastających id. Allokujemy: bierzemy 5, itd. aż gdy kolejka będzie 
pusta to bierzemy 100 ?

[toc] | [prev] | [next] | [standalone]


#28177

Frombartekltg <bartekltg@gmail.com>
Date2015-12-07 03:09 +0100
Message-ID<n42pnu$1kp$1@node2.news.atman.pl>
In reply to#28175
On 06.12.2015 19:47, Borneq wrote:
> W dniu 2015-12-06 o 17:26, bartekltg pisze:
>> Czasowo jest gorsze.
>> Pamięćiowo najprawdopoobnij też (ile na raz okien będzie otwartych?),
>> a te dodatkowe 32 bity chyba nie są takim wqielkim narzutem, skoro
>> jadna liczba przyopada na okno (bardziej skomplikowaną strukturę).
>
> Jak to dokładnie będzie wyglądało? Przypuśćmy że mamy tablicę 256
> wartości uint32_t, na razie pustą. Poza tym jedną liczbę oznaczającą
> numer uchwytu do pobrania, gdy nic nie będzie w kolejce. Na początku ta
> liczba jest 0, potem 1,2..99. zwalniamy 5, potem 2, potem 7.
> W kolejce jest 5,2,7 w takiej kolejności, nie koniecznie kolejności
> wzrastających id. Allokujemy: bierzemy 5, itd. aż gdy kolejka będzie
> pusta to bierzemy 100 ?

class numerkomat{
uint32_t nastepny_numrek;
stack<numerek> data;
public:
  numerkomat();
  void numerek daj_numetek(){
  zwroc_numerek( numerek x)  {

};

numerek numerkomat::daj_numetek(){
   if (data.empty()) napelnij_numerkami( nastepny_numerek*2);
   numerek wyn = data.top();
   data.pop();
   return wyn;
}

void numerek numerkomat::zwroc_numerek(numerek x ){
{
    data.push(x);
}


numerkomat::numerkomat()
{
   napelnij_numerkami(100); //magiczna liczba, poprawić
}

void numerkomat:: napelnij_numerkami( numerek do_ilu )
{
   for (numerek n = nast_numerek; n != do_ilu; n++)
   {
      data.push(n);
   }
}


Dziel problem na poziomy. Powyżej masz klasę, która przydziela
numerki (nietestowana, szkicowana na kolanie). Tu używa std:stack.
W 20s podmienisz to na std:queue lub własną kalsę będącą cyklicznym
buforem zbudowanym na vectro (co jest drugim, zupełnie niezależnym
i niekoniecznie potrzebnym zadaniem).

Pewnie warto by też klasę numerek napisać tak, aby była niekopiowalna,
i tego typu obekty produkować tylko wewnętrz numerkomatu.
Trzeba by wtedy zmienić implementacje i wywołanie napelnij_numerkami,
ale za to użytkownik nie strzeli sobie w stopę tak łatwo, np zwracajkąc
ręcznie wpisaną liczbę.

pzdr
bartekltg

[toc] | [prev] | [next] | [standalone]


#28180

FromBorneq <borneq@antyspam.hidden.pl>
Date2015-12-07 10:31 +0100
Message-ID<n43jke$p31$1@node2.news.atman.pl>
In reply to#28177
W dniu 2015-12-07 o 03:09, bartekltg pisze:
> void numerkomat:: napelnij_numerkami( numerek do_ilu )
> {
>    for (numerek n = nast_numerek; n != do_ilu; n++)
>    {
>       data.push(n);
>    }
> }

Trochę się różni, bo ja w kolejce w yAllocFifo trzymałem te, które 
zostawały zwolnione, a tu mamy napełnianie nowymi.
Jeśli chodzi o std:queue to jakie ma właściwości oprócz dwóch 
wskaźników? czy samoczynnie się powiększa? odporność na wątki?

[toc] | [prev] | [next] | [standalone]


#28176

FromBorneq <borneq@antyspam.hidden.pl>
Date2015-12-07 01:05 +0100
Message-ID<n42ige$9pq$1@node1.news.atman.pl>
In reply to#28174
W dniu 2015-12-06 o 17:26, bartekltg pisze:
> Czasowo jest gorsze.
> Pamięćiowo najprawdopoobnij też (ile na raz okien będzie otwartych?),
> a te dodatkowe 32 bity chyba nie są takim wqielkim narzutem, skoro
> jadna liczba przyopada na okno (bardziej skomplikowaną strukturę).
>
> Nie mówiąc o tym, że trudniejsze do napsiania;-)

A to za to bardzo proste:
yAllocFifo::yAllocFifo(const uint32_t base, const uint32_t count)
{
	alloc_base = base;
	alloc_count = count;
	sentinel = base + count;
	nextNumber = base;
}

uint32_t yAllocFifo::getNumber()
{
	if (fifo.canPop()) return fifo.pop();
	else
	{
		if (nextNumber >= sentinel) throw exception("no more nmbers");
		nextNumber++;
		return nextNumber-1;		
	}
	return 0;
}

void yAllocFifo::releaseNumber(uint32_t number)
{
	if (number < alloc_base)
		throw exception("releaseNumber: bad number, too small");
	if (number - alloc_base >= alloc_count)
		throw exception("releaseNumber: bad number, too big");
	fifo.push(number);
}


tylko nie sprawdza nic przy release, np. gdy zwalniamy już zwolnione to 
wtedy doda dwa razy, albo zwalniamy zupełnie inny numer, którego nie 
wzięliśmy.

[toc] | [prev] | [next] | [standalone]


#28178

Frombartekltg <bartekltg@gmail.com>
Date2015-12-07 03:13 +0100
Message-ID<n42q00$1rm$1@node2.news.atman.pl>
In reply to#28176
On 07.12.2015 01:05, Borneq wrote:
> W dniu 2015-12-06 o 17:26, bartekltg pisze:
>> Czasowo jest gorsze.
>> Pamięćiowo najprawdopoobnij też (ile na raz okien będzie otwartych?),
>> a te dodatkowe 32 bity chyba nie są takim wqielkim narzutem, skoro
>> jadna liczba przyopada na okno (bardziej skomplikowaną strukturę).
>>
>> Nie mówiąc o tym, że trudniejsze do napsiania;-)
>
> A to za to bardzo proste:
> yAllocFifo::yAllocFifo(const uint32_t base, const uint32_t count)
> {
>      alloc_base = base;
>      alloc_count = count;
>      sentinel = base + count;
>      nextNumber = base;
> }
>
> uint32_t yAllocFifo::getNumber()
> {
>      if (fifo.canPop()) return fifo.pop();
>      else
>      {
>          if (nextNumber >= sentinel) throw exception("no more nmbers");
>          nextNumber++;
>          return nextNumber-1;
>      }
>      return 0;
> }
>
> void yAllocFifo::releaseNumber(uint32_t number)
> {
>      if (number < alloc_base)
>          throw exception("releaseNumber: bad number, too small");
>      if (number - alloc_base >= alloc_count)
>          throw exception("releaseNumber: bad number, too big");
>      fifo.push(number);
> }
>
>
> tylko nie sprawdza nic przy release, np. gdy zwalniamy już zwolnione to
> wtedy doda dwa razy, albo zwalniamy zupełnie inny numer, którego nie
> wzięliśmy.

A dlaczego chcesz wolnić coś już zwolnionego?

Numerek powiązany jest z czasem życia okna. pobiera
się w konstruktorze, uwalnia w destruktorze.
Jak uwolnił, to już go nie ma i dośc ciężko, żęby go niszczona drugi
raz.

Jak się bardzo obawiasz, że w kodzie może jadnak taka sytuacja występić,
zamiast szybkiego kontenera, który ma to gdiześ (stack, queue, ręczna
kolejna) wstaw tam tesotwo std::(unordered)set i sprawdzaj przy
oddawaniu, czy zwracanego obiektu już nie ma. Jak jest, podnosi
alarm i zatrzymuje debugger.

pzdr
bartekltg

[toc] | [prev] | [next] | [standalone]


#28151

From"M.M." <mmarszik@gmail.com>
Date2015-12-04 08:21 -0800
Message-ID<c2db5fda-e905-4d16-b46e-1188f15d3d57@googlegroups.com>
In reply to#28146
On Friday, December 4, 2015 at 3:04:17 PM UTC+1, Borneq wrote:
> Dodatkowo potrzebne jeszcze mutexy, aby nie przydzielić dwa razy tego 
> samego numeru przy pracy na wątkach.
Nie bardzo mam czas, podpowiem tylko, że nie są konieczne do tego
muteksy.

[toc] | [prev] | [next] | [standalone]


#28152

FromAdam Klobukowski <adamklobukowski@gmail.com>
Date2015-12-04 08:31 -0800
Message-ID<84dc5eee-c379-43d2-8b51-2925eae1c903@googlegroups.com>
In reply to#28146
Najlepsze rozwiązanie tego problemu z jakim się spotkałem to pamiętanie największego dotąd przyznanego numeru i posortowanej listy zwolnionych numerów.

AdamK

[toc] | [prev] | [next] | [standalone]


#28153

From"M.M." <mmarszik@gmail.com>
Date2015-12-04 09:13 -0800
Message-ID<ad32bd4b-4012-4eee-929e-de4d2f3833d2@googlegroups.com>
In reply to#28152
On Friday, December 4, 2015 at 5:31:48 PM UTC+1, Adam Klobukowski wrote:
> Najlepsze rozwiązanie tego problemu z jakim się spotkałem to pamiętanie największego dotąd przyznanego numeru i posortowanej listy zwolnionych numerów.
> 
> AdamK

Nie wierzę że nie spotkałeś się z lepszym :)

[toc] | [prev] | [next] | [standalone]


#28154

FromAdam M <amorawski@magna-power.com>
Date2015-12-04 10:58 -0800
Message-ID<2c50049f-418f-4ade-809a-b4bed40259be@googlegroups.com>
In reply to#28152
On Friday, December 4, 2015 at 11:31:48 AM UTC-5, Adam Klobukowski wrote:
> Najlepsze rozwiązanie tego problemu z jakim się spotkałem to pamiętanie największego dotąd przyznanego numeru i posortowanej listy zwolnionych numerów.
> 
> AdamK

Po pierwsze przepraszam za uzywanie angielskich zwrotow ale w pracy od kilkunastu lat uzywam wylacznie jezyka angielskiego wiec nie znam polskich odpowiednikow niektorych zwrotow.

Twoj pomysl bedzie dzialal dobrze tylko w systemie w ktorym task churn (duzo zadan jest uruchamainych i szybko zamykanych w losowych odstepach czasu) jest niewielki i nie wystepuje tzw. task attack lub inaczej task ramp-up effect (bardzo duzo zadan jest uruchamianych bardzo szybko po sobie przy niewielkiej ilosci zadan zwalnianych - stosunek zadan uruchamainych do zwalnianych jest bardzo niekorzystny)

[toc] | [prev] | [next] | [standalone]


Page 1 of 2  [1] 2  Next page →

Back to top | Article view | pl.comp.programming


csiph-web