日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux 没有线程的,,Linux 到现在还是没有线程呀?

發布時間:2025/3/15 linux 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 到现在还是没有线程呀?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。