Part B: An interrupt service routine can be viewed as an operating system function called by hardware. The hardware itself can be considered to be at a lower level in the hierarchic system design than the operating system, so the call to the interrupt service routine can be viewed as a callback.
Part C:
cb()
/* callback; called from nbwrite */
{
signal(fsem)
}
thwrite(f,buf,len)
/* thread user calls this instead of blocking write */
{
nbwrite(f,buf,len,cb)
thread_wait(fsem)
}
Part B: Access to a name-server can become a bottleneck as a system grows. If each kernel maintains local copies of forwarding addresses for T time units after a process has migrated away from that kernel, then increasing the value of T will reduce the reliance on the name-server, while reducing the value of T will increase the use on the name-server.