Système D'exploitation Producer Consumer Problem
Système D'exploitation Producer Consumer Problem
Système D'exploitation Producer Consumer Problem
wertyuiopasdfghjklzxcvbnmqwe
rtyuiopasdfghjklzxcvbnmqwerty
Système d’exploitation
uiopasdfghjklzxcvbnmqwertyuio
Producer Consumer problem
pasdfghjklzxcvbnmqwertyuiopas
Hana djemil,Benterzi youssra,………..zineb
dfghjklzxcvbnmqwertyuiopasdfg
hjklzxcvbnmqwertyuiopasdfghjk
lzxcvbnmqwertyuiopasdfghjklzx
cvbnmqwertyuiopasdfghjklzxcvb
nmqwertyuiopasdfghjklzxcvbnm
qwertyuiopasdfghjklzxcvbnmqw
ertyuiopasdfghjklzxcvbnmqwert
yuiopasdfghjklzxcvbnmqwertyui
1.Code :
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include <semaphore.h>
#define BUFFER_SIZE 4
// Producer function
void producer(int class_id, struct SharedMemory *shared_memory)
{
while (1) {
// Produce item
int item = 1; // Replace this with the actual item produced
// Update buffer
shared_memory->buffer[class_id - 1] = item;
// Release mutex
sem_post(&shared_memory->mutex);
// Consumer function
void consumer(int class_id, struct SharedMemory
*shared_memory) {
while (1) {
// Acquire filled slot
sem_wait(&shared_memory->filled_slots);
// Consume item
int item = shared_memory->buffer[class_id - 1];
// Release mutex
sem_post(&shared_memory->mutex);
int main() {
// Create shared memory
int shmid = shmget(IPC_PRIVATE, sizeof(struct
SharedMemory), IPC_CREAT | 0666);
if (shmid == -1) {
perror("shmget");
exit(EXIT_FAILURE);
}
// Initialize semaphores
sem_init(&shared_memory->mutex, 1, 1);
sem_init(&shared_memory->empty_slots, 1, BUFFER_SIZE);
sem_init(&shared_memory->filled_slots, 1, 0);
// Fork processes
pid_t p1 = fork();
pid_t p2 = fork();
pid_t p3 = fork();
pid_t p4 = fork();
if (p1 == 0 || p2 == 0 || p3 == 0 || p4 == 0) {
// Child processes - producers
int class_id = (p1 == 0 || p2 == 0) ? 1 : 2;
producer(class_id, shared_memory);
exit(0);
} else {
// Parent process - consumers
pid_t c1 = fork();
pid_t c2 = fork();
if (c1 == 0 || c2 == 0) {
// Child processes - consumers
int class_id = (c1 == 0) ? 1 : 2;
consumer(class_id, shared_memory);
exit(0);
} else {
// Parent process - wait for all processes to finish
wait(NULL);
wait(NULL);
wait(NULL);
wait(NULL);
wait(NULL);
wait(NULL);
// Detach and remove shared memory
shmdt(shared_memory);
shmctl(shmid, IPC_RMID, NULL);
}
}
return 0;
}
THE OUTPUT :
RAPPORT :
**Rapport sur le Code : Système de Producteur-Consommateur
avec Mémoire Partagée et Sémaphores**
**Fork/Join :**
Le modèle de programmation utilisé dans ce code est basé sur la
création de processus par le biais de la fonction système `fork()` et la
synchronisation de ces processus à l'aide de la fonction `wait()`, ce qui
est souvent appelé le modèle "fork and join" ou "fork and wait".
1. **Fork :**
La fonction `fork()` est utilisée pour créer un nouveau processus
en duplicant le processus appelant. Dans le code fourni, plusieurs
forks sont utilisés pour créer un certain nombre de producteurs et de
consommateurs. Le nouvellement créé processus hérite du code, des
données et de l'espace mémoire du processus parent. Cependant,
chaque processus a son propre espace d'adressage et s'exécute de
manière indépendante des autres processus.