Linux下thread程式設計 一

2021-04-30 03:24:35 字數 3211 閱讀 7986

linux下thread歷史(old pthread與nptl):

linux建立之初,並不能真正支援thread. linuxthreads 專案使用clone()這個系統呼叫實現對thread的模擬。在_clone本來的意圖是建立乙個可定義各種配置的對當前程序的拷貝。linuxthreads專案則利用了這一點,配置了乙個與呼叫程序擁有相同位址空間的拷貝,把它作為乙個thread. 所以,常常有人說,linux下面沒有程序執行緒之分,其實就是這個意思。但這個方法也有問題,尤其是在訊號處理、排程和程序間同步原語方面都存在問題。另外,這個執行緒模型也不符合 posix 的要求。

如果要改進linuxthread. 很明顯,需要kernel層的支援。ibm和redhat分別進行了研究,隨著ibm的放棄,redhat的native posix thread library(nptl)就成唯一的解決方案了。這就是nptl。

linuxthreads 最初的設計相信相關程序之間的上下文切換速度很快,因此每個核心執行緒足以處理很多相關的使用者級執行緒。這就導致了一對一 執行緒模型的革命。

linuxthreads 設計細節的一些基本理念:

linuxthreads 非常出名的乙個特性就是管理執行緒(manager thread)。管理執行緒可以滿足以下要求:

linuxthreads 及其侷限性

linuxthreads 的設計通常都可以很好地工作;但是在壓力很大的應用程式中,它的效能、可伸縮性和可用性都會存在問題。下面讓我們來看一下 linuxthreads 設計的一些侷限性:

關於 nptl

nptl,或稱為 native posix thread library,是 linux 執行緒的乙個新實現,它克服了 linuxthreads 的缺點,同時也符合 posix 的需求。與 linuxthreads 相比,它在效能和穩定性方面都提供了重大的改進。與 linuxthreads 一樣,nptl 也實現了一對一的模型。

ulrich drepper 和 ingo molnar 是 red hat 參與 nptl 設計的兩名員工。他們的總體設計目標如下:

nptl 的優點

與 linuxthreads 相比,nptl 具有很多優點:

sam對上面的這些描述其實很多也不是很清楚,放在這裡作為備份,未來理解多了,慢慢讀。

gnu_libpthread_version 巨集

大部分現代 linux 發行版都預裝了 linuxthreads 和 nptl,因此它們提供了一種機制來在二者之間進行切換。要檢視您的系統上正在使用的是哪個執行緒庫,請執行下面的命令:

$ getconf gnu_libpthread_version

這會產生類似於下面的輸出結果:

nptl 0.34

或者:linuxthreads-0.10

linux 發行版所使用的執行緒模型、glibc 版本和核心版本

表 1 列出了一些流行的 linux 發行版,以及它們所採用的執行緒實現的型別、glibc 庫和核心版本。

表 1. linux 發行版及其執行緒實現

執行緒實現

c 庫發行版

核心linuxthreads 0.7, 0.71 (for libc5)

libc 5.x

red hat 4.2

linuxthreads 0.7, 0.71 (for glibc 2)

glibc 2.0.x

red hat 5.x

linuxthreads 0.8

glibc 2.1.1

red hat 6.0

linuxthreads 0.8

glibc 2.1.2

red hat 6.1 and 6.2

linuxthreads 0.9

red hat 7.2

2.4.7

linuxthreads 0.9

glibc 2.2.4

red hat 2.1 as

2.4.9

linuxthreads 0.10

glibc 2.2.93

red hat 8.0

2.4.18

nptl 0.6

glibc 2.3

red hat 9.0

2.4.20

nptl 0.61

glibc 2.3.2

red hat 3.0 el

2.4.21

nptl 2.3.4

glibc 2.3.4

red hat 4.0

2.6.9

linuxthreads 0.9

glibc 2.2

suse linux enterprise server 7.1

2.4.18

linuxthreads 0.9

glibc 2.2.5

suse linux enterprise server 8

2.4.21

linuxthreads 0.9

glibc 2.2.5

united linux

2.4.21

nptl 2.3.5

glibc 2.3.3

suse linux enterprise server 9

2.6.5

注意,從 2.6.x 版本的核心和 glibc 2.3.3 開始,nptl 所採用的版本號命名約定發生了變化:這個庫現在是根據所使用的 glibc 的版本進行編號的。

sam記得好像某篇文章講,從2.6 kernel開始,nptl支援被加入。只需要glibc用nptl就可以了。就算我們的系統裡裝上了nptl庫,也不會影響原來的程式,就算是那些老的程式,即使用了linuxthreads的標頭檔案且在編譯,連線的時候使用了linuxthreads的庫的程式,我們也能夠讓它在執行的時候,動態連線到我們的nptl庫。從而發揮nptl的作用。

另外,從gnu libc 2.4開始使用了nptl方式,但kernel版本需要 linux 2.6.0以上。

所以判斷乙個嵌入式平台是否支援nptl,首先看kernel版本號,如果低於2.6.則肯定不支援nptl.(因為如果kernel不支援nptl. 則libc再怎麼做都沒辦法)。其次看libc版本號。即/lib/libc.so.***x

Linux下程式設計(一)

真的不好意思,有好久沒來這裡了,今天回來看一下,我的blog還在,真的感謝csdn,從去看沒來開始,我把方向轉向了linux下程式設計,主要是c 說實在的,在這以前,對linux下的程式設計幾乎是一無所知,通過最近的學習,逐漸從中找到了樂趣,在這裡寫一些心得,與大家分享。首先,在linux下的程式設...

linux下socket程式設計(一)

流式套接字 stream socket 是面向連線的套接字,採用tcp協議 中用sock stream表示,有幾大特徵 1 資料在傳輸過程中不會消失 2 資料是按順序傳送與到達 3 資料的傳送與接收不一定同步 解釋一下特徵3 客戶端和服務端都有乙個緩衝區,達到緩衝區的資料不一定被立即讀取,緩衝區滿了...

C 併發程式設計 thread

c 11在標準庫中為多執行緒提供元件,使用執行緒需要包含標頭檔案 thread,其命名空間為 std.每個程序至少有乙個執行緒 執行main 函式的執行緒,其餘執行緒有其各自的入口函式 執行緒函式 當執行緒執行完執行緒函式後,執行緒也會退出.如果不傳入執行緒函式 類似這種形式std thread t...