The following are expectations of what you should know based on material
covered in lecture and from the first two chapters of Tanenbaum for the
Midterm exam.

Understand projects 1 and 2.

% chapter 1

Know the two general functions of an operating system.

Understand how the operating system relates to application programs and the
hardware.  Know what happens at the interfaces.

Know what is a process.

Know what is a resource.  Be able to give examples.

Know what services are provided by the operating system.

Know the different types of operating system structure.  Know why virtual
machines are used.  Know why microkernel (client-server) structures are
used.

Know the general semantics of the fork() system call to create processes.

Know the general semantics of the execve() system call and its related
library routines.

% chapter 2

Understand how the operating system gives the illusion of executing
multiple processes at the same time.

Understand what context switching is in an operating system.

Understand the possible states of a process and the transitions between
states.

Understand what the process table is used for and some of the fields it
contains.

Know how the operating system prevents unwanted interrupts while
maninpulating the process table.

Know what the operating system does when no processes are eligible for
execution.

Understand (in general terms) what happens on an interrupt from a hardware
device.

Understand that I/O can be buffered and the consequences if it is buffered.

Be able to define mutual exclusion and synchronization.

Know what is a race condition.

Know the four requirements that must be satisfied to guarantee mutual
exclusion.

Be able to define a critical section.

Know how to disable/enable interrupts to provide mutual exclusion.  Know
the advantages and disadvantages of doing so.

Understand why busy waiting on a lock variable is not a correct solution
for mutual exclusion.

Be able to explain how a test-and-set lock instruction allows mutual
exclusion to implemented.  Know the advantages and disadvantages of
this approach.

Be able to define a semaphore and the basic operations allowed on a
semaphore.

Know how to implement mutual exclusion using semaphores.

Know how to implement a producer/consumer problem using semaphores.  Know
how implement this problem with a buffer larger than one and multiple
producers or consumers.

Know the advantages and disadvantages of using semaphores.

Know what is a monitor.  Know how mutual exclusion and synchronization are
done with monitors.  What are the advantages and disadvantages of monitors.

Understand basic issues of message passing.

Be familiar with the barrier synchronization mechanism.

Understand the equivalence of different process coordination primitives so
that one can be implemented in terms of another.

Know what a thread is and how it compares to a process.

Know the differences between kernel-level and user-level threads.

Understand the difference between a short and long process.

Know the criteria for consideration in a good scheduling algorithm.

Know measurements used to compare scheduling policies.

Know the difference between preemptive and non-preemptive scheduling
policies.

Understand how the round robin scheduling policy works.

Understand how the shortest process next policy works.

Understand how the multiple-level feedback process scheduling policy works.

Understand how the Linux process scheduling policy works.

Know how priority is used in scheduling policies.

Know the three methods used to evaluate scheduling policies.