Perplessità processi (c,java,python, generico)

« Older   Newer »
  Share  
view post Posted on 6/1/2020, 21:09
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Ciao a tutti, stavo parlando con Dario nella discussione toni DTMF, e si è nominato di striscio, i processi
,therad e via dicendo.
Una cosa non ho mai capito fin da quando li ho studiati (o Dio studiati, non li so padroneggiare bene):
Con un processo che in C otteniamo con fork(), ho la possibilità di svolgere (detto un po' così casereccio) 2 operazioni o
più contemporaneamente.
In un programma "tradizionale", abbiamo il main, che può richiamare una funzione, la svolge, ritorna e poi passa alla successiva, fino terminare. Oppure una funzione che chiama un'altra funzione ecc...ma è comunque sequenziale.
Fai funzione 1,poi 2, poi 3, e poi di norma si torna al main, che terminando con return 0, se non erro , restituisce il controllo al sistema operativo.

Nei processi, invece abbiamo la "contemporaneità" la funzione f2, non ha bisogno che f1 termini, vanno insieme.
Ora la mia domanda è questa: nei pic per esempio so che ci sono moduli hardware che vanno davvero indipendentemente,
se non ricordo male nella serie 16F i timer sono hardware. Puoi fare un loop infinito e far partire il timer e il timer non sarà mai congelato in un loop infinito, fa quello che deve fare, poi, sei tu a testare quello che ti serve con interrupt, polling, quello che è.
Se dico castrate perdonatemi, sono passati un po' di annetti.
Ma torniamo al C su un pc. Se io ho 2,3,4 processi, ma il processore è uno solo, come nel mio caso un pc un po' datato,
la "contemporaneità" non è un' illusione?
So che esistono vari tipi di algoritmi di scheduling, gestiti dal sistema operativo che danno priorità a questo o quel processo in base a...in base a??? Non lo so!! :D :D

Ma non rimane pur sempre un'illusione ? Faccio un poco del processo 1, poi stacco faccio metà del 2, poi torno a 1.
Se hai un pc con più core allora si possono smazzare i compiti, ma con uno solo ?
Potrei provare a fare un test: 2 funzioni un po' gravose (calcoli un po' pesanti) una dopo l'altra e le stesse funzioni farle
dopo una fork e misurare i tempi.
Non so, purtroppo come sapete non ci lavoro con queste cose, e l'hobby ha molti limiti.
Grazie in anticipo per chi avesse voglia e interesse a schiarirmi le idee.

Come sempre la sintesi non è nelle mie corde :P :wb:
 
Top
view post Posted on 6/1/2020, 23:38
Avatar

Noioso

Group:
Professionisti
Posts:
403

Status:


ATTENZIONE: LEGGERE BENE ALTRIMENTI DARIO SI ARRABBIA. :P

In realtà vale la pena di leggerlo perchè sono spiegate cose interessanti ed importanti.

Robo67


:)
Per i Timer, esattamente come dici tu: vanno a fatti loro, indipendenti. Ovviamente da software puoi fermarli farli ripartire o resettarli a piacimento!

Per il multitask diciamo che io vedo 3 possibilità - facciamo 4 se hai più di un core.
Ossia:
1) Il S.O. ha una lista di task (diciamo sempre creata con fork() che io in effetti non ho mai usato: in Windows hai CreateThread() ecc, e ogni OS ha il suo, direi) e assegna un po' di tempo ad ognuno: con le varie priorità, le necessità di start/stop/ecc. Servono ovviamente dei Semafori (Mutex ecc) e specialmente se si ha più di un core... la cosa va gestita "BENE".
2) La lista di task c'è ma non è il S.O. a gestire chi e come gira o si ferma: ogni task gira un po' e poi rilascia il controllo al "supertask" e quindi si passa al task dopo e così via. Se un task non rilascia mai il controllo, gli altri si attaccano...
3) C'è un solo task, che opera con una (o più) macchine a stati: una semplice variabile intera è incrementata da 0 a n, e a ogni stato viene eseguito un pezzetto di una serie di operazioni, passando allo stato dopo solo quando l'operazione è completa ed è sensato eseguire quella dopo. In questo modo, possono "girare" subroutine o altro, specialmente negli stati in cui la macchina a stati sta aspettando qualche evento prima di procedere.

A mio parere, il 90% dei software per MCU vanno benone con il caso 3, il che ti permette semplicità di implementazione e nessun bisogno di OS ossia di codice che non hai scritto tu ;) oltre a controllo TOTALE dell'HW che in un'applicazione embedded è fondamentale. Certo, devi smazzarti le macchine a stati ma di solito è piuttosto semplice (switch() ovvero SELECT CASE...)
Certo, se devi ricreare un Windows o un Android allora ti serve forse uno degli altri metodi. E, specialmente se hai più di un core, ti serviranno i semafori ecc.

Edited by Robo67 - 1/2/2020, 18:05
 
Top
view post Posted on 7/1/2020, 21:49
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Leggo bene con cura, appena riesco, mi era sfuggito. Devo assimilare un po'.
Comunque ho provato a fare la prova che dicevo: 2 funzioni sequenziali chiamate dal main e 2 processi...calcoli identici.
Ebbene, pur avendo un processore solo in effetti i tempi dei processi sono molto minori...e non mi spiego!!!
Molto probabilmente devo rileggere bene ciò che hai scritto e troverò la risposta.
Appena ho tempo, giusto per chiarezza, posto i 2 esempi (4 righe stupide di codice, nulla di che)
 
Top
view post Posted on 7/1/2020, 21:51
Avatar

Noioso

Group:
Professionisti
Posts:
403

Status:


Non capisco bene cosa intendi: che girano metà più lenti? sarebbe logico :)

Il senso è che se devi far fare 2 calcoli in parallelo, ovviamente andranno metà più lenti. Ma se si tratta di operazioni che hanno a che fare con input umano o periferiche "lente"... allora il rallentamento è nullo o quasi.
 
Top
view post Posted on 7/1/2020, 22:27
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Intendo dire, che a logica avendo un processore solo, la simultaneita' dovrebbe essere apparente. Come dicevo, in base alle priorita', fa il processo 1, poi stacca , fa un po' del 2 e via dicendo. Ma la somma dei tempi dei processi in definitiva dovrebbe essere la stessa del modo sequenziale.
Sempre inteso che si abbia un solo processore.
Per testare cio' ho fatto un programma classico con 2 funzioni, e ho testato il tempo totale, poi gli stessi calcoli, ma al posto delle 2 funzioni 2 processi. Se, come credevo io, e solo un'illusione di contemporaneita' il programma classico e quello a processi, piu' o meno dovrebbero impiegare lo stesso tempo.
Invece salvo abbagli, quello a processi, risulta davvero piu' veloce,facendo cadere la mia tesi della finta simultaneita'.
E ripeto, sarebbe logico con piu' core, ma con un solo ?
E' come se con un pic, tutto via software, vuoi fare 2 cose contemporaneamente. Se non hai moduli hardware indipendenti, alla fine i tempi sono la somme delle 2 routines...anzi calcolando i salti a funzione, nemorizzazioni ecc...risulterebbero addirittura maggiori.
Se invece ti aiuti ad un modulo hardware, esempio il famoso timer, e' come se lo potessi equiparare a un secondo core. Ti da davvero una mano in contemporanea. Questo non mi spiego.
Riguardo bene i 2 programmi, magari prendo fischi per fiaschi
 
Top
view post Posted on 7/1/2020, 22:30
Avatar

Noioso

Group:
Professionisti
Posts:
403

Status:


Ah okay.

Sei sicuro di avere un solo core? Al giorno d'oggi un po' tutti i PC sono multi core. Poi dipende anche dal linguaggio usato, sicuramente...

Posta il codice :)
 
Top
view post Posted on 8/1/2020, 06:12
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Sta sera se riesco, posto i 2 programmini di prova e da terminale ubuntu controllo l'hardware
 
Top
view post Posted on 8/1/2020, 18:53
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Forse ho detto una caxxata
da terminale per vedere le cpu:
HTML
gila@gila-pc:~$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
CPU(s): 4
On-line CPU(s) list: 0-3
Thread(s) per core: 1
Core(s) per socket: 4
Socket(s): 1
NUMA node(s): 1
Vendor ID: AuthenticAMD
CPU family: 16
Model: 5
Model name: AMD Athlon(tm) II X4 640 Processor
Stepping: 3
CPU MHz: 1800.000
CPU max MHz: 3000,0000
CPU min MHz: 800,0000
BogoMIPS: 6027.17
Virtualization: AMD-V
L1d cache: 64K
L1i cache: 64K
L2 cache: 512K
NUMA node0 CPU(s): 0-3
Flags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid pni monitor cx16 popcnt lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt hw_pstate vmmcall npt lbrv svm_lock nrip_save
gila@gila-pc:~$

No so bene interpretare, ma sembrerebbero più di uno.
Codice a processi:
HTML
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/wait.h>
#include <math.h>



int main(int argc, char *argv[])
{
int pid,pid1,status;
int i;
double res;
double x=133.55;
double y=0.351;


//********************************************
// filglio 1
//********************************************

pid = fork();
if ( pid == -1 )
{
printf ("Impossibile creare un nuovo processo\n");
exit(1);
}

if ( pid == 0 )
{
printf ("sono il figlio con pid (%d).Mio padre è (%d)\n",getpid(),getppid());

for (i=0; i<15000000; i++)
res=pow (sqrt(x/y),-0.215);
printf ("res0 =%f\n", res);
exit(0);
}

//********************************************
// filglio 2
//********************************************

pid1 = fork();
if ( pid1 == -1 )
{
printf ("Impossibile creare un nuovo processo\n");
exit(0);
}

if ( pid1 == 0 )
{
printf ("sono il figlio con pid (%d).Mio padre è (%d)\n",getpid(),getppid());

for (i=0; i<15000000; i++)
res=pow (sqrt(x/y),-0.215);
printf ("res =%f\n", res);
exit(0);
}

else
wait(&status);
wait(&status);
return 0;





}

tempo:
HTML
gila@gila-pc:~/Scrivania$ time ./xx
sono il figlio con pid (3623).Mio padre è (3621)
sono il figlio con pid (3622).Mio padre è (3621)
res =0.527976
res0 =0.527976

real 0m1.403s
user 0m2.777s
sys 0m0.003s
gila@gila-pc:~/Scrivania$


a funzioni:
HTML
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void f1(double x,double y)
{
int i;
double res;
for (i=0; i<15000000; i++)
res=pow (sqrt(x/y),-0.215);
printf ("res =%f\n", res);
}
void f2(double x,double y)
{
int i;
double res;
for (i=0; i<15000000; i++)
res=pow (sqrt(x/y),-0.215);
printf ("res_2 =%f\n", res);
}




int main(void)
{
double x=133.55;
double y=0.351;
f1(x,y);
f2(x,y);
return 0;
}


tempo:
HTML
gila@gila-pc:~/Scrivania$ time ./xx
res =0.527976
res_2 =0.527976

real 0m2.737s
user 0m2.736s
sys 0m0.000s
gila@gila-pc:~/Scrivania$


Sembrerebbe davvero andare più veloce a processi. Forse davvero non ho un core solo.
A sto punto non so bene nemmeno io.
Qui altre informazioni se può servire:
HTML
gila@gila-pc:~/Scrivania$ cat /proc/cpuinfo
processor : 0
vendor_id : AuthenticAMD
cpu family : 16
model : 5
model name : AMD Athlon(tm) II X4 640 Processor
stepping : 3
microcode : 0x10000c8
cpu MHz : 800.000
cache size : 512 KB
physical id : 0
siblings : 4
core id : 0
cpu cores : 4
apicid : 0
initial apicid : 0
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid pni monitor cx16 popcnt lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt hw_pstate vmmcall npt lbrv svm_lock nrip_save
bugs : tlb_mmatch fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2
bogomips : 6027.17
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 48 bits physical, 48 bits virtual
power management: ts ttp tm stc 100mhzsteps hwpstate

processor : 1
vendor_id : AuthenticAMD
cpu family : 16
model : 5
model name : AMD Athlon(tm) II X4 640 Processor
stepping : 3
microcode : 0x10000c8
cpu MHz : 2300.000
cache size : 512 KB
physical id : 0
siblings : 4
core id : 1
cpu cores : 4
apicid : 1
initial apicid : 1
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid pni monitor cx16 popcnt lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt hw_pstate vmmcall npt lbrv svm_lock nrip_save
bugs : tlb_mmatch fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2
bogomips : 6027.17
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 48 bits physical, 48 bits virtual
power management: ts ttp tm stc 100mhzsteps hwpstate

processor : 2
vendor_id : AuthenticAMD
cpu family : 16
model : 5
model name : AMD Athlon(tm) II X4 640 Processor
stepping : 3
microcode : 0x10000c8
cpu MHz : 800.000
cache size : 512 KB
physical id : 0
siblings : 4
core id : 2
cpu cores : 4
apicid : 2
initial apicid : 2
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid pni monitor cx16 popcnt lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt hw_pstate vmmcall npt lbrv svm_lock nrip_save
bugs : tlb_mmatch fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2
bogomips : 6027.17
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 48 bits physical, 48 bits virtual
power management: ts ttp tm stc 100mhzsteps hwpstate

processor : 3
vendor_id : AuthenticAMD
cpu family : 16
model : 5
model name : AMD Athlon(tm) II X4 640 Processor
stepping : 3
microcode : 0x10000c8
cpu MHz : 800.000
cache size : 512 KB
physical id : 0
siblings : 4
core id : 3
cpu cores : 4
apicid : 3
initial apicid : 3
fpu : yes
fpu_exception : yes
cpuid level : 5
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm 3dnowext 3dnow constant_tsc rep_good nopl nonstop_tsc cpuid extd_apicid pni monitor cx16 popcnt lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs skinit wdt hw_pstate vmmcall npt lbrv svm_lock nrip_save
bugs : tlb_mmatch fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2
bogomips : 6027.17
TLB size : 1024 4K pages
clflush size : 64
cache_alignment : 64
address sizes : 48 bits physical, 48 bits virtual
power management: ts ttp tm stc 100mhzsteps hwpstate

gila@gila-pc:~/Scrivania$


EDIT:

purtroppo non mi ha mantenuto l'identazione degli script, ma sono 2 righe, dovrebbe essere chiaro lo stesso
 
Top
view post Posted on 8/1/2020, 19:03
Avatar

Noioso

Group:
Professionisti
Posts:
403

Status:


Sì mi sembra si capisca abbastanza.

Che tu abbia 4 core direi che è certo, il mio dubbio era se il tuo OS e il tuo compilatore sarebbero stati in grado di usarli e... parrebbe di sì :)

Quindi ok.
La mia nota sopra era molto più a "basso livello" ossia quando hai il controllo diretto dell'hardware e devi progettare da capo.
 
Top
view post Posted on 8/1/2020, 20:43
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


Ho imparato una cosa nuova...chi lo avrebbe detto che avevo più core...
Mi confondono un po' quei dati perchè si parlava di core fisici e non ricordo...virtuali (può essere?)
Calcola che il pc l'ho preso nel 2011/2012 un po' datato direi.

CITAZIONE
Quindi ok.
La mia nota sopra era molto più a "basso livello" ossia quando hai il controllo diretto dell'hardware e devi progettare da capo.

No,no, non ne sarei assolutamente in grado. Già solo in C, conoscere bene processi, segnali ecc è un macello.
Io di quegli argomenti : socket, pipe,processi e thread, ho solo un'infarinatura.
Se non ci lavori, o non frequenti ambienti "stimolanti", si, lo studi ma dopo una settimana, ti scordi.
Programmazione come hobby, si fa fatica...e tu calcola che io ora lavoro in un catenificio !!!! :D :sick:
Grazie delle info !
 
Top
view post Posted on 8/1/2020, 21:50
Avatar

Noioso

Group:
Professionisti
Posts:
403

Status:


Cosa fa un catenificio? Catene da neve? Catenine? tutti i tipi di catene? :D interessante!

Per i core... io ho più o meno venduto PC fino al 2014 e direi che i dual/quad core c'erano già da un bel po' di anni, se non dieci... quasi. Quindi ci stiamo.
Sinceramente a me non è mai interessato molto, né ai miei clienti, perché non erano macchine per gaming ecc: Puntavo sempre sulla fascia bassa e dicevo loro di evitare di installare porcherie... !!

A livello di PC non mi è mai interessato molto ottimizzare i miei software a livello di "core" ecc: uso i thread del S.O. per evitare operazioni bloccanti ma... senza troppe pretese. A livello di MCU è diverso, ovviamente.
Sui core virtuali, non saprei che cosa si possa intendere... boh!

prego :)
 
Top
view post Posted on 9/1/2020, 20:56
Avatar

Rompiball

Group:
Appassionati
Posts:
2,612
Location:
briansa

Status:


CITAZIONE
Cosa fa un catenificio? Catene da neve? Catenine? tutti i tipi di catene? :D interessante!

Mica tanto interessante :( Hai presente le catene che vedi ai porti, sulle navi ecc? Ecco quelle sono piccole!!!
A vote maneggio catene diametro 40 mm... fai conto un anello sei sui 4 kg...enormi.
Ma comunque interessante o meno, di grazia ho il lavoro e al giorno d'oggi è oro.
 
Top
view post Posted on 9/1/2020, 21:17
Avatar

Noioso

Group:
Professionisti
Posts:
403

Status:


sticavoli!! niente male: sei una specie di fabbro...

Per il lavoro, sì, è vero. Per quanto, a giudicare da quanto facciano schifo i software che si vedono in giro (credo che Law sia d'accordo ;) ) ... io ritengo che ci sarebbe molto spazio per chi sa davvero fare le cose "decentemente"...
 
Top
view post Posted on 11/1/2020, 13:04
Avatar

Immane Rompiball

Group:
Administrator
Posts:
18,287
Location:
Orlo esterno della cintura di Orione stella 1957

Status:


Sono d'accordo, ma ormai il casino è talmente tanto e così poco ducumentato che anche Microsoft non ci capisce più una cippa.
Quindi, come dicevo, per accendere e spengere un led si usano macchine con dieci o quindici processori a 64 bit ARM, disarm, broccol, e cippollozzi. Perchè così si mantiene la compatibilità con i processori serie 4000 degli anni 70, ma si riece ad integrare almeno quattro o cinque Blue Genie.
Scusare ma ormai sono schifato.
 
Web  Top
view post Posted on 11/1/2020, 13:05
Avatar

Noioso

Group:
Professionisti
Posts:
403

Status:


io scusale te, tlanquillo amico ocidentale :D
 
Top
159 replies since 6/1/2020, 21:09   1137 views
  Share