linux 没有线程的,,Linux 到现在还是没有线程呀?
Linux中的多線程編程可使用pthread庫。它的用法相對簡單,不過對于其內部的工作原理,相關的技術資料并不多見。本文將討論Linux下的線程模型及其工作原理。? 我們先從pthread庫的應用示例開始。我們通常所用的pthread庫是GNU的C庫glibc的一部分,通常你可以在Linux的/lib目錄找到名為libpthread-x.x.so(x.x是版本號)的庫,這就是多線程編程時所需要的pthread庫。pthread可看作是POSIX thread的簡寫,POSIX對線程定義了一系列的標準,而glibc的pthread庫則是對POSIX線程標準的實現。 下面的代碼示例了一個簡單的多線程程序:
#include
#include
void* threadFunc(void* arg)
{
printf("I am running in sub thread.\n");
}
int main()
{
pthread_t tid;
pthread_create(&tid, NULL, threadFunc, NULL);
pthread_join(tid, NULL);
printf("I am running in main thread.\n");
return 0;
}
這個程序在鏈接時需要指定鏈接pthread庫,否則將出現鏈接錯誤。這是因為pthread庫相對標準C庫libc.so來說,是一個單獨的庫,而libc則是默認被鏈接的。
下面的命令可順利編譯上面的代碼,注意-l參數的使用,用來指定鏈接pthread庫:
# gcc -o test thread.c –lpthread
上面的代碼非常簡單,僅僅是示例了使用pthread_create()函數創建了一個線程,對pthread庫中函數的用法本文不作詳細解釋,不熟悉的讀者可用man命令閱讀相關文檔。
glibc的pthread庫是glibc利用Linux內核提供的系統調用來實現的線程庫,對于2.4和2.6的內核,由于對線程的支持有所不同,其實現效率也有所差別。簡言之,采用2.4及之前的內核的Linux系統通常使用較老的LinuxThreads項目提供的線程模型(當然這并不絕對,采用2.4內核的Redhat較早的試用了NPTL),而采用2.6內核的系統則通常采用新的NPTL項目提供的線程模型,后者的效率比前者要高得多,也更符合POSIX標準。
在Linux的內核中,進程是進行調度的最小單位,并沒有真正的對線程的支持,可以說線程只是用戶空間的概念,在內核中只能用進程來實現線程。一個進程的多個線程在內核中只是多個特殊的進程,它們雖然有各自的進程描述結構,卻共享同一個代碼上下文。在Linux上,這樣的進程稱為輕量級進程(Light weight process)。
同時,Linux內核提供了clone()系統調用,用來創建進程的一個拷貝,這個拷貝與被拷貝的進程共享相同的地址空間。LinuxThreads 項目正是使用這個調用來完全在用戶空間模擬對線程的支持。這個任務在當時內核支持不夠的條件下,具體的實現非常復雜。由于內核并沒有線程組的概念,LinuxThreads模型只能在pthread庫中,對每個進程下的線程組都增加一個額外的線程來進行管理,這就是LinuxThreads模型中著名的管理線程(Manager Thread)。這個管理進程負責對管理同一進程下的其他線程的創建、退出,資源的分配和回收,及線程切換等,非常復雜,開銷也很大,而且一旦管理線程被殺死,其他線程都不能正確回收。另外,由于當時內核中缺乏對線程同步操作的支持,因此pthread庫中的互斥量mutex等只能采用信號來實現,效率非常低。LinuxThreads模型在某些方面也不符合POSIX標準,比如用它在同一進程中創建的線程,都有自己唯一的進程ID,而不是同一個ID,而且接收信號的時候也只能按線程接收。
正是由于LinuxThreads模型的這些問題,Redhat的一些開發人員發起了NPTL(Native POSIX Thread Library)項目,來改進pthread線程庫的這些缺點。目前基于NPTL模型實現的pthread線程庫已被多數2.6內核的Linux系統采用,你可以用下面的命令來查看所使用的線程模型是NPTL還是LinuxThreads:
# getconf GNU_LIBPTHREAD_VERSION
如果得到的結果是類似于“NPTL 2.5”則是使用NPTL,如果是“linuxthreads-0.10”則是LinuxThreads。
NPTL模型仍然采用clone()系統調用,在內核中還是通過進程來模擬線程,不過對LinuxThreads的一些主要缺點有很大的改進:
? 在內核中改進了clone()系統調用并引入新的exit_group()系統調用,優化了線程創建和結束,并且使得pthread庫中不再需要管理線程,減少了很多開銷。
? 在內核中引入新的線程同步原語Futex,并基于Futex來實現線程同步操作如互斥量、條件變量等,改進了原來LinuxThreads基于信號實現時的低效率。
? 符合POSIX標準:發送信號時能發送到同一進程下的所有線程;getpid()會為同一進程下的所有線程返回相同的進程ID。
總結
以上是生活随笔為你收集整理的linux 没有线程的,,Linux 到现在还是没有线程呀?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux查看并口设备,如何在LINUX
- 下一篇: Linux系统怎么挂载安卓手机,NFS挂