chap4
This commit is contained in:
parent
babed7eb09
commit
df9e43e534
27
bac2/os/chap4/Makefile
Normal file
27
bac2/os/chap4/Makefile
Normal file
@ -0,0 +1,27 @@
|
||||
.PHONY: clean, mrproper, run
|
||||
CC = gcc
|
||||
CFLAGS = -g -Wall
|
||||
|
||||
exos = ex4 group
|
||||
|
||||
all: $(exos)
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $<
|
||||
|
||||
ex1: ex1.o RingBuffer.o
|
||||
$(CC) $(CFLAGS) -o $@ $+
|
||||
|
||||
ex%: ex%.o
|
||||
$(CC) $(CFLAGS) -o $@ $+
|
||||
|
||||
group: group.o
|
||||
$(CC) $(CFLAGS) -o $@ $+
|
||||
|
||||
clean:
|
||||
rm -f *.o core.*
|
||||
rm -f out group
|
||||
rm -f ${exos}
|
||||
|
||||
run: group
|
||||
./$<
|
20
bac2/os/chap4/RingBuffer.c
Normal file
20
bac2/os/chap4/RingBuffer.c
Normal file
@ -0,0 +1,20 @@
|
||||
#include "RingBuffer.h"
|
||||
|
||||
void rb_push(rb_t* rb, int el){
|
||||
if(rb->filled)
|
||||
return;
|
||||
rb->data[rb->w_pos] = el;
|
||||
rb->w_pos = (rb->w_pos + 1) % rb->size;
|
||||
if(rb->w_pos == rb->r_pos)
|
||||
rb->filled = true;
|
||||
}
|
||||
int rb_pop(rb_t* rb){
|
||||
if(rb->w_pos == rb->r_pos && !rb->filled){
|
||||
rb->error = true;
|
||||
return 0;
|
||||
}
|
||||
int ret = rb->data[rb->r_pos];
|
||||
rb->r_pos = (rb->r_pos + 1) % rb->size;
|
||||
rb->filled = false;
|
||||
return ret;
|
||||
}
|
27
bac2/os/chap4/RingBuffer.h
Normal file
27
bac2/os/chap4/RingBuffer.h
Normal file
@ -0,0 +1,27 @@
|
||||
#pragma once
|
||||
#include <pthread.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#define rb_init(size, type)\
|
||||
{(size),\
|
||||
0, 0, false, false,\
|
||||
type,\
|
||||
malloc(sizeof(int)*(size)),\
|
||||
PTHREAD_MUTEX_INITIALIZER};
|
||||
|
||||
#define rb_free(rb) free(rb.data)
|
||||
|
||||
typedef struct rb{
|
||||
size_t size;
|
||||
size_t w_pos, r_pos;
|
||||
bool filled;
|
||||
bool error;
|
||||
enum {DROP, WAIT} type;
|
||||
int* data;
|
||||
pthread_mutex_t m;
|
||||
} rb_t;
|
||||
|
||||
void rb_push(rb_t*, int);
|
||||
int rb_pop(rb_t*);
|
46
bac2/os/chap4/ex1.c
Normal file
46
bac2/os/chap4/ex1.c
Normal file
@ -0,0 +1,46 @@
|
||||
#include "RingBuffer.h"
|
||||
#include <stdio.h>
|
||||
#include <pthread.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define THREADS 10
|
||||
|
||||
void* process(void* args);
|
||||
|
||||
int main(void)
|
||||
{
|
||||
srand(time(NULL));
|
||||
rb_t rb = rb_init(50, DROP);
|
||||
pthread_t threads[THREADS];
|
||||
|
||||
int even, odd = {0};
|
||||
|
||||
for (int i = 0; i < THREADS; ++i) {
|
||||
pthread_create(threads+i, NULL, process, (void*) &rb);
|
||||
}
|
||||
int val;
|
||||
while(true){
|
||||
usleep(250);
|
||||
val = rb_pop(&rb);
|
||||
printf("got -> %d\n", val);
|
||||
|
||||
if(val % 2)
|
||||
odd++;
|
||||
else
|
||||
even++;
|
||||
|
||||
printf("%d nombres pairs et %d nombre impairs\n", even, odd);
|
||||
}
|
||||
|
||||
rb_free(rb);
|
||||
}
|
||||
|
||||
void* process(void* args){
|
||||
rb_t *rb = (rb_t*) args;
|
||||
|
||||
while(true){
|
||||
usleep((rand() % 4500) + 500);
|
||||
rb_push(rb, rand());
|
||||
}
|
||||
}
|
46
bac2/os/chap4/ex2.c
Normal file
46
bac2/os/chap4/ex2.c
Normal file
@ -0,0 +1,46 @@
|
||||
#include "RingBuffer.h"
|
||||
#include <stdio.h>
|
||||
#include <pthread.h>
|
||||
#include <time.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define THREADS 10
|
||||
|
||||
void* process(void* args);
|
||||
|
||||
int main(void)
|
||||
{
|
||||
srand(time(NULL));
|
||||
rb_t rb = rb_init(50, WAIT);
|
||||
pthread_t threads[THREADS];
|
||||
|
||||
int even, odd = {0};
|
||||
|
||||
for (int i = 0; i < THREADS; ++i) {
|
||||
pthread_create(threads+i, NULL, process, (void*) &rb);
|
||||
}
|
||||
int val;
|
||||
while(true){
|
||||
usleep(250);
|
||||
val = rb_pop(&rb);
|
||||
printf("got -> %d\n", val);
|
||||
|
||||
if(val % 2)
|
||||
odd++;
|
||||
else
|
||||
even++;
|
||||
|
||||
printf("%d nombres pairs et %d nombre impairs\n", even, odd);
|
||||
}
|
||||
|
||||
rb_free(rb);
|
||||
}
|
||||
|
||||
void* process(void* args){
|
||||
rb_t *rb = (rb_t*) args;
|
||||
|
||||
while(true){
|
||||
usleep((rand() % 4500) + 500);
|
||||
rb_push(rb, rand());
|
||||
}
|
||||
}
|
34
bac2/os/chap4/ex4.c
Normal file
34
bac2/os/chap4/ex4.c
Normal file
@ -0,0 +1,34 @@
|
||||
#include <pthread.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#define SIZE 32768
|
||||
|
||||
pthread_t child_thread;
|
||||
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
|
||||
|
||||
int table[SIZE];
|
||||
|
||||
int cmp(const void* a1, const void* a2){
|
||||
return *((int*)a2) - *((int*)a1);
|
||||
}
|
||||
|
||||
void* child(void* args){
|
||||
pthread_mutex_lock(&mutex);
|
||||
for (int i = 0; i < SIZE; ++i) {
|
||||
table[i] = rand();
|
||||
}
|
||||
pthread_mutex_unlock(&mutex);
|
||||
sleep(1);
|
||||
pthread_mutex_lock(&mutex);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
pthread_create(&child_thread, NULL, child, NULL);
|
||||
|
||||
pthread_mutex_lock(&mutex);
|
||||
qsort(table, SIZE, sizeof(int), cmp);
|
||||
pthread_mutex_unlock(&mutex);
|
||||
}
|
45
bac2/os/chap4/group.c
Normal file
45
bac2/os/chap4/group.c
Normal file
@ -0,0 +1,45 @@
|
||||
/***************************************************************************
|
||||
* Le dinner des philosophes *
|
||||
* Two phase locking: *
|
||||
* - array de baguettes *
|
||||
* - manger(): tente l'acquisition des deux. attente passive si non dispo *
|
||||
****************************************************************************/
|
||||
#include <pthread.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#define TABLE_SIZE 5
|
||||
|
||||
#define RIGHT(x) ((x)) % TABLE_SIZE
|
||||
#define LEFT(x) ((x)+1) % TABLE_SIZE
|
||||
|
||||
typedef unsigned int PHILOSOPHE; // philosophe's id in the table
|
||||
|
||||
pthread_mutex_t baguettes[TABLE_SIZE], tableLock;
|
||||
int main(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void penser(){
|
||||
usleep(100 + rand() % 500);
|
||||
}
|
||||
|
||||
void manger(){
|
||||
usleep(100 + rand() % 500);
|
||||
}
|
||||
|
||||
void prendre(){
|
||||
|
||||
}
|
||||
void deposer(){
|
||||
|
||||
}
|
||||
|
||||
void* thread_philosophe(void* arg){
|
||||
while(42){
|
||||
penser();
|
||||
prendre();
|
||||
manger();
|
||||
deposer();
|
||||
}
|
||||
}
|
11
bac2/os/chap4/philosophes.h
Normal file
11
bac2/os/chap4/philosophes.h
Normal file
@ -0,0 +1,11 @@
|
||||
#ifndef PHILOSOPHES_H
|
||||
#define PHILOSOPHES_H
|
||||
|
||||
|
||||
|
||||
|
||||
#ifndef PHILOSPHES_IMPLEMENTATION
|
||||
|
||||
#endif /* end of implementation */
|
||||
|
||||
#endif /* end of include guard: PHILOSOPHES_H */
|
Loading…
Reference in New Issue
Block a user