Memória compartilhada Luiz Affonso Guedes 1 Ivanovitch Silva 1 affonso@dca.ufrn.br ivan@dca.ufrn.br 1 Universidade Federal do Rio Grande do Norte 15 de outubro de 2009 Memória compartilhada DCA0109 - Prática de programação concorrente 1 / 18
Sumário 1 Introdução 2 Criação Exemplo 01 3 Associação Exemplo 02 Exemplo 03 4 Desassociação Exemplo 04 5 Apagar Exemplo 05 6 Produtor consumidor Produtor Consumidor Análise Memória compartilhada DCA0109 - Prática de programação concorrente 2 / 18
Sumário 1 Introdução 2 Criação Exemplo 01 3 Associação Exemplo 02 Exemplo 03 4 Desassociação Exemplo 04 5 Apagar Exemplo 05 6 Produtor consumidor Produtor Consumidor Análise Memória compartilhada DCA0109 - Prática de programação concorrente 3 / 18
Memória Compartilhada Espaço/segmento de memória onde será compartilhado informações. Varios processos podem ler nesse espaço/segmento. Procedimentos básicos. Alocar e dar permissao em uma região de memória para ser compartilhada. Pegar o ponteiro, ler e escrever nessa região. Memória compartilhada DCA0109 - Prática de programação concorrente 3 / 18
Métodos básicos Função Descrição Retorno shmget Criar memória compartilhada Identificador shmat Associar memória compartilhada Ponteiro shmdt Desassociar memória compartilhada Flag shmclt Apagar memória compartilhada Flag Comandos auxiliares Comando ipcs ipcrm Descrição Mostrar recursos (sem,shm,msg). Destruir recursos. Eg.: ipcrm [sem shm msg] id. Memória compartilhada DCA0109 - Prática de programação concorrente 4 / 18
Sumário 1 Introdução 2 Criação Exemplo 01 3 Associação Exemplo 02 Exemplo 03 4 Desassociação Exemplo 04 5 Apagar Exemplo 05 6 Produtor consumidor Produtor Consumidor Análise Memória compartilhada DCA0109 - Prática de programação concorrente 5 / 18
Criando memória compartilhada Procedimentos básicos Função Param1 Param2 Param3 shmget key t key size t size int shmflg Parâmetros Nome key size shmflg Descrição Chave usada para criação* Tamanho do segmento em bytes Permissões. E.g: 0777 IPC CREAT Memória compartilhada DCA0109 - Prática de programação concorrente 5 / 18
Exemplo 01 Criação - Exemplo 01 Download 1 #include <s t d l i b. h> 2 #include <stdio. h> 3 #include <sys / ipc. h> //shmget 4 #include <sys /shm. h> //shmget 5 6 int main ( int argc, char argv [ ] ) { 7 // Identificador da memória compartilhada 8 int shmid = 0; 9 // Tamanho da memória compartilhada (bytes) 10 int shmsize = 1024; 11 // Criando a memória compartilhada 12 shmid = shmget ( ftok ( / home / ivanovitchm, 1 ), shmsize, 0666 IPC CREAT ) ; 13 // A memória foi criada corretamente 14 if ( shmid == 1) { 15 fprintf ( stderr, Processo de c r i a r a memória compartilhada falhou\n ) ; 16 e x i t ( EXIT FAILURE ) ; 17 } 18 printf ( Id da memória compartilhada é %d.\n... 19 D i g i t e \ i pcs m\ para v e r i f i c a r \n, shmid ) ; 20 return 0; 21 } Memória compartilhada DCA0109 - Prática de programação concorrente 6 / 18
Sumário 1 Introdução 2 Criação Exemplo 01 3 Associação Exemplo 02 Exemplo 03 4 Desassociação Exemplo 04 5 Apagar Exemplo 05 6 Produtor consumidor Produtor Consumidor Análise Memória compartilhada DCA0109 - Prática de programação concorrente 7 / 18
Associando a uma memória compartilhada Procedimentos básicos Função Param1 Param2 Param3 shmat int shmid const void *shmaddr int shmflg Parâmetros Nome Descrição shmid Identificador memória compartilhada criada shmaddr Endereço de aclopamento shmflg SHM RND,SHM RDONLY * * Em geral usa-se shmflg = 0. Memória compartilhada DCA0109 - Prática de programação concorrente 7 / 18
Exemplo 02 Associação - Exemplo 02 Download 1 // Executar: 2 //./nomeexecutavel shmidgeradonoexemplo01 3 4 #include <s t d l i b. h> 5 #include <stdio. h> 6 #include <s t r i n g. h> //strcpy 7 #include <sys / ipc. h> //shmget 8 #include <sys /shm. h> //shmget,shmat 9 #include <sys / types. h> //shmat 10 11 int main (int argc, char argv [ ] ) { 12 // Identificador da memória compartilhada 13 int shmid = atoi ( argv [ 1 ] ) ; 14 // Ponteiro para memória compartilhada 15 char memoriacompartilhada ; 16 // Associando a memória compartilhada 17 memoriacompartilhada = (char ) shmat ( shmid, 0, 0 ) ; 18 // A memória foi associada corretamente? 19 if ( memoriacompartilhada == (char ) 1){ 20 printf ( Não f o i possível associar a memória com o id %d\n, shmid ) ; 21 e x i t ( 1 ) ; 22 } 23 // Escrever na memória compartilhada 24 strcpy ( memoriacompartilhada, Estou escrevendo na memória compartilhada ) ; 25 return 0; 26 } Memória compartilhada DCA0109 - Prática de programação concorrente 8 / 18
Exemplo 03 Associação - Exemplo 03 Download 1 // Executar: 2 //./nomeexecutavel shmidgeradonoexemplo01 3 4 #include <s t d l i b. h> 5 #include <stdio. h> 6 #include <s t r i n g. h> //strcpy 7 #include <sys / ipc. h> //shmget 8 #include <sys /shm. h> //shmget,shmat 9 #include <sys / types. h> //shmat 10 11 int main (int argc, char argv [ ] ) { 12 // Identificador da memória compartilhada 13 int shmid = atoi ( argv [ 1 ] ) ; 14 // Ponteiro para memória compartilhada 15 char memoriacompartilhada ; 16 // Associando a memória compartilhada 17 memoriacompartilhada = (char ) shmat ( shmid, 0, 0 ) ; 18 // A memória foi associada corretamente? 19 if ( memoriacompartilhada == (char ) 1){ 20 printf ( Não f o i possível associar a memória com o id %d\n, shmid ) ; 21 e x i t ( 1 ) ; 22 } 23 // Lendo na memória compartilhada 24 printf ( Valor l i d o : %s \n, memoriacompartilhada ) ; 25 return 0; 26 } Memória compartilhada DCA0109 - Prática de programação concorrente 9 / 18
Sumário 1 Introdução 2 Criação Exemplo 01 3 Associação Exemplo 02 Exemplo 03 4 Desassociação Exemplo 04 5 Apagar Exemplo 05 6 Produtor consumidor Produtor Consumidor Análise Memória compartilhada DCA0109 - Prática de programação concorrente 10 / 18
Desassociação de uma memória compartilhada Procedimentos básicos Função shmdt Param1 void *shmaddr Parâmetros Nome shmaddr Descrição Endereço para desassociação Memória compartilhada DCA0109 - Prática de programação concorrente 10 / 18
Exemplo 04 Desassociação - Exemplo 04 Download 1 // Executar: 2 //./nomeexecutavel shmidgeradonoexemplo01 3 4 #include <s t d l i b. h> 5 #include <stdio. h> 6 #include <s t r i n g. h> //strcpy 7 #include <sys / ipc. h> //shmget 8 #include <sys /shm. h> //shmget,shmat 9 #include <sys / types. h> //shmat 10 11 int main (int argc, char argv [ ] ) { 12... 13 //Idêntico ao exemplo 3 14... 15 // Realizando a desassociação 16 if ( shmdt ( memoriacompartilhada ) == 1){ 17 printf ( Ocorreu f a l h a na desassociação\n ) ; 18 e x i t ( 1 ) ; 19 } 20 printf ( Programa desassociou da memória compartilhada cujo 21 Id é : %d \n, shmid ) ; 22 printf ( Executar o comando \ ipcs m\ e v e r i f i c a r que a 23 memória não f o i deletada\n ) ; 24 return 0; 25 } Memória compartilhada DCA0109 - Prática de programação concorrente 11 / 18
Sumário 1 Introdução 2 Criação Exemplo 01 3 Associação Exemplo 02 Exemplo 03 4 Desassociação Exemplo 04 5 Apagar Exemplo 05 6 Produtor consumidor Produtor Consumidor Análise Memória compartilhada DCA0109 - Prática de programação concorrente 12 / 18
Deletar uma memória compartilhada Procedimentos básicos Função Param1 Param2 Param3 shmclt int *shmid int cmd struct shmid ds *buf Parâmetros Nome shmid cmd buf Descrição Identificador memória compartilhada IPC RMID,IPC SET,IPC STAT Estrutura de informações Memória compartilhada DCA0109 - Prática de programação concorrente 12 / 18
Exemplo 05 Deletar - Exemplo 05 Download 1 // Executar: 2 //./nomeexecutavel shmidgeradonoexemplo01 3 4 #include <s t d l i b. h> 5 #include <stdio. h> 6 #include <s t r i n g. h> //strcpy 7 #include <sys / ipc. h> //shmget 8 #include <sys /shm. h> //shmget,shmat 9 #include <sys / types. h> //shmat 10 11 int main (int argc, char argv [ ] ) { 12... 13 //Idêntico ao exemplo 3 14... 15 // Apagar memória Compartilhada 16 if ( shmctl ( shmid, IPC RMID, NULL) == 1){ 17 printf ( Ocorreu f a l h a ao d e l e t a r a memória compartilhada\n ) ; 18 e x i t ( 1 ) ; 19 } 20 printf ( Programa apagou a memória compartilhada cujo 21 Id era : %d \n, shmid ) ; 22 printf ( Executar o comando \ ipcs m\ e v e r i f i c a r que a 23 memória f o i deletada\n ) ; 24 return 0; 25 } Memória compartilhada DCA0109 - Prática de programação concorrente 13 / 18
Sumário 1 Introdução 2 Criação Exemplo 01 3 Associação Exemplo 02 Exemplo 03 4 Desassociação Exemplo 04 5 Apagar Exemplo 05 6 Produtor consumidor Produtor Consumidor Análise Memória compartilhada DCA0109 - Prática de programação concorrente 14 / 18
Produtor - Consumidor Produtor Criação,associação e escrita na memória compartilhada A memória compartilhada é representada por um contador O acesso a memória compartilhada deve ser realizado por semáforos Consumidor Associação e leitura na memória compartilhada O acesso a memória compartilhada deve ser realizado por semáforos Um mesmo semáforo é utilizado pelo produtor e consumidor Memória compartilhada DCA0109 - Prática de programação concorrente 14 / 18
Produtor Código do produtor Download 1 int main ( int argc, char argv [ ] ) { 2 // Semaforo usado para sincronizar a região crítica 3 Semaforo semaforo ; 4 semaforo = new Semaforo (1234,1,IPC CREAT 0600); 5 // Identificador da memória compartilhada 6 int shmid = 0; 7 // Tamanho da memória compartilhada (bytes) 8 int shmsize = 8; 9 // Ponteiro para memória compartilhada 10 int memoriacompartilhada ; 11 // Criando a memória compartilhada 12 shmid = shmget ( ftok ( / home / ivanovitchm, 1 ), shmsize, 0666 IPC CREAT ) ; 13 // Associando-se a memória compartilhada 14 memoriacompartilhada = (int ) shmat ( shmid, 0, 0 ) ; 15 memoriacompartilhada = 0; 16 // A memória foi criada corretamente 17 if ( shmid == 1) { 18 fprintf ( stderr, Processo de c r i a r a memória compartilhada falhou\n ) ; 19 e x i t ( EXIT FAILURE ) ; 20 } 21 printf ( Produtor : i d da memória compartilhada é 22 %d.\n D i g i t e \ i pcs m\ para v e r i f i c a r \n, shmid ) ; 23... Memória compartilhada DCA0109 - Prática de programação concorrente 15 / 18
Produtor Código do produtor Download 1 2 while ( true){ 3 printf ( Produtor : vou e n t r a r na região c r í t i c a \n ) ; 4 semaforo >P ( ) ; 5 memoriacompartilhada += 1; 6 semaforo >V ( ) ; 7 printf ( Produtor : vou s a i r da região c r í t i c a \n ) ; 8 sleep ( 2 ) ; 9 } 10 delete semaforo ; 11 return 0; 12 } Memória compartilhada DCA0109 - Prática de programação concorrente 16 / 18
Consumidor Código do consumidor Download 1 int main ( int argc, char argv [ ] ) { 2 // Semaforo usado para sincronizar a região crítica 3 Semaforo semaforo ; 4 semaforo = new Semaforo (1234,1,IPC CREAT 0600); 5 // Identificador da memória compartilhada 6 int shmid = atoi ( argv [ 1 ] ) ; 7 // Ponteiro para memória compartilhada 8 int memoriacompartilhada ; 9 // Associando a memória compartilhada 10 memoriacompartilhada = (int ) shmat ( shmid, 0, 0 ) ; 11 // A memória foi associada corretamente? 12 if ( memoriacompartilhada == (int ) 1){ 13 printf ( Não f o i possível associar a memória com o id %d\n, shmid ) ; 14 e x i t ( 1 ) ; 15 } 16 while ( true){ 17 printf ( Consumidor : vou e n t r a r na região c r í t i c a \n ) ; 18 semaforo >P ( ) ; 19 printf ( Consumidor : valor l i d o : %d \n, memoriacompartilhada ) ; 20 semaforo >V ( ) ; 21 printf ( Consumidor : saiu da região c r í t i c a \n ) ; 22 sleep ( 1 ) ; 23 } 24 delete semaforo ; 25 return 0; 26 } Memória compartilhada DCA0109 - Prática de programação concorrente 17 / 18
Análise Análise do problema produtor - consumidor Abordagem A (terminais diferentes) Executar o programa produtor Executar o programa consumidor Analisar as mensagens Finalizar o programa produtor Analisar as mensagens Finalizar o programa consumidor Abordagem B (terminais diferentes) Executar o programa produtor Analisar as mensagens Finalizar o programa produtor Executar o programa consumidor Analisar as mensagens Finalizar o programa consumidor Memória compartilhada DCA0109 - Prática de programação concorrente 18 / 18