Newsgroup: it.comp.os.linux.development
Titolo: numero di processori

sto' sviluppando un applicativo ( C ) in cui necessito di sapere il numero
do processori installati sulla macchina , esiste una funzione che ritorni
il numero di proc o devo spulciarmi /proc ?
-- 
Colmo del prete: non poter mostrare la potenza del proprio organo!
                -- Da it.hobby.umorismo

 il numero di proc o devo spulciarmi /proc ?
cat /proc/cpuinfo|grep ^processor|wc -l
Ciao,
-- 
       Roberto Divia`             Love at first sight is one of the greatest
       =============             labour-saving devices the world has ever seen.
Mailbox: C02110                 CERN-European Organization for Nuclear Research
E-mail: 
Robert...@cern.ch
           CH-1211 GENEVE 23, Switzerland

 cat /proc/cpuinfo|grep ^processor|wc -l
si , ok , fino a qui' ci arrivavo anche io , volevo sapere se esiste un
funzione c di qualche libreria che mi dia lo stesso risultato senza passare
da programmi esterni.
ps: il primo che mi dice fopen ( "/proc/cpuinfo" , "r" ) lo uccido ;-)
-- 
"Era cosi' grasso che per mettersi la sciarpa usava il boomerang."
                -- Da it.hobby.umorismo

 
int procs;
if (FILE *f = popen("cat /proc/cpuinfo|grep ^processor|wc -l", "r"))
	fscanf(f, "%d", &procs);
	pclose(f);
}
Un tempo ero scettico a far cose di sto tipo, ma se la portabilita' non 
e' un requisito una cosa del genere in realta' e' anche piu' facile da 
leggere oltre che da implementare che una criptica sequenza di ioctl...
Bye,
  Gabry

 leggere oltre che da implementare che una criptica sequenza di ioctl...
si , ok , ma la criptica sequenza di ioctl esiste ?
-- 
[Dlin-Dlon]  Si ricorda ai signori passeggeri la presenza a bordo di
borseggiatori.
                -- Gli altoparlanti della Metropolitana di Milano,
                   Stazione Centrale

 si , ok , ma la criptica sequenza di ioctl esiste ?
linux:
long cpus = sysconf(_SC_NPROCESSORS_CONF);
*bsd: 
int mib[2] = { CTL_HW, HW_NCPU };
unsigned int cpus;
size_t len = sizeof(int);
sysctl(mib, 2, &cpus, &len, 0, 0);
.. qualcosa di simile
-- 
sbi

> long cpus = sysconf(_SC_NPROCESSORS_CONF);
grazie 1000 , era proprio quello che cercavo , tra l' altro mi sembra molto
+ pratico che gironzolare x proc.
ciao.
-- 
- Cos'e' che si puo' fare fra 2 uomini, fra 1 uomo e 1 donna, ma non
  fra 2 donne?
- La confessione.
                -- Da it.hobby.umorismo

 + pratico che gironzolare x proc.
ricorda solo che le sysctl sono solo di linux.
e già che ci sei non sputerei sul gironzolare sul filesystem proc, visto
che le sysctl fanno esattamente la stessa roba :-)

 che le sysctl fanno esattamente la stessa roba :-)
vuoi mettere una riga di codice ;-)
-- 
Se stanotte hai intenzione di fare qualcosa di cui ti pentirai domani
mattina, dormi fino a tardi.
                -- Henny Youngman

 che le sysctl fanno esattamente la stessa roba :-)
Ho fatto qualche test sul mio computer (Pentium 4 Intel).
La seguente istruzione, ripetuta miliardi di volte, richiede 1.6 cicli 
di CPU:
    cpus = sysconf(_SC_NPROCESSORS_CONF);
La seguente istruzione, ripetuta decine di volte, richiede 47.9 milioni 
di cicli di CPU:
    if (f = popen("cat /proc/cpuinfo|grep ^processor|wc -l", "r"))
Pertanto risulta circa 30 milioni di volte piu' lenta della precedente.
Una versione leggermente migliorata e' la seguente:
    if (f = popen("grep ^processor /proc/cpuinfo|wc -l", "r"))
Questa richiede 34 milioni di cicli di CPU, quindi risulta circa 21 
milioni di volte piu' lenta della prima soluzione.
Conclusione: Non mi sembra plausibile che le tre soluzioni facciano 
esattamente la stessa roba.
-- 
	Carlo Milanesi
 
http://digilander.libero.it/carlmila

 esattamente la stessa roba.
Beh, dubito che venga usato grep nel primo caso (ne' penso che abbia senso
perche' potrebbe non essere installato in tutti i sistemi).
Per vedere se usa veramente /proc prova con strace.
Alessandro.

 esattamente la stessa roba.
a livello di istruzioni no, perché le tue soluzioni con la popen girano 
in userspace, mentre la sysctl gira in kernelspace. Rimane di fatto che 
entrambe accedono al filesystem proc.

     if (f = popen("cat /proc/cpuinfo|grep ^processor|wc -l", "r"))
Dovresti fare un confronto tra la prima e qualcosa tipo
 f=fopen("/proc/cpuinfo", "r");
 for (riga in f) if (riga inizia con "processor") i++;
Ovviamente in metacodice. Alla fine in i hai il numero di processori.
Bye.

 Rimane di fatto che entrambe accedono al filesystem proc.
Questo e` vero. Il numero di processori si ottiene contando le righe che
iniziano per "cpu" in /proc/stat meno uno.
L'enorme differenza in termini di tempo e` dovuta al fatto che la
creazione e la distruzione di processi (processi, non thread) sono
operazioni molto lente. In pratica il tempo per parsare /proc/cpuinfo (o
/proc/stat) e` insignificate rispetto a quello richiesto per la
creazione/distruzione di un nuovo processo (2 o piu` in verita`, prima
viene creata una shell per eseguire il comando).
Luca
-- 
Home: 
http://kronoz.cjb.net
"Ci sono le balle , le megaballe e le statistiche".
 Mark Twain

 wrote:
Scusate il mega OT,
Gabriele dovrei contattarti, ma trovare un tuo indirizzo email
funzionante e' un'impresa titanica =P
Non ti spiacerebbe contattarmi al mio indirizzo (nel from basta che
togli _lollo_)
Argomento della comunicazione (amimud, amiga e cosucce)
Se non ti secca contattami grazie
Whamoo aka Rattotti Matteo