青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

旅途

如果想飛得高,就該把地平線忘掉

二.Linux 2.4內(nèi)核中的輕量進(jìn)程實(shí)現(xiàn)

最初的進(jìn)程定義都包含程序、資源及其執(zhí)行三部分,其中程序通常指代碼,資源在操作系統(tǒng)層面上通常包括內(nèi)存資源、IO資源、信號處理等部分,而程序的 執(zhí)行通常理解為執(zhí)行上下文,包括對cpu的占用,后來發(fā)展為線程。在線程概念出現(xiàn)以前,為了減小進(jìn)程切換的開銷,操作系統(tǒng)設(shè)計(jì)者逐漸修正進(jìn)程的概念,逐漸 允許將進(jìn)程所占有的資源從其主體剝離出來,允許某些進(jìn)程共享一部分資源,例如文件、信號,數(shù)據(jù)內(nèi)存,甚至代碼,這就發(fā)展出輕量進(jìn)程的概念。Linux內(nèi)核 在2.0.x版本就已經(jīng)實(shí)現(xiàn)了輕量進(jìn)程,應(yīng)用程序可以通過一個(gè)統(tǒng)一的clone()系統(tǒng)調(diào)用接口,用不同的參數(shù)指定創(chuàng)建輕量進(jìn)程還是普通進(jìn)程。在內(nèi)核中, clone()調(diào)用經(jīng)過參數(shù)傳遞和解釋后會調(diào)用do_fork(),這個(gè)核內(nèi)函數(shù)同時(shí)也是fork()、vfork()系統(tǒng)調(diào)用的最終實(shí)現(xiàn):

<linux-2.4.20/kernel/fork.c>
int do_fork(unsigned long clone_flags, unsigned long stack_start,
struct pt_regs *regs, unsigned long stack_size)

其中的clone_flags取自以下宏的"或"值:

<linux-2.4.20/include/linux/sched.h>
#define CSIGNAL 0x000000ff /* signal mask to be sent at exit */
#define CLONE_VM 0x00000100 /* set if VM shared between processes */
#define CLONE_FS 0x00000200 /* set if fs info shared between processes */
#define CLONE_FILES 0x00000400 /* set if open files shared between processes */
#define CLONE_SIGHAND 0x00000800 /* set if signal handlers and blocked signals shared */
#define CLONE_PID 0x00001000 /* set if pid shared */
#define CLONE_PTRACE 0x00002000 /* set if we want to let tracing continue on the child too */
#define CLONE_VFORK 0x00004000 /* set if the parent wants the child to wake it up on mm_release */
#define CLONE_PARENT 0x00008000 /* set if we want to have the same parent as the cloner */
#define CLONE_THREAD 0x00010000 /* Same thread group? */
#define CLONE_NEWNS 0x00020000 /* New namespace group? */
#define CLONE_SIGNAL (CLONE_SIGHAND | CLONE_THREAD)

在do_fork()中,不同的 clone_flags將導(dǎo)致不同的行為,對于LinuxThreads,它使用(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND)參數(shù)來調(diào)用clone()創(chuàng)建"線程",表示共享內(nèi)存、共享文件系統(tǒng)訪問計(jì)數(shù)、共享文件描述符表,以及共享信號處理方式。本 節(jié)就針對這幾個(gè)參數(shù),看看Linux內(nèi)核是如何實(shí)現(xiàn)這些資源的共享的。

1.CLONE_VM

do_fork ()需要調(diào)用copy_mm()來設(shè)置task_struct中的mm和active_mm項(xiàng),這兩個(gè)mm_struct數(shù)據(jù)與進(jìn)程所關(guān)聯(lián)的內(nèi)存空間相對 應(yīng)。如果do_fork()時(shí)指定了CLONE_VM開關(guān),copy_mm()將把新的task_struct中的mm和active_mm設(shè)置成與 current的相同,同時(shí)提高該mm_struct的使用者數(shù)目(mm_struct::mm_users)。也就是說,輕量級進(jìn)程與父進(jìn)程共享內(nèi)存地 址空間,由下圖示意可以看出mm_struct在進(jìn)程中的地位:



2.CLONE_FS

task_struct 中利用fs(struct fs_struct *)記錄了進(jìn)程所在文件系統(tǒng)的根目錄和當(dāng)前目錄信息,do_fork()時(shí)調(diào)用copy_fs()復(fù)制了這個(gè)結(jié)構(gòu);而對于輕量級進(jìn)程則僅增加fs- >count計(jì)數(shù),與父進(jìn)程共享相同的fs_struct。也就是說,輕量級進(jìn)程沒有獨(dú)立的文件系統(tǒng)相關(guān)的信息,進(jìn)程中任何一個(gè)線程改變當(dāng)前目錄、 根目錄等信息都將直接影響到其他線程。

3.CLONE_FILES

一 個(gè)進(jìn)程可能打開了一些文件,在進(jìn)程結(jié)構(gòu)task_struct中利用files(struct files_struct *)來保存進(jìn)程打開的文件結(jié)構(gòu)(struct file)信息,do_fork()中調(diào)用了copy_files()來處理這個(gè)進(jìn)程屬性;輕量級進(jìn)程與父進(jìn)程是共享該結(jié)構(gòu)的,copy_files() 時(shí)僅增加files->count計(jì)數(shù)。這一共享使得任何線程都能訪問進(jìn)程所維護(hù)的打開文件,對它們的操作會直接反映到進(jìn)程中的其他線程。

4.CLONE_SIGHAND

每 一個(gè)Linux進(jìn)程都可以自行定義對信號的處理方式,在task_struct中的sig(struct signal_struct)中使用一個(gè)struct k_sigaction結(jié)構(gòu)的數(shù)組來保存這個(gè)配置信息,do_fork()中的copy_sighand()負(fù)責(zé)復(fù)制該信息;輕量級進(jìn)程不進(jìn)行復(fù)制,而僅 僅增加signal_struct::count計(jì)數(shù),與父進(jìn)程共享該結(jié)構(gòu)。也就是說,子進(jìn)程與父進(jìn)程的信號處理方式完全相同,而且可以相互更改。

do_fork()中所做的工作很多,在此不詳細(xì)描述。對于SMP系統(tǒng),所有的進(jìn)程fork出來后,都被分配到與父進(jìn)程相同的cpu上,一直到該進(jìn)程被調(diào)度時(shí)才會進(jìn)行cpu選擇。

盡 管Linux支持輕量級進(jìn)程,但并不能說它就支持核心級線程,因?yàn)長inux的"線程"和"進(jìn)程"實(shí)際上處于一個(gè)調(diào)度層次,共享一個(gè)進(jìn)程標(biāo)識符空間,這種 限制使得不可能在Linux上實(shí)現(xiàn)完全意義上的POSIX線程機(jī)制,因此眾多的Linux線程庫實(shí)現(xiàn)嘗試都只能盡可能實(shí)現(xiàn)POSIX的絕大部分語義,并在 功能上盡可能逼近。





回頁首


三.LinuxThread的線程機(jī)制

LinuxThreads 是目前Linux平臺上使用最為廣泛的線程庫,由Xavier Leroy (Xavier.Leroy@inria.fr)負(fù)責(zé)開發(fā)完成,并已綁定在GLIBC中發(fā)行。它所實(shí)現(xiàn)的就是基于核心輕量級進(jìn)程的"一對一"線程模型,一 個(gè)線程實(shí)體對應(yīng)一個(gè)核心輕量級進(jìn)程,而線程之間的管理在核外函數(shù)庫中實(shí)現(xiàn)。

1.線程描述數(shù)據(jù)結(jié)構(gòu)及實(shí)現(xiàn)限制

LinuxThreads 定義了一個(gè)struct _pthread_descr_struct數(shù)據(jù)結(jié)構(gòu)來描述線程,并使用全局?jǐn)?shù)組變量__pthread_handles來描述和引用進(jìn)程所轄線程。在 __pthread_handles中的前兩項(xiàng),LinuxThreads定義了兩個(gè)全局的系統(tǒng)線程:__pthread_initial_thread 和__pthread_manager_thread,并用__pthread_main_thread表征 __pthread_manager_thread的父線程(初始為__pthread_initial_thread)。

struct _pthread_descr_struct是一個(gè)雙環(huán)鏈表結(jié)構(gòu),__pthread_manager_thread所在的鏈表僅包括它一個(gè)元素,實(shí)際 上,__pthread_manager_thread是一個(gè)特殊線程,LinuxThreads僅使用了其中的errno、p_pid、 p_priority等三個(gè)域。而__pthread_main_thread所在的鏈則將進(jìn)程中所有用戶線程串在了一起。經(jīng)過一系列 pthread_create()之后形成的__pthread_handles數(shù)組將如下圖所示:


圖2 __pthread_handles數(shù)組結(jié)構(gòu)

新創(chuàng)建的線程將首先在__pthread_handles數(shù)組中占據(jù)一項(xiàng),然后通過數(shù)據(jù)結(jié)構(gòu)中的鏈指針連入以__pthread_main_thread為首指針的鏈表中。這個(gè)鏈表的使用在介紹線程的創(chuàng)建和釋放的時(shí)候?qū)⑻岬健?/p>

LinuxThreads 遵循POSIX1003.1c標(biāo)準(zhǔn),其中對線程庫的實(shí)現(xiàn)進(jìn)行了一些范圍限制,比如進(jìn)程最大線程數(shù),線程私有數(shù)據(jù)區(qū)大小等等。在LinuxThreads的 實(shí)現(xiàn)中,基本遵循這些限制,但也進(jìn)行了一定的改動(dòng),改動(dòng)的趨勢是放松或者說擴(kuò)大這些限制,使編程更加方便。這些限定宏主要集中在 sysdeps/unix/sysv/linux/bits/local_lim.h(不同平臺使用的文件位置不同)中,包括如下幾個(gè):

每 進(jìn)程的私有數(shù)據(jù)key數(shù),POSIX定義_POSIX_THREAD_KEYS_MAX為128,LinuxThreads使用 PTHREAD_KEYS_MAX,1024;私有數(shù)據(jù)釋放時(shí)允許執(zhí)行的操作數(shù),LinuxThreads與POSIX一致,定義 PTHREAD_DESTRUCTOR_ITERATIONS為4;每進(jìn)程的線程數(shù),POSIX定義為64,LinuxThreads增大到1024 (PTHREAD_THREADS_MAX);線程運(yùn)行棧最小空間大小,POSIX未指定,LinuxThreads使用 PTHREAD_STACK_MIN,16384(字節(jié))。

2.管理線程

" 一對一"模型的好處之一是線程的調(diào)度由核心完成了,而其他諸如線程取消、線程間的同步等工作,都是在核外線程庫中完成的。在LinuxThreads中, 專門為每一個(gè)進(jìn)程構(gòu)造了一個(gè)管理線程,負(fù)責(zé)處理線程相關(guān)的管理工作。當(dāng)進(jìn)程第一次調(diào)用pthread_create()創(chuàng)建一個(gè)線程的時(shí)候就會創(chuàng)建 (__clone())并啟動(dòng)管理線程。

在一個(gè)進(jìn)程空間內(nèi),管理線程與其他線程之間通過一對"管理管道 (manager_pipe[2])"來通訊,該管道在創(chuàng)建管理線程之前創(chuàng)建,在成功啟動(dòng)了管理線程之后,管理管道的讀端和寫端分別賦給兩個(gè)全局變量 __pthread_manager_reader和__pthread_manager_request,之后,每個(gè)用戶線程都通過 __pthread_manager_request向管理線程發(fā)請求,但管理線程本身并沒有直接使用 __pthread_manager_reader,管道的讀端(manager_pipe[0])是作為__clone()的參數(shù)之一傳給管理線程的, 管理線程的工作主要就是監(jiān)聽管道讀端,并對從中取出的請求作出反應(yīng)。

創(chuàng)建管理線程的流程如下所示:
(全局變量pthread_manager_request初值為-1)


圖3 創(chuàng)建管理線程的流程

初 始化結(jié)束后,在__pthread_manager_thread中記錄了輕量級進(jìn)程號以及核外分配和管理的線程id, 2*PTHREAD_THREADS_MAX+1這個(gè)數(shù)值不會與任何常規(guī)用戶線程id沖突。管理線程作為pthread_create()的調(diào)用者線程的 子線程運(yùn)行,而pthread_create()所創(chuàng)建的那個(gè)用戶線程則是由管理線程來調(diào)用clone()創(chuàng)建,因此實(shí)際上是管理線程的子線程。(此處子 線程的概念應(yīng)該當(dāng)作子進(jìn)程來理解。)

__pthread_manager()就是管理線程的主循環(huán)所在,在進(jìn)行一系列初始 化工作后,進(jìn)入while(1)循環(huán)。在循環(huán)中,線程以2秒為timeout查詢(__poll())管理管道的讀端。在處理請求前,檢查其父線程(也就 是創(chuàng)建manager的主線程)是否已退出,如果已退出就退出整個(gè)進(jìn)程。如果有退出的子線程需要清理,則調(diào)用pthread_reap_children ()清理。

然后才是讀取管道中的請求,根據(jù)請求類型執(zhí)行相應(yīng)操作(switch-case)。具體的請求處理,源碼中比較清楚,這里就不贅述了。

3.線程棧

在LinuxThreads中,管理線程的棧和用戶線程的棧是分離的,管理線程在進(jìn)程堆中通過malloc()分配一個(gè)THREAD_MANAGER_STACK_SIZE字節(jié)的區(qū)域作為自己的運(yùn)行棧。

用 戶線程的棧分配辦法隨著體系結(jié)構(gòu)的不同而不同,主要根據(jù)兩個(gè)宏定義來區(qū)分,一個(gè)是NEED_SEPARATE_REGISTER_STACK,這個(gè)屬性僅 在IA64平臺上使用;另一個(gè)是FLOATING_STACK宏,在i386等少數(shù)平臺上使用,此時(shí)用戶線程棧由系統(tǒng)決定具體位置并提供保護(hù)。與此同時(shí), 用戶還可以通過線程屬性結(jié)構(gòu)來指定使用用戶自定義的棧。因篇幅所限,這里只能分析i386平臺所使用的兩種棧組織方式:FLOATING_STACK方式 和用戶自定義方式。

在FLOATING_STACK方式下,LinuxThreads利用mmap()從內(nèi)核空間中分配 8MB空間(i386系統(tǒng)缺省的最大棧空間大小,如果有運(yùn)行限制(rlimit),則按照運(yùn)行限制設(shè)置),使用mprotect()設(shè)置其中第一頁為非訪 問區(qū)。該8M空間的功能分配如下圖:


圖4 棧結(jié)構(gòu)示意

低地址被保護(hù)的頁面用來監(jiān)測棧溢出。

對于用戶指定的棧,在按照指針對界后,設(shè)置線程棧頂,并計(jì)算出棧底,不做保護(hù),正確性由用戶自己保證。

不論哪種組織方式,線程描述結(jié)構(gòu)總是位于棧頂緊鄰堆棧的位置。

4.線程id和進(jìn)程id

每個(gè)LinuxThreads線程都同時(shí)具有線程id和進(jìn)程id,其中進(jìn)程id就是內(nèi)核所維護(hù)的進(jìn)程號,而線程id則由LinuxThreads分配和維護(hù)。

__pthread_initial_thread 的線程id為PTHREAD_THREADS_MAX,__pthread_manager_thread的是 2*PTHREAD_THREADS_MAX+1,第一個(gè)用戶線程的線程id為PTHREAD_THREADS_MAX+2,此后第n個(gè)用戶線程的線程 id遵循以下公式:

	tid=n*PTHREAD_THREADS_MAX+n+1

這種分配方式保證了進(jìn)程中所有的線程(包括已經(jīng)退出)都不會有相同的線程id,而線程id的類型pthread_t定義為無符號長整型(unsigned long int),也保證了有理由的運(yùn)行時(shí)間內(nèi)線程id不會重復(fù)。

從線程id查找線程數(shù)據(jù)結(jié)構(gòu)是在pthread_handle()函數(shù)中完成的,實(shí)際上只是將線程號按PTHREAD_THREADS_MAX取模,得到的就是該線程在__pthread_handles中的索引。

5.線程的創(chuàng)建

在pthread_create ()向管理線程發(fā)送REQ_CREATE請求之后,管理線程即調(diào)用pthread_handle_create()創(chuàng)建新線程。分配棧、設(shè)置thread 屬性后,以pthread_start_thread()為函數(shù)入口調(diào)用__clone()創(chuàng)建并啟動(dòng)新線程。pthread_start_thread ()讀取自身的進(jìn)程id號存入線程描述結(jié)構(gòu)中,并根據(jù)其中記錄的調(diào)度方法配置調(diào)度。一切準(zhǔn)備就緒后,再調(diào)用真正的線程執(zhí)行函數(shù),并在此函數(shù)返回后調(diào)用 pthread_exit()清理現(xiàn)場。

6.LinuxThreads的不足

由于Linux內(nèi)核的限制以及實(shí)現(xiàn)難度等等原因,LinuxThreads并不是完全POSIX兼容的,在它的發(fā)行README中有說明。

1)進(jìn)程id問題

這個(gè)不足是最關(guān)鍵的不足,引起的原因牽涉到LinuxThreads的"一對一"模型。

Linux 內(nèi)核并不支持真正意義上的線程,LinuxThreads是用與普通進(jìn)程具有同樣內(nèi)核調(diào)度視圖的輕量級進(jìn)程來實(shí)現(xiàn)線程支持的。這些輕量級進(jìn)程擁有獨(dú)立的進(jìn) 程id,在進(jìn)程調(diào)度、信號處理、IO等方面享有與普通進(jìn)程一樣的能力。在源碼閱讀者看來,就是Linux內(nèi)核的clone()沒有實(shí)現(xiàn)對 CLONE_PID參數(shù)的支持。

在內(nèi)核do_fork()中對CLONE_PID的處理是這樣的:

          if (clone_flags & CLONE_PID) {
if (current->pid)
goto fork_out;
}

這段代碼表明,目前的Linux內(nèi)核僅在pid為0的時(shí)候認(rèn)可CLONE_PID參數(shù),實(shí)際上,僅在SMP初始化,手工創(chuàng)建進(jìn)程的時(shí)候才會使用CLONE_PID參數(shù)。

按照POSIX定義,同一進(jìn)程的所有線程應(yīng)該共享一個(gè)進(jìn)程id和父進(jìn)程id,這在目前的"一對一"模型下是無法實(shí)現(xiàn)的。

2)信號處理問題

由于異步信號是內(nèi)核以進(jìn)程為單位分發(fā)的,而LinuxThreads的每個(gè)線程對內(nèi)核來說都是一個(gè)進(jìn)程,且沒有實(shí)現(xiàn)"線程組",因此,某些語義不符合POSIX標(biāo)準(zhǔn),比如沒有實(shí)現(xiàn)向進(jìn)程中所有線程發(fā)送信號,README對此作了說明。

如 果核心不提供實(shí)時(shí)信號,LinuxThreads將使用SIGUSR1和SIGUSR2作為內(nèi)部使用的restart和cancel信號,這樣應(yīng)用程序就 不能使用這兩個(gè)原本為用戶保留的信號了。在Linux kernel 2.1.60以后的版本都支持?jǐn)U展的實(shí)時(shí)信號(從_SIGRTMIN到_SIGRTMAX),因此不存在這個(gè)問題。

某些信號的缺省動(dòng)作難以在現(xiàn)行體系上實(shí)現(xiàn),比如SIGSTOP和SIGCONT,LinuxThreads只能將一個(gè)線程掛起,而無法掛起整個(gè)進(jìn)程。

3)線程總數(shù)問題

LinuxThreads將每個(gè)進(jìn)程的線程最大數(shù)目定義為1024,但實(shí)際上這個(gè)數(shù)值還受到整個(gè)系統(tǒng)的總進(jìn)程數(shù)限制,這又是由于線程其實(shí)是核心進(jìn)程。

在kernel 2.4.x中,采用一套全新的總進(jìn)程數(shù)計(jì)算方法,使得總進(jìn)程數(shù)基本上僅受限于物理內(nèi)存的大小,計(jì)算公式在kernel/fork.c的fork_init()函數(shù)中:

	max_threads = mempages / (THREAD_SIZE/PAGE_SIZE) / 8

在i386 上,THREAD_SIZE=2*PAGE_SIZE,PAGE_SIZE=2^12(4KB),mempages=物理內(nèi)存大小/PAGE_SIZE, 對于256M的內(nèi)存的機(jī)器,mempages=256*2^20/2^12=256*2^8,此時(shí)最大線程數(shù)為4096。

但為了保證每個(gè)用戶(除了root)的進(jìn)程總數(shù)不至于占用一半以上物理內(nèi)存,fork_init()中繼續(xù)指定:

    init_task.rlim[RLIMIT_NPROC].rlim_cur = max_threads/2;
init_task.rlim[RLIMIT_NPROC].rlim_max = max_threads/2;

這些進(jìn)程數(shù)目的檢查都在do_fork()中進(jìn)行,因此,對于LinuxThreads來說,線程總數(shù)同時(shí)受這三個(gè)因素的限制。

4)管理線程問題

管理線程容易成為瓶頸,這是這種結(jié)構(gòu)的通病;同時(shí),管理線程又負(fù)責(zé)用戶線程的清理工作,因此,盡管管理線程已經(jīng)屏蔽了大部分的信號,但一旦管理線程死亡,用戶線程就不得不手工清理了,而且用戶線程并不知道管理線程的狀態(tài),之后的線程創(chuàng)建等請求將無人處理。

5)同步問題

LinuxThreads中的線程同步很大程度上是建立在信號基礎(chǔ)上的,這種通過內(nèi)核復(fù)雜的信號處理機(jī)制的同步方式,效率一直是個(gè)問題。

6)其他POSIX兼容性問題

Linux中很多系統(tǒng)調(diào)用,按照語義都是與進(jìn)程相關(guān)的,比如nice、setuid、setrlimit等,在目前的LinuxThreads中,這些調(diào)用都僅僅影響調(diào)用者線程。

7)實(shí)時(shí)性問題

線程的引入有一定的實(shí)時(shí)性考慮,但LinuxThreads暫時(shí)不支持,比如調(diào)度選項(xiàng),目前還沒有實(shí)現(xiàn)。不僅LinuxThreads如此,標(biāo)準(zhǔn)的Linux在實(shí)時(shí)性上考慮都很少。





回頁首


四.其他的線程實(shí)現(xiàn)機(jī)制

LinuxThreads 的問題,特別是兼容性上的問題,嚴(yán)重阻礙了Linux上的跨平臺應(yīng)用(如Apache)采用多線程設(shè)計(jì),從而使得Linux上的線程應(yīng)用一直保持在比較低 的水平。在Linux社區(qū)中,已經(jīng)有很多人在為改進(jìn)線程性能而努力,其中既包括用戶級線程庫,也包括核心級和用戶級配合改進(jìn)的線程庫。目前最為人看好的有 兩個(gè)項(xiàng)目,一個(gè)是RedHat公司牽頭研發(fā)的NPTL(Native Posix Thread Library),另一個(gè)則是IBM投資開發(fā)的NGPT(Next Generation Posix Threading),二者都是圍繞完全兼容POSIX 1003.1c,同時(shí)在核內(nèi)和核外做工作以而實(shí)現(xiàn)多對多線程模型。這兩種模型都在一定程度上彌補(bǔ)了LinuxThreads的缺點(diǎn),且都是重起爐灶全新設(shè) 計(jì)的。

1.NPTL

NPTL的設(shè)計(jì)目標(biāo)歸納可歸納為以下幾點(diǎn):

  • POSIX兼容性
  • SMP結(jié)構(gòu)的利用
  • 低啟動(dòng)開銷
  • 低鏈接開銷(即不使用線程的程序不應(yīng)當(dāng)受線程庫的影響)
  • 與LinuxThreads應(yīng)用的二進(jìn)制兼容性
  • 軟硬件的可擴(kuò)展能力
  • 多體系結(jié)構(gòu)支持
  • NUMA支持
  • 與C++集成

在 技術(shù)實(shí)現(xiàn)上,NPTL仍然采用1:1的線程模型,并配合glibc和最新的Linux Kernel2.5.x開發(fā)版在信號處理、線程同步、存儲管理等多方面進(jìn)行了優(yōu)化。和LinuxThreads不同,NPTL沒有使用管理線程,核心線程 的管理直接放在核內(nèi)進(jìn)行,這也帶了性能的優(yōu)化。

主要是因?yàn)楹诵牡膯栴},NPTL仍然不是100%POSIX兼容的,但就性能而言相對LinuxThreads已經(jīng)有很大程度上的改進(jìn)了。

2.NGPT

IBM的開放源碼項(xiàng)目NGPT在2003年1月10日推出了穩(wěn)定的2.2.0版,但相關(guān)的文檔工作還差很多。就目前所知,NGPT是基于GNU Pth(GNU Portable Threads)項(xiàng)目而實(shí)現(xiàn)的M:N模型,而GNU Pth是一個(gè)經(jīng)典的用戶級線程庫實(shí)現(xiàn)。

按照2003年3月NGPT官方網(wǎng)站上的通知,NGPT考慮到NPTL日益廣泛地為人所接受,為避免不同的線程庫版本引起的混亂,今后將不再進(jìn)行進(jìn)一步開發(fā),而今進(jìn)行支持性的維護(hù)工作。也就是說,NGPT已經(jīng)放棄與NPTL競爭下一代Linux POSIX線程庫標(biāo)準(zhǔn)。

3.其他高效線程機(jī)制

此 處不能不提到Scheduler Activations。這個(gè)1991年在ACM上發(fā)表的多線程內(nèi)核結(jié)構(gòu)影響了很多多線程內(nèi)核的設(shè)計(jì),其中包括Mach3.0、NetBSD和商業(yè)版本 Digital Unix(現(xiàn)在叫Compaq True64 Unix)。它的實(shí)質(zhì)是在使用用戶級線程調(diào)度的同時(shí),盡可能地減少用戶級對核心的系統(tǒng)調(diào)用請求,而后者往往是運(yùn)行開銷的重要來源。采用這種結(jié)構(gòu)的線程機(jī) 制,實(shí)際上是結(jié)合了用戶級線程的靈活高效和核心級線程的實(shí)用性,因此,包括Linux、FreeBSD在內(nèi)的多個(gè)開放源碼操作系統(tǒng)設(shè)計(jì)社區(qū)都在進(jìn)行相關(guān)研 究,力圖在本系統(tǒng)中實(shí)現(xiàn)Scheduler Activations。



參考資料

  • [Linus Torvalds,2002] Linux內(nèi)核源碼v2.4.20

  • [GNU,2002] Glibc源碼v2.2.2(內(nèi)含LinuxThreads v0.9)

  • [Thomas E. Terrill,1997] An Introduction to Threads Using The LinuxThreads Interface

  • [Ulrich Drepper,Ingo Molnar,2003] The Native POSIX Thread Library for Linux

  • http://www.ibm.com/developerworks/oss/pthreads/,NGPT官方網(wǎng)站

  • [Ralf S. Engelschall,2000] Portable Multithreading

  • [Thomas E. Anderson, Brian N. Bershad, Edward D. Lazowska, Henry M. Levy,1992] Scheduler Activations: Effective Kernel Support for the User-Level Management of Parallelism

  • [pcjockey@21cn.com] Linux線程初探


關(guān)于作者


楊沙洲,目前在國防科技大學(xué)計(jì)算機(jī)學(xué)院攻讀軟件方向博士學(xué)位。

posted on 2007-08-11 01:38 旅途 閱讀(1121) 評論(0)  編輯 收藏 引用 所屬分類: linux內(nèi)核

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲欧美日韩一区二区三区在线| 久久国产精品一区二区三区| 亚洲靠逼com| 亚洲免费在线视频| 亚洲国产精品悠悠久久琪琪| 亚洲欧美日韩另类| 欧美色综合天天久久综合精品| 国产亚洲精品bt天堂精选| 亚洲制服少妇| 一区二区三区精品久久久| 欧美日韩的一区二区| 亚洲蜜桃精久久久久久久| 亚洲电影一级黄| 蜜桃久久av| 亚洲日本精品国产第一区| 欧美国产日本高清在线| 美女诱惑一区| 日韩午夜av在线| 亚洲美女诱惑| 欧美午夜a级限制福利片| 亚洲综合国产精品| 亚洲视频高清| 国产日本亚洲高清| 久久综合婷婷| 美女尤物久久精品| 久久精品综合一区| 黄色另类av| 欧美大片一区二区三区| 免费不卡在线视频| 99www免费人成精品| 亚洲精品资源美女情侣酒店| 国产精品成人一区二区艾草| 性高湖久久久久久久久| 欧美中文在线观看| 亚洲福利一区| 99精品视频免费| 国产精品一区二区三区成人| 久久五月激情| 欧美巨乳波霸| 欧美一区二区三区在线免费观看| 久久激情网站| 亚洲精选91| 亚洲欧美日韩第一区| 在线观看日韩av| 99精品国产一区二区青青牛奶| 国产午夜精品全部视频播放| 欧美成人午夜激情视频| 欧美三级电影网| 蜜臀久久99精品久久久久久9| 欧美日韩国产首页| 久久精品国产久精国产思思| 欧美福利电影在线观看| 午夜精品久久久久久久久久久| 久久精品一区四区| 一区二区三欧美| 欧美主播一区二区三区| 妖精成人www高清在线观看| 亚洲欧美中文另类| 亚洲久久一区二区| 欧美中文字幕在线播放| 亚洲天堂偷拍| 麻豆成人综合网| 欧美一区网站| 欧美日韩国产精品| 免费成人网www| 国产精品青草久久| 亚洲经典在线| 亚洲第一综合天堂另类专| 亚洲一卡二卡三卡四卡五卡| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲欧美资源在线| 一本色道久久综合亚洲91| 久久综合一区二区| 久久国内精品视频| 国产精品久久久久影院亚瑟| 91久久精品美女| 在线激情影院一区| 亚洲欧美日韩国产综合精品二区| 在线亚洲欧美视频| 欧美极品aⅴ影院| 女女同性精品视频| 国产中文一区二区| 亚洲欧美日韩国产综合在线| 亚洲免费影视| 欧美午夜久久久| 亚洲精品视频在线播放| 亚洲区中文字幕| 麻豆成人91精品二区三区| 美女精品在线观看| 狠狠色综合色区| 亚洲高清不卡| 激情综合视频| 久久久999国产| 噜噜噜在线观看免费视频日韩| 国产日韩欧美成人| 亚洲欧美日韩另类| 久久国产手机看片| 国产日韩精品在线播放| 欧美亚洲综合另类| 久久精品女人| 国际精品欧美精品| 久久综合网hezyo| 亚洲高清中文字幕| 9l视频自拍蝌蚪9l视频成人| 欧美日韩国产三级| 亚洲性感激情| 久久久久国产一区二区三区| 黄色成人在线网站| 免费试看一区| 亚洲美女黄网| 亚洲欧美怡红院| 国产亚洲成人一区| 久久久久国产精品麻豆ai换脸| 久热re这里精品视频在线6| 伊人久久久大香线蕉综合直播| 久久综合网络一区二区| 亚洲人体一区| 性欧美长视频| 在线国产精品一区| 欧美日韩国产综合视频在线观看中文| 日韩一级黄色av| 欧美在线观看一二区| 尤物精品在线| 欧美日韩不卡在线| 午夜日韩激情| 亚洲东热激情| 欧美诱惑福利视频| 亚洲成色777777女色窝| 欧美日韩国产大片| 欧美专区在线观看| 亚洲高清视频一区二区| 亚洲一区亚洲| 亚洲国产精品日韩| 国产精品卡一卡二卡三| 久久男人av资源网站| 日韩视频精品在线| 久久成人综合网| 亚洲精品社区| 国产一区二区日韩精品| 欧美精品免费看| 欧美一级精品大片| 亚洲人成网站在线观看播放| 久久爱91午夜羞羞| 99国产精品99久久久久久| 国产一区视频观看| 欧美日韩亚洲一区二区| 久久久久久欧美| 亚洲丝袜av一区| 欧美高清视频| 久久激情婷婷| 亚洲免费网址| 亚洲美女免费视频| 在线电影院国产精品| 国产精品入口66mio| 免费中文字幕日韩欧美| 欧美一区二区大片| 在线综合亚洲欧美在线视频| 亚洲精华国产欧美| 欧美成人四级电影| 噜噜噜在线观看免费视频日韩| 亚洲一区黄色| 亚洲精品一区二区三区樱花| 在线欧美视频| 国产综合久久久久久鬼色| 国产精品久久久一区二区| 亚洲每日更新| 亚洲国产天堂久久综合| 久久久免费精品视频| 欧美一区二区视频网站| 亚洲摸下面视频| 亚洲永久免费| 亚洲午夜小视频| 亚洲视频axxx| 亚洲社区在线观看| 99香蕉国产精品偷在线观看| 亚洲三级国产| 亚洲精品一区久久久久久| 亚洲国产一区在线观看| 亚洲国产成人一区| 亚洲高清不卡在线观看| 在线看日韩欧美| 亚洲国产成人午夜在线一区| 亚洲激情国产| 99热这里只有成人精品国产| 亚洲美女精品成人在线视频| 99re6这里只有精品| 一二三区精品福利视频| 亚洲一区二区三区精品视频 | 亚洲专区免费| 亚洲欧美伊人| 久久精品国产77777蜜臀| 久久精品国产精品亚洲综合| 久久久噜噜噜久久中文字免| 久久亚洲午夜电影| 欧美aa国产视频| 亚洲国产色一区| 亚洲色诱最新| 久久精品国产亚洲5555| 欧美成人a∨高清免费观看| 欧美另类人妖|