Memória Compartilhada Memórias Compartilhadas são objetos IPC utilizados para comunicação entre processos independentes. Elas são um modo efeciente de transferir dados entre processos. Essa comunicação é possível porque os processos acessam a mesma memória lógica. Uma memória compartilhada é um segmento especial de endereços que é criado por um IPC via requisição de um processo, sendo possível que outro processos venham a endereçá-lo. Comando do IPC: ipcs - ipcs -m ; informações relativas aos segmentos de memória compartilhada. ipcrm [sem|shm|msg] ; destrui recurso (semáforo, memória compartilhada ou mensagem identificado por . ipcrm shm 2344 Funcionamento de uma Memória Compartilhada: - As funções de manipulação de memória compartilhada são bastante similares às dos semáforos. - Cada segmento de memória compartilhada possui um identificador único: inteiro não negativo - Criar uma memória compartilhada significa alocar um segmento de memória e associá-lo a um identificador. Procedimento de Utilização de Memória Compartilhada: id_memoria = criacao_de_semaforo(chave, tamanho_da_memoria, flags); x = leitura_memoria(id_memoria); escrita(id_memoria, valor); fim_ok = destruicao_da_memoria(id_memoria, flags); Função de Criação de Memória Compartilhada em Unix: #include #include // quase sempre utilizada #include // quase sempre utilizada int shmget(key_t key, size_t size, int shm_flag); - Cria um novo um segmento de memória compartilhada, ou o seu descritor se a memória já tenha sido alocada. - Valor de retorno: descritor do segmento de memória alocada ou -1 em caso de erro. - key: é um inteiro utilizado para denominar um segmentos, de forma similar aos semáforos. - key é somente utilizado com a função shmget, todas as outras funções de manipulação de memória compartilhada utilizam o valor retornado por shmget como identificador do segmento de memória. - Quando key por igual a IPC_PRIVATE, o segmento de memória só é acessível pelo processo que o criou. - size o tamanho, em bytes, alocados. - shm_flag: conjunto de flags que especifica os direito de acesso ao segmento de memória. - Memória compartilhada possui permissão de acesso de leitura e escrita similar às dos arquivos em Unix. - shm_flag é codificada de forma similar à semflag na função de criação de semáforos semget. - O argumento shmflag é definido como uma combinação de diferentes constantes pré-definidas, permitindo a especificação de direitos de acesso. Segue a definição de permições de arquivos: rwx,rwx,rwx: user,group,all: 421,421:421. Por exemplo, 666: user, group e all podem ler e escrever. -> Para criar um segmento, shmflag deve conter o valor IPC_CREAT (01000). Se o segmento já foi criado a utilização do flag IPC_CREAT não produz erro. Função de Associação de Segmento de Memória a Processos Unix Quando se cria um segmento de memória compartilhada ele ainda não está acessível para nenhum processo. Para habilitar o acesso a esse segmento se deve associá-lo ao espaço de endereço de um processo. Isto é realizado em Unix via a função shmat(). #include #include #include void *shmat(int shm_id, const void *shm_addr, int shmflg); - shm_id é o identificador da memória compartilhada (valor de retorno da função shmget(). - shm_addr é o endereço no qual a memória compartilhada é associada ao processo. Este valor deverá ser normalmente um ponteito para null, (void *) 0, de modo a permitir que o sistema escolha o endereço apropriado. - shmflg é um conjunto de flags. Dois possíveis valores são: SHM_RND e SHM_RDONLY. O primeiro, em conjunto com shm_addr, controla o endereço no qual a memória é associada. O segundo faz com que a memória seja somente de leitura. Porém, normalmente este valor deve ser 0. - Se shmat for bem sucedida, ela retornará um ponteiro para o primeiro byte do segmento de memória compartilhada, em caso de faloha ela retorna o valor -1. Função de Desassociação de Segmento de Memória a Processos Unix A função shmdt() desassocia um segmento de memória de um processo. Isto não desaloca a memória, mas a deixa não acessível ao processo. #include int shmdt(const void *shm_addr); - shm_addr é o endereço da memória a ser desassociada. - Em caso de sucesso a função retorno o valor 0, caso contrário seu valor de retorno é -1. Função de Controle de Informação de Memória Compartilhada em Unix #include #include #include int shmctl(int shm_id, int command, struct shmid_ds *buf); - shm_id é o identificador retornado pela função shmget(). - command é a ação a ser realizada e pode ter um dos três valores: - IPC_STAT, habilita o dado na estrutura shmid_ds para refletir os valores associados com a memória compartilhada. - IPC_SET, faz o processo inverso de IPC_STAT. - IPC_RMID, apaga o segmento de memória compartilhada. No caso, a estrutura shmid_ds não tem relavância (pode-se uitlizar qualquer valor). - A estrutura shmid_ds contém os modos e permissões da memória compartilhada e tem no mínimo os seguintes membros: struct shmid_ds{ uid_t shm_perm.uid; // perimissão do usuário uid_t shm_perm.gid; // permissão do grupo do usuário mode_t shm_perm.mode; } - buf é um ponteiro para a estrutura de modos e permissões. - Em caso de sucesso a função retorna o valor 0 e em caso de falha o valor de retorno é igual a -1.