From 7b52687f914b7a496df8fe2e7ac834b5cad2e59e Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Fri, 1 Nov 2002 16:35:40 +0000 Subject: [PATCH] Aggiunta figura sulla struttura dello spazio indirizzi nel caso di memoria condivisa e completata shmctl. --- img/sh_memory_layout.dia | Bin 0 -> 1379 bytes ipc.tex | 90 ++++++++++++++++++++++++++++++++++----- 2 files changed, 79 insertions(+), 11 deletions(-) create mode 100644 img/sh_memory_layout.dia diff --git a/img/sh_memory_layout.dia b/img/sh_memory_layout.dia new file mode 100644 index 0000000000000000000000000000000000000000..5d64ed2c235a96c033de35d44851b709662c702b GIT binary patch literal 1379 zcmV-p1)TaHiwFP!000001MOQ&Z`(K!zUNm6$~B?&7Twe-+CxtZEU=rN4ccOCZY9#7 z=s3<{fBTZMQd_d*ha|f7RsoWL%49wcIp551M1TDBn#9Hn<|$!xWZJ+o4NRvjB6Kz~ zzde1uhvuipn~xDeALRFpqr{N^K~psvnR6i)9|nWfY6aqTiUi{zCQFdw!M`Yu(Lf3f z%*PwU*i{fAfz-47DH4K{$x>j0q6Cl337USNakiw9xsl4{rYvUMctP>VynW8T%t5YZ zP|$Ng_W~_2FRM)!EG1GztQUJCHG0&~9hqDzl|pp(c>CGA-ApNeu+>#H(OM9ZAU-2> zABSTUZx+G<&~cpibvPelq8}pG55e_AkaWCYTyR9hKFox%7$dqt5`2l95<(o%G79@=VF6nhL`0|wP5q8l&CU@7_BkS)qmNh zC?j9vocKGdz$X9TsmRUyTOb-C9vSz>7xrpyGp@|HBpR82TE*ol8zhy<0JOJ03-)6l zy*u08b;Y`^tkXW3l$CQieMDz5-T=5@82Spt4*dt)0-hsB0k9mu87Pi%GM+L{_tR}h zW@QK&h4)Q+r*8nf7Ru+C%;utAyG%RHv`-k1Fh4eV3s?;oKb^DHxT4ZJp3$mlKiGPF zV+z>qDPT3-%`+Ha0e4FP2ROR@-)iNdKh^#1-u+K^f2Y0sI~Pa*P9grg`u*Rz-tceR zz5Ac){%!{akPia=1&|N?9Rh^<3DDfEUm*hoJq1psfY$*9!b_Y1!a@#!>X&8;gjbvd znoj-yO@Sx;Dk?bOx8;EJ6zP&0IS_!*$~fS=5I%$;7-k%><)|5|P%BZwEVoBWGIcwe z^_vTFrPj34Q`4M2&|Io(Co(Fkz|`|xo!1 zpkyyHs&IDSa9G(_J0KL38BK8YCSkfvDms9NT8vdaG_AoP=p+~fTB|}ISkMa?A;VS_6a!d@IaQ@&Eyc z4phS{3J{dhK1g&LB)mRIbRH!BAQV>w3E080+P*|*$u4x3BxKWL^^{RM#x%-oILESm z2{oG*=1cdOF3J5cYDyTVa2dL zEA+o>%YMEy!fXDn`3ypMN7>-@RJc+q)KrnS)kzuYXw4A;@L`alSTO55!N7%T2(O}y zoMW`;i^i5kqth3SmpWP6b{8>0?~N=O5?sr^bF!19mxYAkP-41j`0Iy+RG{hiJ|?t_ z32yQFX&(~wRm`^2MM&_p1_YRw%pnNw{0kf)OBPiN_`lKVQ7+mTan4rt6|>t?^Z0n( z?6rkBx;`f&C`Xb$DtVOdWtI287<0)yb%R>vqm{sF~|^<-OO*kzea|b6=MC z0lc%oP}TG915`(T1?pc%eUIr2;Vdip`YONW$sc%qmEUodU-KapzkOdkxWFCEVD}29 zJo)Rsff-!$1$eQU$TCFum(Yj0sK{CrA}O5qTjg l>eFMp^ceO{u=CU7W}JPj`SGUkx#!25{{X?^hY%M;004HIq=Nte literal 0 HcmV?d00001 diff --git a/ipc.tex b/ipc.tex index 488e330..b0eb27e 100644 --- a/ipc.tex +++ b/ipc.tex @@ -2426,7 +2426,7 @@ ripristino non \label{sec:ipc_sysv_shm} Il terzo oggetto introdotto dal \textit{System V IPC} è quello dei segmenti di -memoria condivisa. La funzione che permette di ottenerne uno è \func{shmget} +memoria condivisa. La funzione che permette di ottenerne uno è \func{shmget}, ed il suo prototipo è: \begin{functions} \headdecl{sys/types.h} @@ -2460,6 +2460,24 @@ ripeteremo quanto detto al proposito in \secref{sec:ipc_sysv_mq}. L'argomento \param{size} specifica invece la dimensione, in byte, del segmento, che viene comunque arrotondata al multiplo superiore di \macro{PAGE\_SIZE}. +La memoria condivisa è la forma più veloce di comunicazione fra due processi, +in quanto permette agli stessi di vedere nel loro spazio di indirizzi una +stessa sezione di memoria. Pertanto non è necessaria nessuna operazione di +copia per trasmettere i dati da un processo all'altro, in quanto ciascuno può +accedervi direttamente con le normali operazioni di lettura e scrittura dei +dati in memoria. + +Ovviamente tutto questo ha un prezzo, ed il problema fondamentale della +memoria condivisa è la sincronizzazione degli accessi. È evidente infatti che +se un processo deve scambiare dei dati con un altro, si deve essere sicuri che +quest'ultimo non acceda al segmento di memoria condivisa prima che il primo +non abbia completato le operazioni di scrittura, inoltre nel corso di una +lettura si deve essere sicuri che i dati restano coerenti e non vengono +sovrascritti da un accesso in scrittura sullo stesso segmento da parte di un +altro processo; per questo in genere la memoria condivisa viene sempre +utilizzata in abbinamento ad un meccanismo di sincronizzazione, il che, di +norma, significa insime a dei semafori. + \begin{figure}[!htb] \footnotesize \centering \begin{minipage}[c]{15cm} @@ -2506,6 +2524,12 @@ 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 @@ -2618,19 +2642,46 @@ il suo prototipo \end{functions} La funzione inserisce un segmento di memoria condivisa all'interno dello -spazio di indirizzi del processo, come mostrato in così che questo possa -accedervi, 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 \acr{libc4} e le \acr{libc5}, con il passaggio alle \acr{glibc} il - tipo di \param{shmaddr} è divenuto un \ctyp{const void *} e quello del - valore di ritorno un \ctyp{void *}.} deve essere associato il segmento, che -verrà restituito dalla funzione. +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}). + + +\begin{figure}[htb] + \centering + \includegraphics[height=10cm]{img/sh_memory_layout} + \caption{Disposizione dei segmenti di memoria di un processo quando si è + agganciato un segmento di memoria condivisa.} + \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 + \acr{libc4} e le \acr{libc5}, con il passaggio alle \acr{glibc} il tipo di + \param{shmaddr} è divenuto un \ctyp{const void *} e quello del valore di + 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 +\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 + + La seconda funzione è \func{shmdt}, che consente di sganciare un segmento di -memoria condivisa dal processo chiamante, , quando questo non è più -necessario, il suo prototipo è: +memoria condivisa dal processo chiamante quando questo non è più necessario, +il suo prototipo è: \begin{functions} \headdecl{sys/types.h} \headdecl{sys/shm.h} @@ -2645,10 +2696,27 @@ necessario, il suo prototipo \end{functions} +\section{Tecniche alternative} +\label{sec:ipc_alternatives} + +Come abbiamo visto in \secref{sec:ipc_sysv_generic} il sistema di IPC di +System V presenta numerosi problemi; in \cite{APUE}\footnote{nel capitolo 14.} +Stevens effettua una accurata analisi (i cui concetti sono già stati accennati +in precedenza) ed elenca alcune possibili alternative, che vogliamo riprendere +in questa sezione. + + +\subsection{La sincronizzazione con il \textit{file locking}} +\label{sec:ipc_file_lock} + +Abbiamo esaminato il \textit{file locking} in \secref{sec:file_locking}, +\subsection{Il \textit{memory mapping} anonimo} +\label{sec:ipc_mmap_anonymous} +Abbiamo visto in \secref{sec:file_memory_map} come sia possibile \section{La comunicazione fra processi di POSIX} -- 2.30.2