Prévia do material em texto
Curso de Sistemas da Informação
Disciplina Sistemas Operacionais
Profa. Semíramis Assis
2023.1
ROTEIRO PRÁTICO 01
Threads e Memória Compartilhada
1 - Instalar as bibliotecas para pthreads no linux -> gerenciador
de bibliotecas;
2 - Atualizar as bibliotecas padrões de desenvolvimento no
Linux com o comando
sudo apt install --reinstall libc6-dev
3 – Criar um arquivo de nome criarThread.c contendo o código:
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
pthread_t t1;
pthread_t t2;
void codigo_tarefa_1(void){
for (int ns=0; ns< 10; ns++){
sleep(1);
printf("Tarefa 1: passaram %d segundos\n",ns);
}
}
Curso de Sistemas da Informação
Disciplina Sistemas Operacionais
Profa. Semíramis Assis
2023.1
void codigo_tarefa_2(void){
for (int ns=0; ns< 15; ns++){
sleep(1);
printf("Tarefa 2: passaram %d segundos\n",ns);
}
}
void main(){
printf("Inicio\n");
pthread_create(&t1, NULL, (void *) codigo_tarefa_1, NULL);
pthread_create(&t2, NULL, (void *) codigo_tarefa_2, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
printf("Fim \n");
}
4 - Compilar o arquivo criado com o comando
gcc criarThread.c -o teste -lpthread
5 - Executar o arquivo
./teste
6 - Alterar o arquivo criarThread.c para receber parâmetros:
Curso de Sistemas da Informação
Disciplina Sistemas Operacionais
Profa. Semíramis Assis
2023.1
#include <pthread.h>
#include <stdio.h>
#include <unistd.h>
pthread_t t1;
pthread_t t2;
struct param_t {
int tempo;
char *nome;
};
void codigo_tarefa_1(struct param_t *pparam){
for (int ns=0; ns< pparam->tempo; ns++){
sleep(1);
printf("%s: passaram %d segundos\n",pparam->nome, ns);
}
}
void codigo_tarefa_2(struct param_t *pparam){
for (int ns=0; ns< pparam->tempo; ns++){
sleep(1);
printf("%s: passaram %d segundos\n",pparam->nome, ns);
}
}
void main(){
Curso de Sistemas da Informação
Disciplina Sistemas Operacionais
Profa. Semíramis Assis
2023.1
struct param_t p1,p2;
p1.tempo = 5;
p1.nome = "TAREFA 1";
p2.tempo = 10;
p2.nome = "TAREFA 2";
printf("Inicio\n");
pthread_create(&t1, NULL, (void *) codigo_tarefa_1, (void *) &p1);
pthread_create(&t2, NULL, (void *) codigo_tarefa_1, (void *) &p2
);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
printf("Fim \n");
}
7 - Alterar para executar uma mesma função nas duas threads.
Curso de Sistemas da Informação
Disciplina Sistemas Operacionais
Profa. Semíramis Assis
2023.1
MEMÓRIA COMPARTILHADA
1 - Executar o teste de memória compartilhada e criação de
segmento. Criar o arquivo memoriaCompartilhada.c com o
código:
#include <stdio.h>
#include <sys/shm.h>
#include <sys/stat.h>
int main(){
int segment_id;
char* shared_memory;
struct shmid_ds shmbuffer;
int segment_size;
const int shared_segment_size = 0x6400;
/* Aloca um segmento de memoria compartilhada */
segment_id = shmget (IPC_PRIVATE, shared_segment_size,
IPC_CREAT | IPC_EXCL | S_IRUSR | S_IWUSR);
/*Anexa o segmento de memoria compartilhada */
shared_memory = (char*) shmat (segment_id, 0,0);
printf("memoria compartilhada anexada ao endereco %p\n",
shared_memory);
Curso de Sistemas da Informação
Disciplina Sistemas Operacionais
Profa. Semíramis Assis
2023.1
/*Determina o tamanho do segmento*/
shmctl(segment_id, IPC_STAT, &shmbuffer);
segment_size = shmbuffer.shm_segsz;
printf("tamanho do segmento : %d\n", segment_size);
/*Escreve um texto no segmento de memoria compartilhada */
sprintf(shared_memory, "Ola mundo!");
/*Desanexa o segmento de memoria compartilhada */
shmdt(shared_memory);
/*Reanexa o segmento de memoria compartilhada em um
endereco diferente*/
shared_memory = (char*) shmat (segment_id,
(void*)0x5000000,0);
printf("memoria compartilhada anexada ao novo endereco %p\n",
shared_memory);
/*Imprimindo o texto da memoria compartilhada*/
printf("%s\n", shared_memory);
/*Desanexa o segmento de memoria compartilhada*/
shmdt(shared_memory);
/*Libera o segmento de memoria compartilhada*/
shmctl(segment_id, IPC_RMID, 0);
return 0;
Curso de Sistemas da Informação
Disciplina Sistemas Operacionais
Profa. Semíramis Assis
2023.1
}
2 - Seguir tutorial
https://www.tutorialspoint.com/inter_process_communication/int
er_process_communication_shared_memory.htm#
EXERCÍCIO – VALOR 1,0 PONTO
Criar um programa que solicite o nome do usuário e armazene
em um segmento de memória compartilhada. Criar um código
para fazer a leitura destes segmentos.
Antes de iniciar, o usuário deverá informar a quantidade de
nomes que serão solicitados, sendo necessário que seu
algoritmo crie segmentos diferentes para cada nome inserido.
Após esta primeira etapa, criar um código para leitura de
nomes, sendo uma versão alterada do código inicial, para criar
threads que façam a contagem da quantidade de caracteres de
cada nome informado, apresentando uma contagem regressiva
de acordo com o número de caracteres de cada nome
armazenado (ex: Joao - 4 caracteres - 4 - 3 - 2 - 1; Maria - 5
caracteres - 5 - 4 - 3 - 2 -1).