






Study with the several resources on Docsity
Earn points by helping other students or get them with a premium plan
Prepare for your exams
Study with the several resources on Docsity
Earn points to download
Earn points by helping other students or get them with a premium plan
Material Type: Assignment; Professor: Mishra; Class: OPERATING SYSTEMS; Subject: Computer Science; University: University of Colorado - Boulder; Term: Unknown 1989;
Typology: Assignments
1 / 10
This page cannot be seen from the preview
Don't miss anything!







Serving get_a_serving( ) { if (current_potsize == 0) { signal (need_to_cook); if (current_potsize == 0) wait (empty); }
Take out a serving s from the pot
current_potsize --; if ((current_potsize > 0) && queue(empty)) signal (empty); else if ((current_potsize == 0) && queue(empty)) signal(need_to_cook); return (s); }
void cook_dinner ( ) { while (1) {
prepare M serving and fill the pot
current_potsize = M; if (queue (empty)) signal (empty); if (current_potsize != 0) wait (need_to_cook); } } }
void savage( ) {
Do savage stuff
if (hungry) { Serving s = communal_dinner.get_a_serving( ); Eat s } }
void cook( ) communal_dinner.cook_dinner( );
Semaphore sm = 0; sw = 0; sk = 0; sj = 0; mutex = 1;
void men ( ) { try_m P(mutex); if ((num_f == 0) && (num_j == 0) && (num_b < MAX)) { num_m++; num_b++; if (num_kw > 0) for (int i = 0; i < num_kw; i ++) V(sk); V(mutex); } else { num_mw++; V(mutex); P(sm); goto try_m; }
Use bathroom
P(mutex); num_m--; num_b--; if (num_m == 0) { if ((num_k == 0) && (num_jw > 0)) { V(sj); num_jw = 0; } else if (num_fw > 0) { for (i = 0; i < num_fw; i++) V(sf); num_fw = 0; } } else { if (num_mw > 0) V(sm); if (num_kw > 0) V(sk); } V(mutex);
void kid ( ) { try_k P(mutex); if (((num_m > 0) || (num_w > 0)) && (num_b < MAX)) { num_k++; num_b++; V(mutex); } else { num_kw++; V(mutex); P(sk); goto try_k; }
Use bathroom
P(mutex); num_k--; num_b--; if ((num_b == 0) && (num_jw > 0)) { V(sj); num_jw = 0; } if (num_mw > 0) { for (i = 0; i < num_mw; i++) V(sm); num_mw = 0; } if (num_f w> 0) { for (i = 0; i < num_fw; i++) V(sf); num_fw = 0; } if (num_kw > 0) { for (i = 0; i < num_kw; i++) V(sk); num_kw = 0; } V(mutex);
void janitor ( ) { try_j P(mutex); if (num_b == 0) { num_j++; num_b++; V(mutex); } else { num_jw++; V(mutex); P(sj); goto try_j; }
Clean bathroom
P(mutex); num_j--; num_b--; if (num_mw > 0) { for (i = 0; i < num_mw; i++) V(sm); num_mw = 0; } if (num_f w> 0) { for (i = 0; i < num_fw; i++) V(sf); num_fw = 0; } if (num_kw > 0) { for (i = 0; i < num_kw; i++) V(sk); num_kw = 0; } V(mutex);
void women ( ) { try_w P(mutex); if ((num_m == 0) && (num_j == 0) && (num_b < MAX) && (num_mw == 0) && (num_jw == 0)) { num_w++; num_b++; if (num_kw > 0) for (int i = 0; i < num_kw; i ++) V(sk); V(mutex); } else { num_fw++; V(mutex); P(sf); goto try_w; }
Use bathroom
P(mutex); num_f--; num_b--; if (num_f == 0) last_use = 1; if (num_jw > 0) { if (num_b == 0) { V(sj); num_jw = 0; } } else if (num_mw > 0) { if (num_f == 0) { for (i = 0; i < num_mw; i++) V(sm); num_mw = 0; } } else { if (num_fw > 0) V(sf); if (num_kw > 0) V(sk); } V(mutex);
void kid ( ) { try_k P(mutex); if (((num_m > 0) || (num_w > 0)) && (num_b < MAX) && (num_jw == 0)) { num_k++; num_b++; V(mutex); } else { num_kw++; V(mutex); P(sk); goto try_k; } Use bathroom P(mutex); num_k--; num_b--; if (num_jw > 0) { if (num_b == 0) { V(sj); num_jw = 0; } } else if (last_use == 0) { if (num_fw > 0) { for (i = 0; i < num_fw; i++) V(sf); num_fw = 0; } else { for (i = 0; i < num_mw; i++) V(sm); num_mw = 0; } } else { if (num_mw > 0) { for (i = 0; i < num_mw; i++) V(sm); num_mw = 0; } else { for (i = 0; i < num_fw; i++) V(sf); num_fw = 0; } } V(mutex);
void QuestionStart( ) { region Q&A when (q_state == 0) do q_state = 1; end }
void QuestionDone( ) { region Q&A when 1 do q_state = 2; end }
void AnswerStart( ) { region Q&A when (q_state == 2) do q_state = 3; end }
void AnswerDone( ) { region Q&A when 1 do q_state = 4; end }
void wait_for_AnswerDone( ) { region Q&A when (q_state == 4) do q_state = 0; end