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

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

Sistemas de Computação Semáforos

- pid do último processo a manipular o semáforo (através de semop/semctl); - o número de processos que estão à espera que o valor do semáforo seja 0.

MAC422/5753 Sistemas Operacionais

Pthreads API. Criação de Threads: usando Pthreads

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

Comunicação entre processos 2ª parte (IPC InterProcess Communication)

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

Memória partilhada em Unix SysV

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

Inter-process Communication (IPC)

Memória Compartilhada (Shared Memory) (1) Memória Compartilhada (2) Memória Compartilhada (3)

Semáforos. Walter Fetter Lages.

Comunicação entre Processos Memória Compartilhada

Comunicação entre Processos Memória Compartilhada

Programação. Cap. 12 Gestão de Memória Dinâmica

A regra de acesso aos dados de uma fila é a seguinte: O primeiro elemento que entra (na fila) é o primeiro que sai (FIFO first in, first out).

Programação Mestrado Integrado em Engenharia Aeronáutica 1º ano, 1º semestre. T. 11 Gestão de Memória Dinâmica

Exercícios Avaliativos Memória Compartilhada

Ponteiros. Baseado nos slides do Prof. Mauro.

Produtor / Consumidor

1ª versão. #include <stdio.h> #include <string.h> #include <stdlib.h> #define maxdiscos 1000

SISTEMAS OPERATIVOS I

Universidade de Coimbra Faculdade de Ciências e Tecnologias Departamento de Engenharia Informática. Projecto. Sistemas Operativos 99/00

UNIVERSIDADE DA BEIRA INTERIOR

Programação 5374 : Engenharia Informática 6638 : Tecnologias e Sistemas de Informação. Cap. 7 Arrays. Arrays

Programação de Sistemas Carris

Métodos Computacionais. Tipos Estruturados

O comando for permite que um certo trecho de programa seja executado um determinado número de vezes. A forma do comando for é a seguinte:

Introdução a Programação. Ponteiros e Strings, Alocação Dinâmica

PROGRAMAÇÃO INSTRUÇÕES DA LINGUAGEM C

Apontadores/ponteiros

CES-11. Algoritmos e Estruturas de Dados. Carlos Alberto Alonso Sanches Juliana de Melo Bezerra

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 {

Estrutura de Dados. Struct (Registro) Lais Farias Alves

Algoritmos e Estruturas de dados

SSC304 Introdução à Programação Para Engenharias. Ponteiros. GE4 Bio

ALGORITMOS E ESTRUTURAS DE DADOS CES-11

Linguagem de Programação C. Comandos de Seleção e Desvio

MATRIZES. Luís Charneca.

Computação I - C Prova /10/ Profs. Adriano Cruz e Valeria Bastos

Introdução à Programação I

UNIVERSIDADE DA BEIRA INTERIOR

Tipos Abstratos de Dados. Estrutura de Dados

AULA 14 ESTRUTURA DE DADOS

Introdução à Ciência da Computação I. Alocação Dinâmica. Prof. Claudio Fabiano Motta Toledo

Introdução a Programação. Ponteiros e Vetores, Alocação Dinâmica

1/22 FICHEIROS BINÁRIOS

Estruturas. struct são coleções de dados heterogêneos agrupados em uma mesma estrutura de dados. Ex: armazenar as coordenadas (x,y) de um ponto:

1 Escrita de Arquivos Binário

Programação de Computadores I Arquivos na Linguagem C PROFESSORA CINTIA CAETANO

Estruturas de Dados Aula 10: Listas (parte 2) 19/04/2011

Fundamentos de Programação 1

#include <stdio.h> Void main() { printf( Cheguei!\n"); } INTRODUÇÃO A LINGUAGEM C

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

1/24 FICHEIROS DE TEXTO

Memória Compartilhada

struct Nodo { int struct Nodo struct Nodo typedef struct Nodo *PNodo; int ConstruirLista (PNodo *H, PNodo *T) { int Criar

Listas Encadeadas. David Menotti Algoritmos e Estruturas de Dados II DInf UFPR

Vetores. e o programa deverá ler os valores separadamente:

Métodos Computacionais. Listas Encadeadas

13. ALOCAÇÃO DINÂMICA DE MEMÓRIA

PROGRAMAÇÃO INSTRUÇÕES DA LINGUAGEM C

Programação de Sistemas Array Sistólico

UNIVERSIDADE DA BEIRA INTERIOR

Aula 3 Alocação Dinâmica

Introdução à Programação

1/34 GESTÃO DINÂMICA DE MEMÓRIA

Paralela e Distribuída. Memória Partilhada com Processos

Reinaldo Gomes Alocação Dinâmica

Alocação Dinâmica em C

PROGRAMAÇÃO DE MICROPROCESSADORES 2007 / 2008

Universidade de São Paulo São Carlos Instituto de Ciências Matemáticas e de Computação. Estruturas em C

TÉCNICAS DE LINGUAGEM DE PROGRAMAÇÃO

UNIVERSIDADE ESTADUAL DE PONTA GROSSA SETOR DE CIÊNCIAS AGRÁRIAS E DE TECNOLOGIA DEPARTAMENTO DE INFORMÁTICA JEFERSON AUGUSTO WISBISKI JOÃO DAVI MAYER

Algoritmos e Estruturas de Dados I (DCC/003) Variável Indexada Vetor

Fundamentos de Programação

Linguagem C. Programação Estruturada. Estrutura de Dados Heterogêneos. Prof. Luis Nícolas de Amorim Trigo

Ponteiros em C. Adriano Joaquim de Oliveira Cruz 21 de julho de Instituto de Matemática Departamento de Ciência da Computação UFRJ

ESTRUTURAS DE DADOS (LEI, LM, LEE) PROGRAMAÇÃO III (LTSI) Universidade da Beira Interior, Departamento de Informática Hugo Pedro Proença, 2017/2018

Curso de Programação C em Ambientes Linux Aula 05

Semáforos. Walter Fetter Lages

Programação 5374 : Engenharia Informática 6638 : Tecnologias e Sistemas de Informação. Cap. 11 Estruturas (Structs) Structs

Sistemas Operacionais: Sincronização entre processos

VETORES ADAPTADO DO MATERIAL DE PROF. L. A. ALVARES

Estruturas de Dados. Módulo 11 Pilhas. 9/8/2005 (c) Dept. Informática - PUC-Rio 1

UNIVERSIDADE DA BEIRA INTERIOR

struct LISTA item quant

PONTEIROS E LISTAS. Kalinka Regina Lucas Jaquie Castelo Branco

PROGRAMAÇÃO INSTRUÇÕES DA LINGUAGEM C

#include <stdio.h> #define nl 3 #define nc 4 main () { int matriz[nl][nc],*p,i; for (i=0, p=&matriz[0][0];i<nl*nc;i++) *(p++)=i+1; for (i=0,

! Os primeiros computadores permitiam a execução de apenas um programa de cada vez, com acesso completo aos recursos do sistema

Exercício. 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

INF 1620 P2-01/11/03 Questão 1 Nome:

Carlos Eduardo Batista. Centro de Informática - UFPB

Programação II. Aula Teórica 4: memoria dinâmica / pre-processador. Marco Giunti. Departamento de Informática, UBI

Linguagem C estruturas de repetição

Programação 1. Atribuição, operadores aritméticos, entrada de dados. Técnico em Eletrônica Semestre 5 02

Transcrição:

Este pdf contém o código, em linguagem C, de 6 ficheiros. Os 3 primeiros ficheiros correspondem à solução do exercício 3 do capítulo 4 (solução para o problema do buffer limitado utilizando apenas 2 semáforos). O 1º ficheiro cria e liberta os recursos (semáforos e memória partilhada). O 2º ficheiro armazena informação no buffer limitado O 3º ficheiro retira informação do buffer. Os 3 últimos ficheiros são também uma solução para o problema do buffer limitado mas utilizando 3 semáforos. O 1º ficheiro cria e liberta os recursos (semáforos e memória partilhada). O 2º ficheiro armazena informação no buffer limitado O 3º ficheiro retira informação do buffer.

#include <stdio.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/sem.h> #define SHM_KEY1 0x00007570 #define SHM_KEY2 0x00007566 #define SHM_KEY3 0x00007567 #define SHM_KEY4 0x00007568 #define SHM_KEY5 0x00007569 #define SEM_KEY 0x00007570 main(){ int semid, shmid_buffer, shmid_flag,shmid_turn,shmid_in,shmid_out, *shmaddr_buffer, *shmaddr_flag,*shmaddr_turn,*shmaddr_in,*shmaddr_out, i; union semun {int val; arg; char resp[10]; //criar uma zona de memória partilhada, para servir de buffer de //10 inteiros if((shmid_buffer=shmget(shm_key1,10*sizeof(int),0677 IPC_CREAT IPC_EXC L))==-1){ if((shmaddr_buffer = (int*)shmat(shmid_buffer, NULL,0))==(int*)-1){ //variáveis partilhadas usadas para controlar o acesso à secção //crítica //criar uma zona de memória partilhada, para armazenar o valor de //2 flags ==-1){ -1){ if((shmid_flag=shmget(shm_key2,2*sizeof(int),0677 IPC_CREAT IPC_EXCL)) if((shmaddr_flag = (int*)shmat(shmid_flag, NULL,0))==(int*)-1){ //inicialização das flags a falso for(i=0;i<=1;i++) *(shmaddr_flag+i)=0; //criar uma zona de memória partilhada, para armazenar o valor de //turn if((shmid_turn=shmget(shm_key3,sizeof(int),0677 IPC_CREAT IPC_EXCL))== if((shmaddr_turn = (int*)shmat(shmid_turn, NULL,0))==(int*)-1){

shmctl(shmid_turn, IPC_RMID, NULL); *shmaddr_turn=0; ){ 1){ //criar uma zona de memória partilhada, para armazenar o valor de //in (posição onde será colocado o novo item produzido) if((shmid_in=shmget(shm_key4,sizeof(int),0677 IPC_CREAT IPC_EXCL))==-1 shmctl(shmid_turn, IPC_RMID, NULL); if((shmaddr_in = (int*)shmat(shmid_in, NULL,0))==(int*)-1){ shmctl(shmid_turn, IPC_RMID, NULL); shmctl(shmid_in, IPC_RMID, NULL); *shmaddr_in=0; //criar uma zona de memória partilhada, para armazenar o valor de //out (posição de onde será retirado o próximo item a ser //consumido) if((shmid_out=shmget(shm_key5,sizeof(int),0677 IPC_CREAT IPC_EXCL))==- shmctl(shmid_turn, IPC_RMID, NULL); shmctl(shmid_in, IPC_RMID, NULL); if((shmaddr_out = (int*)shmat(shmid_out, NULL,0))==(int*)-1){ shmctl(shmid_turn, IPC_RMID, NULL); shmctl(shmid_in, IPC_RMID, NULL); shmctl(shmid_out, IPC_RMID, NULL); *shmaddr_out=0; if((semid=semget(sem_key, 2, 0700 IPC_CREAT IPC_EXCL))==-1){ perror("semget"); shmctl(shmid_turn, IPC_RMID, NULL); shmctl(shmid_in, IPC_RMID, NULL); shmctl(shmid_out, IPC_RMID, NULL); arg.val =0; if(semctl(semid,0,setval,arg)==-1){ perror("semctl");

shmctl(shmid_turn, IPC_RMID, NULL); shmctl(shmid_in, IPC_RMID, NULL); shmctl(shmid_out, IPC_RMID, NULL); semctl(semid, 0, IPC_RMID, NULL); arg.val =10; if(semctl(semid,1,setval,arg)==-1){ perror("semctl"); shmctl(shmid_turn, IPC_RMID, NULL); shmctl(shmid_in, IPC_RMID, NULL); shmctl(shmid_out, IPC_RMID, NULL); semctl(semid, 0, IPC_RMID, NULL); do{ printf("quer libertar os recursos? (S/N)\n"); scanf("%s",resp); while((resp[0]!='s')&&(resp[0]!='s')); shmctl(shmid_turn, IPC_RMID, NULL); shmctl(shmid_in, IPC_RMID, NULL); shmctl(shmid_out, IPC_RMID, NULL); semctl(semid, 0, IPC_RMID, NULL);

#include <stdio.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/sem.h> #define SHM_KEY1 0x00007570 #define SHM_KEY2 0x00007566 #define SHM_KEY3 0x00007567 #define SHM_KEY4 0x00007568 #define SHM_KEY5 0x00007569 #define SEM_KEY 0x00007570 main(){ int semid, shmid_buffer,shmid_flag,shmid_turn,shmid_in, *shmaddr_buffer, *shmaddr_flag, *shmaddr_turn, *shmaddr_in, i; struct sembuf sop; if ((shmid_buffer=shmget (SHM_KEY1, 10*sizeof(int), 0))==-1){ if((shmaddr_buffer = (int*)shmat(shmid_buffer, NULL,0))==(int*)-1){ if ((shmid_flag=shmget (SHM_KEY2, 2*sizeof(int), 0))==-1){ if((shmaddr_flag = (int*)shmat(shmid_flag, NULL,0))==(int*)-1){ if ((shmid_turn=shmget (SHM_KEY3, sizeof(int), 0))==-1){ if((shmaddr_turn = (int*)shmat(shmid_turn, NULL,0))==(int*)-1){ if ((shmid_in=shmget (SHM_KEY4, sizeof(int), 0))==-1){ if((shmaddr_in = (int*)shmat(shmid_in, NULL,0))==(int*)-1){ if((semid=semget(sem_key, 1, 0))==-1){ perror("semget"); sop.sem_num=1; sop.sem_op=-1;

semop(semid, &sop, 1); shmaddr_flag[0]=1; *shmaddr_turn=1; while((shmaddr_flag[1]) && (*shmaddr_turn==1)); printf("introduza o valor que quer armazenar no buffer\n"); scanf("%d",&shmaddr_buffer[*shmaddr_in]); *shmaddr_in=(*shmaddr_in+1)%10; shmaddr_flag[0]=0; sop.sem_num=0; sop.sem_op=1; semop(semid, &sop, 1);

#include <stdio.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/sem.h> #define SHM_KEY1 0x00007570 #define SHM_KEY2 0x00007566 #define SHM_KEY3 0x00007567 #define SHM_KEY4 0x00007568 #define SHM_KEY5 0x00007569 #define SEM_KEY 0x00007570 main(){ int semid, shmid_buffer,shmid_flag,shmid_turn,shmid_out, *shmaddr_buffer, *shmaddr_flag, *shmaddr_turn,*shmaddr_out, i; struct sembuf sop; if ((shmid_buffer=shmget (SHM_KEY1, 10*sizeof(int), 0))==-1){ if((shmaddr_buffer = (int*)shmat(shmid_buffer, NULL,0))==(int*)-1){ if ((shmid_flag=shmget (SHM_KEY2, 2*sizeof(int), 0))==-1){ if((shmaddr_flag = (int*)shmat(shmid_flag, NULL,0))==(int*)-1){ if ((shmid_turn=shmget (SHM_KEY3, sizeof(int), 0))==-1){ if((shmaddr_turn = (int*)shmat(shmid_turn, NULL,0))==(int*)-1){ if ((shmid_out=shmget (SHM_KEY5, sizeof(int), 0))==-1){ if((shmaddr_out = (int*)shmat(shmid_out, NULL,0))==(int*)-1){ if((semid=semget(sem_key, 1, 0))==-1){ perror("semget");

sop.sem_num=0; sop.sem_op=-1; semop(semid, &sop, 1); shmaddr_flag[1]=1; *shmaddr_turn=0; while((shmaddr_flag[0]) && (*shmaddr_turn==0)); printf("o elemento retirado do buffer tem o valor %d\n",shmaddr_buffer [*shmaddr_out]); *shmaddr_out=(*shmaddr_out+1)%10; shmaddr_flag[1]=0; sop.sem_num=1; sop.sem_op=1; semop(semid, &sop, 1);

#include<stdio.h> #include<sys/ipc.h> #include<sys/shm.h> #include<sys/sem.h> #define FULL 0 #define EMPTY 1 #define MUTEX 2 #define SHM_KEY1 0x00007580 #define SHM_KEY2 0x00007581 #define SHM_KEY3 0x00007582 #define SEM_KEY 0x00007580 main(){ int shmid_buffer,shmid_in,shmid_out,semid,*shmaddr_buffer,*shmaddr_in, *shmaddr_out; union semun {int val; arg; char resp[10]; if((shmid_buffer=shmget(shm_key1,10*sizeof(int),0600 IPC_CREAT IPC_EXC L))==-1){ if((shmaddr_buffer=(int*)shmat(shmid_buffer,null,0))==(int*)-1){ exit(2); ){ if((shmid_in=shmget(shm_key2,sizeof(int),0600 IPC_CREAT IPC_EXCL))==-1 exit(3); if((shmaddr_in=(int*)shmat(shmid_in,null,0))==(int*)-1){ exit(4); 1){ if((shmid_out=shmget(shm_key3,sizeof(int),0600 IPC_CREAT IPC_EXCL))==- exit(5); if((shmaddr_out=(int*)shmat(shmid_out,null,0))==(int*)-1){ shmctl(shmid_out,ipc_rmid,null); exit(6);

*shmaddr_in=0; *shmaddr_out=0; if ((semid=semget(sem_key,3,0700 IPC_CREAT IPC_EXCL))==-1) { perror("semget"); shmctl(shmid_out,ipc_rmid,null); exit(7); arg.val=0; if ((semctl(semid,full,setval,arg))==-1){ perror("semctl"); shmctl(shmid_out,ipc_rmid,null); semctl(semid,0,ipc_rmid,null); exit(8); arg.val=10; if ((semctl(semid,empty,setval,arg))==-1){ perror("semctl"); shmctl(shmid_out,ipc_rmid,null); semctl(semid,0,ipc_rmid,null); exit(9); arg.val=1; if ((semctl(semid,mutex,setval,arg))==-1){ perror("semctl"); shmctl(shmid_out,ipc_rmid,null); semctl(semid,0,ipc_rmid,null); exit(10); do{ printf("quer libertar os recursos? (S/N)\n"); scanf("%s",resp); while((resp[0]!='s')&&(resp[0]!='s')); shmctl(shmid_out,ipc_rmid,null); semctl(semid,0,ipc_rmid,null);

#include<stdio.h> #include<sys/ipc.h> #include<sys/shm.h> #include<sys/sem.h> #define FULL 0 #define EMPTY 1 #define MUTEX 2 #define SHM_KEY1 0x00007580 #define SHM_KEY3 0x00007582 #define SEM_KEY 0x00007580 main(){ int shmid_buffer,shmid_in,semid,i,*shmaddr_buffer,*shmaddr_in=0, val; struct sembuf sop; if((shmid_buffer=shmget(shm_key1,10*sizeof(int),0))==-1){ if((shmaddr_buffer=(int*)shmat(shmid_buffer,null,0))==(int*)-1){ exit(2); if((shmid_in=shmget(shm_key3,sizeof(int),0))==-1){ exit(3); if((shmaddr_in=(int*)shmat(shmid_in,null,0))==(int*)-1){ exit(4); if ((semid=semget(sem_key,3,0))==-1) { perror("semget"); exit(5); sop.sem_num=empty; sop.sem_op=-1; printf("introduza o valor a armazenar: \n"); scanf("%d",&val); sop.sem_num=mutex; sop.sem_op=-1; shmaddr_buffer[*shmaddr_in]= val; *shmaddr_in=(*shmaddr_in+1)%10; sop.sem_num=mutex;

sop.sem_op=1; sop.sem_num=full; sop.sem_op=1;

#include<stdio.h> #include<sys/ipc.h> #include<sys/shm.h> #include<sys/sem.h> #define FULL 0 #define EMPTY 1 #define MUTEX 2 #define SHM_KEY1 0x00007580 #define SHM_KEY2 0x00007581 #define SEM_KEY 0x00007580 main(){ int shmid_buffer,shmid_out,semid,*shmaddr_buffer,*shmaddr_out=0; struct sembuf sop; if((shmid_buffer=shmget(shm_key1,10*sizeof(int),0))==-1){ if((shmaddr_buffer=(int*)shmat(shmid_buffer,null,0))==(int*)-1){ exit(2); if((shmid_out=shmget(shm_key2,sizeof(int),0))==-1){ exit(3); if((shmaddr_out=(int*)shmat(shmid_out,null,0))==(int*)-1){ exit(4); if ((semid=semget(sem_key,3,0))==-1) { perror("semget"); exit(5); sop.sem_num=full; sop.sem_op=-1; sop.sem_num=mutex; sop.sem_op=-1; ]); printf("elemento retirado do buffer: %d\n",shmaddr_buffer[*shmaddr_out *shmaddr_out=(*shmaddr_out+1)%10; sop.sem_num=mutex; sop.sem_op=1;

sop.sem_num=empty; sop.sem_op=1;