CS 241 Section Week #4 (2/19/09). Topics This Section SMP2 Review SMP3 Forward Semaphores ...
-
Upload
theresa-gibson -
Category
Documents
-
view
215 -
download
1
Transcript of CS 241 Section Week #4 (2/19/09). Topics This Section SMP2 Review SMP3 Forward Semaphores ...
![Page 1: CS 241 Section Week #4 (2/19/09). Topics This Section SMP2 Review SMP3 Forward Semaphores Problems Recap of Classical Synchronization Problems.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/1.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/2.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/3.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/4.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/5.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/6.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/7.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/8.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/9.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/10.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/11.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/12.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/13.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/14.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/15.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/16.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/17.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/18.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/19.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/20.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/21.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/22.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/23.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/24.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/25.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/26.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/27.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/28.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/29.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/30.jpg)
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.](https://reader036.fdocuments.in/reader036/viewer/2022062516/56649dda5503460f94ad1329/html5/thumbnails/31.jpg)
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