www.elektronik.si
GNU C LINUX pomoč začetniku IX

www.elektronik.si -> Linux, unix razprave

Avtor: vilkoKraj: Dragomer PrispevekObjavljeno: Sob Jan 21, 2012 11:45 pm    Naslov sporočila:  GNU C LINUX pomoč začetniku IX
----------------------------------------------------------------------------
Linux je multiprocesna mašina, zato je (vsaj mislim) potrebno paziti in ne po nepotrebnem trošim procesorski čas. To ni (vsaj mislim) tako, kot pri malih mikroprocesorjih, ki izvajajo en sam proces, in je tako CPU namenje samo temu procesu. Pri multiprocesorskih mašinah pa mora CPU imeti še nekaj časa, da postreže še drugim procesom.

Napisal sem program, ki v principu dela tako:
Vsakih 5 sekund se izvaja koda programa, v ostalem pa nima kaj delati.
A tako kot sem napisal, se progam odvija v stalni CPU zanki in gleda, ali je pretekelo tistih 5 sekund, ko bo if stavek izpolnjen.

Koda:
Koda:
do   
{    time_t seconds, sekunde;
   seconds = time (NULL);
   if (seconds > sekunde )            // če je pretečeni čas potekel
   {   sekunde = seconds + 5;     // ponastavimo čas za sledečo periodo
      /* ta koda se izvaja periodično vsakih 5 sekund  */      
   }      
   /* ta koda, ki je na tem mestu se izvaja stalno, in če te kode ni
       se ta del programa stalno izvaja v hitri zanki in troši CPU TIME */   
}   
while (1);    


Da se razumemo: program naredi tisto, kar sem od njega hotel. Le ko razmišljam, se čutim krivega, češ da po nemarnem trošim CPU čas.

Ali se sekiram za prazen nič, ali pa je res nekaj na tem?

Avtor: LinuxFuterKraj: Novo mesto PrispevekObjavljeno: Ned Jan 22, 2012 2:37 am    Naslov sporočila:  
----------------------------------------------------------------------------
V bistvu imaš prav, v času, ko je procesor dodeljen tvojemu procesu trošiš procesorski čas dokler se pogoj v if-u ne izpolne. Z ukazom
Koda:

sched_yield();


sprostiš procesor in postaviš svoj proces na konec liste z zahtevki po procesorskem času.
Tale ukaz lahko daš v v else blok če if pogoj ni izpolnjen.

sched_yield();

Avtor: rudiPKraj: KOPER PrispevekObjavljeno: Ned Jan 22, 2012 10:26 am    Naslov sporočila:  
----------------------------------------------------------------------------
Vilko: da te ne bo več skrbelo kako procesor zapravlja svoj čas uporabljaj RTOS.

Avtor: vilkoKraj: Dragomer PrispevekObjavljeno: Ned Jan 22, 2012 10:50 am    Naslov sporočila:  
----------------------------------------------------------------------------
Hvala obema.

Operacijski sistem ne izbiram sam, tako, da bom poizkusil s int sched_yield(void);
Seveda pa rezultat ne bo videl, dokler bo moj program takorekoč edini na sistemu. No, to se bo s časom spremenilo.

Res hvala za pomoč.

Avtor: vilkoKraj: Dragomer PrispevekObjavljeno: Ned Jan 22, 2012 12:29 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Je že tako, en odgovor sproži novo vprašanje.

Če imam neverending proces ki ima redirektiran output in ga ustavim z kill, tedaj output datoteka ni zaprta in ko jo pogledam je prazna.
Če se proces po nekem pogoju lepo sam ugasne z Return, se redirektirana output datoteka lepo zapre in jo lepo vidim.

Nekako bi moral recimo tak neverending proces enkrat dnevno lepo programsko ugasniti, (to bi verjetno znal, pač ko nek števec doseže nek maksimum ali na osnovi time funkcij), in ga takoj ponovno startati z novim imenom datoteke, kamor se redirektira output.

Prosim namig, kaj moram nujno preštudirati, da ne bi šel študirat celotno linux znanje, ki ga ne rabim. Verjetno bi potreboval samo nekaj bash ukazov, da zaciklam zadevo.

Avtor: gregoralKraj: Ljubljana PrispevekObjavljeno: Ned Jan 22, 2012 10:41 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Datoteka je (verjetno) prazna, ker si uporabil buffered dostop do datoteke.
OS (linux) ne zapiše takoj na disk.
Uporabiš lahko fflush (vsaj mislim da je to pravo ime funkcije).

Tudi če boš enkrat na dan prostovoljno "končal" program, se še vedno lahko zgodi da se bo zaradi napake v programu nekaj podatkov izgubilo.

Imaš več možnosti:
a) uporabiš unbuffered dostop do datoteke
b) flush kličeš vsakič ko nekaj zapišeš
c) flush kličeš periodično (na nekaj sekund)
d) občasno datoteko zapreš (fclose) in ponovno odpreš (fopen)
e) zapreš datoteko in zaključiš proces, ter zaženeš nov proces ki odpre novo datoteko

Kako učinkovit je tvoj process pa lahko vidiš s programom top.
Če imaš možnost ssh ali telnet dostopa odpreš dve seji.
V prvi poženeš tvoj program, v drugi pa top.
Izpisano boš imel obremenitev procesorja.

Če imaš omejitev na eno sejo, potem poženi tvoj proces v ozadju (sintakso pogooglaj), in potem poženi top.

LP, Gregor

Avtor: vilkoKraj: Dragomer PrispevekObjavljeno: Ned Jan 22, 2012 11:05 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Gre za standard output datoteko, ki je niti ne odpiram. Tisto, ki sprejme
vsebino, ki jo pišem z printf() funkcijo.

Zato bi program preproramiral tako, da gre ob določenem pogoju v exit.
A potem potrebujem avtomatiko, ki ga bo takoj ponovno zagnala, ker njegov servis potrebujem stalno. Zato potrebujem tistih nekaj bass script ukazov, s katerim v zanki vsakokrat ko program konča, se ponovno starta s tem, da se output piše v datoteko z novim imenom.
V bash scriptu bi moral tudi testirati nek flag, ki bi lahko ga postavil od zunaj, da bash scrip ne starta ponovno programa, če je flag postavljen, temveč da zaključi delo, saj potem mi ne bi bilo potrebno uporabiti grobega kill ukaza.

Avtor: forest70Kraj: Koper PrispevekObjavljeno: Pon Jan 23, 2012 1:24 pm    Naslov sporočila:  
----------------------------------------------------------------------------
Poskusi z SIGTERM oziroma SIGUSR, vendar moraš v programu detektirat ta signal...

Stran 1 od 1

Powered by phpBB © 2001,2002 phpBB Group