lecture 12 -- more semaphore stuff. continued semaphore demo, it turned out that scheduler didn't like it when all processes immediately requested the semaphore after releasing it. one proc would get control. we think this is a scheduler issue. fixed it by adding sleeps after relinquishing control. then the semaphore system worked properly, and gave each proc its chance. also, went over producer-consumer framework from the book, and related it to the donut problem. need 3 semaphores per ring: 1 for mutex, 1 for full, 1 for empty.