Android執行緒排程機制

2021-07-04 05:21:44 字數 1515 閱讀 3590

2014-2-24

閱讀789

在android weekly上看到了一篇關於android執行緒排程的文章,感覺挺不錯的,試著將其翻譯了一下,

這篇文章是關於android中線程是如何排程的,以及怎麼樣顯示設定執行緒優先順序保證應用程式在

多個執行緒在後台執行時保持響應。

執行緒排程是指作業系統負責決定哪些執行緒應該執行,以及什麼時候,執行多長時間。

android的執行緒排程使用兩個主要因素來決定如何在整個系統排程執行緒:nice values和cgroups。

nice values

高nice values(低優先順序)的執行緒執行次數少於低nice values(高優先順序)的執行緒。

最重要的兩個優先順序是default和background。簡單來說,執行緒優先順序應該和該執行緒期望完成的工作量相反。

執行緒做的工作越多,它的優先順序應該越小,以便它不會餓死系統。

所以,ui執行緒(activity的主線程)通常是default優先順序,

然而後台執行緒(asynctask的執行緒)通常是background優先順序。

nice values在理論上是重要的,因為他們減少了後台工作執行緒中斷ui的可能性。

在實踐中,但是,只有它們並不足夠。例如,假設存在20個後台執行緒和乙個單獨的執行ui的前台執行緒。

雖然他們每個的優先順序很低,但是合起來20個後台執行緒將影響前台執行緒的效能,結果損害了使用者體驗.

因為在任何時刻幾個應用程式可能已經有等待執行的後台執行緒,android os必須以某種方式處理這些問題。

cgroups

為了處理這個問題,android系統使用linux cgroups強制執行更嚴格的foreground、background排程策略。

background優先順序的執行緒被隱式的移動到了background cgroup,它們被限制只有很小的機率利用cpu

如果在其它組中的線城是忙的。這種分離允許後台執行緒執行一些任務,而不會對使用者可見的前台執行緒

產生較大的影響。

除了自動將低優先順序執行緒分配給background cgroup,android也將當前不在前台執行的應用程式的

執行緒移動到background cgroup中。將應用程式執行緒自動分組保證了當前前台執行緒總是優先的,

無論在後台執行的應用程式有多少。

設定執行緒優先順序:process.setthreadpriority(int)

大多數情況下,android apis已經為工作執行緒分配了background優先順序(例如,handlerthead

和asynctask)。在主ui執行緒中,例項化的threads和executorservices會繼承default、

之前設定執行緒的優先順序。這樣做很簡單,如下面的示例所示:

new thread(new runnable() ).start();

}

由於android是基於linux核心的,所以要想深入android的執行緒排程機制,還需要去學習

linux的相關知識。

linux程序排程機制

linux是以執行緒為單位進行cpu排程的。所以下面的描述中所說的執行緒和程序從cpu排程角度來說是等效。linux程序優先順序 priority。程序的優先順序是作業系統自己給定並且動態調整的。使用者可以通過nice值來調整實際優先順序。centos6.2 kernel 2.6.32 程序的預設優...

Spark 任務排程機制

driver執行緒主要是初始化sparkcontext物件,準備執行所需的上下文,然後一方面保持與的rpc連線,通過申請資源,另一方面根據使用者業務邏輯開始排程任務,將任務下發到已有的空閒executor上。executor程序起來後,會向driver反向註冊,註冊成功後保持與driver的心跳,同...

golang的goroutine排程機制

感覺豁然開朗,受益匪淺 去繁就簡,再加上自己的一些理解,整理了一下 排程器 主要基於三個基本物件上,g,m,p 定義在原始碼的src runtime runtime.h檔案中 1.g代表乙個goroutine物件,每次go呼叫的時候,都會建立乙個g物件 2.m代表乙個執行緒,每次建立乙個m的時候,都...