🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.os.linux.programowanie
8 messages
8 total messages Started by Andrzej Niedworok Sun, 22 Sep 2013 16:18
Optymalizacja zużycia zasobów systemowych
#72662
Author: Andrzej Niedworok
Date: Sun, 22 Sep 2013 16:18
70 lines
3496 bytes
Witajcie,

mam pewien problem z prostą aplikacją napisaną na płytkę Raspberry Pi. Aplikacja wyświetla czas i datę na wyświetlaczu alfanumerycznym LCD (2x16 znaków) podłączonym do linii GPIO Raspberry. Obsługę wyświetlacza zrealizowałem przy użyciu biblioteki WiringPi napisanej przez Gordona Drogona (http://wiringpi.com). Wszystko działa bez problemu. Problem pojawił się w momencie gdy po uruchomieniu programu włączyłem podgląd procesów (top lub htop). Okazało się że mój prymitywny program wykorzystuje 50 % CPU. Podejrzewam że problem polega tym że program bez przerwy, w pętli pobiera czas i go wyświetla na LCD. To jest moj pierwszy program na platformę Linux. Do tej pory pisałem programy na mikrokontrolery bez OS'a. Poniżej załączyłem cały kod programu. 


#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
 
#include <syslog.h>
#include <unistd.h>
 
#include <time.h>
#include <wiringPi.h>
#include <lcd.h>
 
static int lcdHandle;
 
 
int main (){
 
  int fval;
 
  struct tm *t;
  time_t tim;
 
  char buf[16];
 
 
  // Fork.
 
  fval = fork ();
  if (fval < 0){
    syslog (LOG_CRIT, "Bandwidth Fork error");
    exit (1);
  }
  else if (fval > 0){
    syslog (LOG_INFO, "Bandwidth Daemonize. Forked child %d", fval);
    exit (0);	 
  }
 
  wiringPiSetup () ;
 
  lcdHandle = lcdInit (2, 16, 4, 11, 10, 0, 1, 2, 3, 0, 0, 0, 0);
 
  while (1){
    tim = time (NULL);
    t = localtime (&tim);
 
    // Prezentacja czasu    
 
    sprintf (buf, "%02d:%02d:%02d", t -> tm_hour, t -> tm_min, t -> tm_sec);
    lcdPosition (lcdHandle, 0, 0);
    lcdPuts (lcdHandle, buf);
 
    // Prezentacja daty
 
    sprintf (buf, "%02d/%02d/%04d", t -> tm_mday, t -> tm_mon + 1, t -> tm_year + 1900) ; 
    lcdPosition (lcdHandle, 0, 1);
    lcdPuts (lcdHandle, buf);
  }
 
  return 0;
}

W programie użyłem instrukcji fork() aby uruchomić go w osobnym wątku (aby działał w tle). Czy ktoś mógłby naprowadzić mnie w jaki sposób zoptymalizować działanie programu aby wykorzystywał mniej zasobów?

Pozdrawiam

Andrzej Niedworok 
Re: Optymalizacja zużycia zasobów systemowych
#72663
Author: Sebastian Biały
Date: Sun, 22 Sep 2013 17:00
16 lines
1495 bytes
On 2013-09-22 18:18, Andrzej Niedworok wrote:
> W programie użyłem instrukcji fork() aby uruchomić go w osobnym wątku (aby działał w tle).

Wystarczy uruchomic apliakcję z & na końcu.

> Czy ktoś mógłby naprowadzić mnie w jaki sposób zoptymalizować działanie programu aby wykorzystywał mniej zasobów?

Na szybko i na początek:

a) dodaj: http://unixhelp.ed.ac.uk/CGI/man-cgi?sleep+3

albo

b) nie rób pętli, tylko odpalaj program co sekundę z crona.

Oba rozwiązania byle jakie, ale najszybsze.
Re: Optymalizacja zużycia zasobów systemowych
#72664
Author: niedworok.andrzej
Date: Sun, 22 Sep 2013 17:32
37 lines
2705 bytes
W dniu niedziela, 22 września 2013 19:00:09 UTC+2 użytkownik Sebastian Biały napisał:
> On 2013-09-22 18:18, Andrzej Niedworok wrote:
> 
> > W programie użyłem instrukcji fork() aby uruchomić go w osobnym wątku (aby działał w tle).
> 
> 
> 
> Wystarczy uruchomic apliakcję z & na końcu.
> 
> 
> 
> > Czy ktoś mógłby naprowadzić mnie w jaki sposób zoptymalizować działanie programu aby wykorzystywał mniej zasobów?
> 
> 
> 
> Na szybko i na początek:
> 
> 
> 
> a) dodaj: http://unixhelp.ed.ac.uk/CGI/man-cgi?sleep+3
> 
> 
> 
> albo
> 
> 
> 
> b) nie rób pętli, tylko odpalaj program co sekundę z crona.
> 
> 
> 
> Oba rozwiązania byle jakie, ale najszybsze.

Dzięki za odpowiedz. Ale czy sleep rozwiąże sprawę. Na ile go ustawić. Jeżeli go ustawię na 1 sekundę, to może się okazać że wyświetlanie aktualnej wartości czasu (głównie sekundy) może być nie równomierne. A może się mylę. Wydaje mi się ze wystarczyło by użycie jakiejś metody reakcji na zdarzenie w postaci zmiany wartości sekundy, połączone z prezentacją nowej wartości czasu na LCD. Czy Linux oferuje takie możliwości?

Pozdrawiam
Andrzej Niedworok
Re: Optymalizacja zużycia zasobów systemowych
#72665
Author: Sebastian Biały
Date: Sun, 22 Sep 2013 17:40
10 lines
1419 bytes
On 2013-09-22 19:32, niedworok.andrzej@gmail.com wrote:
> Na ile go ustawić. Jeżeli go ustawię na 1 sekundę

http://linux.die.net/man/3/usleep

> Wydaje mi się ze wystarczyło by użycie jakiejś metody reakcji na zdarzenie

Pi * drzwi możesz użyć alarm()

http://stackoverflow.com/questions/1784136/simple-signals-c-programming-and-alarm-function
Re: Optymalizacja zużycia zasobów systemowych
#72666
Author: Andrzej Niedworok
Date: Sun, 29 Sep 2013 21:00
27 lines
2624 bytes
W dniu niedziela, 22 września 2013 19:40:17 UTC+2 użytkownik Sebastian Biały napisał:
> On 2013-09-22 19:32, niedworok.andrzej@gmail.com wrote:
> 
> > Na ile go ustawić. Jeżeli go ustawię na 1 sekundę
> 
> 
> 
> http://linux.die.net/man/3/usleep
> 
> 
> 
> > Wydaje mi się ze wystarczyło by użycie jakiejś metody reakcji na zdarzenie
> 
> 
> 
> Pi * drzwi możesz użyć alarm()
> 
> 
> 
> http://stackoverflow.com/questions/1784136/simple-signals-c-programming-and-alarm-function

Dzięki za pomoc. Dodanie usleep() pomogło. W tej chwili proces mojego zegarka na LCD nie zużywa praktycznie wcale procesora. 
Teraz stoję przed kolejnym problemem. Mój program po wywołaniu fork() tworzy proces i sobie w nim działa. Problem pojawia się w momencie gdy wywołuję program jeszcze raz. W tym momencie na wyświetlaczu pojawiają się krzaki. Czy  powodem tego jest działanie dwóch procesów naraz? W jaki sposób wprowadzić do programu sprawdzenie czy program jest już na liście procesów (kontrolę wielokrotnego uruchomienia tej samej aplikacji)? Jak prawidłowo reagować na taką sytuację? Może "ubijać" poprzedni proces?

Pozdrawiam

Andrzej Niedworok
Re: Optymalizacja zużycia zasobów systemowych
#72667
Author: Sebastian Biały
Date: Mon, 30 Sep 2013 16:04
22 lines
1867 bytes
On 2013-09-29 23:00, Andrzej Niedworok wrote:
> Teraz stoję przed kolejnym problemem. Mój program po wywołaniu fork() tworzy proces i sobie w nim działa

Nie forkuj. Zrób normalny program blokujący na czas wywołania. A 
nastepnie wywołaj go tak:

mój_program&

z poziomu basha.

>. Problem pojawia się w momencie gdy wywołuję program jeszcze raz.

Zanim go wywołasz jeszczew raz najpierw zabij go w starej instancji.

Czyli:

killall moj_program
moj_program&

Grzeczniejsze zachowanie raczej nie będzie Ci potrzebne pod warunkiem że 
LCD zostanie za każdym razem poprawnie zainicjowany na nowo. Lepiej 
preferować rozwiązania systemowe (kill, &) niż pisać własne popsute wersje.
Re: Optymalizacja zużycia zasobów systemowych
#72668
Author: jacki
Date: Fri, 01 Aug 2014 20:17
10 lines
2163 bytes
W dniu 2013-09-29 23:00, Andrzej Niedworok pisze:
> Dzięki za pomoc. Dodanie usleep() pomogło. W tej chwili proces mojego zegarka na LCD nie zużywa praktycznie wcale procesora.
> Teraz stoję przed kolejnym problemem. Mój program po wywołaniu fork() tworzy proces i sobie w nim działa. Problem pojawia się w momencie gdy wywołuję program jeszcze raz. W tym momencie na wyświetlaczu pojawiają się krzaki. Czy  powodem tego jest działanie dwóch procesów naraz? W jaki sposób wprowadzić do programu sprawdzenie czy program jest już na liście procesów (kontrolę wielokrotnego uruchomienia tej samej aplikacji)? Jak prawidłowo reagować na taką sytuację? Może "ubijać" poprzedni proces?

Zazwyczaj w /var/run/ umieszcza się plik (np. super_lcd_timer.pid) z PID 
programu. Program przy wyjściu z programu usuwa ten plik a przy 
uruchomieniu sprawdza:
a) sprawdza tylko obecność pliku - nieelegandzkie
b) sprawdza, czy pod PID jest ten właśnie program (sprawdzane jest w 
/proc/PID/)
Re: Optymalizacja zużycia zasobów systemowych
#72669
Author: Sebastian Biały
Date: Sun, 03 Aug 2014 14:55
9 lines
1581 bytes
On 2014-08-01 22:17, jacki wrote:
> Zazwyczaj w /var/run/ umieszcza się plik (np. super_lcd_timer.pid) z PID
> programu. Program przy wyjściu z programu usuwa ten plik a przy
> uruchomieniu sprawdza:
> a) sprawdza tylko obecność pliku - nieelegandzkie
> b) sprawdza, czy pod PID jest ten właśnie program (sprawdzane jest w
> /proc/PID/)

Obie metody są nieeleganckie bo mają oczywisty race-condition.
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads