more review questions for the second midterm cosc 4330/6310

Post on 05-Jan-2016

216 Views

Category:

Documents

4 Downloads

Preview:

Click to see full reader

TRANSCRIPT

More review questions for the second midterm

COSC 4330/6310

Note

This presentation contains questions on topics that are on thee second midterm.

Depending on the semester, some questions will overlap with the materials that were discussed in the review session.These materials are based on the questions

on the most recent second quiz.

Scheduling

How would you simulate a round-robin policy with a time slice of 100 ms on a System V R 4 system?

#ts_quantum ts_tqexp ts_slpret ts_maxwait ts_lwait LVL

Answer

How would you simulate a round-robin policy with a time slice of 100 ms on a System V R 4 system?

#ts_quantum ts_tqexp ts_slpret ts_maxwait ts_lwait LVL

100 0 0 100000 0 #0

Scheduling

Consider the following System V Release 4 scheduler:

#ts_quantum ts_tqexp ts_slpret ts_maxwait ts_lwait LVL 1000 0 1 8000 1 # 0 500 0 2 4000 2 # 1 200 1 3 2000 3 # 2 100 2 3 1000 3 # 3

and assume that a process at priority level 2 receives 800 ms of CPU time before doing an I/O.

Answer

1. Start at priority 2 and get 200 ms of CPU time before returning to the ready queue

2. New priority given by __________

Answer

1. Start at priority 2 and get 200 ms of CPU time before returning to the ready queue

2. New priority given by ts_tqexp

3. Move to priority 1 and get 500 ms of CPU time before returning to the ready queue

4. New priority given by _______

Answer

1. Start at priority 2 and get 200 ms of CPU time before returning to the ready queue

2. New priority given by ts_tqexp

3. Move to priority 1 and get 500 ms of CPU time before returning to the ready queue

4. New priority given by ts_tqexp

5. Move to priority 0 and get 100ms of CPU time before doing an I/O

6. New priority given by _______

Answer

1. Start at priority 2 and get 200 ms of CPU time before returning to the ready queue

2. New priority given by ts_tqexp

3. Move to priority 1 and get 500 ms of CPU time before returning to the ready queue

4. New priority given by ts_tqexp

5. Move to priority 0 and get 200ms of CPU time before doing an I/O

6. New priority given by ts_slpret: level 1

Another answer (I)

Step 1: Process is at priority level 2#ts_quantum ts_tqexp ts_slpret ts_maxwait ts_lwait LVL 1000 0 1 8000 1 # 0 500 0 2 4000 2 # 1 200 1 3 2000 3 # 2 100 2 3 1000 3 # 3

and requests 800 ms of CPU time It gets only 200 ms and returns to the CPU queue at the level

indicated by ts_tqexp

Another answer (II)

Step 2: Process is now at priority level 1#ts_quantum ts_tqexp ts_slpret ts_maxwait ts_lwait LVL 1000 0 1 8000 1 # 0 500 0 2 4000 2 # 1 200 1 3 2000 3 # 2 100 2 3 1000 3 # 3

and requests 600 ms of CPU time It gets only 500 ms and returns to the CPU queue at the level

indicated by ts_tqexp

Another answer (III)

Step 3: Process is now at priority level 0#ts_quantum ts_tqexp ts_slpret ts_maxwait ts_lwait LVL 1000 0 1 8000 1 # 0 500 0 2 4000 2 # 1 200 1 3 2000 3 # 2 100 2 3 1000 3 # 3

and requests 100 ms of CPU time It gets only the 100 ms then goes to the waiting state

Another answer (IV)

Step 4: Process is still at priority level 0#ts_quantum ts_tqexp ts_slpret ts_maxwait ts_lwait LVL 1000 0 1 8000 1 # 0 500 0 2 4000 2 # 1 200 1 3 2000 3 # 2 100 2 3 1000 3 # 3

When it returns to the ready queue, it gets upgraded to the priority level specified by ts_slpret Goes to priority level 1

Short question

What is the major limitation of non-preemptive scheduling policies?

Answer

Non-preemptive policies allow processes to monopolize the CPU.

Short question

What does the System V Release 4 scheduler do to avoid process starvation?

Answer

It increases the priority of processes that have waited more than ts_maxwait time units in the ready queue.

Short question

What is the idea behind penalizing processes that have already got their share of the CPU?

Answer

To ensure that the other processes can get their fair share of the CPU.

Short question

What is the difference between blocking sends and non-blocking sends?

Answer

A blocking send waits until the message has been received by the process to which it was addressed

A non-blocking send returns as soon as the message has been accepted for delivery.Like a letter dropped in a mailbox.

Short question

Can you simulate a non-blocking send—or receive—using only blocking sends and receives?

Answer

No, but you can simulate blocking sends—or receives—using only non-blocking sends and receives.

Short question

What is the difference between virtual circuits and datagrams?

Answer

Virtual circuits are connection-oriented and ensure that all messages will arrive in the right order without any of them being lost, damaged or duplicated.

Datagrams are sent individually.

Short question

How would you pass a linked list to a remote procedure?

Answer

By storing it in array along with unpacking instructions.

A B C D

LL 4 A B C D

Short question

How can we solve the big-endian/little endian issue?

Answer

We can require all transfers to use an arbitrary network order, the same for all computers.

Short question

What is the major advantage of idempotent procedures?

Answer

Idempotent procedures can be repeated an arbitrary number of times without causing any harm.

Hence, we do not have to worry about incomplete executions. We restart the procedure.

Short question

What is the main disadvantage of atomic transactions?

Answer

Their cost.

At the same time they remain indispensable in financial transactions.

Short question

What is the difference between the at most once and the all or nothing semantics in RPCs?

Answer

The at most once semantics guarantees that no RPC call will be executed more than once but does not prevent partial executions, which the all or nothing semantics does.

Busy waits

Why should we avoid busy waits?

Is this always true?

Answer

Busy waits waste computing cycles. There are especially bad on single processor architectures because the process doing the busy wait will repeatedly interrupt the process on which it is waiting.

They are the best solution for short waits on multiprocessor/multicore architectures as long as the expected wait time is less than to context switches.

Problem Consider the function

transfer(int *from, int *to, int amount) {*from -= amount;*to += amount;

} // transfer

and assume the calling sequence:

alpha = 100; beta = 200;transfer (&alpha, &alpha, 10)

Problem (continued)

What will be the value of alpha after the call assuming that

(a) the call was a regular procedure call?

(b) the call was a remote procedure call?

Solution

(a) If the call was a regular procedure call, a = 100

(b) If the call was a remote procedure call, a = 90 or 110

Explanation With a regular procedure call

Calling Program

&alpha, &alpha, 10

Debits &alpha

Credits same amount to &alpha

alpha = 100

doubletrouble

Explanation (cont'd) With a remote procedure call

Calling Program

doubletrouble

100, 100, 10

alpha = 90 or 110

90, 110

What is wrong?

shared int reserved[2] = {0, 0};

void enter_region(int pid) { while (reserved[1-pid]); // busy wait reserved[pid] = 1; } // enter_region

void leave_region(int pid) { reserved[pid] = 0;} // leave_region

Answer

The functions do not guarantee mutual exclusion when processes 0 and 1 enter in lockstep.The two critical steps are:

while (reserved[1-pid]); // test lock reserved[pid] = 1; // set lock

The ice-cream parlor An ice-cream parlor has two employees selling

ice cream and six seats for its customers. Each employee can only serve one customer at a time and each seat can only accommodate one customer at a time. Add the required semaphores to the following program skeleton to guarantee that customers will never have to wait for a chair with a melting ice-cream in their hand.

The ice-cream parlor (cont'd)

semaphore _______________ = ______;semaphore _______________ = ______;customer (int who) {

______________________________order_ice_cream();______________________________eat_it();______________________________

} // customer

Sketching a solution Two resources are shared by all customers

Six seatsTwo employees

Questions to ask areWhen should we request a resource? In which order? (very important)When should we release it?

Solution

semaphore _seats__________ = __6___;semaphore _employees______ = _ 2___;customer (int who) {

______________________________order_ice_cream();______________________________eat_it();______________________________

} // customer

Solution (cont'd)

semaphore _seats__________ = __6___;semaphore _employees_____ = __2___;customer (int who) {

P(&seats); P(&employees);________;order_ice_cream();______________________________;eat_it();______________________________;

// customer

Get seat first

Solution (cont'd)

semaphore _seats__________ = __6___;semaphore _employees______ = __2___;customer (int who) {

P(&seats); P(&employees);________order_ice_cream();V(&employees);_________________eat_it();______________________________

} // customer What is missing?

Solution (cont'd)

semaphore _seats__________ = __6___;semaphore _employees______ = __2___;customer (int who) {

P(&seats); P(&employees);________order_ice_cream();V(&employees);_________________eat_it();V(&seat);______________________

} // customer

The pizza oven

A pizza oven can contain nine pizzas but the oven narrow opening allows only one cook at a time to either put a pizza in the oven or to take one out. Given that there will be more than one cook preparing pizzas at any given time, complete the missing lines in the following C procedure.

The pizza oven (cont'd)

semaphore oven = ______; semaphore access = _______;make_pizza(int size, int toppings) {

prepare_pizza(size, toppings);______________________________________put_into_oven();______________________________________wait_until_done();______________________________________take_from_oven();______________________________________

} // make_pizza

Sketching a solution The two resources are already identified

The ovenAccess to the oven (mutex)

We ask the usual questionsAnd take care of avoiding

mutex-induced deadlocks

Solution

semaphore oven = ___9__; semaphore access = __1__; // the mutexmake_pizza(int size, int toppings) {

prepare_pizza(size, toppings);______________________________________put_into_oven();______________________________________wait_until_done();______________________________________take_from_oven();______________________________________

} // make_pizza

Solution (cont'd)

semaphore oven = ___9__; semaphore access = __1__; // the mutexmake_pizza(int size, int toppings) {

prepare_pizza(size, toppings);P(&oven); P(&access);__________________put_into_oven();______________________________________wait_until_done();______________________________________take_from_oven();______________________________________

} // make_pizza

Order matters!

Solution (cont'd)

semaphore oven = ___9__; semaphore access = __ 1__; // the mutexmake_pizza(int size, int toppings) {

prepare_pizza(size, toppings);P(&oven); P(&access); ____________________put_into_oven();V(&access);____________________________wait_until_done();P(&access);____________________________take_from_oven();V(&oven); V(&access); // IN ANY ORDER!____

} // make_pizza

The pizza oven (again) Redo problem 2 using monitors.

The pizza oven (again)

Class oven {private int n_pizzas; // in ovenprivate condition not_full;public void synchronized put_a_pizza() {

______________________________________________________________put_a_pizza_in_the_oven();____________________________________________________________

} // put_a_pizza()

The pizza oven (again)

(Class oven continued)

public void synchronized remove_a_pizza() {____________________________________________________________take_a_pizza_from_the_oven();____________________________________________________________

} // remove_a_pizza()

The pizza oven (again)(Class oven continued)

oven() {n_pizzas = 0;

} // constructor

} // Class oven

Sketching a solution

Two monitor procedures instead of a C functionEach procedure handles a step that must

be performed in mutual exclusion Questions to ask are

When do we have to wait on a condition? Must be specific

Which conditions do we need to signal?

Solution

Class oven {private int n_pizzas; // in ovenprivate condition not_full;public void synchronized put_a_pizza() {

if (n_pizzas == 9) notfull.wait; _____n_pizzas++;____________________put_a_pizza_in_the_oven();____________________________________________________________

} // put_a_pizza()

Solution (cont'd)(Class oven continued)

public void synchronized remove_a_pizza() {

________________________________________________________

take_a_pizza_from_the_oven();n_pizzas--;___________________notfull.signal;_________________

} // remove_a_pizza()

Solution (cont'd)(Class oven continued)

oven() {n_pizzas = 0;

} // constructor

} // Class oven

More on monitors How should you modify a monitor when you

replace its signal calls by notify calls?

More on monitors

How should you modify a monitor when you replace its signal calls by notify calls?

Answer

How should you modify a monitor when you replace its signal calls by notify calls?

All if(…) clauses preceding waits should be replaced by while(…) clauses.

True or false

You should always initialize mutex semaphores to one.

Answer

You should always initialize mutex semaphores to one.

TRUE

True or false

You should always initialize monitor conditions to zero.

Answer

You should always initialize monitor conditions to zero.

FALSEmonitor conditions have NO VALUE

True or false

Many good programmers prefer to put all their signal operations at the end of their monitor procedures.

Answer

Many good programmers prefer to put all their signal operations at the end of their monitor procedures.

TRUEIssuing a signal means risking to be interrupted in the middle of its critical section

top related