X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;f=ipc.tex;h=6d0cb5db711bc11a64bc331ffb429fb4dfed5bba;hb=5ac64ab2753cbd2198e9b5b17119134b5ef63bc6;hp=f3a2ec75f9ad64d8adc21a1c330fdc08d5fdcf2a;hpb=dcf2c2df897955ff3503a7c426025457ab456fd7;p=gapil.git diff --git a/ipc.tex b/ipc.tex index f3a2ec7..6d0cb5d 100644 --- a/ipc.tex +++ b/ipc.tex @@ -1222,7 +1222,7 @@ cui queste strutture vengono mantenute dal kernel.\footnote{lo schema \label{fig:ipc_msqid_ds} \end{figure} -A ciascuna coda è associata una struttura \struct{msgid\_ds}, la cui +A ciascuna coda è associata una struttura \struct{msqid\_ds}, la cui definizione, è riportata in fig.~\ref{fig:ipc_msqid_ds}. In questa struttura il kernel mantiene le principali informazioni riguardo lo stato corrente della coda.\footnote{come accennato questo vale fino ai kernel della serie 2.2.x, @@ -2167,7 +2167,7 @@ Dato che, come già accennato in precedenza, in caso di uscita inaspettata i semafori possono restare occupati, abbiamo visto come \func{semop} permetta di attivare un meccanismo di ripristino attraverso l'uso del flag \const{SEM\_UNDO}. Il meccanismo è implementato tramite una apposita struttura -\struct{sem\_undo}, associata ad ogni processo per ciascun semaforo che esso +\kstruct{sem\_undo}, associata ad ogni processo per ciascun semaforo che esso ha modificato; all'uscita i semafori modificati vengono ripristinati, e le strutture disallocate. Per mantenere coerente il comportamento queste strutture non vengono ereditate attraverso una \func{fork} (altrimenti si @@ -2208,7 +2208,7 @@ Se invece tutte le operazioni possono avere successo queste vengono eseguite immediatamente, dopo di che il kernel esegue una scansione della coda di attesa (a partire da \var{sem\_pending}) per verificare se qualcuna delle operazioni sospese in precedenza può essere eseguita, nel qual caso la -struttura \struct{sem\_queue} viene rimossa e lo stato del processo associato +struttura \kstruct{sem\_queue} viene rimossa e lo stato del processo associato all'operazione (\var{sleeper}) viene riportato a \textit{running}; il tutto viene ripetuto fin quando non ci sono più operazioni eseguibili o si è svuotata la coda. Per gestire il meccanismo del ripristino tutte le volte che @@ -2218,6 +2218,8 @@ contiene (nel vettore puntato dal campo \var{semadj}) un valore di aggiustamento per ogni semaforo cui viene sommato l'opposto del valore usato per l'operazione. +%TODO verificare queste strutture \kstruct{sem\_queue} e \kstruct{sem\_undo} + Queste strutture sono mantenute in due liste,\footnote{rispettivamente attraverso i due campi \var{id\_next} e \var{proc\_next}.} una associata all'insieme di cui fa parte il semaforo, che viene usata per invalidare le @@ -2832,12 +2834,12 @@ condivisa (la funzione si bloccherà automaticamente se qualche client sta leggendo), poi (\texttt{\small 44}) si cancellano i valori precedentemente immagazzinati nella memoria condivisa con \func{memset}, e si esegue (\texttt{\small 45}) un nuovo calcolo degli stessi utilizzando la funzione -\func{DirScan}; infine (\texttt{\small 46}) si sblocca il mutex con +\myfunc{dir\_scan}; infine (\texttt{\small 46}) si sblocca il mutex con \func{MutexUnlock}, e si attende (\texttt{\small 47}) per il periodo di tempo specificato a riga di comando con l'opzione \code{-p} con una \func{sleep}. Si noti come per il calcolo dei valori da mantenere nella memoria condivisa si -sia usata ancora una volta la funzione \func{DirScan}, già utilizzata (e +sia usata ancora una volta la funzione \myfunc{dir\_scan}, già utilizzata (e descritta in dettaglio) in sez.~\ref{sec:file_dir_read}, che ci permette di effettuare la scansione delle voci della directory, chiamando per ciascuna di esse la funzione \func{ComputeValues}, che esegue tutti i calcoli necessari. @@ -2849,10 +2851,10 @@ ciascuna voce, per ottenerne i dati, che poi utilizza per incrementare i vari contatori nella memoria condivisa, cui accede grazie alla \index{variabili!globali} variabile globale \var{shmptr}. -Dato che la funzione è chiamata da \func{DirScan}, si è all'interno del ciclo -principale del programma, con un mutex acquisito, perciò non è necessario -effettuare nessun controllo e si può accedere direttamente alla memoria -condivisa usando \var{shmptr} per riempire i campi della struttura +Dato che la funzione è chiamata da \myfunc{dir\_scan}, si è all'interno del +ciclo principale del programma, con un mutex acquisito, perciò non è +necessario effettuare nessun controllo e si può accedere direttamente alla +memoria condivisa usando \var{shmptr} per riempire i campi della struttura \struct{DirProp}; così prima (\texttt{\small 6--7}) si sommano le dimensioni dei file ed il loro numero, poi, utilizzando le macro di tab.~\ref{tab:file_type_macro}, si contano (\texttt{\small 8--14}) quanti ce @@ -4275,7 +4277,7 @@ prende un valore identico a quello usato per creare il semaforo stesso con il semaforo viene effettivamente cancellato dal sistema soltanto quando tutti i processi che lo avevano aperto lo chiudono. Si segue cioè la stessa semantica usata con \func{unlink} per i file, trattata in dettaglio in -sez.~\ref{sec:file_link}. +sez.~\ref{sec:link_symlink_rename}. Una delle caratteristiche peculiari dei semafori POSIX è che questi possono anche essere utilizzati anche in forma anonima, senza necessità di fare @@ -4607,7 +4609,7 @@ testo alla terminazione di quest'ultimo. % LocalWords: dtime lpid cpid nattac shmall shmmax SHMLBA SHMSEG EOVERFLOW brk % LocalWords: memory shmat shmdt void shmaddr shmflg SVID RND RDONLY rounded % LocalWords: SIGSEGV nattch exit SharedMem ShmCreate memset fill ShmFind home -% LocalWords: ShmRemove DirMonitor DirProp chdir GaPiL shmptr DirScan ipcs NFS +% LocalWords: ShmRemove DirMonitor DirProp chdir GaPiL shmptr ipcs NFS % LocalWords: ComputeValues ReadMonitor touch SIGTERM dirmonitor unlink fcntl % LocalWords: LockFile UnlockFile CreateMutex FindMutex LockMutex SETLKW GETLK % LocalWords: UnlockMutex RemoveMutex ReadMutex UNLCK WRLCK RDLCK mapping MAP