專案中設計的重力感應驅動調整好之後,裝了一款自己喜歡的卡丁車遊戲,krazycartracing(konami),使用過後發生突然不能轉向了。列印log後發現,手指點觸控螢幕過多就會出現系統排程不過來,log無法列印。手指點螢幕暫停鍵後,log一下子列印出來。
為了驗證問題,此前在系統級寫了乙個死執行緒,每3s列印乙個log,當進入遊戲介面後,手機點觸屏過多後,死執行緒log也無法列印出來,確認是系統無法排程的問題。
針對該現象,從**優化上著手,分析可能原因應該出在工作佇列上或者是上報事件過多引起的。上報事件相關聯的有觸屏事件和重力三維事件,這裡觸屏事件是感應手的中斷,應該在合理範圍內,檢查了下重力三維事件,調低後影響了遊戲靈敏度,而且仍然無法解決目前的問題。
重點分析工作事件,重力感應的**裡面使用了shedule_work()函式,該函式主要是將工作加入到系統共享的預設工作佇列中,對於這類經常上報的資料為了避免衝突盡量建立單獨的工作佇列。
最終問題應該出在觸控螢幕處理方式上,觸屏的大量中斷操作,加上本身遊戲執行畫面中大量專用核心,導致重力感應的工作佇列排程不過來,產生了系統假死的現象。
結論:裝置驅動程式中經常需要上報資料的裝置盡量採用單獨建立工作佇列的方式進行處理,另外,對於一些偶爾才需要向佇列提交的任務可以採用更簡單、有效的方法:使用核心提供的共享預設工作佇列。
單獨建立工作佇列的方法:
1宣告工作處理函式和乙個指向工作佇列的指標
void my_func();
struct workqueue_struct *p_queue;
2建立自己的工作佇列和工作結構體變數
p_queue=create_workqueue("my_queue"); //建立乙個名為my_queue的工作佇列並把工作佇列的入口位址賦給宣告的指標
struct work_struct my_work;
init_work(&my_work , my_func , &data); //
3將工作新增入自己建立的工作佇列等待執行
queue_work(p_queue,&my_work);
4刪除自己的工作佇列
destroy_workqueue(p_queue); //一般是在close函式中刪除
作業系統 作業排程(高階排程)
乙個典型的作業可分成三個作業步 1.編譯 作業步 2.鏈結裝配 作業步 3.執行 作業步。在多道批處理系統中通常有上百個作業,為了管理和排程作業,系統為每個作業設定了乙個作業控制塊 jcb 它記錄該作業的有關資訊。不同系統的 jcb的組成內容有所區別。jcb 是作業在系統中存在的唯一標誌。作業進入系...
分布式排程系統 任務排程
這就是分布式任務排程所要解決的問題 舉個栗子 如何快速的做出大量的熱狗?如果將每乙個乙個熱狗按流程做的話,可見工作量會十分巨大而且效率低下 對任務按需求切分成多個子任務 再對所有的中間態結果進行reduce合併,得到最終結果 我們換個角度理解mapreduce操作 還會有一些廚師,按照一定的比例,將...
資源排程系統 Yarn
系列文章 mapreduce程式設計模型和計算框架架構原理 分布式檔案系統 hdfs yarn產生背景 mapreduce1.x的架構如下 mapreduce1.x的架構 hadoop1.x時,mapreduce的架構仍然是主從架構。乙個jobtracker帶多個tasktracker,主節點為jo...