2.8: Kernel threads should be used, so that another web request can be serviced while the first one's page is being read from the disk. 2.9: Threads are co-operative, not competitive, and are part of a single program. A thread may yield the CPU because it has run enough and some other thread may need to get work done; assuming a competent programmer, it will get the CPU back at some point, under the same philosophy if necesary. 2.11: For single-thread servers, 2/3 of requests take 15 ms and 1/3 take 90 ms; this totals 120 ms for 3 average requests. The server can thus handle 1000/120 groups/second. Each group is 3 requests, so it handles 25 requests/sec. The answer for the multithreaded case is that in 90 ms, it can serve 3 requests, 1 blocking and 2 non-blocking. (The CPU will also be idle for 45 ms, but that's not part of the question.) The answer, then, is that there are 1000/90 blocks, each of 3 requests, for an aggregate of 33.33 requests/sec. Ques 4: Tasklets are used to defer processing from an interrupt. They run with interrupts unmasked, and in particular the device that caused the tasklet to be scheduled can interrupt again; it can't do so while in its own interrupt handler.