Newsgroup: it.comp.os.dibattiti
Titolo: I processi <defunct> o <zombie>

Sulla mia Linux box (Suse 6.0) con kernel 2.0.36 ho grossi problemi con i
processi zombie...
Dalla mia esperienza su Linux, il processo zombie sparisce soltanto al
riavvio, mentre in Solaris, a parte alcuni casi (legati in particolare a bug
del kernel) il processo zombie <defunct> diventa figlio di init che
"cattura" il suo exit status e gli permette di terminarsi definitivamente.
Ora perň nonostante i processi zombie spariscano solo al riavvio la mia
Linux box non riesce a riavviarsi correttamente: si "blocca" (non so come
meglio spiegarlo), in fase di shutdown.
Ci sono delle differenze architetturali tra Linux e Solaris nella gestione
di questi processi e, se non dovesse essere solo un mio problema, come fare
uno shutdown pulito del sistema Linux con processi zombie?
Inoltre mi chiedevo se in NT esistono gli analoghi e come vengono gestiti...
Saluti
UltraSparc

Inoltre mi chiedevo se in NT esistono gli analoghi e come vengono gestiti...
NT ha una gestione dei processi molto diversa.
In NT non c'e` una nozione di gerarchia dei processi netta come in *nix.
A quanto ne so` non esiste un modo pulito (o forse non esiste affatto)
per decidere se il codice e` eseguito dal padre o dal figlio.
Forse non ci problemi con gli zombie ma ce ne sono di piu` seri a
livello di programmazione delle API Win32 riguardo i processi.
-- 
Lorenzo
"Given enough eyeballs, all bugs are shallow", Linus'Law
(per rispondere via email fai un rot13 dell'indirizzo)
(apply a rot13 to reply)

 Ma come fai a generarli 'sti zombie?
Non č che abbia un metodo preciso. Semplicemente a volte nascono (o dovrei
dire resuscitano :-))
Ciao
UltraSparc

uno shutdown pulito del sistema Linux con processi zombie?
Non c'e` niente di particolare da fare.
-- 
ciao, | [Per rispondere togli "toglimi" dal mio indirizzo.]
Marco | "You're one of those condescending Unix computer users!"
      | "Here's a nickel, kid. Get yourself a better computer"  -- Dilbert
      | (Ri)scoprire fidonet: 
http://bbs.mi.linux.it

 per decidere se il codice e` eseguito dal padre o dal figlio.
In Win2K c'č una cosa molto piů complessa. Si chiama Job.
Che non č il concetto di job di Unix, ma quello di OS/400.
Saluti.

 con gli script dello shutdown.
Non credo ci sia una interazione con gli script di shutdown, ma penso che il
kernel provi a killare gli zombie, e che non riuscendoci rimanga in attesa.
Tutto quello che so Unix mi dice che questa spiegazione non ha senso e sono
sicuro che confermerai.
Il mio init potrebbe avere qualche problema? Ricordo di aver letto da
qualche parte che se con i nuovi kernel (> 2.0.xx) la macchina non si spegne
in fase di shutdown (nonostante la direttiva specificata in fase di
compilazione) il problema potrebbe essere proprio di init e guarda caso con
i nuovi kernel la mia macchina non si spegne!
Cosa ne pensi?
Ciao
UltraSparc

 Che non è il concetto di job di Unix, ma quello di OS/400.
Potresti spiegarti meglio, visto che sei sembri una persone che conosce
molto bene i SW Microsoft e che io non ho mai visto OS/400?
Ciao
UltraSparc

Che non è il concetto di job di Unix, ma quello di OS/400.
Qualche esempio di codice?


concetto di job di Unix, ma quello di OS/400.
Sai cos'e`, tra l'altro, che al  mio senso estetico da tecnico non piace
dei  sistemi M$?  Che pure  se vengono  completamente sconvolti,  queste
chicche puramente tecniche passano inosservate  ai piu` e possono essere
apprezzate solo dagli "iniziati". Nel  mondo Unix il sistemista e` molto
piu` vicino  alla sua "creatura",  c'e` molta piu` documentazione,  e le
innovazioni sono molto piu` a portata di tutti.
-- 
  _      ___ ____
 | | /| / (_)_  /
 | |/ |/ / / / /_	ANTI-SPAM WARNING:
 |__/|__/_/ /___/	the e-mail address is fake.
 
$ cat flame > /dev/null

i nuovi kernel la mia macchina non si spegne!
Allora vuoi fare halt, non shutdown! Se non si spegne fisicamente hai
un BIOS buggato e ti serve un kernel piu` recente (che contiene un
rimedio).


 Cosa ne pensi?
Che ci sono degli appositi NG dedicati a Linux sui quali andare
a chiedere aiuto.
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

Che non è il concetto di job di Unix, ma quello di OS/400.
Perche' tendo a dubitare di cio??
Obelix

 Qualche esempio di codice?
void EnumProcessIdsInJob(HANDLE hjob) {
// I assume that there will never be more than 10 processes in this job
w    #define MAX_PROCESS_IDS    10
// Calculate the number of bytes needed for structure & process Ids
    DWORD cb = sizeof(JOBOBJECT_BASIC_PROCESS_ID_LIST) +
        (MAX_PROCESS_IDS - 1) * sizeof(DWORD);
// Allocate the block of memory
    PJOBOBJECT_BASIC_PROCESS_ID_LIST pjobpil = _alloca(cb);
// Tell the function the maximum number of processes that we allocated space
for
    pjobpil->NumberOfAssignedProcesses = MAX_PROCESS_IDS;
// Request the current set of process Ids
    QueryInformationJobObject(hjob, JobObjectBasicProcessIdList, pjobpil,
cb, &cb);
// Enumerate the Process Ids
    for (int x = 0; x < pjobpil->NumberOfProcessIdsInList; x++) {
        // Use pjobpil->ProcessIdList[x].
    }
// Since _alloca was used to allocate the memory, we don't need to free it
here


 molto bene i SW Microsoft e che io non ho mai visto OS/400?
Russinovick docet. Il buon Mark ha scritto dei bellissimi articoli su
Windows 2000 Magazine.
Comunque tech info (codice C) sono disponibili su
http://msdn.microsoft.com/library/psdk/winbase/prothred_9joz.htm
.
Saluti.

 rimedio).
Proverò a fare l' upgrade di BIOS.
Mi potresti spiegare la differenza fra halt e shutdown in Linux? Halt è una
procedura molto sconsigliata i Solaris perché non usa gli rc script. Lo
shutdown o l' init solo le procedure appropriate...
Ciao
UltraSparc

Leggiti bene le modifiche di architettura apportate a win2k.
Mi pare o lui parlava di NT?
-- 
*** Hi! I'm a .signature Virus ! Copy me
    to your signature to help me spreading! ***

}
Ehm, adesso si capisce perche` m$ non voglia rilasciare i sorgenti :-)
Ok, a parte la battuta, Gabriele, ma che e` sta roba? :-)
Quel codice mi elenca tutti i ProcessId dei processi che fanno
parte del job object, e allora? Che ci faccio?
L'elenco dei ProcessId lo potevo fare pure prima (senza w2k) senza
tutto quell'accrocco.
In NT se voglio sapere il ppid (parent pid) di un processo come faccio?
Esiste il parent pid? Con Linux mi basta getppid()
Infine ti ripongo la domanda:
come faccio a fare in modo che una parte del codice venga eseguita
dal padre e una parte dal figlio?
Per esempio:
        pid = fork();
        if (pid == -1) {
	        perror(fork);
		exit(1);
	} else {
	        if (pid == 0) {
		        /* questo e` per il figlio */
		} else {
		        /* questo e` per il padre */
		}
	}
Come faccio ad emularlo con una CreateProcess()? Io ci ho provato.
Risposta breve: si puo`.
Risposta piu` articolata: a patto di scrivere codice orrendo.
Se vuoi te lo faccio vedere ma devi prima tapparti il naso.
Senza queste "features" trovo un po` difficile avere una gestione
gerarchica dei processi.
La soluzione dei job non e` altro che una rappresentazione insiemistica
dei processi, un modo veloce per fare la stessa cosa su piu` processi
una volta sola. A me basta mandare un segnale al pgid che voglio e
quel segnale raggiungera` tutti i processi appartenenti a quel process
group id...


Mi potresti spiegare la differenza fra halt e shutdown in Linux? Halt è una
halt spegne il computer, shutdown fa il reset.
Tutti e due i comandi eseguono gli script appropriati.
Leggere le relative man page sarebbe una buona cosa.


 Mi pare o lui parlava di NT?
W2K è NT.
Saluti.

una volta sola
E non e' neppure parente dei job di AS400, en passant...
Obelix

 wrote in message
news:391f2810...@news.seven.it...

Non ho letto il post di Lorenzo perchè il news server si ostina a non
fornirmelo....
Dal Work Management di OS/400 4.4
------------------------------
5.0 Jobs
Each piece of work on the system is performed in a job; each job has a
unique name within the system. All jobs, with the exception of system jobs,
run within subsystems. A job can enter the subsystem from any of the work
entries, such as, a job queue entry, workstation entry, communications
entry, autostart job entry, or prestart job entry.
A job, however, is a collection of one or more threads. Each job has at
least one thread, which is identified as the initial thread. The initial
thread is created when the job starts. The job may also have additional
threads, identified as secondary threads, depending on the applications that
are used by a job.
The thread is an independent unit of dispatchable work. Each thread has its
own execution environment, such as a call stack, but the thread shares many
of the resources that are assigned to the job. The identifier for the thread
is unique in the job to which the thread belongs.
Controlling work in the system is performed mainly at the job level. Most
commands and application programming interfaces (APIs) operate against the
entire job.
Resources can be owned at the thread level or the job level. The job serves
as an owner for resources that are shared with all threads within the same
job. Similarly, some attributes that determine how work is processed are
defined at the thread level and some are defined at the job level.
Individual attributes and interfaces need to be reviewed to determine the
scope of the attribute.
------------------------
MSDN - Job Object Definition
A  allows groups of processes to be managed as a unit. Job objects are
namable, securable, sharable objects that control attributes of the
processes associated with them. Operations performed on the job object
affect all processes associated with the job object.
Each process provides the resources needed to execute a program. A process
has a virtual address space, executable code, data, object handles,
environment variables, a base priority, and minimum and maximum working set
sizes. Each process is started with a single thread, often called the
primary thread, but can create additional threads from any of its threads.
All threads of a process share its virtual address space and system
resources. In addition, each thread maintains exception handlers, a
scheduling priority, and a set of structures the system will use to save the
thread context until it is scheduled. The thread context includes the
thread's set of machine registers, the kernel stack, a thread environment
block, and a user stack in the address space of the thread's process
----------------------
Considerando che per IBM il termine Job ha lo stesso significato del termine
Process usato da Microsoft
la definizione di base è la medesima (e non vedo come possa essere
diversamente).
Un Job IBM come un Process Microsoft contiene almeno un Thread
Forse il modello di  NT ha una granularità più fine rispetto a quello di IBM
dato che Thread può a sua volta
In realtà i modelli sono i seguenti
IBM:
Job -> Threads
Microsoft
Job -> Process -> Thread ->Fiber
Aggiungiamo che i Threads sono gestibili in pool.
La differenza più evidente è la condivisione delle risorse fra Process in
ambiente Microsoft , dato che Process è isolato nel suo spazio. Esistono
svariati metodi per farlo. DCOM consente di farlo anche su macchine
fisicamente diverse. E' per questo che nel modello di Microsoft il Job
Object non è realmente il componente padre della gerarchia. Quindi un
Process Microsoft non origina obbligatoriamente un Job Object Microsoft.
Le utility (Job Management) per gestire da user normale cose come i
Subsystem, Work Entry,  Routing, Job Transfer (che ci sono perchè
intrinseche di COM, COM+ e DCOM )  NON sono presenti nelle versioni
Professional, Server e Advanced Server. Lo sono solo nella Datacenter
Edition :-( .
Se queste funzionalità devone essere implementate nelle versioni per esseri
umani deve essere attualmente il programmatore a prevederlo applicativo per
applicativo.
Le API ci sono tutte.  Tuttavia terze parti stanno scrivendo l'equivalente
delle
utility di Job Management della versione DataCenter.
Saluti.

W2K è NT.
Allora perche' si chiama Win2000 e non NT2000?


 Allora perche' si chiama Win2000 e non NT2000?
Perche' il marchio NT era sotto copyright e MS doveva pagare i diritti.
Ciao
Francesco

 Perche' il marchio NT era sotto copyright e MS doveva pagare i diritti.
Non e' una provocazione, dico sul serio, giuro.. ma a chi? A loro stessi?
-- 
Pierluigi De Rosa (
tho...@durin.khazad-dum.net
).
<<      LINUX: the choice of a GNU generation     >>
<<   For my real address... ask the Balrog.       >>
* Sostenete la Lega per la Soppressione dei Troll *

W2K è NT.
Gabriele, i Job di cui parli sono inclusi in NT?
No, e allora W2K != NT.
In ogni caso mi sembra che nessuno dei due tenga traccia della
generazione dei processi per cui non si puo` parlare di gestione
gerarchica dei processi. I JobObject sono solo un modo per
raggruppare piu` processi in una unita`.
Questa e` l'esatta definizione che da m$ e non c'e` scritto da
nessuna parte che questa cosa offra una rappresentazione
gerarchica dei processi.


 Non e' una provocazione, dico sul serio, giuro.. ma a chi? A loro stessi?
Nortel Telecom o giu' di li', vado a memoria.
Ciao
Francesco

 gerarchica dei processi.
E chi parla di gerarchia?
L'oggetto base rimane sempre il Processo. Il Job è una collection di
processi.
Viene creata quando un processo viene associato al Job. La struttura che
contiene queste informazioni è JOBOBJECT_BASIC_PROCESS_ID_LIST.
Saluti.

Nortel Telecom o giu' di li', vado a memoria.
Del resto "New Tecnology" e` sempre stato un po` diciamo... ambizioso :-)


Non e' una provocazione, dico sul serio, giuro.. ma a chi? A loro stessi?
:-)
no, alla northern telecom; davvero, c' e' sulla scatola
ciao
marco

has a virtual address space, executable code, data, object handles,
Questo, automaticamente, lo rende diverso dal Job AS400 e tu lo sai...
Obelix

Del resto "New Tecnology" e` sempre stato un po` diciamo... ambizioso :-)
Come, non signifcava 'Not Today'???
Obelix

 Allora perche' si chiama Win2000 e non NT2000?
E perchè non funzionano i drivers di NT?
Saluti,
Fabio Alemagna

E perchè non funzionano i drivers di NT?
Non e' che non vanno tutti, a volte ci sono problemi dovuti al fatto che ci
sono stati cambiamenti al SO, in (molti) altri casi si tratta di driver
scritti male.
Ciao
Francesco

Questo, automaticamente, lo rende diverso dal Job AS400 e tu lo sai...
Ricapitolando
Un JOB OS/400 e un'insieme di thread (che sono unita indipendenti con ANCHE
possibilita
di condivisione di oggetti). Un thread OS/400 non e divisibile.
Un JOB NT e un'insiemi di processi. Un Processo e un'entita indipendente.
Puo essere
suddiviso in thread e questi in fibers. I Thread NT essendo figli di un
processo condividono
le informazioni del processo dal quale sono stati generati.
In effetti la comparazione JOB OS/400 = Process NT non e corretta in quanto
dovrebbe
essere Thread OS/400 = Process NT.
Cosi come un JOB OS/400 e composto da almeno un Thread un JOB NT e composto
da
almeno un Process.
E' profondamente diverso il modo in cui i Thread/Process si scambiano
informazioni.
Saluti in Job.

Ricapitolando
Ricapitolando, ti sei dimenticato degli activation group.....
Obelix

contiene queste informazioni è JOBOBJECT_BASIC_PROCESS_ID_LIST.
Trova il modo di leggere il mio articolo precedente, altrimenti
non ci capiamo. Se vuoi te lo riposto.


 no, alla northern telecom; davvero, c' e' sulla scatola
Ah, capisco, THNX !!


 Nortel Telecom o giu' di li', vado a memoria.
Grazie anche a te per la risposta 8-)
