Problem Set 3 - Operating Systems - Spring 2006 | CSCI 3753, Assignments of Operating Systems

Material Type: Assignment; Professor: Mishra; Class: OPERATING SYSTEMS; Subject: Computer Science; University: University of Colorado - Boulder; Term: Unknown 1989;

Typology: Assignments

Pre 2010

Uploaded on 02/10/2009

koofers-user-j5f
koofers-user-j5f 🇺🇸

4

(1)

9 documents

1 / 10

Toggle sidebar

This page cannot be seen from the preview

Don't miss anything!

bg1
CSCI 3753: Operating Systems
Spring 2006
(Homework 3 Solutions)
2. monitor communal_dinner {
int current_potsize = 0;
condition empty, need_to_cook;
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( );
pf3
pf4
pf5
pf8
pf9
pfa

Partial preview of the text

Download Problem Set 3 - Operating Systems - Spring 2006 | CSCI 3753 and more Assignments Operating Systems in PDF only on Docsity!

CSCI 3753: Operating Systems

Spring 2006

(Homework 3 Solutions)

  1. monitor communal_dinner { int current_potsize = 0; condition empty, need_to_cook;

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( );

  1. (a) int num_b = 0; num_m = 0; num_mw = 0; num_f = 0; num_fw = 0; num_k = 0; num_kw = 0; num_j = 0; num_jw = 0;

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);

  1. resource Q&A:: int q_state = 0;

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