Newsgroup: it.scienza.informatica
Titolo: Troppi Loop (*)

 Sono l'amministartore di una rete di computer per l'universita'.
 Le capacita' di calcolo del server sono limitate, quindi vorrei
 riconoscere automaticamente i programmi fatti dagli studenti
 che sono andati in loop in modo da killarli.
 Esiste un programma del genere?
--
Ciao Alan T.
-> it.scienza.informatica (Moderated)
%followup-to
it.scienza.informatica

Ciao
cito 
" Sono l'amministartore di una rete di computer per l'universita'.
 Le capacita' di calcolo del server sono limitate, quindi vorrei
 riconoscere automaticamente i programmi fatti dagli studenti
 che sono andati in loop in modo da killarli.
 Esiste un programma del genere?"
caro Alat T. (Turing?) puoi scrivere uno scriptino che eseguito da
cron controlli i tempi di uso della CPU dei processi di utente e
killa quelli che sforano un limite da te ritenuto inaccettabile...
Fai attenzione a killare solo i processi di utente altrimenti
il primo proceso a morire sara' init con tutti gli altri di sistema...
Cheers
Yuri


 Yuri
Caro Yuri,
avevo gia pensato a qualcosa del genere, che Limitasse i Bisogni Aumentati
degli studenti solo che esistono dei processi molto lunghi che vengono
correttamente lanciati dagli stessi, quello che volevo era proprio qualcosa
che distinguesse tra processi lunghi utili e quelli lunghi ma inutili.
Ciao Avril F.


 writes:
RC> 
RC>  Esiste un programma del genere?
la bash ha il comando ulimit che  permette di limitare l'uso di alcune
risorse da  parte dei  programmi,  tra cui  il  tempo  di cpu per   un
programma. Non so però se possa fare al caso tuo.
Ciao
Marco
-- 
- L'ultima invenzione dei carabinieri?
- La torcia a batterie solari.
		-- Da it.hobby.umorismo


 writes:
RC> 
RC> proprio  qualcosa che distinguesse    tra processi lunghi utili  e
RC> quelli lunghi ma inutili.
un'euristica spannometrica  basata   sul   pathname  potrebbe   essere
sufficiente?
/usr/* è un processo utile
/home/* è un processo utente, scritto male e finito in loop ;-)
Ciao
Marco
-- 
Dio e' il punto di tangenza tra zero ed infinito.
		-- Alfred Jarry


  Esiste un programma del genere?
Se ci pensi ti accorgi che non esiste un modo per capire se un programma
sta generando dati utili o meno. Prima dovresti definire il concetto di
utile. ANche un programma che sta in un loop che apparentemente non
produce niente potrebbe essere utile per valutare la velocita' di calcolo.
L'unica cosa che si puo' fare e' mettere dei limiti al tempo massimo di
CPU ed utilizzare qualche strumento per terminare tutti i programmi di
utente che superano il limite.
						l.f.


Salve
dato un processo che occupa troppa CPU puoi 
vedere se il processo crea output su un file e 
killarlo se la dimensione del file non cresce dato
un intervallo di tempo da te fissato, se un porcesso
occupa troppa CPU e non crea output su un file forse si
puo' concludere che e' in loop..... si puo' anche pensare
di richiamare l'attenzione dell'operatore su tali processi
e lasciare che sia l'operatore a decidere (magari usando top)
oppure di usare lsof per sapere se il processo ha file
aperti o connessioni di rete etc....
Non un solo criterio ma piu' di uno che consentano di dire
che un processo puo' essere in loop. C'e' comunque
sempre il rischio di killare processi legittimi....
Cheers
Yuri


 sempre il rischio di killare processi legittimi....
Grazie per le dittre.. ma l'ultimo che ha killato un processo legittimo
e' stato richiamato ufficialmente dal capo personale del personale,
sono sicuro che trovero' un modo, anche se ho letto da qualche parte
che non si puo'.
Ciao Last Hint.


 talvolta va in loop.
Ma dai? Avevo pensato ci potesse essere un problema del genere
infatti, non credo sia un problema grave cmq. Mandami pure questo
programma anche se ha qualche Problema di Arresto.
Ciao "smettero' di LOL quando l'universo finira', in una risata presumo"
Roberto


 utente che superano il limite.
Limitando la classe dei programmi che posso essere fatti girare ai LBA,
che e' evidentemente una cosa che non voglio.
Ciao "una luce si accende?"


programma anche se ha qualche Problema di Arresto.
Ah, ma ho sentito un tizio che accennava ad un altro programma con cui si 
potrebbe controllare il primo, e se non funziona, te ne proponeva un'altro per 
controllare il controllore, etc... ;-)
-- 
God is Real, unless declared Integer.
ObjectZone - 
http://space.tin.it/computer/csadun


Pape' Satan, pape' Satan aleppe, comincio' Roberto con voce chioccia:
RC> Grazie per le dittre.. ma l'ultimo che ha killato un processo legittimo
RC> e' stato richiamato ufficialmente dal capo personale del personale,
RC> sono sicuro che trovero' un modo, anche se ho letto da qualche parte
RC> che non si puo'.
se vuoi semplicemente un programma che si accorga se un altro
programma e' andato in loop allora hai letto bene. Non e' possibile :)
-- 
addio, e grazie per tutto il pesce


 programma e' andato in loop allora hai letto bene. Non e' possibile :)
Finalmente qualcuno che ha dato la risposta giusta :-)
E posso smetterla di trollare..
Ciao R.


Salve...
Cito:
"Finalmente qualcuno che ha dato la risposta giusta :-)
E posso smetterla di trollare..
Ciao R."
In pratica era un conorso a quizzzzzzzzzzz....
'azzo, mi ero distratto, allora non ci sono di mezzo un povero server 
sovraccarico e un amministartore in  ambasce che piange e grida al 
capezzale del server "figlio io resisti, ti salvero'..."
Prossima volta, evitare chiose
spiritose...
Cheers
Yuri
PS Che si vince se si e' solo partecipato? Niente premi di consoleiscion?


> programma e' andato in loop allora hai letto bene. Non e' possibile :)
RC> Finalmente qualcuno che ha dato la risposta giusta :-)
RC> E posso smetterla di trollare..
meno male, iniziava ad essere un po' troppo evidente ;)
-- 
addio, e grazie per tutto il pesce


controllare il controllore, etc... ;-)
Scusatemi, conosco l'Halting Problem, ma giusto per essere pignolo
vorrei azzardare una critica. Roberto Corda ha scritto "sono
l'amministratore di un server.. " ecc. Ora, presumo che l'halting
problem si riferisca ad un programma per una generica macchina di
turing. Un server, a quanto ne so, pero' non e' esattamente uguale ad
una MdT, che ha risorse di memoria illimitate. Al contrario, le
risorse di memoria di un server sono limitate, quindi si puo' trovare
al piu' in 2^n stati differenti, dove n e' il numero di bit di memoria
del server. Per individuare un loop dovrebbe allora bastare
affiancargli un secondo server, con una rappresentazione dei 2^n stati
del server principale. Ogniqualvolta questo entra in uno stato,
basterebbe contrassegnare lo stato corrispondente sul server di
supporto; se ci si trova a contrassegnare due volte lo stesso stato,
significa che il server principale e' entrato in loop.
Che dite, potebbe funzionare?
Ciao,
anders


 Che dite, potebbe funzionare?
Hmm, come faresti a distinguere tra un programma che termina ed uno che non
termina?
Ad esempio:
begin
    b:=true;
    while b do
        skip
    od
end
e:
begin
    b:=true
end
Dovresti controllare anche il program counter per individuare il primo loop,
guardare il valore di b non è sufficiente. Questo significa che in un
ambiente multiprogrammato questa tecnica non può essere usata, dato che i
programmi possono essere spostati dal sistema operativo lungo tutto il range
della memoria.
Ciao,
    Paolo


 significa che il server principale e' entrato in loop.
Il tutto fìunziona se mi convinci che il secondo server non va in loop.
E' vero che i computer reali sono tutti dei LBA.
Ciao R.


 [while (1)  i++;]
Su un sistema di calcolo reale questo però termina; prima o poi andrà in
overflow. Non costituisce un problema per noi.
Ciao,
    Paolo


wrote:
ecc. ecc.
Naturalmente, ho commesso il solito errore di distrazione (chiedo
venia): il secondo server dovrebbe contenere una rappresentazione di
2^nb*ns stati differenti, dove nb e' il numero di bit della memoria
del primo server, e ns e' il numero di possibili stati del suo
processore. A questo punto credo che possa funzionare.
In primo luogo non dovrebbe bloccarsi: se il primo server dispone solo
di un numero finito di stati da poter attraversare, sappiamo anche
esattamente quanto puo' durare AL PIU' una computazione terminante,
dato che li dovrebbe attraversare tutti. Giunta al 2^nb*ns esimo
cambio di stato, dovrebbe per forza tornare ad uno stato precedente, e
saremmo certi che il server e' il loop.
Inoltre, essendo il server rigidamente deterministico, ogni suo stato
successivo e' dato dal precedente. Se ci si ritrova due volte su uno
stesso stato A, significa che ci si trova a percorrere una qualunque
catena di stati che inizia e termina in A, all'infinito. La catena non
ha naturalmente ramificazioni (c'e' una sola freccia in uscita da ogni
stato), altrimenti il server sarebe dotato di libero arbitrio!
Quanto all'obiezione sulla possibilita' di applicare il metodo anche
in un ambiente multiprogrammato, non dovrebbero esserci problemi, dato
che lo possiamo considerare come se fossero n macchine del tutto
indipendenti ognuna delle quali agisce solo sulla propria memoria,
indirizzata con un offset rispetto alla locazione iniziale.
E' chiaro comunque che se anche la cosa fosse corretta dal punto di
vista teorico, e' in realta' non e' fattibile, dato che 2^nb*ns stai
sono un numero enorme. Ma visto che si trolleggiava...
Ciao,
anders


 indirizzata con un offset rispetto alla locazione iniziale.
Ok, io perň intendevo il fatto che i programmi possono essere rilocati,
quindi potresti avere programmi nonterminanti che "gironzolano" in memoria,
occupando stati sempre diversi del sistema processore-memoria (cambia
l'offset). A questo punto dovresti conoscere come il s.o. gestisce la
memoria virtuale ed in piů tenere sotto controllo gli altri programmi.
Ciao,
    Paolo


Che dite, potebbe funzionare?
Gli stati dovrebbero essere, se seguo il tuo ragionamento, tutte le possibili 
permutazioni di n bit (dove n e' il numero totale di bit di memoria+interni al 
processore+etc). Quindi n!, che e' piu' grandino. :)
Ci sono un paio di cose da dire. Il tuo dubbio - che e' sensato :) - e' di dire 
"Okay, l'HP si applica alle MdT, ma un computer vero e' modellato da una MdT o 
un ASFnd? O un ASC?". 'nsomma, ci hanno sempre detto che un computer reale e' 
modellato una MdTU, ma e' vero o no? :)
Ora, un computer *non* e' modellabile con un ASFnd, anche se ha un numero di 
stati possibili finito - e il perche' non e' forse cosi' ovvio: normalmente 
tutto quello che viene fatto e' arrivarci in modo leggermente obliquo, 
dimostrando, ad esempio, che esistono linguaggi riconoscibili da una MdT ma non 
da un ASF o un ASFnd etc, quantunque grande sia il suo numero di stati - e 
siccome un computer reale e' in grado di riconoscere questi linguaggi, quindi 
e' piu' potente di un ASFnd, voila', un computer non e' modellabile da un 
ASFnd. 
Quindi, "avere un numero finito di stati possibili" non e' equivalente ad 
"avere la stessa potenza computazionale di un automa a stati finiti". :) In 
effetti c'e' un'intera area di CS che riguarda computazioni a memoria limitata.
Il punto intutivo e' - imho - che una MdT e' qualcosa in cui il programma e' 
*fornito* insieme all'input su cui opera: sono entrambi parametri. Per un ASF 
di qualunque tipo, il programma e' *fisso*. Ma cos'e' il programma? E' una 
mappa tra stato e stato, dove gli stati possibili *dipendono dall'input*. Non 
basta, quindi, un ASFnd? No, perche' per un computer reale *il programma puo' 
essere un'altra MdT*. Se anche scrivo un ASFnd in cui ogni stato ha transizioni 
verso *tutti* gli altri stati, non riesco lo stesso - per i motivi noti - a 
simularci ogni generica MdT.
Quindi un computer vero puo' avere in input una MdT che usa per le sue 
computazioni solo una porzione limitata di nastro ('sta' nella memoria 
disponsibile). Ergo e' modellato da una MdT universale, dove l'universo e' 
quello delle MdT a nastro limitato.
Quindi l'HP si applica: non sono in grado di costruire una seconda MdT che - 
data *ogni* possibile MdT X (che usa solo una porzione limitata di nastro) data 
in pasto al computer - si fermi su uno stato "ok" se X si ferma, e si fermi su 
uno stato "non ok" se X non si ferma.
Occhio che cio' non vuol dire che non posso *imporne* la fermata (tipo: dopo n 
volte che la testina ha la stessa sequenza di movimenti, decido che mi fermo), 
ma che non posso *riconoscerla*. Cioe', la mia MdT "programma" potrebbe 
terminare al n+1esimo passo - e io mi perdo 'sta informazione.
-- 
God is Real, unless declared Integer.
ObjectZone - 
http://space.tin.it/computer/csadun




Ho tagliato parti del tuo post originale perche' conteneva righe fuori
standard, e il bot del newsgroup non me lo accettava...  
Gli stati dovrebbero essere, se seguo il tuo ragionamento, tutte le
possibili ..
Non mi pare: le permutazioni sono disposizioni diverse degli stessi
oggetti, mentre qui parliamo di semplici combinazioni. Abbiamo un
insieme NB, che e' l'insieme dei bit del server, con cardinalita' nb,
e l'insieme delle parti di NB, cioe' l'insieme di tutti i possibili
insiemi di bit in NB accesi, con cardinalita' 2^nb.
Ci sono un paio di cose da dire. Il tuo dubbio - che e' sensato :) -
e' di dire ..
...hmm.. ma come fai a dire che il computer e' in rado di accettare uno
di questi linguagg? Voglio dire, non puoi basarti sul fatto che una
MdT li accetta, altrimenti siamo daccapo.
quindi ..
Non capisco come possa un computer essere un automa a stati finiti e
ciononostante non averne la capacita' computazionale. Ma non mi voglio
addentrare piu' di tanto in questo problema. Notero' soltanto che, se
da una parte e' difficile pensare che la varieta' dei linguaggi che
possono essere accettati da un computer si riduca alla classe dei
linguaggi regolari, d'altra partee' anche ovvio che non solo un
computer non e' in grado di accettare il linguaggio di una generica
TM, ma neppure quello di un automa pushdown.
Il punto intutivo e' - imho - che una MdT e' qualcosa in cui il
programma e' ..
E' qui che non ci intendiamo, forse. Io sto pensando ad un automa
finito *univoco* (per il vero non so se ne esistano nella teoria).
Cioe' ad una automa finito in cui esiste un solo arco uscente da ogni
stato, e i percorsi non sono determinati da algoritmi e input, ma sono
solo iniziati da algoritmi e input. Cioe' una macchina in cui sono
codificate sotto forma di stati distinti tutte le possibili
combinazioni <algoritmo,input> (comprese quelle sintatticamente
errate, ecc) e in cui quindi la transizione fra gli stati non e'
determinata da un particolare programma ma e' universale e obbligata.
Fornire un programma  e un input ad una simile macchina significa
quindio semplicemente portarla in un certo stato iniziale. In efetti
le successive transizioni di stato non comporterebbero alcuna
"elaborazione".
Non 
basta, quindi, un ASFnd? No, perche' per un computer reale *il
programma puo' ..
E ti credo: una generica MdT non la puoi simulare nemmeno su un
computer!
Quindi un computer vero puo' avere in input una MdT che usa per le sue
Non capisco dove stia il passaggio dalla possibilita' di simulare una
MdT a nastro limitato alla possibilita' di simulare una generica MdT.
Ti ricordo che un computer non e' neppure in grado di simulare un
automa pushdown.
Trovami infatti un computer che accetti il linguaggio formato da
stringhe contenenti n "a" seguite da n "b", per ogni generico n.
Infine, il programma di controllo termina in al piu' 2^nb passi, che
e' la lunghezza massima di passi di un programma terminante per il
server principale.
ciao,
anders
