PDA

View Full Version : sincronizzazione processi e thread


zzzzzz
28-12-2005, 20:02
Salve a tutti, sono nuovo del forum e avrei bisogno di aiuto per un progetto da realizzare usando il c. Il testo, composto da 2 parti, è il seguente:

“1. Realizzare una piccola libreria di funzioni che, utilizzando le chiamate di sistema IPC, permetta a più processi di sincronizzarsi per:
- richiedere l'allocazione di un numero k di risorse da un pool di N risorse, tutte dello stesso tipo, disponibili inizialmente (dove N è una costante dichiarata in un opportuno file della libreria). L'allocazione deve avvenire in modo atomico, ovvero: se tutte le k risorse sono disponibli, vengono assegnate, altrimenti non ne viene allocata nessuna e il processo viene sospeso
- restituire m risorse.
Scrivere programmi opportuni per illustrare l'utilizzo e il funzionamento della libreria.

2. Realizzare poi una analoga libreria per un processo con thread multipli piuttosto che per processi multipli. Cioè una piccola libreria di funzioni che, utilizzando le chiamate della libreria Pthreads, permetta a più threads di sincronizzarsi per richiedere in mutua esclusione, in modo atomico, un numero k di risorse da un pool di N risorse, tutte dello stesso tipo, disponibili inizialmente (dove N è una costante dichiarata in un opportuno file della libreria), e per restituire m risorse.”

Se qualcuno avesse le idee più chiare di me e sapesse darmi qualche indicazione per partire gliene sarei grato.
Grazie a tutti!!!
:)

cionci
28-12-2005, 20:47
Per Windows o per Linux ?

zzzzzz
28-12-2005, 20:54
per Linux

Poix81
28-12-2005, 23:30
faccio una domanda da persona che sa poco di thread... che differenza c'e' tra processi e thread?

ciao e grazi

ekerazha
29-12-2005, 00:47
faccio una domanda da persona che sa poco di thread... che differenza c'e' tra processi e thread?

ciao e grazi

(Per Linux nessuna, ahah :p :ciapet: )

Poix81
29-12-2005, 09:23
(Per Linux nessuna, ahah :p :ciapet: )

e per windows?

ciao e grazie

cionci
29-12-2005, 09:48
Linux fino a poco tempo fa non aveva i thread ora sono pienamente supportati... I thread vengono anche detti "processi leggeri", questo perchè la creazione è molto più semplice e meno onerosa...

In pratica i thread, al contrario dei processi, condividono lo stesso spazio di indirizzamento del processo/thread da cui vengono creati... Questo implica che l'accesso ad una determinata area di memoria può essere fatto contemporaneamente da due flussi di esecuzione diversi appartenenti allo stesso programma...

Solitamente il thread è una funzione che viene eseguita parallelamente al flusso di esecuzione che l'ha creata...

Per evitare race condition e mantenere la coerenza dei dati vengono eseguite particolari chiamate di sistema che permettono di far accedere ai dati in modo esclusivo (o non) per i vari thread...

In definitiva non devono poter mai accadare due scritture contemporanee, una lettura contemporaneamente ad un scrittura, due letture contemporanee sono ammesse... Ovviamente ci si deve mettere mentalmente nel caso peggiore possibile...

Inoltre bisogna garantire (e questo si fa con una buona progettazione) che non ci sia mai starvation: ovvero la possibilità che un thread resti in attesa infinita di una risorsa condivisa...

Poix81
29-12-2005, 09:57
Linux fino a poco tempo fa non aveva i thread ora sono pienamente supportati... I thread vengono anche detti "processi leggeri", questo perchè la creazione è molto più semplice e meno onerosa...

In pratica i thread, al contrario dei processi, condividono lo stesso spazio di indirizzamento del processo/thread da cui vengono creati... Questo implica che l'accesso ad una determinata area di memoria può essere fatto contemporaneamente da due flussi di esecuzione diversi appartenenti allo stesso programma...

Solitamente il thread è una funzione che viene eseguita parallelamente al flusso di esecuzione che l'ha creata...

Per evitare race condition e mantenere la coerenza dei dati vengono eseguite particolari chiamate di sistema che permettono di far accedere ai dati in modo esclusivo (o non) per i vari thread...

In definitiva non devono poter mai accadare due scritture contemporanee, una lettura contemporaneamente ad un scrittura, due letture contemporanee sono ammesse... Ovviamente ci si deve mettere mentalmente nel caso peggiore possibile...

Inoltre bisogna garantire (e questo si fa con una buona progettazione) che non ci sia mai starvation: ovvero la possibilità che un thread resti in attesa infinita di una risorsa condivisa...

grazie per l'esaustiva spiegazione

ekerazha
29-12-2005, 10:07
Linux fino a poco tempo fa non aveva i thread ora sono pienamente supportati... I thread vengono anche detti "processi leggeri", questo perchè la creazione è molto più semplice e meno onerosa...

In pratica i thread, al contrario dei processi, condividono lo stesso spazio di indirizzamento del processo/thread da cui vengono creati... Questo implica che l'accesso ad una determinata area di memoria può essere fatto contemporaneamente da due flussi di esecuzione diversi appartenenti allo stesso programma...

Solitamente il thread è una funzione che viene eseguita parallelamente al flusso di esecuzione che l'ha creata...

Per evitare race condition e mantenere la coerenza dei dati vengono eseguite particolari chiamate di sistema che permettono di far accedere ai dati in modo esclusivo (o non) per i vari thread...

In definitiva non devono poter mai accadare due scritture contemporanee, una lettura contemporaneamente ad un scrittura, due letture contemporanee sono ammesse... Ovviamente ci si deve mettere mentalmente nel caso peggiore possibile...

Inoltre bisogna garantire (e questo si fa con una buona progettazione) che non ci sia mai starvation: ovvero la possibilità che un thread resti in attesa infinita di una risorsa condivisa...

Non proprio... in realtà Linux non fa alcuna distinzione tra processi e thread e per condividere "lo stesso spazio di indirizzamento del processo da cui vengono creati" (ed altre cose) si crea un nuovo processo "clonando" quello originario con la funzione clone().

Windows (ed altri) invece, gestisce i thread come entità separate dai processi e provvede in modo "nativo" a gestire e condividere le suddette informazioni alla creazione del thread.

cionci
29-12-2005, 10:14
Non proprio... in realtà Linux non fa alcuna distinzione tra processi e thread e per condividere "lo stesso spazio di indirizzamento del processo da cui vengono creati" (ed altre cose) si crea un nuovo processo "clonando" quello originario con la funzione clone().
Non lo sapevo...non ho mai usato i thread su Linux... Credevo che i pthread fossero equivalenti a quelli Windows...

ilsensine
29-12-2005, 14:15
Non lo sapevo...non ho mai usato i thread su Linux... Credevo che i pthread fossero equivalenti a quelli Windows...
Dal punto di vista del programmatore, sono molto simili a parte differenze minori. La gestione da parte del sistema operativo è diversa; ricordi questo thread?
http://www.hwupgrade.it/forum/showpost.php?p=9001211&postcount=85

ilsensine
29-12-2005, 14:22
Salve a tutti, sono nuovo del forum e avrei bisogno di aiuto per un progetto da realizzare usando il c. Il testo, composto da 2 parti, è il seguente:

“1. Realizzare una piccola libreria di funzioni che, utilizzando le chiamate di sistema IPC, permetta a più processi di sincronizzarsi per:
- richiedere l'allocazione di un numero k di risorse da un pool di N risorse, tutte dello stesso tipo, disponibili inizialmente (dove N è una costante dichiarata in un opportuno file della libreria). L'allocazione deve avvenire in modo atomico, ovvero: se tutte le k risorse sono disponibli, vengono assegnate, altrimenti non ne viene allocata nessuna e il processo viene sospeso
- restituire m risorse.
Scrivere programmi opportuni per illustrare l'utilizzo e il funzionamento della libreria.

2. Realizzare poi una analoga libreria per un processo con thread multipli piuttosto che per processi multipli. Cioè una piccola libreria di funzioni che, utilizzando le chiamate della libreria Pthreads, permetta a più threads di sincronizzarsi per richiedere in mutua esclusione, in modo atomico, un numero k di risorse da un pool di N risorse, tutte dello stesso tipo, disponibili inizialmente (dove N è una costante dichiarata in un opportuno file della libreria), e per restituire m risorse.”

Se qualcuno avesse le idee più chiare di me e sapesse darmi qualche indicazione per partire gliene sarei grato.
Grazie a tutti!!!
:)
Ti consiglierei di iniziare con 2), visto che è un pò più semplice. Quindi passi a 1) sostituendo ai pthread mutex i semafori IPC.

cionci
29-12-2005, 14:35
Dal punto di vista del programmatore, sono molto simili a parte differenze minori. La gestione da parte del sistema operativo è diversa; ricordi questo thread?
http://www.hwupgrade.it/forum/showpost.php?p=9001211&postcount=85
Non lo ricordavo... Comunque mi tornerà utile ;)

zzzzzz
29-12-2005, 23:47
grazie.....ho dato un po' un'occhiata in giro e ho provato a buttar giù qualcosa.....solo che nella mia testa la vedo una cosa ancora un po' troppo teorica....potrebbe andare bene come base???e per mostrarne l'utilizzo come posso fare???scusate ma, se non si fosse capito, sono alquanto confuso.....
:confused:
Qui c'è quello che ho fatto finora:

#include "semfun.h"
#include <stdio.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#define N 10 // num risorse
#define NP 10 // NP numero di processi

semaforo mutex initial 1;
semaforo priv[NP] initial 0;//semafori proc
int risorse= N; // cont ris
int n_blocc=0; //cont processi bloccati
boolean proc_bloccati[NP]; //definiz proc bloccati

allocazione(int proc, int k)
{
down(mutex);
if (risorse<k)
{
n_blocc++;
proc_bloccati[proc]=true; //processo proc bloccato
up(mutex);
down(priv[proc]);
n_blocc--;
proc_bloccati[proc]=false; //processo proc sbloccato
}
risorse=risorse-k; //alloca k risorse
up(mutex);

}
restituzione()
{
int j;
down(mutex);
risorse=risorse+k;
if (risorse>=k && n_blocc>0)
{
j=0;
while (proc_bloccati[j]==false)// scegli processo da attivare
j++;
up(priv[j]);
}
else
up(mutex);
}

grazie ancora per la pazienza!!!!