目录
例题
1.What are two differences between user-level threads and kernel-level threads? Under what circumstances is one type better than the other?
Answer:
用户线程和内核线程的不同是:
1) 站在操作系统的角度,用户线程是不被操作系统知道的,它由用户进程创建与管理;而内核线程由操作系统的调度算法调度,因此是被操作系统所得知的。
2) 针对多对一或多对多的线程模型,用户线程可以直接由线程库调度,而内核线程则需要由内核调度,也就是上文所说的调度算法。 对于用户线程和内核线程在不同的状况下的优劣比较:
内核线程比用户线程好的情况:
① 针对内核是单线程的情况,内核线程优于用户线程。因为任何执行阻塞系统调用的用户线程都会导致整个进程阻塞,即使应用程序中可以运行其他线程。例如,有两个进程a和b。进程a有2个内核线程,而进程b有2个用户线程。如果a中的一个线程被阻塞,它的第二个线程不会受到影响。但是对于b,如果一个线程被阻塞(比如I/O),整个进程b和第二个线程就会被阻塞。
② 针对多处理器环境,内核线程优于用户线程,因为内核线程可以在不同的处理器上同时运行,而即使有多个处理器可用,进程的用户线程也只能在一个处理器上运行。
用户线程比内核线程好的情况:
对于时间共享型的内核,用户线程优于内核线程,因为共享系统上下文切换经常发生。内核线程之间的上下文切换具有很高的开销,几乎与进程相同,而与内核线程相比,用户线程之间的上下文切换几乎没有开销。
2.Describe the actions taken by a kernel to context-switch between kernel- level threads.
Answer:
切换内核线程上下文时,首先操作系统会从用户态转到内核态,然后内核在内核态保存正在关闭的线程所保存的cpu的寄存器,并恢复正在调度的新线程的cpu的寄存器。
内核线程的上下文切换需要先保存被切换线程的状态信息(包括cpu各寄存器的值和程序计数器在某一时间点的内容等)并加载切换线程的状态信息。
与进程上下文切换的区别:不需要切换PCB,但两者都要记录寄存器信息。
3.Which of the following components of program state are shared across threads in a multithreaded proces?
a. Register values
b. Heap memory
c. Global variables
d. Stack memory
Answer:
线程之间共享堆和全局变量。因为堆是在进程空间中开辟出来的,所以肯定是跨线程共 享的;同理,全局变量是整个程序所共享的,也应由线程共享。而每个线程都会独立地维护属于自己的寄存器与栈。
4.Amdahl's Law
5.
Consider the following code segment:
pid t pid;
pid = fork();
if (pid == 0) { /* child process */
fork();
thread create( . . .);
}
fork();
a. How many unique processes are created?
b. How many unique threads are created?
Answer:
如果一个进程中有多个线程,fork()函数会将这些线程copy吗?