Hi 大家好,小弟之前有去某一家嵌入式晶片供應商公司上課,令人印象深刻時候有個重點。
-> 不要使用太多sleep(),但是他沒講說為什麼不能使用sleep(),有其他代替方案嗎?
-> 不要使用太多system call(),會需要fork而消耗系統資源,
有專門的C code就優先使用。
有專門的C code就優先使用。
請問先進們針對這兩個問題有什麼特別要注意的地方 or 見解嗎?
因為不是很清楚為什麼要避免使用這樣的情境,謝謝大家。
王詔凱 sleep可以用,但要問為什麼用sleep能夠解決問題?還是僅加了sleep,程式就能運作,但也說不上來為什麼?常見用sleep來"解決"race condition,問題沒有真的解掉,效率倒是先變差。
system()問題的答案就在你的提問中。fork常比呼叫API耗用更多資源。popen()回來的結果是給人看的字串,還得寫C code解析,程式碼很亂也不容易寫好。可攜性也很差,舉例來說,同樣是fdisk,不同版本的輸出訊息沒有保證一致。......查看更多
system()問題的答案就在你的提問中。fork常比呼叫API耗用更多資源。popen()回來的結果是給人看的字串,還得寫C code解析,程式碼很亂也不容易寫好。可攜性也很差,舉例來說,同樣是fdisk,不同版本的輸出訊息沒有保證一致。......查看更多
Ott Ben sleep 盡量能不用就不用, 在這前提下會促使你盡可能弄清楚流程、在流程上做控制跟調整, 效率通常較佳 也比較不容易出現無法預期且難解的 bug
(想像因為兩個 sleep 時間或順序的調整而產生預期之外的結果)
真要用通常就是 為了繞過某個你無法控制跟預期的東西所產生的限制, 那就是不得不用的最後手段了
(想像因為兩個 sleep 時間或順序的調整而產生預期之外的結果)
真要用通常就是 為了繞過某個你無法控制跟預期的東西所產生的限制, 那就是不得不用的最後手段了
吳錚 也許有些是要給某個function執行時間, 然後再去看他執行結果, 用Sleep(n)來等是可以正確執行, 但是換到不同PC上面, 所需的Sleep也不一樣, 那這時假如能夠改成Polling會比較好, 也不浪費時間空等.
Hua Lee 說真的,這個問題好好的K一下The Linux Programming Interface, Linux System Programming就有答案了
其實最大的問題是,過去很多人是non-OS MCU上coding,轉換到32bit CPU+OS產生不適應,而且很多人還覺得OS很爛妨礙我辦事
其實最大的問題是,過去很多人是non-OS MCU上coding,轉換到32bit CPU+OS產生不適應,而且很多人還覺得OS很爛妨礙我辦事
陳立唐 實務上 sleep 一般常用在控制 multi-process/multi-thread 執行的流程, 簡單的例子, B thread 要等 A thread 執行完才能執行, 比較笨的方法就是在 B thread 做很長的 sleep, 等A thread執行完, 這會引發幾個個問題,
1. 不同的硬體平台, A thread 執行完所需的時間會不一樣, 所以要等多久才是安全的呢?
2. 以後換平台, 這些sleep 時間很可能需要重新調整
3. 因為sleep 的時間是估計的, 會浪費時間在多餘的等待
基於應用的不同, 建議以 mutex/semaphore/join/filelock/select...等機制來取代sleep
1. 不同的硬體平台, A thread 執行完所需的時間會不一樣, 所以要等多久才是安全的呢?
2. 以後換平台, 這些sleep 時間很可能需要重新調整
3. 因為sleep 的時間是估計的, 會浪費時間在多餘的等待
基於應用的不同, 建議以 mutex/semaphore/join/filelock/select...等機制來取代sleep
Jonathan Shao 工程師要瞭解一些問題, 不要先問, 要先做一些實驗後, 再就實驗經驗. 否則, 別人的隻字片語, 很難變成真實的經驗. 而經驗是工程師最重要的資產.
試一下這個例子:
1, system("echo hello > /tmp/a.txt")
2, fpt = fopen("/tmp/a.txt, "w")
s = "hello"
fwrite(s, len(s), 1, fpt)
fclose(fpt)
看看performance差多少.
不用 sleep() 是一個比較奇怪的要求, 這通常和系統或軟體架構有關.
sleep() 常在簡單而獨立的軟性周期性 (soft deadline) 工作使用, 如每五分鐘記錄一下 CPU load.
你必須要瞭解貴公司 timing control 的慣用手法, 如 select() 或 alarm(). 或是你需要小於 1 秒的控制, 你要考慮 usleep() 和 nanosleep(). 也要考慮到 signal/interrupt 的交互作用.
試一下這個例子:
1, system("echo hello > /tmp/a.txt")
2, fpt = fopen("/tmp/a.txt, "w")
s = "hello"
fwrite(s, len(s), 1, fpt)
fclose(fpt)
看看performance差多少.
不用 sleep() 是一個比較奇怪的要求, 這通常和系統或軟體架構有關.
sleep() 常在簡單而獨立的軟性周期性 (soft deadline) 工作使用, 如每五分鐘記錄一下 CPU load.
你必須要瞭解貴公司 timing control 的慣用手法, 如 select() 或 alarm(). 或是你需要小於 1 秒的控制, 你要考慮 usleep() 和 nanosleep(). 也要考慮到 signal/interrupt 的交互作用.
Yihhann Chang 感覺好像話只有一半, 一般會建議不要用 sleep 時, 應該還會說該 XXX, 這樣才有意義~
XXX 可能是 call back / event message...
XXX 可能是 call back / event message...
Jonathan Shao 如 Vincent 所說, 這和使用的情境與需求有關. Callback 或 event 是更結構性的設計, 牽涉到整體的系統設計. 不能用其來等同於 sleep().
其實, 我們不應該糾結於哪一個 function call, 真正的問題是我們要完成什麼. 知道要達成什麼後, 才能在整題設計下去選用適合的 function call.
試想以下兩種要求:
1, 至少停 5 秒鐘, 而後執行 ABC task
2, 確實於 5 秒鐘後, 執行 ABC task
這裡, 1 是可以用 sleep(), 但 2 是 hard deadline, sleep() 就不能保證達到.
所以獨立討論某一個 function 該不該用, 而不先設定目的與環境, 是有疑義的.
其實, 我們不應該糾結於哪一個 function call, 真正的問題是我們要完成什麼. 知道要達成什麼後, 才能在整題設計下去選用適合的 function call.
試想以下兩種要求:
1, 至少停 5 秒鐘, 而後執行 ABC task
2, 確實於 5 秒鐘後, 執行 ABC task
這裡, 1 是可以用 sleep(), 但 2 是 hard deadline, sleep() 就不能保證達到.
所以獨立討論某一個 function 該不該用, 而不先設定目的與環境, 是有疑義的.
















沒有留言:
張貼留言