深夜福利网-深夜福利网站大全,国产一区二区三区久久精品,99re6热在线精品视频播放,日韩中文字幕视频免费,影院一区二区小说性鲍视频

知名百科 >> POSIX線程 >> 歷史版本
編輯時(shí)間歷史版本內(nèi)容長度圖片數(shù)目錄數(shù)修改原因
2024-04-30 11:52 最新歷史版本 12740 1 6
  返回詞條

POSIX線程

POSIX(Portable Operating System Interface Threads,Pthread)是基于POSIX標(biāo)準(zhǔn)的線程編程接口,它使程序能夠在多處理器或多核系統(tǒng)上并行處理多個(gè)任務(wù),有效地提高了執(zhí)行效率和系統(tǒng)響應(yīng)速度。與單線程應(yīng)用程序相比,POSIX線程支持更高效的資源共享和任務(wù)并行性,其強(qiáng)大的可移植性允許跨平臺(tái)應(yīng)用程序并易于在不同操作系統(tǒng)之間移植。

POSIX線程經(jīng)歷了一個(gè)重要的發(fā)展階段。最初,POSIX標(biāo)準(zhǔn)作為統(tǒng)一UNIX系統(tǒng)中多線程的國際標(biāo)準(zhǔn),旨在提供一種跨平臺(tái)的線程支持方案。隨后,Linux系統(tǒng)使用LinuxThreads來實(shí)現(xiàn)線程管理,但這種方案在信號(hào)處理和線程同步方面存在局限性。為了解決這些問題并進(jìn)一步提高性能和標(biāo)準(zhǔn)之間的兼容性,開發(fā)人員后來引入了NPTL(原生POSIX線程庫)。NPTL不僅顯著提高了性能,而且在遵循POSIX標(biāo)準(zhǔn)方面更加嚴(yán)格,成為GNU C庫的核心組件,極大地優(yōu)化了Linux系統(tǒng)的多線程處理能力。

POSIX線程管理涉及精細(xì)的屬性設(shè)置,包括優(yōu)先級(jí)調(diào)整、堆棧大小控制、線程調(diào)度、線程同步和互斥。在這些功能的支持下,POSIX線程可以廣泛應(yīng)用于各種需要高實(shí)時(shí)性的領(lǐng)域,例如實(shí)時(shí)測(cè)量設(shè)備的協(xié)同操作和自動(dòng)處理、GPS實(shí)時(shí)數(shù)據(jù)處理、超聲數(shù)據(jù)成像和實(shí)時(shí)采集。與微軟的Win32線程相比,POSIX線程遵守國際開放標(biāo)準(zhǔn),具有更高的可用性和可移植性。與Java線程相比,它在底層提供了更精細(xì)的線程控制,特別適合C和C++環(huán)境,滿足了高實(shí)時(shí)性的需求。

目錄

起源發(fā)展

POSIX標(biāo)準(zhǔn)的起源

1985年,IEEE著手為類Unix系統(tǒng)制定統(tǒng)一的接口標(biāo)準(zhǔn)。最初,項(xiàng)目組考慮使用“IEEEIX”作為標(biāo)準(zhǔn)名稱,但這一名稱被認(rèn)為難以普及,可能會(huì)引起混淆。這時(shí),理查德·斯托爾曼(Richard Stallman)提議使用“POSIX”作為標(biāo)準(zhǔn)名稱。他將“便攜操作系統(tǒng)”的首字母與后綴“ix”結(jié)合起來,創(chuàng)造了“POSIX”這個(gè)易于發(fā)音和記憶的名稱。斯托曼的提議很快被IEEE委員會(huì)采納,這避免了標(biāo)準(zhǔn)可能無意中升級(jí)競爭對(duì)手美國電話電報(bào)公司的Unix系統(tǒng)的問題。

POSIX線程技術(shù)的發(fā)展和重點(diǎn)項(xiàng)目

1996年,Xavier Leroy在Linux系統(tǒng)中引入了LinuxThreads庫,這是在Linux系統(tǒng)中支持內(nèi)核級(jí)線程的首次嘗試。LinuxThreads可以利用克隆系統(tǒng)調(diào)用創(chuàng)建一個(gè)共享父進(jìn)程地址空間的新進(jìn)程,實(shí)現(xiàn)線程的基本功能。然而,這種實(shí)現(xiàn)在信號(hào)處理、調(diào)度和進(jìn)程間同步原語方面與POSIX線程標(biāo)準(zhǔn)存在明顯的兼容性問題。這些限制阻礙了Linux在多線程管理方面的進(jìn)一步發(fā)展,特別是其在企業(yè)應(yīng)用程序中的廣泛應(yīng)用。

為了解決Linux線程的問題,NGPT(下一代POSIX線程)項(xiàng)目于1998年啟動(dòng)。NGPT是由包括IBM在內(nèi)的幾個(gè)開發(fā)團(tuán)隊(duì)開發(fā)的,目標(biāo)是全面改革L(fēng)inux中的POSIX線程實(shí)現(xiàn)。與此同時(shí),Red Hat的開發(fā)人員還啟動(dòng)了NPTL(Native POSIX Thread Library)項(xiàng)目,計(jì)劃集成NGPT和LinuxThreads的優(yōu)勢(shì)和特性。這兩個(gè)項(xiàng)目在2002年密切合作,以整合各自的技術(shù)優(yōu)勢(shì)。

2003年,NPTL在Red Hat Linux 9中正式發(fā)布,并從Linux 2.6版開始包含在Linux內(nèi)核中。NPTL解決了以前的線程模型無法搶占和放棄系統(tǒng)資源的問題,顯著提高了POSIX標(biāo)準(zhǔn)的兼容性和系統(tǒng)性能。NPTL的成功標(biāo)志著POSIX線程在Linux中實(shí)現(xiàn)的重大突破。該技術(shù)已成為GNU C庫的核心組件,極大地提高了Linux系統(tǒng)的多線程處理能力。

開發(fā)其他工具

隨著NPTL的普及,社區(qū)也開發(fā)了一些輔助工具,如2005年發(fā)布的POSIX線程跟蹤工具(PTT)和open POSIX測(cè)試套件(OPTS)。這些工具支持Linux中多線程應(yīng)用程序的開發(fā)和調(diào)試,進(jìn)一步推動(dòng)了多線程技術(shù)在Linux平臺(tái)上的應(yīng)用和發(fā)展。

線程模型

POSIX線程模型定義了在操作系統(tǒng)或運(yùn)行時(shí)環(huán)境中如何創(chuàng)建、調(diào)度、管理和終止線程。在操作系統(tǒng)中,線程模型分為用戶線程模型、內(nèi)核線程模型和兩級(jí)線程模型。

用戶線程模型:在POSIX用戶線程模型中,線程管理操作完全在用戶空間中進(jìn)行。線程的調(diào)度和管理不需要操作系統(tǒng)內(nèi)核的直接干預(yù),從而減少了上下文切換的開銷,提高了運(yùn)行效率。在該模型中,由于操作系統(tǒng)內(nèi)核將這些線程視為單個(gè)執(zhí)行實(shí)體,因此一個(gè)線程的阻塞將影響同一進(jìn)程中的所有線程。

內(nèi)核線程模型:在POSIX內(nèi)核線程模型下,每個(gè)線程都由操作系統(tǒng)內(nèi)核直接管理和調(diào)度。內(nèi)核可以在不同的處理器內(nèi)核上并行調(diào)度線程,這使得線程可以更好地利用多核處理器的優(yōu)勢(shì)。內(nèi)核級(jí)線程支持真正的并發(fā)執(zhí)行,一個(gè)線程的阻塞不會(huì)影響進(jìn)程中的其他線程。這種模型需要通過系統(tǒng)調(diào)用與內(nèi)核進(jìn)行交互,這將消耗更多資源,并且需要更長時(shí)間來創(chuàng)建和管理線程。

兩級(jí)線程模型:在POSIX模型中,兩級(jí)線程模型結(jié)合了用戶線程和內(nèi)核線程的優(yōu)點(diǎn),提供了靈活的線程管理策略。在這個(gè)模型中,線程可以映射到一個(gè)或多個(gè)內(nèi)核線程。這種映射策略允許應(yīng)用程序根據(jù)需要調(diào)整線程的并發(fā)級(jí)別,同時(shí)可以避免單個(gè)線程阻塞整個(gè)進(jìn)程的問題。

生命周期

線程的生命周期通常包括幾個(gè)階段:創(chuàng)建、開始、執(zhí)行、阻塞、終止和恢復(fù)。

創(chuàng)建:當(dāng)調(diào)用pthread_create函數(shù)創(chuàng)建新線程時(shí),它確保新線程已創(chuàng)建并在返回前處于就緒狀態(tài)。也就是說,盡管pthread_create將在新線程準(zhǔn)備就緒后返回,但新線程的實(shí)際執(zhí)行開始時(shí)間取決于操作系統(tǒng)的調(diào)度策略。因此,新線程可能在pthread_create函數(shù)返回之前開始執(zhí)行,也可能在函數(shù)返回之后開始執(zhí)行,具體取決于操作系統(tǒng)的調(diào)度決策。

啟動(dòng):一個(gè)線程通過pthread_create創(chuàng)建并執(zhí)行一個(gè)啟動(dòng)函數(shù)。在初始線程中,線程的“啟動(dòng)函數(shù)(main)”是從程序外部調(diào)用的。應(yīng)該用pthread_exit終止初始線程,以允許進(jìn)程中的其他線程繼續(xù)運(yùn)行。初始線程的堆棧大小與其他線程不同,這可能會(huì)受到更多限制,并且堆棧溢出會(huì)導(dǎo)致錯(cuò)誤。

運(yùn)行和阻塞:線程在其生命周期中主要經(jīng)歷三種狀態(tài):就緒、運(yùn)行和阻塞。新創(chuàng)建或未阻塞的線程處于就緒狀態(tài),等待處理器分配。當(dāng)處理器選擇一個(gè)線程來執(zhí)行時(shí),它就變成了運(yùn)行狀態(tài)。線程通過等待資源(如互斥體)、條件變量、信號(hào)或完成I/O操作而進(jìn)入阻塞狀態(tài)。線程從阻塞狀態(tài)釋放后,它將再次進(jìn)入就緒狀態(tài),并可能立即執(zhí)行或等待處理器再次可用。

終止:線程通過從啟動(dòng)函數(shù)返回或調(diào)用pthread_exit來終止。如果設(shè)置了特定于線程的數(shù)據(jù),將調(diào)用相應(yīng)的析構(gòu)函數(shù)。

回收:如果線程在創(chuàng)建時(shí)被設(shè)置為分離狀態(tài),或者被pthread_detach調(diào)用,當(dāng)它終止時(shí)將立即被回收。未分離的線程終止后,需要通過pthread_detach或pthread_join進(jìn)行回收。線程回收將釋放所有系統(tǒng)或進(jìn)程資源,包括線程返回值的存儲(chǔ)空間、堆棧和寄存器狀態(tài)的內(nèi)存等。這些資源不再被其他線程訪問。

線程管理

線程管理在現(xiàn)代多線程應(yīng)用中起著關(guān)鍵作用。通過并行處理任務(wù),它可以顯著提高程序效率并優(yōu)化多核處理器資源的使用。允許在同一進(jìn)程中共享內(nèi)存和資源,提高數(shù)據(jù)交換和通信的效率,并增強(qiáng)應(yīng)用程序的響應(yīng)能力。

線程管理可以分為線程創(chuàng)建、線程終止和線程屬性。

創(chuàng)建線程:創(chuàng)建POSIX線程需要調(diào)用pthread_create()函數(shù),傳入一個(gè)線程標(biāo)識(shí)符指針、一個(gè)線程屬性指針(可以為空以使用默認(rèn)屬性)、一個(gè)線程函數(shù)指針和一個(gè)函數(shù)參數(shù)。函數(shù)創(chuàng)建成功時(shí)結(jié)果返回0,失敗時(shí)返回錯(cuò)誤號(hào);線程函數(shù)完成后,它通過返回void* value結(jié)束,或者可以被取消,允許它通過pthread_join()捕獲其退出狀態(tài)。

線程屬性:設(shè)置線程優(yōu)先級(jí)

這種優(yōu)先級(jí)配置不僅提高了系統(tǒng)處理關(guān)鍵任務(wù)的能力,還優(yōu)化了整體運(yùn)行效率和響應(yīng)時(shí)間,這是實(shí)時(shí)系統(tǒng)編程中的重要功能。

在POSIX線程規(guī)范中,線程優(yōu)先級(jí)允許用戶指定線程的執(zhí)行順序。用戶可以通過調(diào)用sched_get_priority_min和sched_get_priority_max來查詢系統(tǒng)支持的實(shí)時(shí)優(yōu)先級(jí)范圍,這通常適用于SCHED_FIFO(先進(jìn)先出)和SCHED_RR(輪詢調(diào)度)調(diào)度策略。

例如,在Linux中,實(shí)時(shí)優(yōu)先級(jí)的范圍通常是從1到99。要設(shè)置線程優(yōu)先級(jí),用戶需要選擇一個(gè)值,并使用sched_setscheduler系統(tǒng)調(diào)用將其應(yīng)用于線程或進(jìn)程。如果pid參數(shù)為0,則表示修改調(diào)用進(jìn)程的調(diào)度屬性。優(yōu)先級(jí)配置增強(qiáng)了系統(tǒng)處理關(guān)鍵任務(wù)的能力,提高了運(yùn)行效率和響應(yīng)時(shí)間,對(duì)于實(shí)時(shí)系統(tǒng)編程非常重要。

控制線程堆棧大?。涸赑OSIX線程中,合理設(shè)置線程堆棧大小對(duì)于優(yōu)化程序性能和內(nèi)存管理非常重要。

在Linux x86-32位系統(tǒng)中,線程的默認(rèn)堆棧大小為2MB;在64位IA-64架構(gòu)中,默認(rèn)大小為32MB。這些默認(rèn)值通常滿足大多數(shù)應(yīng)用程序的一般要求。開發(fā)人員可以通過pthread_attr_setstacksize()函數(shù)自定義線程堆棧大小,該函數(shù)需要兩個(gè)參數(shù):線程屬性對(duì)象的指針和要設(shè)置的堆棧大?。▎挝?字節(jié))。設(shè)置后,可以使用pthread_attr_getstacksize()函數(shù)檢查堆棧大小是否符合預(yù)期。設(shè)置堆棧大小時(shí),請(qǐng)確保它不低于系統(tǒng)的最小堆棧限制。系統(tǒng)支持的堆棧大小范圍可以通過調(diào)用sysconf(SC _ THREAD _ STACK _ MIN)來確認(rèn)。

可連接狀態(tài)(可接合狀態(tài)):在POSIX線程中,線程連接是一個(gè)進(jìn)程,其中一個(gè)線程通過pthread_join()函數(shù)暫停執(zhí)行,直到另一個(gè)特定線程結(jié)束。線程連接保證了在線程結(jié)束時(shí)可以及時(shí)回收資源,同時(shí)防止了因資源未回收而導(dǎo)致的僵尸線程現(xiàn)象。線程連接是線程同步的一個(gè)重要方面,它確保一個(gè)線程完成工作后,其他線程可以繼續(xù)安全執(zhí)行,實(shí)現(xiàn)有效的線程間協(xié)調(diào)和資源利用。這對(duì)于保持程序的運(yùn)行效率和系統(tǒng)資源的整體管理非常重要。

分離狀態(tài):在POSIX線程中,默認(rèn)情況下線程是可連接的。可以通過pthread_detach()函數(shù)設(shè)置線程分離,以便線程結(jié)束時(shí)不會(huì)留下任何要處理的資源。當(dāng)線程處于分離狀態(tài)時(shí),它會(huì)在執(zhí)行后自動(dòng)清理并釋放所有占用的資源,而無需其他線程的干預(yù)。一旦線程被設(shè)置為分離狀態(tài),任何對(duì)其使用pthread_join()的嘗試都將導(dǎo)致失敗。線程可以在其生命周期的任何階段設(shè)置為分離狀態(tài)。一旦設(shè)置,它將在任務(wù)完成后立即釋放所有資源。它消除了對(duì)pthread_join()的依賴,并使資源恢復(fù)更快。

線程ID:在POSIX線程中,每個(gè)線程都有一個(gè)唯一的標(biāo)識(shí)符,稱為線程ID。線程ID可用于查詢特定線程的狀態(tài),或管理線程之間的關(guān)系和數(shù)據(jù)交換。線程的創(chuàng)建和線程ID的獲取通常由pthread_create函數(shù)實(shí)現(xiàn),該函數(shù)填充一個(gè)pthread_t類型的變量,該變量唯一標(biāo)識(shí)進(jìn)程中的一個(gè)線程。同時(shí),線程ID可以幫助開發(fā)人員實(shí)現(xiàn)特定線程的特定操作,例如調(diào)整優(yōu)先級(jí)和設(shè)置親和力。

POSIX線程ID與特定于Linux的系統(tǒng)調(diào)用gettid()返回的線程ID不同。POSIX線程ID由線程庫實(shí)現(xiàn),負(fù)責(zé)分配和維護(hù)。gettid()返回的線程id是內(nèi)核(Kemel)分配的一個(gè)數(shù)字,它類似于ID(進(jìn)程ID。

CPU關(guān)聯(lián)性:在POSIX線程中,CPU親和力是指將線程綁定到特定CPU內(nèi)核的能力,以優(yōu)化線程的執(zhí)行效率和系統(tǒng)性能。CPU affinity通過減少線程在不同內(nèi)核之間的切換來降低緩存失效的可能性,從而提高CPU緩存的利用率??梢酝ㄟ^sched_setaffinity和sched_getaffinity的系統(tǒng)調(diào)用來設(shè)置和查詢此綁定。

終止線程:在POSIX thread中,通常通過執(zhí)行函數(shù)中的pthread_exit()或從函數(shù)中返回void*值來終止線程,這與main函數(shù)(main)以return結(jié)束的方式類似。此外,該線程還可以通過pthread_cancel()被其他線程強(qiáng)制終止,但需要注意的是,使用pthread_cancel()可能會(huì)導(dǎo)致線程無法執(zhí)行清理代碼,因此它可能不會(huì)釋放分配的資源或執(zhí)行必要的狀態(tài)更新。線程的終止將觸發(fā)資源的釋放,并允許其他線程通過pthread_join()捕獲它們的退出狀態(tài)。因此,一個(gè)線程終止后,其他線程可以繼續(xù)運(yùn)行,但進(jìn)程級(jí)的資源不會(huì)自動(dòng)釋放,需要通過適當(dāng)?shù)耐胶凸芾聿僮魇謩?dòng)回收資源。

線程終止后,其線程ID和返回值將被保留。如果線程被取消,其返回值為PTHREAD_CANCELED。您可以回收已終止線程的返回值并分離資源,以避免使用線程堆棧地址作為返回值來避免數(shù)據(jù)覆蓋。未分離的線程可以在終止后通過pthread_join進(jìn)行連接。像UNIX這樣的僵尸進(jìn)程必須顯式加入才能恢復(fù)它們的資源。

線程調(diào)度

線程調(diào)度是操作系統(tǒng)用來管理多個(gè)線程的執(zhí)行順序的一種機(jī)制。它允許設(shè)置調(diào)度策略來決定應(yīng)該首先執(zhí)行哪個(gè)線程。

調(diào)度策略:在Linux內(nèi)核中,調(diào)度策略是指內(nèi)核用來決定應(yīng)該執(zhí)行哪個(gè)線程的方法。這些策略包括完全公平調(diào)度器(CFS)和實(shí)時(shí)調(diào)度策略,旨在平衡系統(tǒng)性能和響應(yīng)時(shí)間,確保高優(yōu)先級(jí)任務(wù)獲得足夠的CPU時(shí)間,同時(shí)保持系統(tǒng)的整體效率。調(diào)度策略對(duì)于操作系統(tǒng)非常重要,因?yàn)樗鼈冎苯佑绊懴到y(tǒng)資源的分配和任務(wù)的執(zhí)行順序。POSIX定義了兩種實(shí)時(shí)調(diào)度策略:SCHED_FIFO(先進(jìn)先出)和SCHED_RR(輪詢)。這些策略確保在這些策略下運(yùn)行的進(jìn)程的優(yōu)先級(jí)始終高于標(biāo)準(zhǔn)分時(shí)策略下的進(jìn)程(由常量SCHED_OTHER標(biāo)識(shí))。

優(yōu)先級(jí)反轉(zhuǎn)問題:優(yōu)先級(jí)反轉(zhuǎn)是指低優(yōu)先級(jí)線程占用高優(yōu)先級(jí)線程所需的資源,導(dǎo)致高優(yōu)先級(jí)線程被迫等待的情況。在這樣的系統(tǒng)中,每個(gè)CPU都有一個(gè)單獨(dú)的運(yùn)行隊(duì)列,進(jìn)程只在每個(gè)CPU的運(yùn)行隊(duì)列中按優(yōu)先級(jí)排序。這個(gè)問題可能會(huì)嚴(yán)重影響系統(tǒng)的響應(yīng)時(shí)間和性能。Linux內(nèi)核通過實(shí)現(xiàn)優(yōu)先級(jí)繼承等機(jī)制來緩解優(yōu)先級(jí)反轉(zhuǎn)的影響,以確保系統(tǒng)能夠有效地管理線程之間的資源競爭。實(shí)時(shí)應(yīng)用程序通常使用CPU affinity)API來避免這種調(diào)度行為可能導(dǎo)致的問題。例如,在四處理器系統(tǒng)中,所有非關(guān)鍵進(jìn)程都可以隔離在單個(gè)CPU上,而其他三個(gè)CPU則保留給應(yīng)用程序。

線程本地存儲(chǔ):在POSIX線程中,線程本地存儲(chǔ)(TLS)允許線程擁有自己獨(dú)立的數(shù)據(jù)副本。即使同一程序中的不同線程訪問同一個(gè)全局變量,每個(gè)線程都有該變量的私有副本。這對(duì)于避免多線程環(huán)境中全局變量的同步問題非常有用。線程本地存儲(chǔ)由一組API函數(shù)實(shí)現(xiàn)。其中,pthread_key_create函數(shù)用于創(chuàng)建特殊密鑰。這些鍵使每個(gè)線程能夠綁定和存儲(chǔ)自己唯一的數(shù)據(jù)值。這些鍵及其相關(guān)數(shù)據(jù)在程序啟動(dòng)或線程創(chuàng)建時(shí)被初始化,每個(gè)鍵可以指定一個(gè)析構(gòu)函數(shù),以便在線程結(jié)束時(shí)自動(dòng)執(zhí)行數(shù)據(jù)清理??梢哉{(diào)用Pthread_setspecific來綁定值和特定的鍵,并且可以通過pthread_getspecific檢索綁定的數(shù)據(jù)。如果不再需要某個(gè)密鑰,請(qǐng)調(diào)用pthread_key_delete函數(shù)銷毀該密鑰,這樣可以避免將來出現(xiàn)潛在問題。根據(jù)POSIX標(biāo)準(zhǔn),至少可以同時(shí)創(chuàng)建和使用128個(gè)這樣的密鑰。

線程池:線程池是POSIX線程中預(yù)先創(chuàng)建和管理的線程的集合,用于限制并發(fā)線程的數(shù)量并重用線程以降低線程創(chuàng)建和銷毀的成本。應(yīng)用程序通過創(chuàng)建幾個(gè)線程并讓它們執(zhí)行任務(wù)隊(duì)列中的任務(wù)來實(shí)現(xiàn)線程池功能。線程池通常與工作隊(duì)列結(jié)合使用,工作隊(duì)列管理要處理的任務(wù),線程池中的線程負(fù)責(zé)執(zhí)行這些任務(wù)。這種組合方法優(yōu)化了任務(wù)的分配和執(zhí)行,提高了應(yīng)用程序的性能和響應(yīng)速度。

實(shí)時(shí)應(yīng)用

實(shí)時(shí)應(yīng)用程序是指需要及時(shí)響應(yīng)輸入的應(yīng)用程序。通常,該輸入來自外部傳感器或?qū)S幂斎朐O(shè)備,輸出采取控制某些外部硬件的形式。具有實(shí)時(shí)響應(yīng)要求的應(yīng)用示例包括自動(dòng)裝配線、銀行自動(dòng)取款機(jī)和飛機(jī)導(dǎo)航系統(tǒng)。

POSIX線程POSIX線程

POSIX線程在實(shí)時(shí)應(yīng)用中的應(yīng)用主要關(guān)注系統(tǒng)在指定的截止時(shí)間內(nèi)對(duì)輸入事件的可靠響應(yīng)。這種需求涉及從硬件輸入設(shè)備獲取數(shù)據(jù)和控制外部硬件,這需要操作系統(tǒng)的支持以確保及時(shí)的任務(wù)調(diào)度和執(zhí)行。盡管傳統(tǒng)的UNIX系統(tǒng)不是為實(shí)時(shí)應(yīng)用程序設(shè)計(jì)的,但Linux的實(shí)時(shí)變體和最近的內(nèi)核改進(jìn)正在增加對(duì)此類應(yīng)用程序的本機(jī)支持。

計(jì)時(shí)器和時(shí)間管理:計(jì)時(shí)器使流程能夠安排未來某個(gè)時(shí)間的通知。setitimer()系統(tǒng)調(diào)用可以建立一個(gè)在未來某個(gè)時(shí)間點(diǎn)到期的計(jì)時(shí)器,并可以選擇在此之后定期到期。對(duì)于周期性定時(shí)器的精度,盡管setitimer()使用的timeval結(jié)構(gòu)允許微秒級(jí)精度,但定時(shí)器的精度傳統(tǒng)上受到軟件時(shí)鐘頻率的限制。然而,在現(xiàn)代Linux內(nèi)核中,高分辨率定時(shí)器提供了比軟件時(shí)鐘頻率更高的精度。

資源鎖定:文件鎖定通常與文件I/O結(jié)合使用,但它也可以用作更通用的同步技術(shù)。Linux和許多其他UNIX實(shí)現(xiàn)還允許fcntl()記錄鎖成為強(qiáng)制性的,這意味著將檢查任何文件I/O操作,以確保它與文件上其他進(jìn)程持有的鎖兼容。

中斷管理:在處理SIGGTSTP信號(hào)時(shí),正確的方法是在信號(hào)處理程序中觸發(fā)更多的SIGGTSTP信號(hào)來停止進(jìn)程。如果信號(hào)處理程序需要在重新建立處理程序后執(zhí)行一些其他操作(例如保存或恢復(fù)全局變量中的值),但在返回之前,它需要再次阻塞SIGTSTP信號(hào)。

最小化延遲和抖動(dòng):盡管定時(shí)器精度受到軟件時(shí)鐘的限制,但在現(xiàn)代Linux內(nèi)核上,高分辨率定時(shí)器不受此限制,它可以達(dá)到硬件允許的最高精度,通常達(dá)到微秒級(jí)。

標(biāo)簽