www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 
Sponsored by SiOL

GNU C LINUX pomoč začetniku IX

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Linux, unix razprave
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3308
Aktiv.: 19.71
Kraj: Dragomer

PrispevekObjavljeno: Sob Jan 21, 2012 11:45 pm    Naslov sporočila:  GNU C LINUX pomoč začetniku IX Odgovori s citatom

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?

_________________
Charles Baudelaire:“Vragova največja zvijača je v tem, da je uspel prepričati svet, da ne obstaja.”
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
LinuxFuter
Član
Član



Pridružen-a: Pon 18 Jun 2007 14:40
Prispevkov: 381
Aktiv.: 2.54
Kraj: Novo mesto

PrispevekObjavljeno: Ned Jan 22, 2012 2:37 am    Naslov sporočila:   Odgovori s citatom

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();
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
rudiP
Član
Član



Pridružen-a: Tor 07 Avg 2007 15:30
Prispevkov: 1226
Aktiv.: 8.26
Kraj: KOPER

PrispevekObjavljeno: Ned Jan 22, 2012 10:26 am    Naslov sporočila:   Odgovori s citatom

Vilko: da te ne bo več skrbelo kako procesor zapravlja svoj čas uporabljaj RTOS.
_________________
Lep pozdrav iz Kopra Rudi
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3308
Aktiv.: 19.71
Kraj: Dragomer

PrispevekObjavljeno: Ned Jan 22, 2012 10:50 am    Naslov sporočila:   Odgovori s citatom

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č.

_________________
Charles Baudelaire:“Vragova največja zvijača je v tem, da je uspel prepričati svet, da ne obstaja.”
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3308
Aktiv.: 19.71
Kraj: Dragomer

PrispevekObjavljeno: Ned Jan 22, 2012 12:29 pm    Naslov sporočila:   Odgovori s citatom

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.

_________________
Charles Baudelaire:“Vragova največja zvijača je v tem, da je uspel prepričati svet, da ne obstaja.”
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
gregoral
Član
Član



Pridružen-a: Pet 24 Nov 2006 9:42
Prispevkov: 688
Aktiv.: 4.38
Kraj: Ljubljana

PrispevekObjavljeno: Ned Jan 22, 2012 10:41 pm    Naslov sporočila:   Odgovori s citatom

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
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
vilko
Član
Član



Pridružen-a: Pet 13 Feb 2004 10:26
Prispevkov: 3308
Aktiv.: 19.71
Kraj: Dragomer

PrispevekObjavljeno: Ned Jan 22, 2012 11:05 pm    Naslov sporočila:   Odgovori s citatom

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.

_________________
Charles Baudelaire:“Vragova največja zvijača je v tem, da je uspel prepričati svet, da ne obstaja.”
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
forest70
Član
Član



Pridružen-a: Ned 20 Jul 2008 1:00
Prispevkov: 588
Aktiv.: 4.30
Kraj: Koper

PrispevekObjavljeno: Pon Jan 23, 2012 1:24 pm    Naslov sporočila:   Odgovori s citatom

Poskusi z SIGTERM oziroma SIGUSR, vendar moraš v programu detektirat ta signal...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Linux, unix razprave Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 169 dni


Powered by phpBB © 2001, 2005 phpBB Group