70 likes | 201 Vues
This lab assignment focuses on implementing synchronization primitives, including locks and condition variables, as well as applying these concepts to solve specific problems in operating systems. Task 1 involves practical implementation of locks and condition variables, while Task 2 utilizes these primitives to address scenarios such as the "Mice and Cats" problem and managing traffic lights. Understanding atomic regions and semaphore functions is crucial for successful completion. Students will engage with coding and analyzing possible interleavings during synchronization.
E N D
Operating SystemsECE344 Lab assignment 1: Synchronization Ding Yuan
Overview of the lab assignment • Task 1: implementing synchronization primitives • 1a: implement lock • 1b: implement condition variable • Task 2: use synchronization primitives to solve problems • 2a: Mice and cats • 2b: traffic lights Ding Yuan, ECE344 Operating System
Lock and cond. var. • Needs atomic region • Atomic region can be done in a similar way to semaphore • If you understand how semaphore is implemented, should be trivial! • Cannot use semaphore to implement lock or cond. var. V(sem) { Disable interrupts; sem->count++; thread_wakeup (sem); /* this will wake up all the threads waiting on this sem. Why wake up all threads? */ Enable interrupts; } P(sem) { Disable interrupts; while (sem->count == 0) { thread_sleep(sem); /* current thread will sleep on this sem */ } sem->count--; Enable interrupts; } Ding Yuan, ECE344 Operating System
Synchronization problems • How to start? • First: write operation code • Next: carefully reason about all the possible interleaving and timing scenarios • Add synchronization Ding Yuan, ECE344 Operating System
Mice and cats • Two bowls, multiple cats and mice • Safety criteria: • If a cat is eating at either dishes, no mouse can eat • If a mouse is eating at either dishes, no cat can eat Ding Yuan, ECE344 Operating System
Operation code void sem_eat(const char *who, intnum, int bowl, int iteration) { kprintf("%s: %d starts eating: bowl %d, iteration %d\n", who, num, bowl, iteration); clocksleep(1); kprintf("%s: %d ends eating: bowl %d, iteration %d\n", who, num, bowl, iteration); } void mousesem(void * p, unsigned long mousenumber) { int bowl, iteration; for (iteration = 0; iteration < 4; iteration++) { sem_eat (”mouse", mousenumber, bowl, iteration); } } intcatmousesem(.. ..) { for (index = 0; index < NCATS; index++) thread_fork("catsemThread”, NULL, index, catsem, NULL); for (index = 0; index < NMICE; index++) thread_fork(”mousesem Thread”, NULL, index, mousesem, NULL); } Ding Yuan, ECE344 Operating System
About starvation • You do not need to consider priority or starvation • e.g., mice can prevent cat from eating • Since cats/mice will eventually finish eating, won’t starve forever Ding Yuan, ECE344 Operating System