1) Consider the following algorithm to compute a product in a distributed
system:

int product = 1;
...
pchild = fork();
if (pchild == 0) {
  /* childprocess code */
  product *= computeFirstNumber();
} else {
  /* parent code */
  product *= computeSecondNumber();
}
...

Where the two functions 
  int computeFirstNumber(),
  int computeSecondNumber()
do some longrunning computation (e.g. compute primes with 100 digits).

Where's the obvious problem in this code? What OS techniques from the code
do you need to fix it?


2) Assume that in our shell assignment, the programmer wanted to print the
shell prompt after a background process is finished. A solution would be

pchild = fork();
if (pchild == 0) {
  /* child process */
  ...
  /* execute program */
  execv(path,A);

  /* print prompt */
  printf("myShell:>>");
}

This solution doesn't work. What's the reason for this? Give a brief
explanation of the semantics of the exec command. Discribe a possible
solution on a high level - WITHOUT coding it. (You don't know the
necessary C commands!).

3) This problem is about scheduling.
   a) Define the following terms
      * arrival time
      * burst time
      * turnaround time
      * waiting time
   b) Consider n processes p1, ... pn with burst times t1, t2, ..., tn.
      What is the schedule sequence with maximum waiting time? 
      Assume that you only know the sum of the burst times 
        T = t1 + t2 + ... + tn. 
      Can you give an upper bound on the waiting time of a process for any
      process? What about the average waiting time? 
   b) Consider the following processes p1, ... pn all of which take the
      same burst time t. (They arrive in order p1, ... pn).
      What's the FCFS average waiting time? (need some computation)
      What's the FCFS average turnaround time? (almost obvious)
   c) True or false (give a one sentence explanation):
      * wait time is less than response time + burst time
      * response time is less than turnaround time
      * burst time is less than turnaround time
      * the time it takes to finish _all_ processes is exactly
           sum over all wait times +
           sum over all burst times

Also questions from the book:
5.3-5.5, 5.10
6.1-6.8