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.