Exercícios Avaliativos Memória Compartilhada

Documentos relacionados
Sincronização e memória compartilhada no Linux

time_t shm_ctime; /* hora da última alteração de atributod da MP através de shmctl + IPC_SET */

tutorial. man fork man pthread_create man pthread_join man wait man sleep

Memória partilhada em Unix SysV

Semáforos em Unix. Criar um conjunto (vetor) de semáforos: semid = semget ( chave, nsems, flag); onde:

Comunicação Inter-Processo em Unix. Pipes FIFO (Named Pipes) Pipes

Este pdf contém o código, em linguagem C, de 6 ficheiros.

1 Escrita de Arquivos Binário

Capítulo 6: Arquivos

INF 1007 Programação II

Permissionamento (Parte 3)

Listas (cont.) K&R: Capitulo 6. Lista Simplesmente Ligada IAED, 2012/2013. Conjunto de nós. Cada nó contém. head NULL. typedef struct node {

INF 1620 P3-29/06/04 Questão 1 Nome:

Estruturas de Dados. Módulo 17 - Busca. 2/6/2005 (c) Dept. Informática - PUC-Rio 1

Gilberto A. S. Segundo. 24 de agosto de 2011

Curso de Introdução à Liguagem de. Grupo PET-Tele. Universidade Federal Fluminense. July 16, 2012

AULA 14 ESTRUTURA DE DADOS

Capítulo 06: Arquivos

Variável Composta Homogênea Unidimensional e Multidimensional - ARRAY

Aula 9 Oficina de Programação Matrizes. Profa. Elaine Faria UFU

Alocação de Memória. Lucas Ferrari de Oliveira Professor Adjunto Universidade Federal do Paraná (UFPR)

Trabalho Linguagem e Programação de Compiladores

Alocação Dinâmica de Memória

MESMO QUE ESTAS VARIÁVEIS TENHAM NOME IDÊNTICOS

Vetores e Strings. 4. Funções Básicas para manipulação de Strings. A função gets() lê uma string do teclado. Sua forma geral é:

ESTRUTURA DE DADOS CIÊNCIA E TECNOLOGIA DO RIO. Curso de Tecnologia em Sistemas para Internet

BLOGS. Blogs AMBIENTE VIRTUAL DE APRENDIZAGEM TUTORIAL DO. Autor(es) Scarlat Pâmela Silva

INF 1620 P1-04/10/03 Questão 1 Nome:

Módulo 5 Vetores e Alocação Dinâmica

Linguagem C: Ponteiros - Alocação Dinâmica

Anexo 1 Processos UNIX Anexo 2 Pipes UNIX Anexo 3 IPC UNIX ANEXOS

Trabalho 2 Matriz Esparsa

Linguagem e Técnicas de Programação

Outline. 33. Manipulação de arquivos DIM

P2 Programação II Departamento de Informática/PUC-Rio

Lista Encadeada (Linked List)

Tipos Abstratos de Dados

Exercícios. Alocação Dinâmica. Alocação dinâmica de memória. Alocação de memória. Alocação da Memória Principal. Alocação da Memória Principal

BCC202 - Estrutura de Dados I

Sistemas Operacionais e Introdução à Programação. Programação com linguagem C

INF1007: Programação 2. 2 Alocação Dinâmica. 17/02/2014 (c) Dept. Informática - PUC-Rio 1

Algoritmos e Estruturas de Dados I

Estruturas de Dados. Módulo 15 - Arquivos. 2/6/2005 (c) Dept. Informática - PUC-Rio 1

Métodos Computacionais. Listas Encadeadas

Lista de Exercícios para P1 INF1007 (Prog2) 15/04/2013. ATENÇÃO: O material a seguir não sofreu revisão e pode conter erros.

Árvores B. Prof. Márcio Bueno. / Fonte: Material da Prof a Ana Eliza Lopes Moura

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: tipos de dados definidos pelo programador: struct union enum typedef

1 Exercícios com ponteiros

Sistema Rodoviário Tabajara

Árvores Binárias. 16/11 Representação e Implementação: Encadeada Dinâmica O TAD

7. Memória partilhada e sincronização em UNIX

Tratamento de Erros. Sérgio Luiz Ruivace Cerqueira

1 Exercícios com ponteiros

As notícias são recebidas no formato texto, contendo o nome da fonte geradora (agência):

Manual do Professor AVA - Moodle/Unesp (versão 3.0) Grupos e agrupamentos

FTIN FORMAÇÃO TÉCNICA EM INFORMÁTICA. Módulo de Programação Prof. Flávio Dantas

Árvores. Sérgio Carlos Portari Júnior

Estruturas de Dados. Parte dos slides a seguir são adaptações, extensões e recodificações em C dos originais:

Técnicas de Programação:

Instalando Servidor de Arquivos

Threads em Ambiente LINUX. Estudo e testes com a biblioteca pthreads

Arquivos em C Parte 2

1. Listas sequenciais versus listas ligadas. Lista sequencial

Fábio da Fontoura Beltrão Felipe Augusto Chies Lucas Fialho Zawacki Marcos Vinicius Cavinato Matheus de Carvalho Proença

Um processo sob UNIX ocupa uma área de memória formada basicamente por 3 partes:

Tipos Abstratos de Dados. Estrutura de Dados

2º Roteiro de Laboratório Estruturas condicionais

1ª Lista de Exercícios

CURSO BÁSICO DE PROGRAMAÇÃO AULA 15. Revisão Vetores e Matrizes Trabalho

Programação de Sistemas Carris

Sumário. Introdução à Ciência da Computação. Ponteiros em C. Introdução. Definição. Por quê ponteiros são importantes?

Sumário. 1 Tutorial: Ferramentas do Clickideia Editor de Jornal - Básico. O jornal na sala de aula... 2

INF1007: Programação 2 8 Listas Encadeadas. (c) Dept. Informática - PUC-Rio 1

Departamento de Informática - PUC-Rio INF 1007 Programação 2 P1 17/04/2010

ponteiros INF Programação I Prof. Roberto Azevedo

Universidade Estadual de Mato Grosso do Sul Ciência da Computação Algoritmos e Estruturas de Dados I (AED-I) Prof. Nilton

CAP. IX - MANIPULAÇÃO DE ARQUIVOS Generalidades sobre Arquivos. 9.2 Abertura e Fechamento de Arquivos. Operações com arquivos:

Introdução à Programação C

Comunicação entre pai e filho

Introdução à Engenharia ENG1000

Programação: Vetores

Módulo 10 Listas Encadeadas

Professora Jeane Melo

4ª Lista de Exercícios de Programação I

O que é um apontador em C (type pointer in C)?

Sobre o Visual C

INF 1620 P1-14/04/07 Questão 1 Nome:

Universidade Federal de Uberlândia Faculdade de Computação. Linguagem C: ponteiros e alocação dinâmica

INF P3-23/06/07 Questão 1 Nome:

Semáforos. Walter Fetter Lages.

LP II Estrutura de Dados Estruturas Heterogêneas e Listas Lineares Estáticas. Prof. José Honorato Ferreira Nunes

Manipulação de Arquivos

INF 1620 P3-25/11/05 Questão 1 Nome:

Arquivos. Prof. Dr. Silvio do Lago Pereira. Departamento de Tecnologia da Informação Faculdade de Tecnologia de São Paulo

Lista com descritor (continuação)

Volnys Bernal 1. Trabalho Chat UDP. PSI 2653 Meios Eletrônicos Interativos I

SCC122 - Estruturas de Dados. Lista Estática Seqüencial

Aula : Permissões de acesso a arquivos e diretórios. 2 Conceito de permissões de acesso a arquivos e diretórios

Transcrição:

1ª Avaliação Faculdades Integradas de Caratinga Sistemas Distribuídos Jacson RC Silva Exercícios Avaliativos Memória Compartilhada Uma posição de memória compartilhada é identificada por uma chave. Essa chave pode ser IPC_PRIVATE para que somente o pai e seus filhos consigam acessar, ou pode ser um número para que vários processos diferentes consigam acessar. Encontramos um problema nessa implementação: se um outro processo souber minha chave, ou se ele coincidentemente colocar minha chave, ele conseguirá acessar minha posição de memória, o que causará muitos erros. Para isso, torna-se necessário a utilização da função ftok(). Ela cria uma chave através do nome do seu programa e de um número que você passe. 1. Execute o código abaixo e descreva o que você entendeu. // armazenamento da chave int i; // para utilizarmos todos os valores possíveis // de chaves para um pathname for ( i=0 ; i<=255 ; i++ ) // syntaxe: key_t ftok ( char *pathname, char proj ) chave = ftok ( argv[0], i ); if (chave == -1) perror("erro ao criar a chave"); else printf("valor da chave: %#x\n", chave); 2. Troque o número 255 para um número maior e indique o que aconteceu Para que a chave não fique vinculada somente ao nome do seu programa ( argv[0] ), podemos utilizar um outro nome de arquivo. 3. Modifique o valor de argv[0] para outro_nome.chave. Depois, compile e execute novamente seu programa. O que aconteceu? Qual o erro informado? (obs: o perror serve para escrever na tela o erro retornado pela função de sistema chamada, no nosso caso, o ftok() ) 4. Bom, agora simplesmente crie um arquivo com o nome outro_nome.chave na pasta do seu programa e execute-o novamente. O erro aconteceu novamente? Por que?

Agora que já aprendemos a criar chaves, vamos aprender a criar e utilizar memórias compartilhadas. A memória compartilhada é uma posição de memória alocada pelo sistema operacional e identificada por uma ID. A função que pede ao sistema operacional para criar a chave chama-se shmget(). Esta função que será responsável por alocar uma posição de memória e retornar seu ID. Vamos criar uma posição de memória: 1. Execute o programa abaixo e dê o comando ipcs -m. Por que sua memória não apareceu? typedef struct valores; if (chave == -1) perror("erro ao criar a chave"); exit(1); if (mem_id == -1) perror("erro ao criar memoria");exit(2); 2. Será que ela não foi criada? Bom, mudando um pouco de pau pra cavaco, para um outro programa utilizar essa memória criada, ele tem que utilizar a mesma chave e a mesma função do programa que acabamos de fazer, ou seja, seu início deve ser idêntico ao que fizemos. Para garantir que a posição de memória é do seu programa, ou seja, que já não existia na memória uma outra posição com a chave que você utilizou, temos que adicionar a diretiva IPC_EXCL. Faça isso e execute novamente seu programa, basta alterar IPC_CREAT por IPC_CREAT IPC_EXCL. Execute novamente seu programa. Qual o erro apresentado? O erro File Exists quando relacionado a memória, significa que essa posição já existe. 3. Bom, já que vimos que ela existe, vamos agora trabalhar com sua permissão. Vamos dar permissão ao dono (usuário que criou) de leitura e escrita. Faça os passos: remova a memória com o comando: ipcrm -m ID_QUE_SEU_PROGRAMA_ESCREVEU Adicione o include: #include <sys/stat.h> Modifique

de: IPC_CREAT IPC_EXCL para: IPC_CREAT IPC_EXCL S_IRUSR S_IWUSR Execute novamente o programa e verifique a memória criada com o comando ipcs 3. Agora, encontre e sua memória dentre os segmentos listados pelo ipcs e responda: qual a relação entre a sua chave e a memória criada? qual a relação entre a sua ID e a memória criada? qual a relação de permissão entre seu usuário e a memória criada? 4. Agora vamos escrever valores em nossa memória. Execute o programa abaixo e faça outro programa para ler essas informações e escrevê-las na tela: #include <string.h> typedef struct valores; // acesso a nossa memória valores *minhamemoria; if (chave == -1) perror("erro ao criar a chave"); exit(1); if (mem_id == -1) perror("erro ao criar memoria");exit(2); minhamemoria = (valores*) shmat(mem_id, NULL, NULL); if ( ((int) minhamemoria) == -1 ) perror("erro ao obter endereço da mem");exit(3); printf("colocando na memória o nome \"Jeiks\"\n"); strcpy( minhamemoria->nome, "Jeiks" ); printf("colocando na memória a idade 25\n"); minhamemoria->idade = 25; printf("desassociando da memória\n"); if ( shmdt( minhamemoria ) == -1 ) perror("erro no shmdt()");exit(3);

Agora temos que apagar a memória através de nosso programa, pois é feio sempre utilizar o ipcrm. [ ;) ] 5. Compile e execute o programa abaixo e descreva seu funcionamento. #include <string.h> typedef struct valores; if (chave == -1) perror("erro ao criar a chave"); exit(1); if (mem_id == -1) perror("erro ao criar memoria");exit(2); // syntaxe: // int shmctl(int shmid, int cmd, struct shmid_ds *buf); if ( shmctl( mem_id, IPC_RMID, NULL) == -1 ) perror("erro ao destruir a memória"); exit(3); printf("memória removida\n"); Como vocês puderam notar, podemos ter vários programas diferentes: um para criar a memória; outro para colocar os valores; outro para ler os valores; e outro para remover a memória. A implementação é bem livre para o usuário, para assim ele conseguir utilizar esse sistema de memórias compartilhadas à vontade. 6. Como último exercício de memória compartilhada, crie um semáforo para garantir o acesso a memória como seção crítica. Para isso, faça: crie um semáforo; antes de entrar na seção crítica, chame a função shm_wait(); após utilizar a seção crítica, chame a função shm_post().

As filas de mensagens seguem os mesmos conceitos da memória compartilhada. Com esses conceitos, obtenha o arquivo fila_mensagens.zip, compile e execute os arquivos que ele contém e descreva como utilizar uma fila de mensagens.