前天去面試掸犬,問到性能測試過程中如何定位性能問題,然后從里面牽扯出一個問題绪爸,Linux下有沒有線程湾碎?
自己這塊沒研究過,只記得在學校里面學《操作系統(tǒng)原理》的時候提到過線程的概念奠货,面試官告訴我Linux下沒有線程的概念胜茧,我所說的線程是子進程的概念〕鹞叮回來后自己查了下呻顽,發(fā)現(xiàn)網(wǎng)絡(luò)上對Linux下是否有線程的說法也不一樣,看了一些別人寫的文章丹墨,總結(jié)下來如下所述:
Linux下存在著“pthread庫”廊遍,線程庫,既然存在線程庫那么就意味著存在著線程贩挣。在Linux的內(nèi)核中喉前,進程是進行調(diào)度的最小單位,并沒有真正的對線程的支持王财,可以說線程只是用戶空間的概念卵迂,在內(nèi)核中只能用進程來實現(xiàn)線程。一個進程的多個線程在內(nèi)核中只是多個特殊的進程绒净,它們雖然有各自的進程描述結(jié)構(gòu)见咒,卻共享同一個代碼上下文。在Linux上挂疆,這樣的進程稱為輕量級進程(Light weight process)改览。
同時下翎,Linux內(nèi)核提供了clone()系統(tǒng)調(diào)用,用來創(chuàng)建進程的一個拷貝宝当,這個拷貝與被拷貝的進程共享相同的地址空間视事。LinuxThreads 項目正是使用這個調(diào)用來完全在用戶空間模擬對線程的支持。這個任務(wù)在當時內(nèi)核支持不夠的條件下庆揩,具體的實現(xiàn)非常復(fù)雜俐东。
由于內(nèi)核并沒有線程組的概念,LinuxThreads模型只能在pthread庫中订晌,對每個進程下的線程組都增加一個額外的線程來進行管理虏辫,這就是LinuxThreads模型中著名的管理線程(Manager Thread)。這個管理進程負責對管理同一進程下的其他線程的創(chuàng)建腾仅、退出乒裆,資源的分配和回收,及線程切換等推励,非常復(fù)雜鹤耍,開銷也很大,而且一旦管理線程被殺死验辞,其他線程都不能正確回收稿黄。另外,由于當時內(nèi)核中缺乏對線程同步操作的支持跌造,因此pthread庫中的互斥量mutex等只能采用信號來實現(xiàn)杆怕,效率非常低。LinuxThreads模型在某些方面也不符合POSIX標準壳贪,比如用它在同一進程中創(chuàng)建的線程陵珍,都有自己唯一的進程ID,而不是同一個ID违施,而且接收信號的時候也只能按線程接收互纯。