進(jìn)程:
進(jìn)程是資源分配的最小單位,進(jìn)程是一個(gè)具有獨(dú)立功能的程序關(guān)于某個(gè)數(shù)據(jù)集合的一次運(yùn)行活動(dòng)。它可以申請(qǐng)和擁有系統(tǒng)資源,是系統(tǒng)進(jìn)行資源分配和調(diào)度的基本單位。進(jìn)程是一個(gè)動(dòng)態(tài)的概念,是一個(gè)活動(dòng)的實(shí)體。
“獨(dú)立功能”表示進(jìn)程是面向使用者的定義,它關(guān)心的是要做什么?比如,在電腦上我要寫一篇文章,打開Word。那么計(jì)算機(jī)就會(huì)創(chuàng)建一個(gè)Microsoft Word的進(jìn)程,如果我想同步寫兩篇文章,就要再打開一個(gè)Word,計(jì)算機(jī)就又創(chuàng)建一個(gè)Microsoft Word的進(jìn)程。普通的計(jì)算機(jī)機(jī)可以同步做幾件事情,比如“上網(wǎng)”,“看電影”,“打游戲”,就是說(shuō)可以運(yùn)行很多進(jìn)程。但是嵌入式計(jì)算機(jī)通常設(shè)計(jì)成只做一件事情,比如在汽車領(lǐng)域,整車控制器VCU,發(fā)動(dòng)機(jī)噴油點(diǎn)火控制器ECU,變速箱換擋控制器TCU,車身控制器BCM等。這樣類比,傳統(tǒng)的一個(gè)電子控制單元ECU相當(dāng)于只運(yùn)行一個(gè)進(jìn)程。
線程:
線程是程序執(zhí)行的最小單位,也是處理器調(diào)度的基本單位,是操作系統(tǒng)能夠進(jìn)行運(yùn)算調(diào)度的最小單位。它被包含在進(jìn)程之中,是進(jìn)程中的實(shí)際運(yùn)作單位。一條線程指的是進(jìn)程中一個(gè)單一順序的控制流,一個(gè)進(jìn)程中可以并發(fā)多個(gè)線程,每條線程并行執(zhí)行不同的任務(wù)。
每個(gè)線程都獨(dú)自占用一個(gè)虛擬處理器:獨(dú)自的寄存器組,指令計(jì)數(shù)器和處理器狀態(tài)。每個(gè)線程完成不同的任務(wù),但是共享同一地址空間(也就是同樣的動(dòng)態(tài)內(nèi)存,映射文件,目標(biāo)代碼等等)
當(dāng)我們提及多線程的時(shí)候會(huì)想到thread和threadpool,這都是異步操作,threadpool其實(shí)就是thread的集合,具有很多優(yōu)勢(shì),不過(guò)在任務(wù)多的時(shí)候全局隊(duì)列會(huì)存在競(jìng)爭(zhēng)而消耗資源。thread默認(rèn)為前臺(tái)線程,主程序必須等線程跑完才會(huì)關(guān)閉,而threadpool相反。
小結(jié):threadpool確實(shí)比thread性能優(yōu),但是兩者都沒(méi)有很好的api區(qū)控制,如果線程執(zhí)行無(wú)響應(yīng)就只能等待結(jié)束,從而誕生了task任務(wù)。
對(duì)比進(jìn)程與線程:
- 進(jìn)程有自己的獨(dú)立地址空間,每啟動(dòng)一個(gè)進(jìn)程,系統(tǒng)就會(huì)為它分配地址空間,建立數(shù)據(jù)表來(lái)維護(hù)代碼段、堆棧段和數(shù)據(jù)段,這種操作非常昂貴。而線程是共享進(jìn)程中的數(shù)據(jù),使用相同的地址空間,因此,CPU切換一個(gè)線程的花費(fèi)遠(yuǎn)比進(jìn)程小很多,同時(shí)創(chuàng)建一個(gè)線程的開銷也比進(jìn)程小很多。
- 線程之間的通信更方便,同一進(jìn)程下的線程共享全局變量、靜態(tài)變量等數(shù)據(jù),而進(jìn)程之間的通信需要以通信的方式進(jìn)行(如隊(duì)列,信號(hào),管道,接套字等)。不過(guò)如何處理好同步與互斥是編寫多線程程序的難點(diǎn)。但是多進(jìn)程程序更健壯,多線程程序只要有一個(gè)線程死掉,整個(gè)進(jìn)程也跟著死掉了,而一個(gè)進(jìn)程死掉并不會(huì)對(duì)另外一個(gè)進(jìn)程造成影響,因?yàn)檫M(jìn)程有自己獨(dú)立的地址空間。
- 進(jìn)程切換時(shí),消耗的資源大,效率高。所以涉及到頻繁的切換時(shí),使用線程要好于進(jìn)程。同樣如果要求同時(shí)進(jìn)行并且又要共享某些變量的并發(fā)操作,只能用線程不能用進(jìn)程。
Core:
可以理解為就是ECU,一個(gè)核就代表一個(gè)進(jìn)程。多核就是多個(gè)ECU。也就是說(shuō)在多核的情況下,可以執(zhí)行多進(jìn)程。
不論是進(jìn)程還是線程,一個(gè)cpu核一個(gè)時(shí)刻就只能干一件事,所以一個(gè)cpu核處理多個(gè)線程或者進(jìn)程的話,都是并發(fā);
對(duì)于多核心的架構(gòu),由于共用一套MMU和cache,所以地址空間是一個(gè),同一時(shí)刻只能運(yùn)行一個(gè)進(jìn)程,此時(shí)進(jìn)程不能并行只能并發(fā)。同一個(gè)進(jìn)程下的多線程可以并行執(zhí)行,因?yàn)槎嗑€程共享同一套進(jìn)程空間資源。
OS Application:
說(shuō)明1:Task、Interrupt、Alarm、schedule Table、Resource、Event 我們稱他們叫對(duì)象(Object)
說(shuō)明2:【OS 包含1~N個(gè)Core】->【1個(gè)Core 包含1~N個(gè)Application,相當(dāng)于一個(gè)core可以運(yùn)行多個(gè)進(jìn)程,一般AUTOSAR Aurix定義兩個(gè)進(jìn)程,一個(gè)trusted,一個(gè)nontrusted】->【1個(gè)Application 包含0~N個(gè)Object,也就是一個(gè)OS-Application包括多個(gè)任務(wù)Task】
不論是進(jìn)程還是線程,一個(gè)cpu核一個(gè)時(shí)刻就只能干一件事,所以一個(gè)cpu核處理多個(gè)線程或者進(jìn)程的話,都是并發(fā);
AUTOSAR OS必須能夠支持構(gòu)成一個(gè)有多功能單元的Operating System objects (Tasks, ISRs, Alarms, Schedule tables, Counters)的集合。此對(duì)象集合稱為 OS-Application
OS Application分為兩類,一類是Trusted, 一類是Non-Trusted
對(duì)于Trusted OS Application,可以運(yùn)行在監(jiān)控或保護(hù)功能關(guān)閉的情況下,對(duì)于內(nèi)存或者OS Api的訪問(wèn)沒(méi)有限制;如果處理器支持,可以運(yùn)行在特權(quán)模式,OS默認(rèn)Trusted類型的OS Application不會(huì)引發(fā)內(nèi)存相關(guān)故障,如果發(fā)生了內(nèi)存故障,系統(tǒng)穩(wěn)定性將不再保證,可能需要關(guān)閉OS。
對(duì)于Non-Trusted OS Application,不允許關(guān)閉監(jiān)控或保護(hù)功能,對(duì)于內(nèi)存或OS Api的訪問(wèn)也受權(quán)限控制,也不允許運(yùn)行在特權(quán)模式。對(duì)于non-trusted OS Application,操作系統(tǒng)會(huì)保護(hù)MPU,timer,中斷控制器等控制寄存器,不允許修改。如果需要修改這些寄存器,那么OS服務(wù)必須執(zhí)行在特權(quán)模式。如果ISR Handler在non-trusted OS Application中,那么OS需要在ISR() wrapper中先切換到非特權(quán)模式,再執(zhí)行ISR handler。
task:
在嵌入式操作系統(tǒng)里,任務(wù)就是線程的意思。
AUTOSAR OS中存在兩種任務(wù):基本任務(wù)(Basic Task)和擴(kuò)展任務(wù)(Extended Task)?;救蝿?wù)則存在以下三種狀態(tài):
運(yùn)行狀態(tài)(Running):
處于運(yùn)行狀態(tài)的任務(wù)可能被高優(yōu)先級(jí)任務(wù)或者中斷搶占從而進(jìn)入就緒狀態(tài),且同一Core中任何時(shí)刻只會(huì)存在一個(gè)任務(wù)處于運(yùn)行狀態(tài),任務(wù)運(yùn)行結(jié)束后則將自己掛起進(jìn)入阻塞狀態(tài);
就緒狀態(tài)(Ready):?
處于就緒狀態(tài)的任務(wù)由調(diào)度器決定是否啟動(dòng)進(jìn)入運(yùn)行狀態(tài),且該狀態(tài)時(shí)任務(wù)切換至運(yùn)行狀態(tài)的前提;
阻塞狀態(tài)(Suspend):?
處于阻塞狀態(tài)的任務(wù)是被動(dòng)的,可以由API函數(shù)或Alarm激活進(jìn)入就緒狀態(tài);
擴(kuò)展任務(wù)與之相比,則多了一個(gè)等待狀態(tài)(Waiting),解釋如下:
等待狀態(tài)(Waiting):
當(dāng)任務(wù)的運(yùn)行需要等待某一或某些事件被置位時(shí),任務(wù)進(jìn)入就緒狀態(tài)。
Task調(diào)度策略:
AUTOSAR OS是基于優(yōu)先級(jí)進(jìn)行任務(wù)吊物,所以每個(gè)任務(wù)必定有一個(gè)優(yōu)先級(jí),而每個(gè)任務(wù)都是根據(jù)其自身特點(diǎn)來(lái)定義一個(gè)優(yōu)先級(jí)且需要配置其可搶占屬性。
可搶占屬性可分為不可搶占與全搶占,這里所說(shuō)的搶占指的是內(nèi)核搶占。AUTOSAR OS可根據(jù)各個(gè)任務(wù)的可搶占屬性配置,來(lái)提供不同的調(diào)度策略,調(diào)度策略可分為以下三種:
- 完全搶占式:OS所有任務(wù)均是可搶占類型;
- 非搶占式:OS中所有任務(wù)均是不可搶占的;
- 混合搶占式:OS部分任務(wù)是可搶占類型,部分任務(wù)是不可搶占類型;
event:
OS中的Event 主要用于為Extended Task 提供多個(gè)同步點(diǎn),每個(gè)Event 可以關(guān)聯(lián)多個(gè)Task
自由調(diào)度:
自由調(diào)度一般task的類型配置為EXTENDED,這種調(diào)度方式主要跟runnable綁定alarm,通過(guò)alarm觸發(fā)event,event觸發(fā)pending的task來(lái)執(zhí)行task。
如下實(shí)列代碼可以展示自由調(diào)度中EXTENED類型的task的執(zhí)行過(guò)程
Task(DIAG)
{
while(1)
{
waitevent(eventA);
if(eventA)
{
runnable();
}
}
}
WaitEvent:
只要表達(dá)式中任意一個(gè)EVENT 被收到,Task state則切換至Ready, 等待調(diào)度表按照優(yōu)先級(jí)進(jìn)行調(diào)度
SetEvent:
為指定的Task 設(shè)置Event
GetEvent:
獲取指定Task當(dāng)前接收到的所有EVENT
ClearEvent:
當(dāng)Event被Task處理完成之后,需要進(jìn)行Clear
Runnable & SWC & port:
Runnable就是一個(gè)函數(shù),SWC是應(yīng)用層單元模塊.,例如上圖SWC2是接收數(shù)據(jù)的功能模塊,里面包含了三個(gè)函數(shù),也就是3個(gè)runnable
一個(gè)TASK包含多個(gè)SWC
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-694492.html
Port是依附在SWC上的概念,比如配置工具配置SWC后,需要配置這個(gè)SWC的Port。其實(shí)也好理解,如果一個(gè)C文件孤零零的放在那里,與別的C文件沒(méi)有任何數(shù)據(jù)交互,那么作為一套代碼中的一個(gè)C文件,根本沒(méi)法發(fā)揮作用,所以必然在SWC上需要配置上或者輸入(R-Port)的或者輸出(P-Port)的Port。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-694492.html
到了這里,關(guān)于進(jìn)程、線程、Core、OS Application、task、event、runnable、SWC、port的區(qū)別與聯(lián)系的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!