X-Git-Url: https://gapil.gnulinux.it/gitweb/?a=blobdiff_plain;ds=sidebyside;f=fileadv.tex;h=fd08d0d185fc15149cdf52416d69d9dbc160ece9;hb=71bd769469078fc921d9646d62b0f9293b6ae47c;hp=b49bcf84ad8ccd7fe3c295251d2ab32f95614ae2;hpb=6f8e0ca42d3d0b97b5e5747798a1eaffb44e8521;p=gapil.git diff --git a/fileadv.tex b/fileadv.tex index b49bcf8..fd08d0d 100644 --- a/fileadv.tex +++ b/fileadv.tex @@ -1,6 +1,6 @@ %% fileadv.tex %% -%% Copyright (C) 2000-2005 Simone Piccardi. Permission is granted to +%% Copyright (C) 2000-2006 Simone Piccardi. Permission is granted to %% copy, distribute and/or modify this document under the terms of the GNU Free %% Documentation License, Version 1.1 or any later version published by the %% Free Software Foundation; with the Invariant Sections being "Un preambolo", @@ -270,7 +270,7 @@ immediatamente prima di eseguire l'attesa, e ripristinata al ritorno della funzione. L'uso di \param{sigmask} è stato introdotto allo scopo di prevenire possibili -\textit{race condition}\itindex{race~condition} quando ci si deve porre in +\textit{race condition} \itindex{race~condition} quando ci si deve porre in attesa sia di un segnale che di dati. La tecnica classica è quella di utilizzare il gestore per impostare una variabile globale e controllare questa nel corpo principale del programma; abbiamo visto in @@ -285,10 +285,10 @@ sotto controllo anche dei file descriptor con \func{select}, in questo caso si può fare conto sul fatto che all'arrivo di un segnale essa verrebbe interrotta e si potrebbero eseguire di conseguenza le operazioni relative al segnale e alla gestione dati con un ciclo del tipo: -\includecodesnip{listati/select_race.c} qui però emerge una \textit{race - condition},\itindex{race~condition} perché se il segnale arriva prima della -chiamata a \func{select}, questa non verrà interrotta, e la ricezione del -segnale non sarà rilevata. +\includecodesnip{listati/select_race.c} +qui però emerge una \itindex{race~condition} \textit{race condition}, perché +se il segnale arriva prima della chiamata a \func{select}, questa non verrà +interrotta, e la ricezione del segnale non sarà rilevata. Per questo è stata introdotta \func{pselect} che attraverso l'argomento \param{sigmask} permette di riabilitare la ricezione il segnale @@ -309,6 +309,8 @@ in questo caso utilizzando \var{oldmask} durante l'esecuzione di \func{pselect} la ricezione del segnale sarà abilitata, ed in caso di interruzione si potranno eseguire le relative operazioni. +% TODO pselect è stata introdotta nel kernel 2.6.16 (o 15 o 17?) insieme a +% ppoll mettere e verificare \subsection{La funzione \func{poll}} @@ -435,6 +437,8 @@ indica un errore nella chiamata, il cui codice viene riportato al solito tramite \var{errno}. +% TODO accennare a ppoll + %\subsection{L'interfaccia di \textit{epoll}} %\label{sec:file_epoll} % placeholder ... @@ -903,8 +907,8 @@ richiesta, o in caso di errore. Non \errcode{EINVAL} siano rilevati immediatamente al momento della chiamata, potrebbero anche emergere nelle fasi successive delle operazioni. Lettura e scrittura avvengono alla posizione indicata da \var{aio\_offset}, a meno che -il file non sia stato aperto in \textit{append mode} (vedi -sez.~\ref{sec:file_open}), nel qual caso le scritture vengono effettuate +il file non sia stato aperto in \itindex{append~mode} \textit{append mode} +(vedi sez.~\ref{sec:file_open}), nel qual caso le scritture vengono effettuate comunque alla fine de file, nell'ordine delle chiamate a \func{aio\_write}. Si tenga inoltre presente che deallocare la memoria indirizzata da @@ -1402,7 +1406,7 @@ tab.~\ref{tab:file_mmap_flag}. un \const{SIGSEGV}. \\ \const{MAP\_LOCKED} & Se impostato impedisce lo swapping delle pagine mappate.\\ - \const{MAP\_GROWSDOWN} & Usato per gli stack. Indica + \const{MAP\_GROWSDOWN} & Usato per gli \itindex{stack} stack. Indica che la mappatura deve essere effettuata con gli indirizzi crescenti verso il basso.\\ \const{MAP\_ANONYMOUS} & La mappatura non è associata a nessun file. Gli @@ -1852,18 +1856,20 @@ mappatura che gi \label{sec:file_locking} \index{file!locking|(} + In sez.~\ref{sec:file_sharing} abbiamo preso in esame le modalità in cui un sistema unix-like gestisce la condivisione dei file da parte di processi diversi. In quell'occasione si è visto come, con l'eccezione dei file aperti -in \textit{append mode}, quando più processi scrivono contemporaneamente sullo -stesso file non è possibile determinare la sequenza in cui essi opereranno. +in \itindex{append~mode} \textit{append mode}, quando più processi scrivono +contemporaneamente sullo stesso file non è possibile determinare la sequenza +in cui essi opereranno. -Questo causa la possibilità di una \textit{race condition} -\itindex{race~condition}; in generale le situazioni più comuni sono due: -l'interazione fra un processo che scrive e altri che leggono, in cui questi -ultimi possono leggere informazioni scritte solo in maniera parziale o -incompleta; o quella in cui diversi processi scrivono, mescolando in maniera -imprevedibile il loro output sul file. +Questo causa la possibilità di una \itindex{race~condition} \textit{race + condition}; in generale le situazioni più comuni sono due: l'interazione fra +un processo che scrive e altri che leggono, in cui questi ultimi possono +leggere informazioni scritte solo in maniera parziale o incompleta; o quella +in cui diversi processi scrivono, mescolando in maniera imprevedibile il loro +output sul file. In tutti questi casi il \textit{file locking} è la tecnica che permette di evitare le \textit{race condition}\itindex{race~condition}, attraverso una @@ -2280,13 +2286,13 @@ questo caso la titolarit voce nella file table, ma con il valore del \acr{pid} del processo. Quando si richiede un lock il kernel effettua una scansione di tutti i lock -presenti sul file\footnote{scandisce cioè la - \itindex{linked~list}\textit{linked list} delle strutture - \struct{file\_lock}, scartando automaticamente quelle per cui - \var{fl\_flags} non è \const{FL\_POSIX}, così che le due interfacce restano - ben separate.} per verificare se la regione richiesta non si sovrappone ad -una già bloccata, in caso affermativo decide in base al tipo di lock, in caso -negativo il nuovo lock viene comunque acquisito ed aggiunto alla lista. +presenti sul file\footnote{scandisce cioè la \itindex{linked~list} + \textit{linked list} delle strutture \struct{file\_lock}, scartando + automaticamente quelle per cui \var{fl\_flags} non è \const{FL\_POSIX}, così + che le due interfacce restano ben separate.} per verificare se la regione +richiesta non si sovrappone ad una già bloccata, in caso affermativo decide in +base al tipo di lock, in caso negativo il nuovo lock viene comunque acquisito +ed aggiunto alla lista. Nel caso di rimozione invece questa viene effettuata controllando che il \acr{pid} del processo richiedente corrisponda a quello contenuto nel lock. @@ -2596,6 +2602,8 @@ affatto equivalente a \func{flock}). \subsection{Il \textit{mandatory locking}} \label{sec:file_mand_locking} +\itindbeg{mandatory~locking|(} + Il \textit{mandatory locking} è una opzione introdotta inizialmente in SVr4, per introdurre un file locking che, come dice il nome, fosse effettivo indipendentemente dai controlli eseguiti da un processo. Con il @@ -2619,16 +2627,16 @@ significato, diventa l'indicazione della presenza o meno del \textit{mandatory quando esso viene utilizzato per attivare il \textit{mandatory locking}.} L'uso del \textit{mandatory locking} presenta vari aspetti delicati, dato che -neanche root può passare sopra ad un lock; pertanto un processo che blocchi un -file cruciale può renderlo completamente inaccessibile, rendendo completamente -inutilizzabile il sistema\footnote{il problema si potrebbe risolvere - rimuovendo il bit \itindex{sgid~bit} \acr{sgid}, ma non è detto che sia così - facile fare questa operazione con un sistema bloccato.} inoltre con il -\textit{mandatory locking} si può bloccare completamente un server NFS -richiedendo una lettura su un file su cui è attivo un lock. Per questo motivo -l'abilitazione del mandatory locking è di norma disabilitata, e deve essere -attivata filesystem per filesystem in fase di montaggio (specificando -l'apposita opzione di \func{mount} riportata in +neanche l'amministratore può passare sopra ad un lock; pertanto un processo +che blocchi un file cruciale può renderlo completamente inaccessibile, +rendendo completamente inutilizzabile il sistema\footnote{il problema si + potrebbe risolvere rimuovendo il bit \itindex{sgid~bit} \acr{sgid}, ma non è + detto che sia così facile fare questa operazione con un sistema bloccato.} +inoltre con il \textit{mandatory locking} si può bloccare completamente un +server NFS richiedendo una lettura su un file su cui è attivo un lock. Per +questo motivo l'abilitazione del mandatory locking è di norma disabilitata, e +deve essere attivata filesystem per filesystem in fase di montaggio +(specificando l'apposita opzione di \func{mount} riportata in tab.~\ref{tab:sys_mount_flags}, o con l'opzione \code{-o mand} per il comando omonimo). @@ -2682,6 +2690,7 @@ soltanto quando si chiama \func{mmap} con l'opzione \const{MAP\_SHARED} (nel qual caso la funzione fallisce con il solito \errcode{EAGAIN}) che comporta la possibilità di modificare il file. \index{file!locking|)} +\itindend{mandatory~locking|(} @@ -2690,3 +2699,39 @@ possibilit %%% mode: latex %%% TeX-master: "gapil" %%% End: + +% LocalWords: dell'I locking multiplexing cap dell' sez system call socket BSD +% LocalWords: descriptor client deadlock NONBLOCK EAGAIN polling select kernel +% LocalWords: pselect like sys unistd int fd readfds writefds exceptfds struct +% LocalWords: timeval errno EBADF EINTR EINVAL ENOMEM sleep tab signal void of +% LocalWords: CLR ISSET SETSIZE POSIX read NULL nell'header l'header glibc fig +% LocalWords: libc header psignal sigmask SOURCE XOPEN timespec sigset race DN +% LocalWords: condition sigprocmask tut self trick oldmask poll XPG pollfd l'I +% LocalWords: ufds unsigned nfds RLIMIT NOFILE EFAULT ndfs events revents hung +% LocalWords: POLLIN POLLRDNORM POLLRDBAND POLLPRI POLLOUT POLLWRNORM POLLERR +% LocalWords: POLLWRBAND POLLHUP POLLNVAL POLLMSG SysV stream ASYNC SETOWN FAQ +% LocalWords: GETOWN fcntl SETFL SIGIO SETSIG Stevens driven siginfo sigaction +% LocalWords: all'I nell'I Frequently Unanswered Question SIGHUP lease holder +% LocalWords: breaker truncate write SETLEASE arg RDLCK WRLCK UNLCK GETLEASE +% LocalWords: uid capabilities capability EWOULDBLOCK notify dall'OR ACCESS st +% LocalWords: pread readv MODIFY pwrite writev ftruncate creat mknod mkdir buf +% LocalWords: symlink rename DELETE unlink rmdir ATTRIB chown chmod utime lio +% LocalWords: MULTISHOT thread linkando librt layer aiocb asyncronous control +% LocalWords: block ASYNCHRONOUS lseek fildes nbytes reqprio PRIORITIZED sigev +% LocalWords: PRIORITY SCHEDULING opcode listio sigevent signo value function +% LocalWords: aiocbp ENOSYS append error const EINPROGRESS fsync return ssize +% LocalWords: DSYNC fdatasync SYNC cancel ECANCELED ALLDONE CANCELED suspend +% LocalWords: NOTCANCELED list nent timout sig NOP WAIT NOWAIT size count iov +% LocalWords: iovec vector EOPNOTSUPP EISDIR len memory mapping mapped swap NB +% LocalWords: mmap length prot flags off MAP FAILED ANONYMOUS EACCES SHARED SH +% LocalWords: only ETXTBSY DENYWRITE ENODEV filesystem EPERM EXEC noexec table +% LocalWords: ENFILE lenght segment violation SIGSEGV FIXED msync munmap copy +% LocalWords: DoS Denial Service EXECUTABLE NORESERVE LOCKED swapping stack fs +% LocalWords: GROWSDOWN ANON GiB POPULATE prefaulting SIGBUS fifo VME fork old +% LocalWords: exec atime ctime mtime mprotect addr EACCESS mremap address new +% LocalWords: long MAYMOVE realloc VMA virtual Ingo Molnar remap pages pgoff +% LocalWords: dall' fault cache linker prelink advisory discrectionary lock fl +% LocalWords: flock shared exclusive operation dup inode linked NFS cmd ENOLCK +% LocalWords: EDEADLK whence SEEK CUR type pid GETLK SETLK SETLKW all'inode HP +% LocalWords: switch bsd lockf mandatory SVr sgid group root mount mand TRUNC +% LocalWords: SVID UX Documentation