From 750bf2482350e5770a47fbdd76b7eacb88d376ab Mon Sep 17 00:00:00 2001 From: Simone Piccardi Date: Mon, 3 Feb 2003 14:27:58 +0000 Subject: [PATCH] Inizio della shared memory --- ipc.tex | 52 +++++++++++++++++++++++++++++++++------------ sources/Gapil.h | 6 +++--- sources/SharedMem.c | 14 ++++++++---- 3 files changed, 52 insertions(+), 20 deletions(-) diff --git a/ipc.tex b/ipc.tex index 78d612f..9207873 100644 --- a/ipc.tex +++ b/ipc.tex @@ -3817,15 +3817,16 @@ per i quali richiede che: \subsection{Code di messaggi} \label{sec:ipc_posix_mq} -Le code di messaggi non sono ancora supportate nel kernel -ufficiale;\footnote{esiste però una proposta di implementazione di Krzysztof - Benedyczak, a partire dal kernel 2.5.50.} inoltre esse possono essere -implementate, usando la memoria condivisa ed i mutex, con funzioni di -libreria. In generale, come le corrispettive del SysV IPC, sono poco usate, -dato che i socket\index{socket}, nei casi in cui sono sufficienti, sono più -comodi, e negli altri casi la comunicazione può essere gestita direttamente -con mutex e memoria condivisa. Per questo, in assenza di una implementazione -uffiale, ne tralasciamo la descrizione. +Le code di messaggi non sono ancora supportate nel kernel ufficiale, esiste +però una implementazione sperimentale di Michal Wronski e Krzysztof +Benedyczak,\footnote{i patch al kernel e la relativa libreria possono essere + trovati \href{http://www.mat.uni.torun.pl/~wrona/posix_ipc} + {http://www.mat.uni.torun.pl/\~wrona/posix_ipc}.}. In generale, come le +corrispettive del SysV IPC, sono poco usate, dato che i socket\index{socket}, +nei casi in cui sono sufficienti, sono più comodi, e negli altri casi la +comunicazione può essere gestita direttamente con mutex e memoria condivisa. + + @@ -3834,9 +3835,12 @@ uffiale, ne tralasciamo la descrizione. Dei semafori POSIX esistono sostanzialmente due implementazioni; una è fatta a livello di libreria ed è fornita dalla libreria dei thread; questa però li -implementa solo a livello di thread e non di processi. Esiste un'altra -versione, realizzata da Konstantin Knizhnik, che reimplementa l'interfaccia -POSIX usando i semafori di SysV IPC. +implementa solo a livello di thread e non di processi.\footnote{questo + significa che i semafori sono visibili solo all'interno dei thread creati da + un sngolo processo.} Esiste un'altra versione, realizzata da Konstantin +Knizhnik, che reimplementa l'interfaccia POSIX usando i semafori di SysV IPC, +e che non vale comunque la pena di usare visto che i problemi sottolineati in +\secref{sec:ipc_sysv_sem} restano invariati. @@ -3845,7 +3849,29 @@ POSIX usando i semafori di SysV IPC. \label{sec:ipc_posix_shm} La memoria condivisa è l'unico degli oggetti di IPC POSIX già presente nel -kernel ufficiale. +kernel ufficiale. Per poterla utilizzare occorre abilitare il filesystem +\texttt{tmpfs}, uno speciale filesystem che mantiene tutti i suoi contenuti in +memoria,\footnote{il filesystem \texttt{tmpfs} è diverso da un normale RAM + disk, anch'esso disponibile attraverso il filesystem \texttt{ramfs}, proprio + perché realizza una interfaccia utilizzabile anche per la memoria condivisa; + esso infatti non ha dimensione fissa, ed usa direttamente la cache interna + del kernel (viene usato anche per la SysV shared memory). In più i suoi + contenuti, essendo trattati direttamente dalla memoria + virtuale\index{memoria virtuale} e possono essere salvati sullo swap + automaticamente.} abilitando l'opzione \texttt{CONFIG\_TMPFS} in fase di +compilazione del kernel, e montando il filesystem aggiungendo una riga tipo: +\begin{verbatim} +tmpfs /dev/shm tmpfs defaults 0 0 +\end{verbatim} +ad \file{/etc/fstab}, oppure dove si preferisce con un comando del +tipo:\footnote{il filesystem riconosce, oltre quelle mostrate, le opzioni + \texttt{uid} e \texttt{gid} che identificano rispettivamente utente e gruppo + cui assegnarne la titolarità, e \texttt{nr\_blocks} che permette di + specificarne la dimensione in blocchi, cioè in multipli di + \const{PAGECACHE\_SIZE}.} +\begin{verbatim} +mount -t tmpfs -o size=10G,nr_inodes=10k,mode=700 tmpfs /mytmpfs +\end{verbatim} %%% Local Variables: diff --git a/sources/Gapil.h b/sources/Gapil.h index 401871c..17f07fa 100644 --- a/sources/Gapil.h +++ b/sources/Gapil.h @@ -23,7 +23,7 @@ * * Author: S. Piccardi * - * $Id: Gapil.h,v 1.6 2003/02/02 20:35:33 piccardi Exp $ + * $Id: Gapil.h,v 1.7 2003/02/03 14:27:58 piccardi Exp $ * *****************************************************************************/ #include /* IPC semaphore declarations */ @@ -115,8 +115,8 @@ void * ShmFind(key_t ipc_key, int shm_size); /* Function ShmRemove: remove a SysV shared memory */ int ShmRemove(key_t ipc_key, void * shm_ptr); /* Function CreateShm: create a POSIX shared memory */ -void * CreateShm(char * shm_name, int shm_size, int perm, char fill); +void * CreateShm(char * shm_name, off_t shm_size, int perm, char fill); /* Function FindShm: find an existing POSIX shared memory */ -void * FindShm(char * shm_name, int shm_size); +void * FindShm(char * shm_name, off_t shm_size); /* Function RemoveShm: remove a POSIX shared memory */ int RemoveShm(char * shm_name); diff --git a/sources/SharedMem.c b/sources/SharedMem.c index eab28f4..35ba20c 100644 --- a/sources/SharedMem.c +++ b/sources/SharedMem.c @@ -26,7 +26,7 @@ * * Author: S. Piccardi * - * $Id: SharedMem.c,v 1.3 2003/02/02 20:35:33 piccardi Exp $ + * $Id: SharedMem.c,v 1.4 2003/02/03 14:27:58 piccardi Exp $ * ***************************************************************/ #include /* SysV IPC shared memory declarations */ @@ -39,6 +39,8 @@ #include #include #include + +#include "macros.h" /* ************************************************************************* * * Functions for SysV shared memory @@ -140,24 +142,27 @@ int ShmRemove(key_t ipc_key, void * shm_ptr) * the fill value * Return: the address of the shared memory segment (NULL on error) */ -void * CreateShm(char * shm_name, int shm_size, int perm, char fill) +void * CreateShm(char * shm_name, off_t shm_size, mode_t perm, char fill) { void * shm_ptr; int fd; int flag; /* first open the object, creating it if not existent */ - flag = O_RDWR|O_TRUNC|O_CREAT|O_EXCL; + flag = O_CREAT|O_EXCL|O_RDWR; fd = shm_open(shm_name, flag, perm); /* get object file descriptor */ if (fd < 0) { + perror("errore in shm_open"); return NULL; } /* set the object size */ if (ftruncate(fd, shm_size)) { + perror("errore in ftruncate"); return NULL; } /* map it in the process address space */ shm_ptr = mmap(NULL, shm_size, PROT_WRITE|PROT_READ, MAP_SHARED, fd, 0); if (shm_ptr == MAP_FAILED) { + perror("errore in mmap"); return NULL; } memset((void *) shm_ptr, fill, shm_size); /* fill segment */ @@ -170,12 +175,13 @@ void * CreateShm(char * shm_name, int shm_size, int perm, char fill) * the shared memory segment size * Return: the address of the segment (NULL on error) */ -void * FindShm(char * shm_name, int shm_size) +void * FindShm(char * shm_name, off_t shm_size) { void * shm_ptr; int fd; /* ID of the IPC shared memory segment */ /* find shared memory ID */ if ((fd = shm_open(shm_name, O_RDWR|O_EXCL, 0)) < 0) { + debug("Cannot open %s\n", shm_name); return NULL; } /* take the pointer to it */ -- 2.30.2