阻塞 cpu占用
請問,windowsxp系統下,有一個線程A,此線程中需要wait一個信號,我有以下觀點,請大家幫我判斷一下我的觀點對不對,謝謝!如果我用阻塞方式,則一旦輪到這個線程執行,os只要發現這個線程所wait的信號沒有到達,則立即跳轉到其他線程執行,當前線程連掛起都不用,是么?。如果用非阻塞模式,則輪到這線程執行的時候,如果沒有wait到這個信號,則cpu跳過wait,繼續執行這個線程,直到執行到下一個阻塞點或者時間片到時,是么?謝謝!
www.cqzol.com網友回答:如果線程在等待某個事件,內核會將其放入等待列表,直到收到事件信號。操作系統在切換線程時不會考慮等待列表中的線程,只會考慮就緒列表中的線程。
?
// 問題:那么等待列表中的線程什么時候放到就緒列表中?是操作系統每次切換的時候都檢查一下嗎?還是用中斷?
// 回答:請看下面UCOSIII解釋,os里的5個默認任務之一的時鐘節拍任務會檢查等待列表中的線程是否可以就緒。
?
UCOSIII默認有5個系統任務:
??? 1、空閑任務:UCOSIII創建的第一個任務,UCOSIII必須創建的任務,此任務有UCOSIII自動創建,不需要用戶手動創建。
2、時鐘節拍任務:此任務也是必須創建的任務。遍歷所有在等待延時結束或指定時間內等待某個內核對象的任務,及遍歷節拍列表。
?? ① 插入節拍列表:
????? dly 為要延時或等待的時間;
????? MatchValue = OSTickCtr +dly
????? 節拍列表下標 = MatchValue %表格長度
該表是一個環形表,取模運算時一表格長度為模,將任務插入節拍列表中,在同一下標下按照延時或等待的時間長短排序。
? ?② 每個節拍中斷都會給此任務一個信號讓其執行,通過對OSTickCtr求模(同上),找到對應的位置,與.TickCtrMatch比較是否相同,若相同就把相應的OS_TCB從時鐘列表中刪除,如果是等待延時,會把它放入就緒列表中;如果是等待某一事件,還需要將其從等待列表中刪除;接著繼續一本下標的下一個任務控制塊比較。若不同則結束返回函數。
??? 3、統計任務:可選任務,用來統計CPU使用率和各個任務的堆棧使用量。此任務是可選任務,由宏OS_CFG_STAT_TASK_EN控制是否使用此任務。可以統計CPU利用率
??? 4、定時任務:用來向用戶提供定時服務,也是可選任務,由宏OS_CFG_TMR_EN控制是否使用此任務。計時減到零會調用回調函數進行一系列操作。
5、中斷服務管理任務:可選任務,由宏OS_CFG_ISR_POST_DEFERRED_EN控制是否使用此任務。當ISR調用UCOS_III中的“post”函數,要發送數據的副本和發送的目的地都會存入一個特別的緩沖隊列中,當ISR執行完畢后,任務切換到中斷服務管理任務,該任務會把存放的信息重發給相應的任務。做額外的這一步可以減少中斷關閉的時間;否則,在ISR中還需要把任務從等待列表中刪除,并把任務放在就緒表中,以及一些耗時的操作。
?
轉載于:https://www.cnblogs.com/dirichlet/archive/2011/03/16/1986288.html
總結
- 上一篇: 识图在线识图_水电腾讯课堂开课啦~学习建
- 下一篇: Debug调试