线程分类:
用户级线程和内核级线程(轻量级进程)
用户级线程:
在一个纯粹的用户级线程软件中,有关线程管理的所有工作都由应用程序完成,内核意识不到线程的存在。
使用用户级线程而非内核级线程有很多优点:
(1)由于所有线程管理数据结构都在一个进程的用户地址空间中,线程切换不需要内核态特权,因此,进程不需要为了线程管理而切换到内核态,这节省了两次状态转换(从用户态到内核态,从内核态返回到用户态)的开销。
(2)调度可以是应用程序相关的。一个应用程序可能更适合简单的轮转调度算法,二零一个应用程序可能更适合基于优先级的调度算法。可以做到为应用程序量身定做调度算法而不影响底层的操作系统调度程序。
(3)用户级线程可以在任何操作系统中运行,不需要对底层内核进行修改以支持用户级线程。线程库是一组供所有应用程序共享的应用程序共享的应用程序级别的函数。
用户级线程相对于内核级线程的缺点:
(1)在典型的操作系统中,许多系统调用会引起阻塞。因此,当用户级线程执行一个系统调用时,不进这个线程会被阻塞,进程中所有线程都会被阻塞。
(2)在纯粹的用户级线程中,一个多线程应用程序不能利用多处理技术。内核一次只把一个进程分配给一个处理器,因此一个进程中只有一个线程可以执行。
解决办法:
(1)把应用程序写成一个多进程应用程序而非多线程应用程序,但这种方法消除了线程的主要优点:每次切换都变成了进程间的切换,而不是线程间的切换,导致开销过大。
(2)使用jacketing技术,jacketing目标是把一个产生阻塞的系统调用转换成一个非阻塞的