From 789a38451310ab1b56885887e36f97124e8f86e6 Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Fri, 1 Nov 2002 18:44:37 +0000 Subject: [PATCH] Figura sulla struttura dei segmenti di memoria condivisa, e completamenti di shmat --- img/shmstruct.dia | Bin 0 -> 2621 bytes ipc.tex | 80 +++++++++++++++++++++++++++++++++++----------- 2 files changed, 62 insertions(+), 18 deletions(-) create mode 100644 img/shmstruct.dia diff --git a/img/shmstruct.dia b/img/shmstruct.dia new file mode 100644 index 0000000000000000000000000000000000000000..b9a7cf32024dd972b3f4b2a883ad1b48070d5e43 GIT binary patch literal 2621 zcmV-D3c~dtiwFP!000001MOW~lbbjee$TIPIj)!)d+fdHT`$kmaP^!Av)J1OkMotc{(F-q&#^x*M^)q2 zNtC3sZ(j5`|M<1|GhbBGEY9Y+F!$cu2WfNK-9E`eIwXJHw}$l0!+xHOsYYdVP`r8i z_$&HYUQ+eOajvcl?G=*mymS-BZ8>S+Mdgivh65oy+=tsmtmKP`yeX^6grCZq>w18v2(N z@oYrTEH9y-ZhXd38&G#A`{l6{k}R?WFndi7qs ziGsuYmiu5EuKU?CZ16znk8#q1DA+C6NgB7!teE8#0t(G-FX^DQ)~VLsJoz>VH`}~_ zcGIxO&Av)fKS-}#ylI#tuRhx*FUyV%)^$VHt?i2=&<7y@kKlXW0e!#=eMr%Wq(a|y z0EMGrx&T=e|0Zy3CX>A!CpTxeq9L_OiH$LRkF?lho{ej4N9iZL^)|?QHl-JgO5Zjj ziSsUj?EPxUzmn%Pqzb;^k<(JMPF+BJLe8Nz0A6E+6la$%F{g(bv-ra&i0&RY@h<3o zK0*Av>oEG4b`@P_Qw$mW7REsb89-h#pw@|+DVdhgGO&ZG4Ez~WBgp>ej+3@d;&>Uv zesT3Tt*Jc(^DLX1- z7IF3d43xm2L{UmrDQj7k!*6C=s(fsxN_8zyn6BCL+40wpbJPM@$A>}nVL;A5Y_&Jr zjZ3wPj%uulehpZu=&$=%3DLXbc9jt|E^FmQ!^Xh8YcAG;up z{z;)9i$Fgd`#guE9~z)Wzat&}kPDz1{Zm1|Edu?PWG4wlzeRtP=tqVr9sQ#hq|rYq z^b-;2SAc!D#=iVLzefH&Am0&zd{Z{>6Z}y8Wax*OZplrEW#iw}+~2POBkz6~)BC<` z`l?%g>HxF9?qn0G9FLCPe&0oM7UZ{tKz4SPUD(1pJIkWB5KJXIi`l|`knXf8 z9BT@J&dyS0425K0Ao($9RL7vPf*3T?G3dMS#sVQJ7+8J~8rMN+tRM)DbrAZU!M`Ur z7YIqhAhPM7U@8OG;RwQhN>0#it*bkScl6TVGC>!sIcIREI1s7jPvpTiEC)LFXDY`4 z?0-N0+2Wm^DID2niZdwb6NStz6?bk&S@ zzyy+=hy++HQJ|s%=ny7xI!qALkFB?w3r2H+_8}^Ys6jzVN{;*_r9;BHtsr3?>xA|D zh^Rr#Zwzh8E_4D5Kpu=CVFBL>Ind+1x6$oH#~VXid(c%GLm`cGZ266I?7DFdQP4O? zrt z-REf@ZJoD&hPU*NHqSpxM7NIaQvi1Y&7*4tpt2NJuUu3BuCkpwQ2>)e0q|G_V0+E| z*-~!orfy#Q#-+ASbZ4wXp0B}b>Bfab{G!3G+itLXtIY1xl7z)|o|#%;MVtaUHguOx zPB(v1VE5_i%K7Q$Z@=q3Lvei5UR!m>sR|IKDvf=$ELEwyGP+$|8D**q*8=ZNT{xae zcfZB~9UG^qmpwiX3yM%oQsCB6pqRua=-A8AHIN1Ej%JQGe_L#)PvffR;}+jX!~5}V zxAZ8Km-O}XI`4IXTs&zHcZ1y0;&F_~PLIfSpU4^8&O6Iv6^~a}_HzSdE$seu4J{P{e4J3` z*gn@S2gWw%Gj!INx(sT|715xN$ZyZ**6sOh>FxQ5&Yr%9>}h0*u!2Nt^+0I_N!4(p zw1Q+R{Wi1}1^T@l>F#Bxv-#o3bDL(s4xra>+Z!ObBO z^2SF#nIQI;UYaH^&B>3*hMY4mqafZ~zItvESMLv$m{#9NjYmV$>aCuLkR`gX_RW}F=Qx_FwH%wjXx*LF17T)l$QCHsR%A4Dq zVnR}&fTgJPhHA)p?G05>U3{a9Z-zlq=cK5vzClD7y{JfZs|1y4ZU?El0OwxQ+PZM3 zIYe~@4swK@AAq{k1IyE9GL}O7j;mBIj47Z~^DlD_}|xsE7Z literal 0 HcmV?d00001 diff --git a/ipc.tex b/ipc.tex index b0eb27e..f3fb316 100644 --- a/ipc.tex +++ b/ipc.tex @@ -2524,12 +2524,6 @@ invece: al segmento viene inizializzato a zero. \end{itemize*} -La struttura di come vengono gestiti i segmenti di memoria condivisa nel -kernel è illustrata in . - - - - Come per le code di messaggi e gli insiemi di semafori, anche per i segmenti di memoria condivisa esistono una serie di limiti, i cui valori, riportati in \tabref{tab:ipc_shm_limits} sono associati ad altrettante costanti. Alcuni di @@ -2613,7 +2607,7 @@ attraverso l'argomento \param{cmd}, i valori possibili sono i seguenti: l'amministratore può utilizzare questo comando. \end{basedescript} i primi tre comandi sono gli stessi già visti anche per le code ed i semafori, -gli ultimi due sono delle estensioni previste solo in Linux. +gli ultimi due sono delle estensioni previste da Linux. Per utilizzare i segmenti di memoria condivisa si usano due funzioni, la prima di queste è \func{shmat}, che serve ad agganciare un segmento al processo @@ -2635,8 +2629,6 @@ il suo prototipo \item[\macro{EINVAL}] Si è specificato un identificatore invalido per \param{shmid}, o un indirizzo non allineato sul confine di una pagina per \param{shmaddr}. - \item[\macro{EIDRM}] Si è richiesto un segmento marcato per la - cancellazione. \end{errlist} ed inoltre \macro{ENOMEM}.} \end{functions} @@ -2645,8 +2637,9 @@ La funzione inserisce un segmento di memoria condivisa all'interno dello spazio di indirizzi del processo, in modo che questo possa accedervi direttamente, la situazione dopo l'esecuzione di \func{shmat} è illustrata in \figref{fig:ipc_shmem_layout} (per la comprensione del resto dello schema si -ricordi al proposito quanto illustrato in \secref{sec:proc_mem_layout}). - +ricordi quanto illustrato al proposito in \secref{sec:proc_mem_layout}). Si +tenga presente che la funzione ha successo anche se il segmento è stato +marcato per la cancellazione. \begin{figure}[htb] \centering @@ -2656,7 +2649,6 @@ ricordi al proposito quanto illustrato in \secref{sec:proc_mem_layout}). \label{fig:ipc_shmem_layout} \end{figure} - L'argomento \param{shmaddr} specifica a quale indirizzo\footnote{Lo standard SVID prevede che l'argomento \param{shmaddr} sia di tipo \ctyp{char *}, così come il valore di ritorno della funzione. In Linux è stato così con le @@ -2665,18 +2657,48 @@ L'argomento \param{shmaddr} specifica a quale indirizzo\footnote{Lo standard ritorno un \ctyp{void *}.} deve essere associato il segmento, se il valore specificato è \macro{NULL} è il sistema a scegliere opportunamente un'area di memoria libera (questo è il modo più portabile e sicuro di usare la funzione). -Altrimenti il kernel aggangia il segmento all'indirizzo specificato da +Altrimenti il kernel aggancia il segmento all'indirizzo specificato da \param{shmaddr}; questo però può avvenire solo se l'indirizzo coincide con il limite di una pagina, cioè se è un multiplo esatto del parametro di sistema \macro{SHMLBA}, che in Linux è sempre uguale \macro{PAGE\_SIZE}. - - - L'argomento \param{shmflg} permette di cambiare il comportamento della funzione; esso va specificato come maschera binaria, i bit utilizzati sono - - +solo due e sono identificati dalle costanti \macro{SHM\_RND} e +\macro{SHM\_RDONLY}, che vanno combinate con un OR aritmetico. Specificando +\macro{SHM\_RND} si evita che \func{shmat} ritorni un errore quando +\param{shmaddr} non è allineato ai confini di una pagina. Si può quindi usare +un valore qualunque per \param{shmaddr}, e il segmento verrà comunque +agganciato, ma al più vicino multiplo di \macro{SHMLBA} (il nome della +costante sta infatti per \textit{rounded}, e serve per specificare un +indirizzo come arrotondamento). + +Il secondo bit permette di agganciare il segmento in sola lettura (si ricordi +che anche le pagine di memoria hanno dei permessi), in tal caso un tentativo +di scrivere sul segmento comporterà una violazione di accesso con l'emissione +di un segnale di \macro{SIGSEGV}. Il comportamento usuale di \func{shmat} è +quello di agganciare il segmento con l'accesso in lettura e scrittura (ed il +processo deve aver questi permessi in \var{shm\_perm}), non è prevista la +possibilità di agganciare un segmento in sola scrittura. + +In caso di successo la funzione aggiorna anche i seguenti campi di +\var{shmid\_ds}: +\begin{itemize*} +\item il tempo \var{shm\_atime} dell'ultima operazione di aggancio viene + impostato al tempo corrente. +\item il \acr{pid} \var{shm\_lpid} dell'ultimo processo che ha operato sul + segmento viene impostato a quello del processo corrente. +\item il numero \var{shm\_nattch} di processi agganciati al segmento viene + aumentato di uno. +\end{itemize*} + +Come accennato in \secref{sec:proc_fork} un segmento di memoria condivisa +agganciato ad un precesso viene ereditato da un figlio attraverso una +\func{fork}, dato che quest'ultimo riceve una copia dello spazio degli +indirizzi del padre. Invece, dato che attraverso una \func{exec} viene +eseguito un diverso programma, tutti i segmenti eventualmente agganciati al +processo vengono automaticamente sganciati. Lo stesso avviene all'uscita del +processo attraverso una \func{exit}. La seconda funzione è \func{shmdt}, che consente di sganciare un segmento di @@ -2695,6 +2717,28 @@ il suo prototipo \macro{EINVAL}.} \end{functions} +La funzione esegue lo sganciamento del segmento di memoria condivisa +agganciato all'indirizzo \param{shmaddr}; quest'ultimo deve essere uguale +all'indirizzo ottenuto da una precedente chiamata a \func{shmat}. + + + + + + +Per capire meglio il funzionamento delle funzioni facciamo ancora una volta +riferimento alle strutture con cui il kernel implementa i segmenti di memoria +condivisa; uno schema semplificato della struttura è illustrato in +\figref{fig:ipc_shm_struct}. + +\begin{figure}[htb] + \centering + \includegraphics[width=10cm]{img/shmstruct} + \caption{Schema dell'implementazione dei segmenti di memoria condivisa in + Linux.} + \label{fig:ipc_shm_struct} +\end{figure} + \section{Tecniche alternative} \label{sec:ipc_alternatives} -- 2.30.2