我只是好奇,如果线程在不同版本的Unix中的工作方式有什么不同。
特别是Linux,Solaris和原始的Unix
有什么想法吗?
答案 0 :(得分:7)
最初的Unix不使用线程进行多道程序设计。 1987年的一篇文章对Mach和Unix内核进行了比较,指出" Unix System V和4.3 BSD都没有提供一种方法来管理地址空间内的多个控制线程。"
现代Unix克隆遵循POSIX Threads规范。 POSIX Threads标准仅出现在1995年.Linux中的底层实现基于clone()和futex()系统调用,这些调用由内核实现。 clone()系统调用创建一个新的轻量级进程,可以与其子进程共享一个内存空间。因此,例如,pthread_create()库调用在内部调用clone()系统调用。 futex()系统调用实现了一个同步原语,可用于创建更大的同步操作,如互斥,信号量等。例如,pthread_mutex_lock()将在内部调用futex()。
使用POSIX术语,Linux实现模型是一个内核线程模型",也称为1:1模型,其中1个内核轻量级进程用于1个用户可见线程。
随着时间的推移,Linux也有不同的线程实现。有关Linux中线程支持的更多说明,请参见pthreads(7),clone(2)和futex(2)手册页。
其他实现可能完全不同,仍然实现POSIX线程API。 FreeBSD使用M:N实现,或者#34;混合模型",其中用户可见线程可以由内核或用户空间库管理。有关完整说明,请参见kse(2)手册页。我曾经将当前的1:1 FreeBSD线程实现跟踪到kerneltrap中的一篇文章:
http://web.archive.org/web/20110512021159/http://kerneltrap.org/node/624
OpenSolaris似乎并没有在手册页上描述自己的线程实现。我可以找到一个文档,将OpenSolaris内核与Linux 2.6和Windows Vista进行比较。在那里,Linux和OpenSolaris实现之间的主要区别在于,在Linux中,每个进程都是一个轻量级进程,统一线程和进程,而在OpenSolaris中,一个进程包含多个轻量级进程,实际上在内核中将进程与内核线程分开
参考文献:
http://en.wikipedia.org/wiki/Thread_(computing)
http://en.wikipedia.org/wiki/POSIX_Threads
http://repository.cmu.edu/cgi/viewcontent.cgi?article=2728&context=compsci
http://man7.org/linux/man-pages/man7/pthreads.7.html
http://man7.org/linux/man-pages/man2/clone.2.html
http://man7.org/linux/man-pages/man2/futex.2.html
http://pubs.opengroup.org/onlinepubs/7908799/xsh/threads.html
http://web.archive.org/web/20110512021159/http://kerneltrap.org/node/624