用户级线程与LWP
Pthread()是基于用户级线程来实现,而clone()是基于轻量级进程(LWP)来实现的。
对于用户级线程,是由用户空间运行线程库,使得任何应用程序都可以通过使用线程库被设计成多线程程序。所以对于线程的创建、消息的传递等都由线程库来完成,并且内核感知不到多线程的存在。而内核继续以进程为单位,给该进程一个执行状态。
而对于LWP而言,它是由内核支持的用户线程。正如图片里面显示的一样,它可以起到逻辑上对于用户线程和内核线程的连接。
事实上,它是基于内核线程的高级抽象,因此只有先支持内核线程,才会有LWP.由于LWP都与特定的内核线程关联,因此每个LWP都是独立的线程调度单元。即使有一个LWP在系统中阻塞,也不会影响到整个进程的执行。
LWP的局限性在于,大多数LWP的操作如建立、析构以及同步等,都需要经过内核的系统的调用,因此系统调用的代价比较高;需要在用户模式和内核模式中切换。
正因为系统调用的代价比较高,每个LWP都需要内核线程支持,消耗内核线程资源(栈空间),因此一个系统不能支持大量的LWP。