前天去面试,问到性能测试过程中如何定位性能问题,然后从里面牵扯出一个问题,Linux下有没有线程?
自己这块没研究过,只记得在学校里面学《操作系统原理》的时候提到过线程的概念,面试官告诉我Linux下没有线程的概念,我所说的线程是子进程的概念。回来后自己查了下,发现网络上对Linux下是否有线程的说法也不一样,看了一些别人写的文章,总结下来如下所述:
Linux下存在着“pthread库”,线程库,既然存在线程库那么就意味着存在着线程。在Linux的内核中,进程是进行调度的最小单位,并没有真正的对线程的支持,可以说线程只是用户空间的概念,在内核中只能用进程来实现线程。一个进程的多个线程在内核中只是多个特殊的进程,它们虽然有各自的进程描述结构,却共享同一个代码上下文。在Linux上,这样的进程称为轻量级进程(Light weight process)。
同时,Linux内核提供了clone()系统调用,用来创建进程的一个拷贝,这个拷贝与被拷贝的进程共享相同的地址空间。LinuxThreads 项目正是使用这个调用来完全在用户空间模拟对线程的支持。这个任务在当时内核支持不够的条件下,具体的实现非常复杂。
由于内核并没有线程组的概念,LinuxThreads模型只能在pthread库中,对每个进程下的线程组都增加一个额外的线程来进行管理,这就是LinuxThreads模型中著名的管理线程(Manager Thread)。这个管理进程负责对管理同一进程下的其他线程的创建、退出,资源的分配和回收,及线程切换等,非常复杂,开销也很大,而且一旦管理线程被杀死,其他线程都不能正确回收。另外,由于当时内核中缺乏对线程同步操作的支持,因此pthread库中的互斥量mutex等只能采用信号来实现,效率非常低。LinuxThreads模型在某些方面也不符合POSIX标准,比如用它在同一进程中创建的线程,都有自己唯一的进程ID,而不是同一个ID,而且接收信号的时候也只能按线程接收。
网友评论