Top Banner
CS 241 Section Week #4 (2/19/09)
31

CS 241 Section Week #4 (2/19/09). Topics This Section SMP2 Review SMP3 Forward Semaphores Problems Recap of Classical Synchronization Problems.

Dec 25, 2015

Download

Documents

Theresa Gibson
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

CS 241 Section Week #4(2/19/09)

Page 2: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Topics This Section

SMP2 Review SMP3 Forward Semaphores Problems Recap of Classical Synchronization Problems

Page 3: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

SMP2

Page 4: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

SMP2 Review

qsort() Define your own comparison function int compare (const void *e1, const void *e2) {

return (*(int*)e1 - *(int*)e2); } Merge

You need to remove duplicates How do you do that?

Pthreads pthread_create and pthread_join You DO NOT want to do this:

for ( …) {pthread_create(…);…pthread_join(…);

}

Page 5: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

SMP3

Page 6: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

SMP3 Forward

The scenario:

Request: line

Response: #

client_0

Server

file0

Read a line

client_1

file1

Read a line

client_2

file2

Read a line … …

Page 7: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

SMP3 Forward

Communication is done through shared memories queue client_result[client_id]

You need to deal with three semaphores queue_semaphore

To protect access to the queue server_notify_semaphore

Client notify the server when data is added to the queue

client_notify_semaphore Array of semaphores Client ID is used to access the semaphores Server notify individual client a response is ready

Page 8: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Semaphores

Page 9: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Example (machex1.c)int N = 1000000;int x = 0;int main(int argc, char** argv){

pthread_t threadCountUp, threadCountDown;

pthread_create(&threadCountUp, NULL, countUp, NULL);pthread_create(&threadCountDown, NULL, countDown, NULL);

}

Page 10: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Examplevoid* countUp(){

int i;

for (i = 0; i < N; i++){

int c = x;c++;x = c;

}}

void* countDown(){

int i;

for (i = 0; i < N; i++){

int c = x;c--;x = c;

}}

Page 11: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Semaphores Thread1 did ‘x++’ N times. Thread2 did ‘x--’ N times. Ideal result: ‘x’ is at its initial value. Please try to compile machex1.c and run it

with different N values: N= 1000, N = 1000000, etc…

Actual result?

Page 12: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Semaphores To fix this:

A thread must read, update, and write ‘x’ back to memory without any other threads interacting with ‘x’.

This concept is an atomic operation.

Page 13: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Semaphores Conceptually, we would want an ‘atomic’

scope: void* countUp() {

atomic { int c = x; c++; x = c; } // But this doesn’t exist…}

Page 14: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Semaphores Semaphores provides a locking mechanism to

give us atomicity. void* countUp() {

sem_wait(&sema); int c = x; c++; x = c; sem_post(&sema);}

Page 15: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Semaphores Semaphores provides a locking mechanism to

give us atomicity. void* countUp() {

sem_wait(&sema); LOCKS int c = x; c++; x = c; sem_post(&sema); UNLOCKS}

Page 16: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Semaphores To use a semaphore, you have to define it.

Three steps to defining a semaphore:

1. Include the header file: #include <semaphore.h>

Page 17: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Semaphores To use a semaphore, you have to define it.

Three steps to defining a semaphore:

2. Declare the semaphore: sem_t sema;

(Declare this in a global scope.)

Page 18: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Semaphores To use a semaphore, you have to define it.

Three steps to defining a semaphore:

3. Initialize the semaphore: sem_init(&sema, 0, 1);

Page 19: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Semaphores sem_init(&sema, 0, 1);

&sema: Your declared sem_t. 0 : 0 := Thread Sync 1 : Total of one thread

inside a ‘locked’ section of code.

Page 20: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Semaphores Three steps to starting them:

Include: #include <semaphore.h> Define: sem_t sema; Init: sem_init(&sema, 0, 1);

Page 21: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Semaphores Two functions to use them:

Acquiring the lock: sem_wait(&sema);

Releasing the lock: sem_post(&sema);

Page 22: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Semaphores Example Revisited:

sem_wait() read x x++ context sw sema_wait() write x thread blocked sem_post() unlocked /*…*/

Page 23: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Problems

Page 24: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Problem 1 - Use semaphores to ensure order machex2.c creates two threads to print out

“Hello World”. Use semaphores to ensure that that “World\

nHello “ is never printed instead of “Hello World”.

void *hello_thread(void *arg){

sleep(2);fprintf(stderr, "Hello

");}

void *world_thread(void *arg){

sleep(1);fprintf(stderr,

"World!\n");}

int main(int argc, char **argv){

pthread_t hello, world;

pthread_create(&hello, NULL, hello_thread, NULL); pthread_create(&world, NULL, world_thread, NULL);

pthread_join(hello, NULL);pthread_join(world, NULL);

return 0;

}

Page 25: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Problem 1 - Use semaphores to ensure order

void *hello_thread(void *arg){

sleep(2);fprintf(stderr, "Hello

");sem_post(&sem);

}

void *world_thread(void *arg){

sleep(1);sem_wait(&sem);fprintf(stderr,

"World!\n");sem_post(&sem);

}

sem_t sem;

int main(int argc, char **argv){

pthread_t hello, world;

sem_init(&sem, 0, 0);pthread_create(&hello, NULL,

hello_thread, NULL);pthread_create(&world, NULL,

world_thread, NULL);

pthread_join(hello, NULL);pthread_join(world, NULL);

return 0;

Page 26: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Problem 2 – Two semaphores machex3.c creates two threads that both want

access to two semaphores. If you run this program, the program appears

to stop running after a bit. Why?sem_t sem1, sem2;int main(int argc, char **argv){

pthread_t t1, t2;

sem_init(&sem1, 0, 1);sem_init(&sem2, 0, 1);

pthread_create(&t1, NULL, p1, NULL);pthread_create(&t2, NULL, p2, NULL);pthread_join(t1, NULL);pthread_join(t2, NULL);

return 0;}

Page 27: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Problem 2 – Two semaphores

void *p1(void *arg){ while (1) {

printf("p1: sem_wait(&sem1);\n");

sem_wait(&sem1);printf("p1:

sem_wait(&sem2);\n");sem_wait(&sem2);printf("p1: locked\n");printf("p1:

sem_post(&sem2);\n");sem_post(&sem2);printf("p1:

sem_post(&sem1);\n");sem_post(&sem1);printf("p1: unlocked\n");

} return NULL;}

void *p2(void *arg){ while (1) {

printf("p2: sem_wait(&sem2);\n");

sem_wait(&sem2);printf("p2:

sem_wait(&sem1);\n");sem_wait(&sem1);printf("p2: locked\n");

printf("p2:sem_post(&sem1);\n");sem_post(&sem1);printf("p2:

sem_post(&sem2);\n");sem_post(&sem2);printf("p2: unlocked\n");}return NULL;

Page 28: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Problem 2 – Two semaphores

sem1_wait()

sem2_wait()

sem1_wait()

sem2_wait()

DEADLOCK!

How to fix it??

Page 29: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Classical Synchronization Problems

Page 30: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Producer – consumer problem

Producers insert items Consumers remove items Shared bounded buffer Three semaphores

Slots: initialize to N, to prevent buffer overflow Items: initialize to 0, to prevent buffer underflow Mutex to protect accesses to shared buffer &

pointers.

Page 31: CS 241 Section Week #4 (2/19/09). Topics This Section  SMP2 Review  SMP3 Forward  Semaphores  Problems  Recap of Classical Synchronization Problems.

Reader – writer problem

Multiple readers can read the data simultaneously

Only one writer can write the data at any time A reader and a writer cannot in critical section

together. One global reader counter and 2 semaphores

Semaphore wrt to enforce mutual exclusion Semaphore x to protect access to the global

reader counter