![野火飛鳥嵌入式內(nèi)核實(shí)踐_第1頁](http://file4.renrendoc.com/view/64bb5fb0e75e3e84b6731052dbcaf63f/64bb5fb0e75e3e84b6731052dbcaf63f1.gif)
![野火飛鳥嵌入式內(nèi)核實(shí)踐_第2頁](http://file4.renrendoc.com/view/64bb5fb0e75e3e84b6731052dbcaf63f/64bb5fb0e75e3e84b6731052dbcaf63f2.gif)
![野火飛鳥嵌入式內(nèi)核實(shí)踐_第3頁](http://file4.renrendoc.com/view/64bb5fb0e75e3e84b6731052dbcaf63f/64bb5fb0e75e3e84b6731052dbcaf63f3.gif)
![野火飛鳥嵌入式內(nèi)核實(shí)踐_第4頁](http://file4.renrendoc.com/view/64bb5fb0e75e3e84b6731052dbcaf63f/64bb5fb0e75e3e84b6731052dbcaf63f4.gif)
![野火飛鳥嵌入式內(nèi)核實(shí)踐_第5頁](http://file4.renrendoc.com/view/64bb5fb0e75e3e84b6731052dbcaf63f/64bb5fb0e75e3e84b6731052dbcaf63f5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、前言3第一章內(nèi)核基礎(chǔ).系統(tǒng)結(jié)構(gòu)3內(nèi)核簡(jiǎn)介4內(nèi)核結(jié)構(gòu)5內(nèi)核的定位5內(nèi)核基礎(chǔ)5多任務(wù)機(jī)制5時(shí)鐘節(jié)拍6任務(wù)上下文6任務(wù)切換7任務(wù)調(diào)度7任務(wù)狀態(tài)7任務(wù)的時(shí)間片和優(yōu)先級(jí)7任務(wù)調(diào)度算法8系統(tǒng)資源8臨界代碼9可重入函數(shù)9任務(wù)同步、互斥和通訊9優(yōu)先級(jí)反轉(zhuǎn)9優(yōu)先級(jí)天花板和優(yōu)先級(jí)繼承111.3.15 死鎖12同步和異步12等待和喚醒機(jī)制12任務(wù)調(diào)度方式131.3.20 可搶占式內(nèi)核13第二章 任務(wù)管理與調(diào)度14多任務(wù)機(jī)制概述14多任務(wù)機(jī)制實(shí)現(xiàn)...62.2.7線程的結(jié)構(gòu)15線程的狀態(tài)15線程優(yōu)先級(jí)17線管理17線程函數(shù)1
2、8線程數(shù)據(jù)18線程隊(duì)列18線程調(diào)度機(jī)制19線程調(diào)度算法20第 1 頁 共 47 頁線程調(diào)度時(shí)機(jī)20線程調(diào)度步驟20線程管理...62.4.7線程初始化21線程激活21線程休眠21用戶級(jí)線程切換22線程優(yōu)先級(jí)設(shè)定22線程延時(shí)22線程掛起與解掛22第三章任務(wù)同步、互斥和通訊22IPC 機(jī)制介紹23信號(hào)量23二值信號(hào)量23計(jì)數(shù)信號(hào)量24互斥信號(hào)量.5 郵箱253.1.6 消息隊(duì)列253.17 事件集27IPC 通用機(jī)制設(shè)計(jì)28信號(hào)量設(shè)計(jì)實(shí)現(xiàn)2.23.3.3信號(hào)量結(jié)構(gòu)定義29信號(hào)量功能設(shè)計(jì)29信號(hào)量代碼分析3
3、03.4 互斥量設(shè)計(jì)實(shí)現(xiàn)30.23.4.3互斥量結(jié)構(gòu)定義31互斥量功能設(shè)計(jì)31互斥量代碼分析31郵箱設(shè)計(jì)實(shí)現(xiàn)32郵箱結(jié)構(gòu)定義32郵箱功能設(shè)計(jì)32郵箱代碼分析33消息隊(duì)列設(shè)計(jì)實(shí)現(xiàn)33消息隊(duì)列結(jié)構(gòu)定義34消息隊(duì)列功能設(shè)計(jì)34消息隊(duì)列代碼分析35事件集設(shè)計(jì)實(shí)現(xiàn)35事件集結(jié)構(gòu)定義35事件集功能設(shè)計(jì)35事件集代碼分析36第 章 時(shí)間管理364.1 內(nèi)核定時(shí)機(jī)制概述364.2定時(shí)器實(shí)現(xiàn)39第 2 頁 共 47 頁四定時(shí)器定義40定時(shí)器功能設(shè)計(jì)41定時(shí)器代碼分析4.24.2.3第五章 內(nèi)存管 理43內(nèi)存管理機(jī)制概述43動(dòng)態(tài)內(nèi)存管理實(shí)現(xiàn)445.3.1 內(nèi)存管理結(jié)構(gòu)定義455.
4、3.1 內(nèi)存管理功能設(shè)計(jì)465.3.1 內(nèi)存管理代碼分析46第六章設(shè)備管理46第七章內(nèi)核移植46附錄飛鳥內(nèi)核.47附錄飛鳥內(nèi)核代碼導(dǎo)讀47附錄 C飛鳥內(nèi)核編程手冊(cè)47附錄 D飛鳥內(nèi)核代碼注釋47前言第一章內(nèi)核基礎(chǔ)本章主要介紹操作系統(tǒng)和內(nèi)核的概念,闡明操作系統(tǒng)的整體結(jié)構(gòu)和概念,介紹章的內(nèi)核在系統(tǒng)的功能和在系統(tǒng)中所處的位置,為在以下各內(nèi)核分析和學(xué)習(xí)做好準(zhǔn)備。本章假設(shè)讀者已經(jīng)對(duì)系統(tǒng)有初步了解,不再介紹例如發(fā)展歷史、機(jī)制特點(diǎn)這些基本知識(shí)。1.1系統(tǒng)結(jié)構(gòu)目前常見的結(jié)構(gòu)可以分為輪詢系統(tǒng)、前系統(tǒng)和多任務(wù)系統(tǒng)。輪詢系統(tǒng)這是最簡(jiǎn)單的一種結(jié)構(gòu),主程序是一段無限循環(huán)的代碼,在循環(huán)中,逐個(gè)查詢各個(gè)條件,一旦滿足就執(zhí)行
5、相應(yīng)的操作,然后再次查詢其他條件并處理相應(yīng)的功能。第 3 頁 共 47 頁這種方案的好處是實(shí)現(xiàn)簡(jiǎn)單,邏輯清晰,便于開發(fā)掌握。但每種操作的時(shí)機(jī)是不確定的。因?yàn)榍懊娴牟僮魅绻麜r(shí)間較長(zhǎng),那么后面的操作必然會(huì)被延遲。如果需要查詢處理的IO 操作很多,因?yàn)?IO 的操作是很不確定的。并且由于數(shù)據(jù)的接收和處理都是在一個(gè)操作過處理的,在處理數(shù)據(jù)的時(shí)候,必然不能接收數(shù)據(jù)。前系統(tǒng)出于對(duì)輪詢系統(tǒng)的改進(jìn),前系統(tǒng)對(duì) IO 的處理做了優(yōu)化。前系統(tǒng)是由中斷驅(qū)動(dòng)的。主程序依然是一段無限循環(huán)的代碼,稱為程序,而其他的 IO 處理則由中斷來完成。在程序執(zhí)行的時(shí)候,如果有 IO 操作,則前臺(tái)的中斷程序打斷程序,完成必要的數(shù)據(jù)操作
6、之后,通知并且切換會(huì)來繼續(xù)操作。程序完成數(shù)據(jù)的最終處理。這種方案最顯而易見的好處是由于采用中斷方案,比輪詢系統(tǒng)響應(yīng)速度快。缺點(diǎn)則是需要考慮中斷的處理,并且中斷與主程序之間資源共享需要應(yīng)用來解決。雖然中斷程序可以盡快地響應(yīng) IO 操作,但是數(shù)據(jù)的處理依然有來完成,同樣需要循環(huán)的處理接收到的數(shù)據(jù)。從邏輯上講,數(shù)據(jù)的收集和處理初步分為兩個(gè)部分了。和前多任務(wù)系統(tǒng)系統(tǒng)相比,多任務(wù)系統(tǒng)在接收數(shù)據(jù)的時(shí)候,同樣由多個(gè)中斷處理程序完成的。但是對(duì)于接收到的數(shù)據(jù),是由多個(gè)任務(wù)來處理的。也就是說每個(gè)任務(wù)處理它所負(fù)責(zé)的數(shù)據(jù),如果有就處理,沒有就讓出處理器,讓別的任務(wù)來處理它所需要處理的數(shù)據(jù)。在多任務(wù)系統(tǒng)中,為了支撐多個(gè)
7、任務(wù)的運(yùn)行,相應(yīng)配套的功能得到提出,包括多任務(wù)、任務(wù)切換 共享資源 任務(wù)同步和互斥,任務(wù)通訊等。內(nèi)核的概念被提出了。不過這帶來了和處理器等資源的額外開銷。從數(shù)據(jù)處理的角度考慮,可以把整個(gè)流為數(shù)據(jù)接收和數(shù)據(jù)處理兩個(gè)階段。正是對(duì)著兩個(gè)階段的采用的不同技術(shù),才得以發(fā)展出這三種結(jié)構(gòu)方案。從這個(gè)發(fā)展路線可以明顯感覺到的就是解決問題的思路越來越清晰,結(jié)構(gòu)和層次越來越合理。以下是對(duì)三種結(jié)構(gòu)的比較通過比較,可以看出結(jié)構(gòu)的發(fā)展,但這并不能說明后來的技術(shù)就比先前的技術(shù)更普遍的適用于應(yīng)用的需求。每種方案都有它產(chǎn)生的年代、硬件資源的發(fā)展階段和所適合的應(yīng)用領(lǐng)域,這是技術(shù)的發(fā)展,也是針對(duì)于應(yīng)用方案的細(xì)分。1.2內(nèi)核簡(jiǎn)介操
8、作系統(tǒng)是一種用于系統(tǒng)的操作系統(tǒng)。它是系統(tǒng)的重要的組成部分,通常包括與硬件相關(guān)的底層驅(qū)動(dòng)、系統(tǒng)內(nèi)核、設(shè)備驅(qū)動(dòng)以及圖形用戶接口,文件系統(tǒng),網(wǎng)絡(luò)模塊等。操作系統(tǒng)具有通用操作系統(tǒng)的基本特點(diǎn)。但與通用操作系統(tǒng)相比第 4 頁 共 47 頁數(shù)據(jù)接收數(shù)據(jù)處理輪詢系統(tǒng)主程序主程序前系統(tǒng)前臺(tái)多個(gè)中斷程序單個(gè)主程序多任務(wù)系統(tǒng)多個(gè)中斷程序多個(gè)任務(wù)較,操作系統(tǒng)在系統(tǒng)實(shí)時(shí)性、硬件的依賴性、固態(tài)化以及應(yīng)用的性等方面具有較為突出的特點(diǎn)。操作系統(tǒng)處于硬件和應(yīng)用之間,負(fù)責(zé)管理硬件資源和向應(yīng)用提供服務(wù)。操作系統(tǒng)使的程序的設(shè)計(jì)和開發(fā)變得容易,不需要大的改動(dòng)就可以增加新的功能。通過將應(yīng)用程序分割成若干獨(dú)立的任務(wù)模塊,使應(yīng)用程序的設(shè)計(jì)過
9、程大為簡(jiǎn)化;而且對(duì)實(shí)時(shí)性要求苛刻的事件都得到了快速、可靠的處理。通過有效的系統(tǒng)服務(wù),更好的利用。實(shí)時(shí)操作系統(tǒng)使得系統(tǒng)資源得到1.2.1內(nèi)核結(jié)構(gòu)1.2.2內(nèi)核的定位操作系統(tǒng)在整個(gè)應(yīng)用中的位置如下圖所示:1.3內(nèi)核基礎(chǔ)內(nèi)核是操作系統(tǒng)的基礎(chǔ)部分,它主要包括任務(wù)管理、任務(wù)切換、任務(wù)同步、任務(wù)互斥、任務(wù)通訊、設(shè)備管理、中斷管理、時(shí)間管理、內(nèi)存管理等功能。像圖形用戶接口、文件系統(tǒng)、TCP/IP 協(xié)議、數(shù)據(jù)庫引擎等,則是屬于內(nèi)核層之上的功能模塊。因?yàn)槎嗳蝿?wù)內(nèi)核允許將具體的應(yīng)用系統(tǒng)分成若干個(gè)任務(wù)來管理,所以內(nèi)核可以簡(jiǎn)化應(yīng)用系統(tǒng)的設(shè)計(jì)。不過內(nèi)核將消耗部分處理器、代價(jià)。器等硬件資源。這是引入內(nèi)核機(jī)制的必要的關(guān)于內(nèi)
10、核,有很多常見的技術(shù)概念,熟悉這些知識(shí)是學(xué)習(xí)內(nèi)核的基礎(chǔ)。下面對(duì)其中一些重要的概念做詳細(xì)介紹。注意主要是以單處理器多任務(wù)來講解的,并且任務(wù)只是1.3.1 多任務(wù)機(jī)制在單處理器的計(jì)算機(jī)系統(tǒng)中,在某一具體時(shí)刻處理器只能運(yùn)行一個(gè)任務(wù),但是可以通過將處理器運(yùn)行時(shí)間分成小的時(shí)間段,多個(gè)任務(wù)按照一定的原則這些時(shí)間段的方流加載執(zhí)行各個(gè)任務(wù)的方法,從而使得在宏觀上看,有多個(gè)任務(wù)在處理器上同時(shí)執(zhí)行,這就是單處理器系統(tǒng)上的多任務(wù)機(jī)制的原理。如下圖所示:第 5 頁 共 47 頁圖 多任務(wù)機(jī)制演示另外,因?yàn)椴煌蝿?wù)的運(yùn)行路徑不同,在某一時(shí)刻有些任務(wù)可能需要等待一些資源,這時(shí)可以通過一定方式和策略,使得當(dāng)前任務(wù)讓出處理器
11、,從而避免因?yàn)槿蝿?wù)等待資源而長(zhǎng)期占有處理器,使得其他任務(wù)得以運(yùn)行。這樣多任務(wù)機(jī)制可以使處理器的利用率得到提高并提高了系統(tǒng)的響應(yīng)時(shí)間。在多任務(wù)操作系統(tǒng)內(nèi)核中,必須提供解決并發(fā)任務(wù)的機(jī)制。通用內(nèi)核一般以“進(jìn)程”、“線程”等為但在很多來管理用戶任務(wù)。在相關(guān)資料中,也會(huì)明確“進(jìn)程”與“線程”的區(qū)別。內(nèi)核中,并沒有區(qū)分進(jìn)程和線程,只是把整個(gè)內(nèi)核當(dāng)作一個(gè)大的運(yùn)行實(shí)體,其中運(yùn)行著很多任務(wù)。面曾說明過多任務(wù)系統(tǒng)是如何演化過來的。和前系統(tǒng)相比較,多任務(wù)可以理解為有多個(gè)程序的前系統(tǒng)。每個(gè)任務(wù)都專注自己處理,并通過一些技術(shù)方案來維持多個(gè)任務(wù)間的聯(lián)系。在系統(tǒng)中,任務(wù)通常被以進(jìn)程或者線程的方式來實(shí)現(xiàn),并且作為調(diào)度的基本
12、。關(guān)于多任務(wù)機(jī)制在這里就不多做解釋,很多中都詳細(xì)介紹過。1.3.2 時(shí)鐘節(jié)拍時(shí)鐘節(jié)拍是多任務(wù)系統(tǒng)的基礎(chǔ),它指明了以多大的頻率把處理器時(shí)間分割成固定長(zhǎng)度的時(shí)間段。作為多任務(wù)系統(tǒng)運(yùn)行的時(shí)間尺度,時(shí)鐘節(jié)拍是通過特定的硬件定時(shí)器產(chǎn)生的,硬件定時(shí)器產(chǎn)生周期的中斷,在相應(yīng)的中斷處理函數(shù)中,內(nèi)核代碼得以運(yùn)行,從而進(jìn)行任務(wù)調(diào)度和定時(shí)器時(shí)間處理等內(nèi)核工作。中斷之間的時(shí)間間隔取決于不同的內(nèi)核設(shè)計(jì),一般是毫秒級(jí)的。時(shí)鐘節(jié)拍越快,內(nèi)核函數(shù)介入系統(tǒng)運(yùn)行的幾率就大,中斷響應(yīng)次數(shù)越多,內(nèi)核消耗的處理器時(shí)間越長(zhǎng)。 相反,如果時(shí)鐘節(jié)拍太慢,則任務(wù)的切換間隔時(shí)間越長(zhǎng),進(jìn)而影響到系統(tǒng)的響應(yīng)效果。1.3.3 任務(wù)上下文任務(wù)可以看做是
13、用戶設(shè)定的應(yīng)用邏輯代碼在處理器等硬件上的運(yùn)行,是一個(gè)動(dòng)態(tài)的概念。任務(wù)在處理器上運(yùn)行的某一時(shí)刻,有它自己的狀態(tài),即在處理器所有的寄存器的數(shù)據(jù),第 6 頁 共 47 頁這個(gè)叫做任務(wù)的上下文,可以理解為是處理器的“寄存器數(shù)據(jù)快照”。通過這些數(shù)據(jù),內(nèi)核可以隨時(shí)打斷任務(wù)的運(yùn)行或者加載新的任務(wù),從而實(shí)現(xiàn)不同任務(wù)的切換運(yùn)行。1.3.4 任務(wù)切換任務(wù)切換又叫做任務(wù)上下文切換。當(dāng)內(nèi)核需要運(yùn)行其他的任務(wù)時(shí),內(nèi)核會(huì)保存處理器和當(dāng)前任務(wù)相關(guān)的寄存器的內(nèi)容到該任務(wù)的棧中,然后從將要運(yùn)行的任務(wù)的棧中取出全部寄存器內(nèi)容并加載到相關(guān)的寄存器中,從而開始下一個(gè)任務(wù)的運(yùn)行。這個(gè)過程叫做任務(wù)切換。簡(jiǎn)單的說,就是內(nèi)核保存當(dāng)前任務(wù)的上
14、下文,然后讀加載一個(gè)任務(wù)的上下文。任務(wù)切換過消耗部分處理器時(shí)間,但從系統(tǒng)整體上考慮,這樣的消耗是值得的。 任務(wù)切換過程如下圖所示:1.3.5 任務(wù)調(diào)度任務(wù)調(diào)度是內(nèi)核的主要功能之一,它完成在任務(wù)調(diào)度時(shí)機(jī)選擇合適的任務(wù),替換當(dāng)前任務(wù)占有處理器等硬件資源。根據(jù)調(diào)度原理的不同,任務(wù)調(diào)度主要分為搶占式多任務(wù)和分時(shí)式多任務(wù)模式。了解內(nèi)核會(huì)在什么時(shí)候發(fā)生調(diào)度是非常重要的。這些調(diào)度時(shí)機(jī)姑且稱之為調(diào)度點(diǎn)。一般來說,在時(shí)鐘節(jié)拍發(fā)生的時(shí)候、中斷響應(yīng)結(jié)束和系統(tǒng)調(diào)用結(jié)束之后,通常會(huì)發(fā)生任務(wù)調(diào)度;有些內(nèi)核也允許任務(wù)自身發(fā)起任務(wù)調(diào)度。這是和內(nèi)核的設(shè)計(jì)密切相關(guān)的。既然任務(wù)需要切換,那么就需要一個(gè)調(diào)度算法來決定在需要調(diào)度的時(shí)候
15、處理器應(yīng)該切換到哪一個(gè)任務(wù)上。一個(gè)任務(wù)調(diào)度算法有很多需要考慮的度、調(diào)度機(jī)制的公平性等。,比如任務(wù)的優(yōu)先級(jí)、時(shí)間片長(zhǎng)1.3.6 任務(wù)狀態(tài)在多任務(wù)的系統(tǒng)中,任務(wù)一般具有多種狀態(tài),反映任務(wù)不同的執(zhí)行階段。常見任務(wù)狀態(tài)主要有 3 種:就緒狀態(tài)運(yùn)行狀態(tài)等待狀態(tài)任務(wù)已經(jīng)獲得除處理器之外的一切需要的資源,等待任務(wù)調(diào)度任務(wù)正在運(yùn)行中,它得到了所有需要的資源任務(wù)缺少某些必須的運(yùn)行條件或資源而不能參與任務(wù)調(diào)度在不同的運(yùn)行條件下,任務(wù)的狀態(tài)可能會(huì)改變,任務(wù)狀態(tài)的變遷如下圖所示:1.3.7 任務(wù)的時(shí)間片和優(yōu)先級(jí)TODO 介紹時(shí)間片調(diào)度和優(yōu)先級(jí)調(diào)度時(shí)間片長(zhǎng)度是時(shí)鐘節(jié)拍的整數(shù)倍,指的是任務(wù)一次投入運(yùn)行,在不被搶占或者中斷
16、的情況下,能夠連續(xù)執(zhí)行的最長(zhǎng)時(shí)間(以時(shí)鐘節(jié)拍計(jì)數(shù))。第 7 頁 共 47 頁TODO 更詳細(xì)介紹時(shí)間片時(shí)間片的長(zhǎng)度由具體內(nèi)核規(guī)定,有些內(nèi)核中不同任務(wù)可以有不同的時(shí)間片長(zhǎng)度,或者是在運(yùn)行過可以動(dòng)態(tài)改變時(shí)間片長(zhǎng)度。任務(wù)的優(yōu)先級(jí)說明個(gè)任務(wù)的重要性,任務(wù)越重要,它的優(yōu)先級(jí)高,越應(yīng)該獲得處理器資源。任務(wù)優(yōu)先級(jí)的安排有兩種方式:靜態(tài)優(yōu)先級(jí)和動(dòng)態(tài)優(yōu)先級(jí)。如果任務(wù)優(yōu)先級(jí)在運(yùn)行的過不能改變,則稱為靜態(tài)優(yōu)先級(jí),這是在任務(wù)初始化時(shí)候決定的;反之如果任務(wù)優(yōu)先級(jí)是可以改變的,則稱為動(dòng)態(tài)優(yōu)先級(jí)。時(shí)間片和優(yōu)先級(jí)是任務(wù)的兩個(gè)重要參數(shù),分別描述了任務(wù)獲得處理器資源的能力高低和保持處理器時(shí)間長(zhǎng)短的能力。同時(shí)這兩者也是任務(wù)搶占的重
17、要參數(shù)。因任務(wù)時(shí)間片運(yùn)行完畢而引起的任務(wù)調(diào)度可以從另外的角度理解為是時(shí)間片搶占,而因?yàn)閮?nèi)核中最高就緒優(yōu)先級(jí)的變化而引起的調(diào)度則成為優(yōu)先級(jí)搶占。1.3.8 任務(wù)調(diào)度算法常見的任務(wù)調(diào)度機(jī)制主要有時(shí)間片輪轉(zhuǎn)調(diào)度算法(時(shí)分式)、優(yōu)先級(jí)調(diào)度算法(搶占式)和基于優(yōu)先級(jí)的時(shí)間片調(diào)度算法。 時(shí)間片調(diào)度算法指的是內(nèi)核先運(yùn)行某個(gè)任務(wù)一個(gè)時(shí)間片(多個(gè)時(shí)鐘節(jié)拍),然后再切換給另一個(gè)任務(wù)。這種算法保證每個(gè)任務(wù)都能夠輪流占有處理器一段時(shí)間。并且不是在每個(gè)時(shí)鐘節(jié)拍都做任務(wù)調(diào)度,對(duì)處理器資源的消耗又做到了最少。缺點(diǎn)是在任務(wù)占有處理器的時(shí)間段內(nèi),即是有更緊急任務(wù)就緒,也不能立刻執(zhí)行它。 優(yōu)先級(jí)調(diào)度算法指的是當(dāng)發(fā)生任務(wù)切換的時(shí)候
18、,內(nèi)核總是讓別的可運(yùn)行任務(wù)先運(yùn)行。即當(dāng)有任務(wù)的優(yōu)先級(jí)高于當(dāng)前任務(wù)優(yōu)先級(jí)并且就緒后,在下一個(gè)調(diào)度點(diǎn)就一定會(huì)發(fā)生任務(wù)調(diào)度,這種內(nèi)核最大的了系統(tǒng)的實(shí)時(shí)性。不好的地方是,當(dāng)多個(gè)就緒任務(wù)擁有相同的最高優(yōu)先級(jí)的時(shí)候,第一個(gè)就緒的任務(wù)將持續(xù)占有處理器資源直到任務(wù)結(jié)束或者阻塞,其他擁有最高優(yōu)先級(jí)的任務(wù)無法獲得運(yùn)行機(jī)會(huì)而導(dǎo)致任務(wù)饑餓。 基于優(yōu)先級(jí)的時(shí)間片調(diào)度算法,吸收了以上兩種算法的優(yōu)點(diǎn),同時(shí)又解決了它們的。這種算法為每個(gè)任務(wù)都安排了優(yōu)先級(jí)和時(shí)間片,不同優(yōu)先級(jí)的任務(wù)采用優(yōu)先級(jí)調(diào)度算法,相同優(yōu)先級(jí)使用時(shí)間片輪轉(zhuǎn)調(diào)度算法。任務(wù)調(diào)度策略首先考慮優(yōu)先級(jí),不同優(yōu)先級(jí)的任務(wù)中,不考慮時(shí)間片的,優(yōu)先級(jí)高的任務(wù)必定會(huì)搶占低優(yōu)先
19、級(jí)的任務(wù)。這樣既保證了盡快響應(yīng)緊急任務(wù),又保證相優(yōu)先級(jí)的任務(wù)都有機(jī)會(huì)輪流占有處理器。1.3.9 系統(tǒng)資源內(nèi)核和任務(wù)所使用的任何對(duì)象都可稱為資源,包括各種設(shè)備,甚至是內(nèi)存中的一個(gè)變量,只不過某些資源需要特殊對(duì)待,而有些則不需要過多考慮。比如,兩個(gè)任務(wù)都可以使用它,但使用它的時(shí)候,則需要單獨(dú),否則兩個(gè)任務(wù)各自輸出各自的數(shù)據(jù),結(jié)果打印結(jié)果就會(huì)是的;而任務(wù)所必需的內(nèi)存也是一種資源,但每個(gè)任務(wù)的變量則是私有的,不需考慮其它任務(wù)會(huì)對(duì)它有操作,也就不用進(jìn)行保護(hù)了。原則上,在使用資源的時(shí)候,只要有跨任務(wù)或者 ISR 的情況,必須特殊處理該資源。第 8 頁 共 47 頁多個(gè)任務(wù)共同使用的資源叫做共享資源。為了防
20、止,每個(gè)任務(wù)(包括內(nèi)核)在使用共享資源時(shí),必須通過內(nèi)核來申請(qǐng)而不是自己直接該資源。具體方法就是采用互斥等手段防止使用資源的時(shí)候發(fā)生(或者 LockFree 方式)。1.3.10 臨界代碼代碼的臨界段也稱為臨界區(qū),它意味著這段代碼是關(guān)鍵的操作,一旦開始運(yùn)行之后就不允許任何理由來打斷(主要指的是各種中斷會(huì)打斷當(dāng)前任務(wù)的執(zhí)行路徑)。為確保臨界段代碼的執(zhí)行,在單處理器系統(tǒng)中,在進(jìn)入臨界段之前要關(guān)中斷,在臨界段代碼執(zhí)行完以后要立即開中斷。 注意關(guān)閉系統(tǒng)中斷,會(huì)暫停對(duì)外設(shè)的響應(yīng),影響外部事件的處理,關(guān)中斷時(shí)間越長(zhǎng),對(duì)系統(tǒng)吞吐量影響越大。關(guān)閉中斷的時(shí)間越短越好,這也是內(nèi)核好壞的重要指標(biāo)之一。1.3.11 可
21、重入函數(shù)在多任務(wù)環(huán)境中,可重入的函數(shù)可以理解為是可以被多個(gè)任務(wù)同時(shí)調(diào)用、可以隨時(shí)被打斷并且當(dāng)恢復(fù)運(yùn)行后仍然能保證它所使用數(shù)據(jù)的正確性的函數(shù)。從具體代碼實(shí)現(xiàn)上來看,這是因?yàn)榭芍厝胄秃瘮?shù)只使用局部變量(保存在處理器寄存器中或任務(wù)棧中)或者已經(jīng)被互斥保護(hù)過的全局變量。從執(zhí)行結(jié)果上看,只要輸入數(shù)據(jù)相同,可重入函數(shù)就會(huì)產(chǎn)生相同的結(jié)果。下圖是一個(gè)不可重入函數(shù)在運(yùn)行時(shí)的內(nèi)存使用情況:從中可以看出,假如任務(wù) A 執(zhí)行了函數(shù) count(),那么在任務(wù) A 的棧中將存在函數(shù)局部變量 x 和 y,而對(duì)于全局變量 R 的地址則是在全局?jǐn)?shù)據(jù)區(qū)。對(duì)于任務(wù) B 來說它的內(nèi)存使用情況同樣如此。如果任務(wù) A 在執(zhí)行完第 4
22、行代碼的時(shí)候因?yàn)橐恍┰虮粨屨?,而任?wù) B 隨后又調(diào)用函數(shù) count(),那么此時(shí)對(duì)于全局變量 R 的數(shù)值是,對(duì)全局?jǐn)?shù)據(jù)區(qū)的變量 R 的并發(fā)將產(chǎn)生錯(cuò)誤的結(jié)果。1.3.12 任務(wù)同步、互斥和通訊任務(wù)和任務(wù)之間、中斷處理函數(shù)和任務(wù)之間是有數(shù)據(jù)傳遞的,這些數(shù)據(jù)或者是結(jié)構(gòu)化的數(shù)據(jù)或者是無結(jié)構(gòu)的數(shù)據(jù)。前者一般是通過消息隊(duì)列/郵箱機(jī)制實(shí)現(xiàn)的,而后者是通過管道機(jī)制實(shí)現(xiàn)的。1.3.13 優(yōu)先級(jí)反轉(zhuǎn)在系統(tǒng)中,有些資源必須是獨(dú)占使用的,否則多個(gè)任務(wù)對(duì)這樣的資源的并發(fā)將導(dǎo)致第 9 頁 共 47 頁錯(cuò)誤的發(fā)生。一般來說,對(duì)需要獨(dú)占使用的資源必須使用互斥來將對(duì)其的并發(fā)串行化。而互斥方案的引入,又會(huì)導(dǎo)致任務(wù)優(yōu)先級(jí)反轉(zhuǎn):
23、低優(yōu)先級(jí)的任務(wù)占有資源,這時(shí)有高優(yōu)先級(jí)的任務(wù)申請(qǐng)資源,因?yàn)椴荒軡M足而被掛起了,即低優(yōu)先級(jí)任務(wù)阻塞了高優(yōu)先級(jí)任務(wù)的運(yùn)行。假如這時(shí)又有一個(gè)中優(yōu)先級(jí)任務(wù),那么它會(huì)把低優(yōu)先級(jí)任務(wù)搶占。最終高優(yōu)先級(jí)任務(wù)會(huì)間接的被優(yōu)先級(jí)低于它的中優(yōu)先級(jí)任務(wù)搶占了。這種高優(yōu)先級(jí)任務(wù)需要等待低優(yōu)先級(jí)任務(wù)明:資源,而低優(yōu)先級(jí)任務(wù)又正在等待中等優(yōu)先級(jí)任務(wù)的現(xiàn)象叫做優(yōu)先級(jí)反轉(zhuǎn)。舉例說假如 ABC 三個(gè)線程優(yōu)先級(jí)從高到底排列,線程 A 和C 共享互斥信號(hào)量 M,如果某一時(shí)刻線程 C 已經(jīng)獲得互斥信號(hào)量 M,而線程 A 此時(shí)嘗試鎖定 M,那么線程 A 會(huì)因?yàn)榈貌坏?M 而阻塞在 M 的線程等待隊(duì)列中,再假設(shè)此時(shí)線程 B 因?yàn)閮?yōu)先級(jí)高于
24、線程 C 從而搶占了 C,進(jìn)而長(zhǎng)期占有處理器資源,那么就相當(dāng)于低優(yōu)先級(jí)的線程 B 間接阻塞了高優(yōu)先級(jí)的線程 A 的運(yùn)行。這個(gè)過程可以用下圖來說明:T0 時(shí)刻,只有任務(wù) C 處于可運(yùn)行狀態(tài),運(yùn)行過,任務(wù) C 獲得了獨(dú)占資源 R;T1 時(shí)刻,任務(wù) A 就緒進(jìn)入可運(yùn)行狀態(tài),由于優(yōu)先級(jí)高于正在運(yùn)行的 Thread C,所以它搶占了 Thread C, Thread A 被調(diào)度執(zhí)行;T2 時(shí)刻,任務(wù) A 需要獨(dú)占資源 R,但 R 被更低優(yōu)先級(jí)的任務(wù) C 所擁有,所以任務(wù) A被掛起等待該資源。任務(wù) C 繼續(xù)運(yùn)行。T3 時(shí)刻,此時(shí)任務(wù) B 就緒,因?yàn)槿蝿?wù) B 的優(yōu)先級(jí)高于任務(wù) C,所以任務(wù) B 搶占任務(wù)C,
25、任務(wù)B 得到處理器資源?,F(xiàn)在看看這些任務(wù)的情況:任務(wù) A 優(yōu)先級(jí)最高,但是因?yàn)榈貌坏劫Y源 R 而阻塞,任務(wù) C 占有資源 R 但是優(yōu)先級(jí)低于任務(wù) B,所以也無法運(yùn)行。任務(wù) B 不需要任何資源并且是就緒任務(wù)的最高優(yōu)先級(jí),所以只有它在運(yùn)行。從整體上看,高優(yōu)先級(jí)任務(wù) A 被低優(yōu)先級(jí)任務(wù) B間接的搶占了。此時(shí)優(yōu)先級(jí)最高的任務(wù) A 不僅要等優(yōu)先級(jí)低的任務(wù) B 運(yùn)行完,還要等優(yōu)先級(jí)更低的任務(wù) C 運(yùn)行完之后才能被調(diào)度,如果任務(wù) B 和任務(wù)C 需要執(zhí)行很長(zhǎng)時(shí)間,那么任務(wù) A的響應(yīng)就不能保證,整個(gè)系統(tǒng)的實(shí)時(shí)性能就很差了。優(yōu)先級(jí)翻轉(zhuǎn)現(xiàn)象對(duì)于分時(shí)調(diào)度系統(tǒng)的影響不大,但是對(duì)于基于優(yōu)先級(jí)調(diào)度的實(shí)時(shí)系統(tǒng)則有很大的影響。
26、在基于優(yōu)先級(jí)調(diào)度的系統(tǒng)中,處理器資源是按照優(yōu)先級(jí)分配給任務(wù)的,就緒的高優(yōu)先級(jí)任務(wù)必須實(shí)時(shí)的得到處理器。另外系統(tǒng)中的其他各種資源,如果采用按照任務(wù)優(yōu)第 10 頁 共 47 頁先級(jí)分配的原則,那么在某資源的任務(wù)等待隊(duì)列中,高優(yōu)先級(jí)的任務(wù)應(yīng)該是首先被關(guān)注的。優(yōu)先級(jí)反轉(zhuǎn)則將打亂這些原則。優(yōu)先級(jí)翻轉(zhuǎn)是由來已久型的一個(gè)優(yōu)先級(jí)翻轉(zhuǎn)引起,自從出現(xiàn)多任務(wù)系統(tǒng)后,就一直困擾著開發(fā),很典是在 1997 年 7 月探路者火星車(Pathfinder)發(fā)生的在火星表面不停重啟的故障,讀者如果有的話可以自己去找些資料看看。1.3.14 優(yōu)先級(jí)天花板和優(yōu)先級(jí)繼承優(yōu)先級(jí)反轉(zhuǎn)問題的原因在于獨(dú)占資源的規(guī)則,即只能被一個(gè)資源占用,
27、被占用后其它任務(wù)不能強(qiáng)迫占有該資源的任務(wù)放棄這個(gè)資源。在優(yōu)先級(jí)反轉(zhuǎn)問題上,高優(yōu)先級(jí)任務(wù)被低優(yōu)先級(jí)任務(wù)阻塞是必定的,但被中優(yōu)先級(jí)阻塞則是很無奈的。為了避免因?yàn)橹袃?yōu)先級(jí)任務(wù)挾持低優(yōu)先級(jí)任務(wù)從而要挾高優(yōu)先級(jí)任務(wù)的現(xiàn)象,可以采用一些必要的算法。常見的算法是優(yōu)先級(jí)繼承協(xié)議和優(yōu)先級(jí)天花板協(xié)議。優(yōu)先級(jí)繼承協(xié)議指的是當(dāng)一個(gè)任務(wù)占有了資源并且隨后阻塞了其他申請(qǐng)?jiān)撡Y源的任務(wù)的時(shí)候,該任務(wù)將臨時(shí)改變它的優(yōu)先級(jí)為所有申請(qǐng)?jiān)撡Y源的任務(wù)的最高的優(yōu)先級(jí)。并以這個(gè)臨時(shí)優(yōu)先級(jí)在臨界區(qū)執(zhí)行。當(dāng)任務(wù)資源后,則恢復(fù)它原有的優(yōu)先級(jí)。從行為上看,占有資源的任務(wù)的優(yōu)先級(jí)將是“水漲船高”式的多次改變,因?yàn)樗膬?yōu)先級(jí)最高,所以它將不被曾經(jīng)比它
28、優(yōu)先級(jí)高的那些任務(wù)的搶占。內(nèi)核從優(yōu)先級(jí)角度安排它盡快執(zhí)行,盡快資源,為了盡快調(diào)度被低優(yōu)先級(jí)任務(wù)阻塞的高優(yōu)先級(jí)任務(wù)。但是這樣做內(nèi)核卻犧牲了中等優(yōu)先級(jí)任務(wù)的調(diào)度機(jī)會(huì)。兩種經(jīng)典的防止反轉(zhuǎn)的方法:優(yōu)先級(jí)繼承策略(Priority inheritance):繼承現(xiàn)有被阻塞任務(wù)的最高優(yōu)先級(jí)作為其優(yōu)先級(jí),任務(wù)退出臨界區(qū),恢復(fù)初始優(yōu)先級(jí)。優(yōu)先級(jí)天花板策略(Priority ceilings): 優(yōu)先級(jí)天花板是指將申請(qǐng)(占有)某資源的任務(wù)的優(yōu)先級(jí)到可能該資源的所有任務(wù)中最高優(yōu)先級(jí)任務(wù)的優(yōu)先級(jí).(這個(gè)優(yōu)先級(jí)稱為該資源的優(yōu)先級(jí)天花板)第 11 頁 共 47 頁優(yōu)先級(jí)繼承策略對(duì)任務(wù)執(zhí)行流程的影響相對(duì)較小,因?yàn)橹挥挟?dāng)高
29、優(yōu)先級(jí)任務(wù)申請(qǐng)已被低優(yōu)先級(jí)任務(wù)占有的臨界資源這一事實(shí)發(fā)生時(shí),才抬升低優(yōu)先級(jí)任務(wù)的優(yōu)先級(jí)。而天花板策略是誰占有就直接升到最高。形象一些說,優(yōu)先級(jí)繼承協(xié)議是“水漲船高”,而優(yōu)先級(jí)天花板協(xié)議則是“一次到位”.1.3.15 死鎖指多個(gè)任務(wù)無限期地互相等待彼此占有的資源,從而形成了閉合的等待鏈。設(shè)任務(wù) T1正獨(dú)享資源 R1,任務(wù) T2 在獨(dú)享資源 T2,而此時(shí) T1 又要獨(dú)享 R2,T2 也要獨(dú)享 R1,于是哪個(gè)任務(wù)都沒法繼續(xù)執(zhí)行了,發(fā)生了死鎖。最簡(jiǎn)單的防止發(fā)生死鎖的方法是讓每個(gè)任務(wù)都:先得到全部需要的資源再做下一步的工作用同樣的順序去申請(qǐng)多個(gè)資源資源時(shí)使用相反的順序內(nèi)核大多允許用戶在申請(qǐng)資源時(shí)規(guī)定一個(gè)
30、等待時(shí)限,一旦時(shí)限到達(dá)則立刻返回申請(qǐng)操作超時(shí)失敗的錯(cuò)誤碼,以此解除死鎖。1.3.16 同步和異步1.3.17 等待和喚醒機(jī)制當(dāng)任務(wù)在試圖資源的時(shí)候,有時(shí)候資源條件而被迫返回失敗值或者進(jìn)入該資源的等待隊(duì)列。而當(dāng)有任務(wù)資源從而使得資源條件可以滿足時(shí),內(nèi)核將會(huì)喚醒該資源的等待任務(wù),使得被喚醒任務(wù)繼續(xù)運(yùn)行。不同的等待機(jī)制和喚醒機(jī)制是不同內(nèi)核的重要區(qū)別。用于任務(wù)資源的等待機(jī)制主要包括直接返回、阻塞等待、時(shí)限等待三種: 在直接返回模式下,任務(wù)直接返回結(jié)果,或者成功或者失敗,沒有其他操作或第 12 頁 共 47 頁者結(jié)果; 在阻塞等待模式下,任務(wù)如果得不到資源,則進(jìn)入該資源的等待隊(duì)列,直到得到該資源為止;
31、在時(shí)限等待模式下,任務(wù)如果得不到資源,則進(jìn)入等待狀態(tài)并開始計(jì)時(shí)。如果在等待期間得到了資源則返回操作成功;如果當(dāng)計(jì)時(shí)結(jié)束的時(shí)候任務(wù)仍然沒有得到資源,那么它并不會(huì)繼續(xù)等下去,而是返回失敗的結(jié)果。當(dāng)任務(wù)不能獲得資源而進(jìn)入資源的等待隊(duì)列之后,如果某個(gè)時(shí)刻資源可用,那么內(nèi)核就該決定怎么處理這些等待任務(wù)。這就涉及到了內(nèi)核任務(wù)喚醒機(jī)制。內(nèi)核喚醒機(jī)制主要有的三種模型: 當(dāng)資源可以可使用時(shí),喚醒該資源的全部等待任務(wù)。讓這些任務(wù)與系統(tǒng)中的其他任務(wù)競(jìng)爭(zhēng)資源。這種策略會(huì)使系統(tǒng)瞬間繁忙,在參與競(jìng)爭(zhēng)資源的所有任務(wù)中,最終只有一個(gè)任務(wù)獲取到資源,沒有得到資源的任務(wù)將再次進(jìn)入資源的等待隊(duì)列。 將該資源等待隊(duì)列中的一個(gè)合適的任
32、務(wù)喚醒。這個(gè)任務(wù)將和系統(tǒng)中可能該資源的其他任務(wù)一起競(jìng)爭(zhēng)這個(gè)資源。如果這個(gè)任務(wù)最終沒有競(jìng)爭(zhēng)到資源,它會(huì)再次進(jìn)入該資源的等待隊(duì)列。 內(nèi)核從等待隊(duì)列中直接找到一個(gè)最佳的任務(wù)并立刻把資源交給它,這樣該任務(wù)直接從資源的那個(gè)任務(wù)那里獲得資源。目前主流實(shí)時(shí)內(nèi)核都采用第三種方案。1.3.18 任務(wù)調(diào)度方式任務(wù)調(diào)度方式可分為可搶占調(diào)度和不可搶占式調(diào)度兩類。對(duì)于基于優(yōu)先級(jí)的系統(tǒng)而言,可搶占型調(diào)度是指內(nèi)核可以搶占正在運(yùn)行任務(wù)的 CPU 使用權(quán)并將使用權(quán)交給進(jìn)入就緒態(tài)的優(yōu)先級(jí)更高的任務(wù),是內(nèi)核搶了 CPU 讓別的任務(wù)運(yùn)行。不可搶占型調(diào)度使用某種算法并決定讓某個(gè)任務(wù)運(yùn)行后,就把 CPU 的控制權(quán)完全交給了該任務(wù),直到它
33、主動(dòng)將 CPU 控制權(quán)還回來。某些內(nèi)核操作或者中斷處理程序可以激活一個(gè)休眠態(tài)的任務(wù),使之進(jìn)入就緒態(tài);但任務(wù)還不能運(yùn)行,一直要等到當(dāng)前運(yùn)行的任務(wù)主動(dòng)把處理器的控制權(quán)交給它??蓳屨夹驼{(diào)度的實(shí)時(shí)性好,優(yōu)先級(jí)高的任務(wù)只要具備了運(yùn)行的條件,也就是說進(jìn)入了就緒態(tài),就可以立即運(yùn)行。除了優(yōu)先級(jí)最高的任務(wù),其他任務(wù)在運(yùn)行過都可能隨時(shí)被比它優(yōu)先級(jí)高的任務(wù)搶占,讓后者運(yùn)行。通過這種方式的任務(wù)調(diào)度保證了系統(tǒng)的實(shí)時(shí)性。1.3.20 可搶占式內(nèi)核內(nèi)核也是分為可搶占內(nèi)核和不可搶占式內(nèi)核兩種,這和任務(wù)的可搶占式調(diào)度是不一樣的。搶占式內(nèi)核指的是在任務(wù)執(zhí)行內(nèi)核操作的時(shí)候,仍然是可搶占的調(diào)度。那些不可搶占的內(nèi)核,在內(nèi)核進(jìn)行操作的時(shí)
34、候是不能被搶占調(diào)度的。第 13 頁 共 47 頁第二章 任務(wù)管理與調(diào)度2.1 多任務(wù)機(jī)制概述面曾說明過多任務(wù)系統(tǒng)是如何演化過來的。和前系統(tǒng)相比較,多任務(wù)可以理解為有多個(gè)程序的前系統(tǒng)。每個(gè)任務(wù)都專注自己處理,并通過一些技術(shù)方案來維持多個(gè)任務(wù)間的聯(lián)系。在系統(tǒng)中,任務(wù)通常被以進(jìn)程或者線程的方式來實(shí)現(xiàn),并且作為調(diào)度的基本。關(guān)于多任務(wù)機(jī)制在這里就不多做解釋,很多中都詳細(xì)介紹過。2.2 多任務(wù)機(jī)制實(shí)現(xiàn)在飛鳥內(nèi)核目前的版本中,沒有明確提供進(jìn)程機(jī)制,而是以線程來代表用戶任務(wù),線程同時(shí)作為資源分配和任務(wù)調(diào)度的基本。從整體上考慮,可以把內(nèi)核和用戶任務(wù)看作是一個(gè)大的進(jìn)程,而整個(gè)系統(tǒng)內(nèi)則有多個(gè)用戶線程。飛鳥內(nèi)核是基于
35、輕量級(jí)多線程的多任務(wù)系統(tǒng)。也就是上面所講的單進(jìn)程多線程的任務(wù)模型。在內(nèi)核中,某一時(shí)刻,可能會(huì)有多個(gè)線程同時(shí)處于就緒與運(yùn)行狀態(tài),內(nèi)核必須決定某個(gè)時(shí)刻應(yīng)該執(zhí)行那個(gè)線程,調(diào)度算法是內(nèi)核的關(guān)鍵特性。程調(diào)度部分,需要注意有幾個(gè)可能發(fā)生線程調(diào)度的時(shí)機(jī)和可能引起內(nèi)核調(diào)度的函數(shù),這是了解內(nèi)核線程調(diào)度的關(guān)鍵問題。一般來說,線程調(diào)度分為用戶級(jí)線程調(diào)度和中斷級(jí)線程調(diào)度??梢赃@樣對(duì)飛鳥內(nèi)核的線程模型做個(gè)簡(jiǎn)要的歸納:線程指得是任務(wù)邏輯代碼在處理器上執(zhí)行的過程。它是內(nèi)核調(diào)度的基本,也是資源分配的基本。線程對(duì)象由線程結(jié)構(gòu)、線程堆棧、線程函數(shù)和線程數(shù)據(jù)等部分組成。線程具有多種運(yùn)行狀態(tài),由內(nèi)核中的各種線程隊(duì)列組織管理。飛鳥內(nèi)核
36、的線程管理功能,主要包括:線程創(chuàng)建和刪除(CreateDelete)線程激活和休眠(ActivateDormant)線程掛起和喚醒掛(SuspendResume)線程調(diào)度(YieldSchedule)線程延時(shí)(Delay)線程優(yōu)先級(jí)管理(Set Priority)第 14 頁 共 47 頁2.2.1 線程的結(jié)構(gòu)飛鳥內(nèi)核是通過線程結(jié)構(gòu)管理所有線程的,每個(gè)線程都存在一個(gè)線程結(jié)構(gòu)。線程結(jié)構(gòu)定義在 includekernelthread.h 中,其中保存著用于管理線程的全部數(shù)據(jù)信息。線程結(jié)構(gòu)是內(nèi)核中的一種 數(shù)據(jù)結(jié)構(gòu),決定了內(nèi)核的很多特點(diǎn)。飛鳥內(nèi)核當(dāng)前版本(v0.1.0)的線程結(jié)構(gòu)結(jié)構(gòu)定義如下:type
37、def struct ThreadDef/* 線程 ID/* 線程堆棧棧底指針/* 線程堆棧棧頂指針/* 線程狀態(tài)/* 線程當(dāng)前優(yōu)先級(jí)TThreadID ThreadID; TStackAddr StackBase; TStackAddr StackTop;TThreadS us S us;*/*/*/*/*/*/*/*/*/TThreTThreriority Priority;riority BasePriority; /* 線程基本優(yōu)先級(jí)TWord TimeTicks; TWord TimeSlice;TThreadQueue* Queue;/* 時(shí)間片中下的 ticks 數(shù)目/* 時(shí)間片
38、長(zhǎng)度(ticks 數(shù)目)/* 線程所屬線程隊(duì)列指針#if (TCL_IPC_ENABLE)TIPCData IPCData; TIPCThreadQueue* IPCQueue;#endif/* 線程互斥、同步、通訊的控制結(jié)構(gòu) */* 線程所屬 IPC 線程隊(duì)列指針*/#if (TCL_TIMER_ENABLE)TTimer Timer; #endif/* 線程自帶定時(shí)器*/TLinkN TThread;inkNode;/* 進(jìn)程所在隊(duì)列的兄弟進(jìn)程的指針*/2.2.2 線程的狀態(tài)線程由于不同的代碼執(zhí)行路徑,可能會(huì)處于不同的狀態(tài),這些狀態(tài)之間并不都是可以互相轉(zhuǎn)化的。飛鳥內(nèi)核中的線程主要包括以下這
39、些狀態(tài):/* 線程狀態(tài)定義 */ typedef enumExThreadDormant = 0, ExThreadReady, ExThreadBlocked,ExThreadDelayed,/* 休眠*/* 就緒 & 運(yùn)行 */* 阻塞/* 延時(shí)*/*/第 15 頁 共 47 頁ExThreadSuspended TThreadS us;/* 就緒掛起*/飛鳥內(nèi)核的線程狀態(tài)遷移圖,如下所示。Blocked阻塞DORMANT休眠Ready/Run ning 就緒或運(yùn)行Suspend掛起Delayed延時(shí)線程創(chuàng)建之后就處于休眠狀態(tài),此時(shí)它置于線程輔助隊(duì)列中,等待內(nèi)核激活它。激活后的線程轉(zhuǎn)為就緒
40、狀態(tài),置于線緒隊(duì)列中。等待內(nèi)核調(diào)度它。一旦它被內(nèi)核選中并調(diào)度運(yùn)行,就處于運(yùn)行狀態(tài)(飛鳥內(nèi)核沒有真正設(shè)置一個(gè)“運(yùn)行狀態(tài)”,而是繼續(xù)以就緒態(tài)代表正在運(yùn)行中的線程的狀態(tài))。處于運(yùn)行狀態(tài)的線程保持緒隊(duì)列中。內(nèi)核中某一時(shí)刻可以有多個(gè)線程出于就緒狀態(tài),但只有一個(gè)線程處于運(yùn)行狀態(tài)。程運(yùn)行過,經(jīng)常被內(nèi)核時(shí)鐘中斷打斷,此時(shí)內(nèi)核根據(jù)線程優(yōu)先級(jí)和當(dāng)前線程的時(shí)間片來決定內(nèi)核中哪個(gè)線程應(yīng)該得到運(yùn)行的機(jī)會(huì):假更高優(yōu)先級(jí)的線緒,則內(nèi)核會(huì)調(diào)度高優(yōu)先級(jí)線程;如果當(dāng)前線程的時(shí)間片用完,內(nèi)核則選擇其它的線程來運(yùn)行。如果是優(yōu)先級(jí)搶占,那么當(dāng)前線被搶占,仍然保持在就緒隊(duì)列;如果是時(shí)間片搶占,則當(dāng)前線程的時(shí)間片還會(huì)被恢復(fù)初始的數(shù)值。綜上
41、所述,不同優(yōu)先級(jí)的就緒線通過優(yōu)先級(jí)來實(shí)現(xiàn)搶占,相同優(yōu)先級(jí)線則是通過時(shí)間片來實(shí)現(xiàn)搶占。另外,如果線程嘗試某些資源但是由于某些原因而沒能夠得到,根據(jù)規(guī)則,如果是不阻塞的方式,那么線程返回后繼續(xù)運(yùn)行;如果是阻塞方式的,那么線會(huì)第 16 頁 共 47 頁被內(nèi)核阻塞在該資源的線程阻塞隊(duì)列上(每個(gè)擁有線程阻塞特性的資源都存在一個(gè)線程阻塞隊(duì)列,用來保存那些希望得到資源但又不能得到資源的線程)。隨后,內(nèi)核發(fā)起線程調(diào)度,使得當(dāng)前線程放棄處理器,并將處理器交給其它線程。程資源的時(shí)候,假如該資源的線程阻塞隊(duì)列上有線程等待該資源,那么當(dāng)前線會(huì)通過內(nèi)核喚醒這些等待線的一個(gè)線程,并使它得到該資源,隨后內(nèi)核將該線程加入內(nèi)核
42、中的線緒隊(duì)列。此時(shí)因?yàn)橛行碌木€程可以運(yùn)行,所以此時(shí)當(dāng)前線程通過內(nèi)核嘗試發(fā)起線程調(diào)度。但是這樣也只是給了新線程一個(gè)參與競(jìng)爭(zhēng)處理器資源的機(jī)會(huì),但不一定保證新線程能夠得到處理器。線程調(diào)用延時(shí)函數(shù)的時(shí)候,線程首先將自置于延時(shí)狀態(tài)并且加入內(nèi)核延時(shí)線程隊(duì)列,然后開啟自己的線程定時(shí)器。因?yàn)樵诘却〞r(shí)結(jié)束的這段時(shí)間里,當(dāng)前線程不再參與內(nèi)核線程調(diào)度,所以此時(shí)也需要進(jìn)行一次線程調(diào)度。處于就緒或者運(yùn)行的線程被加以懸掛操作之后,就直接轉(zhuǎn)為懸掛狀態(tài),此時(shí)被懸掛的線從線緒隊(duì)列轉(zhuǎn)到線程輔助隊(duì)列。2.2.3 線程優(yōu)先級(jí)線程的優(yōu)先級(jí)線程任務(wù)的重要性,它決定線獲得調(diào)度機(jī)會(huì)上的能力,原則上越是緊急的任務(wù),它獲得處理的機(jī)會(huì)就越高。飛
43、鳥內(nèi)核采用的是動(dòng)態(tài)優(yōu)先級(jí)機(jī)制。每個(gè)線程都擁有自己的優(yōu)先級(jí),優(yōu)先級(jí)的范圍是 031,數(shù)值越小說明優(yōu)先級(jí)越高。不同線程可以擁有不同的優(yōu)先級(jí),也可以擁有相同的優(yōu)先級(jí)。用戶可以通過系統(tǒng)調(diào)用直接改變某個(gè)線程的優(yōu)先級(jí),也可能是通過其他操作間接的修改某個(gè)線程的優(yōu)先級(jí),具體情況相關(guān)的章節(jié)會(huì)有相應(yīng)的講解。程調(diào)度的時(shí)候,優(yōu)先級(jí)高的線先后順序輪流得到運(yùn)行機(jī)會(huì)。首先得到調(diào)度機(jī)會(huì),相同優(yōu)先級(jí)的線程之間按照在飛鳥內(nèi)核中,默認(rèn)的線程優(yōu)先級(jí)分配原則是:優(yōu)先級(jí) 02 和 31 共 4 個(gè)優(yōu)先級(jí)保留給內(nèi)核線程使用,其余優(yōu)先級(jí)分配給用戶線程使用。內(nèi)核初始線程使用最低優(yōu)先級(jí) 31。2.2.4 線管理在飛鳥內(nèi)核線程管理過,應(yīng)該非常注意
44、線的使用。飛鳥內(nèi)核沒有采用任何保護(hù)機(jī)制來安全的使用內(nèi)存,也就是說,線程和內(nèi)核同時(shí)處于一個(gè)地址空間,各個(gè)線程以及內(nèi)核的數(shù)據(jù)和代碼是編址的,稍有錯(cuò)誤,就可能引起系統(tǒng)。內(nèi)核中的每個(gè)線程都有自己的??臻g。用戶線是在用戶線程初始化的時(shí)候指定的,并且在指定用戶線之前,必須以全局?jǐn)?shù)組的方式定義用戶堆棧,棧最好為整數(shù)類型(字長(zhǎng)),并且必須由連續(xù)的內(nèi)存空間組成。具體實(shí)現(xiàn)方式請(qǐng)參考線程創(chuàng)建函數(shù)的實(shí)現(xiàn)。 在系統(tǒng)運(yùn)行的時(shí)候,內(nèi)核代碼和用戶線程一樣,同樣需要一個(gè)運(yùn)行棧。在飛鳥內(nèi)核中并沒有為內(nèi)核代碼特別設(shè)定運(yùn)行棧,而是使用當(dāng)前用戶線程的運(yùn)行棧。當(dāng)用戶線程調(diào)用內(nèi)核函數(shù)的時(shí)候,被調(diào)用的內(nèi)核函數(shù)將使用當(dāng)前用戶線程的棧。飛鳥內(nèi)核
45、中所有中斷服務(wù)程序共個(gè)中斷棧,這個(gè)中斷棧與用戶線程和內(nèi)核代碼所使用的運(yùn)行棧沒有任何聯(lián)系。但是要保障任何運(yùn)行類型的棧都不會(huì)溢出,否則內(nèi)核會(huì)發(fā)生未知的。第 17 頁 共 47 頁2.2.5 線程函數(shù)線程函數(shù)必須為一個(gè)大的循環(huán)體,應(yīng)用功能代碼在循環(huán)體內(nèi),這樣保證線程代碼不會(huì)執(zhí)行完畢而直接返回,否則內(nèi)核無法捕獲線程退出消息,從而導(dǎo)致內(nèi)核錯(cuò)誤。如果確實(shí)需要退出,則應(yīng)該通過系統(tǒng)調(diào)用,顯式通知內(nèi)核該線程需要退出(當(dāng)前版本的內(nèi)核沒有真正刪除該線程)。舉例說明:void thread_x_func () while (1) / application code, do sth. if (exit_conditi
46、on)TclThreadDormantt(&self);2.2.6 線程數(shù)據(jù)線程數(shù)據(jù)主要包括棧數(shù)據(jù)、全局?jǐn)?shù)據(jù)和動(dòng)態(tài)數(shù)據(jù)。棧數(shù)據(jù)編譯器會(huì)確保完整和正確。但是全局?jǐn)?shù)據(jù)是各個(gè)線程和內(nèi)核都能的,所以對(duì)全局?jǐn)?shù)據(jù)的必須是互斥的。另外,線程通過內(nèi)存管理函數(shù)申請(qǐng)的內(nèi)存,必須及時(shí),防止內(nèi)存泄漏。2.2.7 線程隊(duì)列在內(nèi)核中,線程隊(duì)列基本上是按照線程狀態(tài)的不同而專門設(shè)置的,這些線程隊(duì)列是分類管理線程的有效方法,分為兩種類型的線程隊(duì)列結(jié)構(gòu)。內(nèi)核中的線程,某個(gè)時(shí)刻必定屬于某個(gè)線程隊(duì)列。在當(dāng)前版本的內(nèi)核中,主要包括以下線程隊(duì)列:線緒隊(duì)列用于保存處于就緒狀態(tài)(包括運(yùn)行中的)的線程結(jié)構(gòu)用于保存處于掛起、休眠、延時(shí)狀態(tài)的線程
47、結(jié)構(gòu)線程輔助列列線程同步/阻塞隊(duì)列 用于保存阻塞在 IPC 對(duì)象上的線程結(jié)構(gòu)需要注意的是處于運(yùn)行狀態(tài)的線程其實(shí)是屬于就緒隊(duì)列的。前兩個(gè)線程隊(duì)列屬于第一種線程隊(duì)列結(jié)構(gòu),這種線程隊(duì)列結(jié)構(gòu)的特點(diǎn)是能夠?qū)崿F(xiàn)固定時(shí)間的調(diào)度算法。內(nèi)核中只有一個(gè)線緒隊(duì)列和線程輔助隊(duì)列。另外在 IPC 機(jī)制中的各種內(nèi)核設(shè)施中,大多具有等待隊(duì)列,就是上面提到的線程同步/阻塞隊(duì)列,這種隊(duì)列和線緒隊(duì)列和阻塞隊(duì)列的結(jié)構(gòu)是不一樣的。并且這種類型的隊(duì)列的個(gè)數(shù)是不確定的,是根據(jù)實(shí)際使用的 IPC 對(duì)象的多少?zèng)Q定的。線程隊(duì)列結(jié)構(gòu)定義在文件 thread.h 中,具體內(nèi)容如下:/* 線程隊(duì)列結(jié)構(gòu)定義,該結(jié)構(gòu)大小隨內(nèi)核支持的優(yōu)先級(jí)范圍而變化,可
48、以實(shí)現(xiàn)固定時(shí)間的線程調(diào)度算法 */typedef struct ThreadQueueDef第 18 頁 共 47 頁TPriorityMask PriorityMask; /* 隊(duì)列中就緒優(yōu)先級(jí)掩碼 */TPolicy Policy;/* 隊(duì)列中線程的調(diào)度策略 */TLinkNode* HandleMX_THREAD_LOWEST_PRIORITY + 1; /* 隊(duì)列中線 TThreadQueue;隊(duì)列 */從上面的線程隊(duì)列定義可以看出,進(jìn)程隊(duì)列內(nèi)設(shè)置了就緒線程隊(duì)列的指針數(shù)組,這些隊(duì)列頭指針指向了同優(yōu)先級(jí)線程組成的雙向循環(huán)鏈表。成員 PriorityMask 表明了哪些優(yōu)先級(jí)的線程處于隊(duì)列
49、中。通過快速的硬件算法,內(nèi)核可以以固定時(shí)間差找到線程隊(duì)列中最高的就緒優(yōu)先級(jí),然后找到處于該優(yōu)先級(jí)隊(duì)列的第一個(gè)線程。和線程隊(duì)列相關(guān)的操作主要包括線程加入隊(duì)列、線程移出隊(duì)列、選擇隊(duì)列中線程的最高優(yōu)先級(jí)和選擇隊(duì)列中的最高優(yōu)先級(jí)線程。這其中主要涉及到鏈表的操作和查找優(yōu)先級(jí)算法。線程隊(duì)列內(nèi),按照優(yōu)先級(jí)的不同有多個(gè)雙向循環(huán)鏈表。線程出入某個(gè)線程隊(duì)列的時(shí)候,就是對(duì)這些的鏈表進(jìn)行的操作,同時(shí)完成線程隊(duì)列其它數(shù)據(jù)的更新。線程加入隊(duì)列的時(shí)候,根據(jù)優(yōu)先級(jí)查找和它匹配的鏈表頭,然后將它追加到鏈表尾部,然后更新所屬優(yōu)先級(jí)線程存在標(biāo)記。線程從隊(duì)列離開的時(shí)候,同樣根據(jù)優(yōu)先級(jí)查找和它匹配的鏈表頭、將它從鏈表中刪除,最后更新所
50、屬優(yōu)先級(jí)線程存在標(biāo)記。用與 IPC 阻塞的線程隊(duì)列結(jié)構(gòu)和上面的線程結(jié)構(gòu)有所不同,如下所示/* IPC 線程等待隊(duì)列結(jié)構(gòu)定義 */ struct IPCSuspendQueueDefTPolicy PrimaryPolicy; TPolicy AuxiliaryPolicy; TLinkNode* PrimaryQueue;TLinkNode* AuxiliaryQueue;/* 隊(duì)列中線程的調(diào)度策略/* 隊(duì)列中線程的調(diào)度策略*/*/* 隊(duì)列中線/* 隊(duì)列中線*/*/隊(duì)列隊(duì)列;之所以這樣設(shè)計(jì),有幾點(diǎn)考慮:1.如果像就緒線程結(jié)構(gòu)那樣設(shè)置每個(gè)優(yōu)先級(jí)的頭指針,那內(nèi)核中每個(gè) IPC 對(duì)象(信號(hào)量、郵箱等
51、)都要占用 MX_THREAD_LOWEST_PRIORITY 個(gè)指針大小的空間,那在系統(tǒng)中,會(huì)顯得占用了太多的空間2.對(duì)于類似郵箱這種 IPC 對(duì)象,因?yàn)榭赡馨l(fā)送不同類型的郵件(緊急、普通),所以需要設(shè)置兩個(gè)隊(duì)列,一個(gè)用于阻塞發(fā)送緊急消息發(fā)送的線程、另一個(gè)用于阻塞發(fā)送普通消息的線程。因?yàn)樯厦娴脑颍瑑蓚€(gè)用于不同目地的線程阻塞隊(duì)列,也需要考慮是按照先到先出的原則來處理喚醒時(shí)的順序還是按照優(yōu)先級(jí)的原則來處理。所以需要設(shè)置兩個(gè)隊(duì)列的調(diào)度策略的字段。3.2.3 線程調(diào)度機(jī)制飛鳥內(nèi)核的線程調(diào)度機(jī)制包括優(yōu)先級(jí)搶占機(jī)制和時(shí)間片輪轉(zhuǎn)機(jī)制。在不同優(yōu)先級(jí)的線程第 19 頁 共 47 頁之間,采用優(yōu)先級(jí)搶占方式,
52、在相同優(yōu)先級(jí)線程之間,采用時(shí)間片輪轉(zhuǎn)機(jī)制。特點(diǎn)是不同的線程可以采用相同的優(yōu)先級(jí),每個(gè)線程可以擁有任意長(zhǎng)度的時(shí)間片。這種調(diào)度算法,兼顧線優(yōu)先級(jí)上的不同和同優(yōu)先級(jí)線程之間在占有 CPU 機(jī)會(huì)上的公平性。支持這種調(diào)度機(jī)制的數(shù)據(jù)結(jié)構(gòu)是線緒隊(duì)列結(jié)構(gòu)。另外,內(nèi)核進(jìn)行任務(wù)調(diào)度操作所花費(fèi)的時(shí)間是常數(shù)(IPC 隊(duì)列不是這樣的),與應(yīng)用程序中建立的任務(wù)數(shù)無關(guān),這歸功于內(nèi)核隊(duì)列結(jié)構(gòu)的定義和隊(duì)列操作函數(shù)的實(shí)現(xiàn)。線程的優(yōu)先級(jí)和時(shí)間片在建立的時(shí)候分配的,并且可以在運(yùn)行期間修改,內(nèi)核的優(yōu)先級(jí)和時(shí)間片管理具有相當(dāng)?shù)撵`活性。2.3.1 線程調(diào)度算法目前版本的內(nèi)核只支持 Cortex M3 處理器,采用了該型號(hào)處理器的特殊指令,
53、可以以最快最簡(jiǎn)潔的方式得到內(nèi)核中所有就緒線程的最高就緒優(yōu)先級(jí)。2.3.2 線程調(diào)度時(shí)機(jī)面線程狀態(tài)的部分,下發(fā)生調(diào)度是很重要的,這里面幾個(gè):已經(jīng)介紹了部分線程調(diào)度的情況,清楚內(nèi)核會(huì)在什么情況總結(jié)一下線程調(diào)度的時(shí)機(jī)。飛鳥內(nèi)核的調(diào)度時(shí)機(jī)主要有下線程主動(dòng)直接放棄處理器,通過函數(shù)實(shí)現(xiàn)線程主動(dòng)間接放棄處理器(無法獲得資源、優(yōu)先級(jí)變化、線程掛起等操作)時(shí)鐘嘀嗒中斷處理過,線程時(shí)間片用盡,被迫放棄處理器中斷處理過,線程被更高就緒優(yōu)先級(jí)線程搶占內(nèi)核調(diào)度分為主動(dòng)和調(diào)度,同時(shí)也有直接和間接的區(qū)別。而調(diào)度的原因主要是優(yōu)先級(jí)變化、時(shí)間片變化、資源阻塞或者阻塞時(shí)限到達(dá)等。程調(diào)用一些內(nèi)核功能的時(shí)候,可能運(yùn)行環(huán)境發(fā)生了變化,
54、比如在更改其他就緒線程的優(yōu)先級(jí)的時(shí)候,就不能保證當(dāng)前線程的優(yōu)先級(jí)是最高的,所以需要嘗試調(diào)度一次。同理,如果程獲得資源的時(shí)候,如果因?yàn)榈貌坏蕉枞谠撡Y源的等待隊(duì)列上,那么必須進(jìn)行線程調(diào)度。也就是說,當(dāng)有其他線程加入內(nèi)核就緒線程隊(duì)列或者當(dāng)前線程由于一些原因不能繼續(xù)運(yùn)行的時(shí)候,必須嘗試或必須進(jìn)行線程調(diào)度。另外,飛鳥內(nèi)核提供了 API 用來完成線程主動(dòng)放棄處理器的功能,這就是所謂的協(xié)作式任務(wù)調(diào)度模型。此時(shí)任務(wù)是否進(jìn)行調(diào)度都是由任務(wù)自身決定的,沒有搶占調(diào)度的概念。2.3.3 線程調(diào)度步驟內(nèi)核的線程調(diào)度主要包含三個(gè)步驟:根據(jù)需求和調(diào)度算法查找新的就緒線程。處理當(dāng)前線程的時(shí)間片和當(dāng)前線程的狀態(tài),如果需要?jiǎng)t
55、修改線程所處的線程隊(duì)列。在兩個(gè)線程之間進(jìn)行線程切換。第 20 頁 共 47 頁其中線程切換是一個(gè)縝密的過程,功能需要由匯編代碼來完成,因?yàn)?C/C+等高級(jí)語言是無法處理此時(shí)的處理器上下文的。內(nèi)核首先把當(dāng)前線程的寄存器上下文保存到它的線中,然后再把需要切換運(yùn)行的線程寄存器上下文從它的線中,完成線程切換。線程切換的過程如下圖所示:中讀并且加載道寄存器組2.4 線程管理在多任務(wù)內(nèi)核中,任務(wù)是參與調(diào)度與資源競(jìng)爭(zhēng)的基本,內(nèi)核的最基本功能就是任務(wù)的管理與調(diào)度。任務(wù)管理主要包括任務(wù)創(chuàng)建、任務(wù)刪除、任務(wù)掛起與喚醒、任務(wù)調(diào)度、優(yōu)先級(jí)處理等。飛鳥內(nèi)核提供基本的線程管理與調(diào)度 API 函數(shù)。在本章的最后的篇幅中,主
56、要分析了與線程管理與調(diào)度相關(guān)的各個(gè) API 函數(shù)的功能與實(shí)現(xiàn),對(duì)相關(guān)代碼也進(jìn)行了講解,但是對(duì)于 API 函數(shù)調(diào)用的函數(shù),則只是根據(jù)需要進(jìn)行了合理的取舍后,對(duì)部分代碼進(jìn)行了分析講解。在本書后半部分的源代碼中有非常詳細(xì)的注解,在本章中就不再具體講解。在以后各章中,也是如此。2.4.1 線程初始化線程初始化函數(shù)為線配和初始化相關(guān)的數(shù)據(jù)。線程可以在多線程調(diào)度開始前建立,也可以在其它線程的執(zhí)行過線程機(jī)構(gòu)。在整個(gè)初始化的過被建立,但是在開始多線程調(diào)度前,用戶必須定義所需要的中斷是被的。如果應(yīng)用程序開放了中斷系統(tǒng),有可能產(chǎn)生意想不到的初始化后的線。被放在內(nèi)核線程輔助隊(duì)列 uThreadAuxiliaryQu
57、eue 中。2.4.2 線程激活線程激活時(shí),會(huì)將處于休眠的線程從 uThreadAuxiliaryQueue 中移出,隨后放入uThreadReadyQueue 隊(duì)列中,如果需要還會(huì)進(jìn)行線程調(diào)度。激活成功的線程的狀態(tài)轉(zhuǎn)為ExThreadReady。2.4.3 線程休在飛鳥內(nèi)核中,線程的刪除并不是真正的刪除,只是簡(jiǎn)單的設(shè)置該線程的狀態(tài)為ExThreadDormant 狀態(tài),并且將該線程放入內(nèi)核 uThreadAuxiliaryQueue 隊(duì)列來管理,此時(shí)內(nèi)核調(diào)度等操作不會(huì)再考慮這個(gè)線程。從功能原理上講,通過特殊以被重新激活的,但是飛鳥內(nèi)核并沒有給出具體實(shí)現(xiàn)。,這個(gè)線程仍然可第 21 頁 共 47
58、 頁眠2.4.4 用戶級(jí)線程切換用戶級(jí)線程切換是通過 TclYieldThread ()函數(shù)來實(shí)現(xiàn)的。2.4.5 線程優(yōu)先級(jí)設(shè)定用戶線程可以在運(yùn)行過主動(dòng)地修改自己或者其它線程的優(yōu)先級(jí).2.4.6 線程延時(shí)程運(yùn)行的過,有可能需要延時(shí)一段時(shí)間,這時(shí)候需要使用線程延時(shí)函數(shù),它啟動(dòng)當(dāng)前線程的軟定時(shí)器,將其加入內(nèi)核軟定時(shí)器隊(duì)列,隨后再把線程加入內(nèi)核延時(shí)隊(duì)列,相當(dāng)于阻塞在該隊(duì)列上,直到定時(shí)器到時(shí),內(nèi)核自動(dòng)喚醒該線程,該線程繼續(xù)運(yùn)行。需要注意的是,每個(gè)線程都擁有一個(gè)軟定時(shí)器,線程延時(shí)和資源時(shí)限等待功能都是通過這個(gè)軟定時(shí)器實(shí)現(xiàn)的。另外,因?yàn)檐浂〞r(shí)器是通過系統(tǒng)時(shí)鐘嘀嗒中斷實(shí)現(xiàn)的,它的精度是有限定的,在 100m
59、s 的時(shí)鐘嘀嗒的環(huán)境下,軟定時(shí)器的觸發(fā)是上下 100ms,而相應(yīng)時(shí)間則需要根據(jù)線程的優(yōu)先級(jí)來決定。如果線程優(yōu)先級(jí)最高,則它的軟定時(shí)器的精度在上下 100 毫秒,否則不好估計(jì),要看優(yōu)先級(jí)高于等于該線程的其他線程的運(yùn)行情況來分析。如果需要更高精度的定時(shí)效果,需要另外處理。2.4.7 線程掛起與解掛在飛鳥內(nèi)核里,一個(gè)線程被掛起時(shí)需要把任務(wù)的狀態(tài)修改并從就緒隊(duì)列中刪除,然后加入 uThreadAuxiliaryQueue 中。第三章 任務(wù)同步、互斥和通訊系統(tǒng)中運(yùn)行的各種實(shí)體主要包括線程和 ISR,在這些可運(yùn)行實(shí)體的運(yùn)行過程在中,有時(shí)需要同步它們的運(yùn)行步驟,有時(shí)需要互斥的資源,有時(shí)也要彼此交換數(shù)據(jù)。因此
60、內(nèi)核必須提供相應(yīng)的機(jī)制來完成這些功能。在這里把這些機(jī)制統(tǒng)稱為進(jìn)(線)通訊(IPC ,ernal Pros Comunication),常見的機(jī)制主要包括信號(hào)量、消息隊(duì)列、郵箱、事件集、管道、信號(hào)和條件變量等。本章主要分析實(shí)時(shí)內(nèi)核提供的各種 IPC 機(jī)制的功能特征和設(shè)計(jì)實(shí)現(xiàn)。第 22 頁 共 47 頁3.1 IPC 機(jī)制介紹內(nèi)核中的任務(wù)之間,大多需要互相交換數(shù)據(jù),這就涉及到任務(wù)間通訊紹的任務(wù)同步和互斥相比,任務(wù)間的通訊機(jī)制更強(qiáng)調(diào)數(shù)據(jù)的傳輸。和前面介任務(wù)間的數(shù)據(jù)傳輸,可以是直接的,也可以是間接的。在直接數(shù)據(jù)傳輸方式下,一個(gè)任務(wù)可以把數(shù)據(jù)直接發(fā)給指定的任務(wù),發(fā)送過程很明確的說明了誰從誰那里得到了數(shù)據(jù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 合作研發(fā)協(xié)議書
- 高新科技研發(fā)成果轉(zhuǎn)讓合同
- 公司場(chǎng)地長(zhǎng)期租賃合同
- 制造業(yè)工業(yè)互聯(lián)網(wǎng)平臺(tái)建設(shè)方案
- (高清版)DB2104∕T 0007-2021 撫順煤精
- 2025年吉林貨運(yùn)從業(yè)資格證考試題技巧答案大全
- 小學(xué)三年級(jí)口算題
- 2025年道路貨物運(yùn)輸從業(yè)資格考試復(fù)習(xí)題
- 2024-2025學(xué)年高中生物第7章細(xì)胞的增殖第1節(jié)第1課時(shí)細(xì)胞不能無限長(zhǎng)大植物細(xì)胞的有絲分裂練習(xí)含解析北師大版必修1
- 2024-2025學(xué)年八年級(jí)科學(xué)上冊(cè)第1章水和水的溶液第1節(jié)地球上的水教案新版浙教版
- 2022年高考湖南卷生物試題(含答案解析)
- GB/T 20909-2007鋼門窗
- GB/T 17854-1999埋弧焊用不銹鋼焊絲和焊劑
- GB/T 15593-2020輸血(液)器具用聚氯乙烯塑料
- 直線加速器專項(xiàng)施工方案
- 聯(lián)苯二氯芐生產(chǎn)工藝及產(chǎn)排污分析
- 儲(chǔ)能設(shè)備項(xiàng)目采購供應(yīng)質(zhì)量管理方案
- 2022年全國卷高考語文答題卡格式
- 美國房地產(chǎn)市場(chǎng)特征、框架與周期演變
- 復(fù)旦大學(xué)簡(jiǎn)介 (課堂PPT)
- CKD馬達(dá)使用說明
評(píng)論
0/150
提交評(píng)論