① 線程里加入延遲有什麼用
你對sleep可能有些誤解,sleep本身就是使進程睡眠,睡眠的線程不會去佔用CPU的。對於一個正在運行的線程來說,他最主要佔用的資源就是CPU運行時間和內存。既然SLEEP使其放棄對CPU的進程許可權(意思是這段時間內,他不會到CPU執行,如棚陪大果想了解原因和具體實現可以參考linux內核代碼對sleep的實現),那你不想讓他佔用亂沒資源意思就是說:不想讓它占內存嘍??
從定義角度來說,線程不擁有內存資源(從內核中可以查到鏈豎fork和vfork創建的都是線程,他們都不會新分配內存空間,而是和父進程共享內存空間),所以說你已經沒有什麼可以釋放了。如果還不明白,可以發信息給我。
或許你更希望做的是,壓根就不啟動這個線程,而是一個小時後啟動。因為你沒有辦法然main主線程1小時後啟動這個線程,因為你把握不好時間,那我可以建議你考慮下linux守護線程cron,這個可以達到你1小時後啟動的目的。
② linux進程、線程及調度演算法(三)
調度策略值得是大家都在ready時,並且CPU已經被調度時,決定誰來運行,誰來被調度。
兩者之間有一定矛盾。
響應的優化,意味著高優先順序會搶占優先順序,會花時間在上下文切換,會影響吞吐。
上下文切換的時間是很短的,幾微妙就能搞定。上下文切換本身對吞吐並多大影響, 重要的是,切換後引起的cpu 的 cache miss.
每次切換APP, 數據都要重新load一次。
Linux 會盡可能的在響應與吞吐之間尋找平衡。比如在編譯linux的時候,會讓你選擇 kernal features -> Preemption model.
搶占模型會影響linux的調度演算法。
所以 ARM 的架構都是big+LITTLE, 一個很猛CPU+ 多個 性能較差的 CPU, 那麼可以把I/O型任務的調度 放在 LITTLE CPU上。需要計算的放在big上。
早期2.6 內核將優先順序劃分了 0-139 bit的優先順序。數值越低,優先順序越高。0-99優先順序 都是 RT(即時響應)的 ,100-139都是非RT的,即normal。
調度的時候 看哪個bitmap 中的 優先順序上有任務ready。可能多個任務哦。
在普通優先順序線程調度中,高優先順序並不代表對低優先順序的絕對優勢。會在不同優先順序進行輪轉。
100 就是比101高,101也會比102高,但100 不會堵著101。
眾屌絲進程在輪轉時,優先順序高的:
初始設置nice值為0,linux 會探測 你是喜歡睡眠,還是幹活。越喜歡睡,linux 越獎勵你,優先順序上升(nice值減少)。越喜歡幹活,優先順序下降(nice值增加)。所以一個進程在linux中,干著干著 優先順序越低,睡著睡著 優先順序越高。
後期linux補丁中
紅黑樹,數據結構, 左邊節點小於右邊節點
同時兼顧了 CPU/IO 和 nice。
數值代表著 進程運行到目前為止的virtual runtime 時間。
(pyhsical runtime) / weight * 1024(系數)。
優先調度 節點值(vruntime)最小的線程。權重weight 其實有nice 來控制。
一個線程一旦被調度到,則物理運行時間增加,vruntime增加,往左邊走。
weight的增加,也導致vruntime減小,往右邊走。
總之 CFS讓線程 從左滾到右,從右滾到左。即照顧了I/O(喜歡睡,分子小) 也 照顧了 nice值低(分母高).所以 由喜歡睡,nice值又低的線程,最容易被調度到。
自動調整,無需向nice一樣做出獎勵懲罰動作,個人理解權重其實相當於nice
但是 此時 來一個 0-99的線程,進行RT調度,都可以瞬間秒殺你!因為人家不是普通的,是RT的!
一個多線程的進程中,每個線程的調度的策略 如 fifo rr normal, 都可以不同。每一個的優先順序都可以不一樣。
實驗舉例, 創建2個線程,同時開2個:
運行2次,創建兩個進程
sudo renice -n -5(nice -5級別) -g(global), 會明顯看到 一個進程的CPU佔用率是另一個的 3倍。
為什麼cpu都已經達到200%,為什麼系統不覺得卡呢?因為,我們的線程在未設置優先順序時,是normal調度模式,且是 CPU消耗型 調度級別其實不高。
利用chrt工具,可以將進程 調整為 50 從normal的調度策略 升為RT (fifo)級別的調度策略,會出現:
chrt , nice renice 的調度策略 都是以線程為單位的,以上 設置的將進程下的所有線程進行設置nice值
線程是調度單位,進程不是,進程是資源封裝單位!
兩個同樣死循環的normal優先順序線程,其中一個nice值降低,該線程的CPU 利用率就會比另一個CPU的利用率高。
③ linux線程異常耗時
網路出現異常。
根據查詢相關公開信息顯示,網路出現異常,導致linux系統消息耗時過長,linux系統出現卡頓,導致消息耗時過長。
線程(英語:thread)是操作系統能夠進行運算調度的最小單位。
④ linux下怎麼在等待線程結束中設置超時
多線程退出有三種方式:(1)執行完成後隱式退出;(2)由線程本身顯示調用pthread_exit函數退出;pthread_exit(void*retval);(3)被其他線程用pthread_cance函數終止:pthread_cance(pthread_tthread);用event來實現。在子線程中,在循環內檢測event。while(!e.is_active()){}當退出循環體的時候,自然return返回。這樣子線程會優雅的結束。注意:選用非等待的檢測函數。pthread線程有兩種狀態,joinable(非分離)狀態和detachable(分離)狀態,默認為joinable。joinable:當線程函數自己返回退出或pthread_exit時都不會釋放線程所用資源,包括棧,線程描述符等(有人說有8k多,未經驗證)。detachable:線程結束時會自動釋放資源。Linuxmanpagesaid:Whenajoinablethreadterminates,itsmemoryresources(threaddescriptorandstack)_joinonit.Therefore,pthread_.因此,joinable線程執行完後不使用pthread_join的話就會造成內存泄漏。解決法:1.//創建線程前設置PTHREAD_CREATE_DETACHED屬性pthread_attr_tattr;pthread_tthread;pthread_attr_init(&attr);pthread_attr_setdetachstat(&attr,PTHREAD_CREATE_DETACHED);pthread_create(&thread,&attr,&thread_function,NULL);pthread_attr_destroy(&attr);2.當線程為joinable時,使用pthread_join來獲取線程返回值,並釋放資源。3.當線程為joinable時,也可在線程中調用pthread_detach(pthread_self());來分離自己。
⑤ linuxsleep函數不準
linuxsleep函數不準解決辦法如下塌搏者:
如下面的一段團薯程序:
應用程序:銀鎮
#include <syswait.h>
usleep(n) //n微秒
Sleep(n)//n毫秒
sleep(n)//n秒
驅動程序:
#include <linux/delay.h>
mdelay(n) //milliseconds 其實現
#ifdef notdef
#define mdelay(n) (\
{unsigned long msec=(n); while (msec--) udelay(1000);})
#else,linuxsleep函數不準就可以調整為正確的了。
⑥ 在linux下,想用sleep函數實現延時五秒,應該怎麼設參數
使用許可權 : 所有使用者
使用方式 : sleep [--help] [--version] number[smhd]
說明 : sleep 可以用來將目前動作延遲一段時間
參數說明 :
--help : 顯示輔助訊息
--version : 顯示版本編號
number : 時間長度,後面可接 s、m、h 或 d
其中 s 為秒,m 為 分鍾,h 為小時,d 為日數
例子 :
顯示目前時間後延遲 1 分鍾,之後再次顯示時間 :
date;sleep 1m;date
這個命令更多應用於shell腳本編程里和程序里
如下面的一段程序:
應用程序:
復制代碼
代碼如下:
#include <syswait.h>
usleep(n) //n微秒
Sleep(n)//n毫秒
sleep(n)//n秒
驅動程序:
#include <linux/delay.h>
mdelay(n) //milliseconds 其實現
#ifdef notdef
#define mdelay(n) (\
{unsigned long msec=(n); while (msec--) udelay(1000);})
#else
#define mdelay(n) (\
(__builtin_constant_p(n) && (n)<=MAX_UDELAY_MS) ? udelay((n)*1000) : \
({unsigned long msec=(n); while (msec--) udelay(1000);}))
#endif
調用asm/delay.h的udelay,udelay應該是納秒級的延時
Dos:
sleep(1); //停留1秒
delay(100); //停留100毫秒
Windows:
Sleep(100); //停留100毫秒
Linux:
sleep(1); //停留1秒
usleep(1000); //停留1毫秒
每一個平台不太一樣,最好自己定義一套跨平台的宏進行控制
秒還是微秒?關於延時函數sleep()
因為要寫一段代碼,需要用到sleep()函數,在我印象中,sleep(10)好像是休眠10微秒,結果卻是休眠了10秒(在Linux下)。覺得很奇怪,因為頭兒也記得好像是微秒為單位的。所以就查了一下。
原來linux下的sleep函數原型為:
unsigned int sleep(unsigned int seconds);
而MFC中的Sleep函數原型為:
void Sleep(DWORD dwMilliseconds);
也就是說,Linux下(使用的gcc的庫),sleep()函數是以秒為單位的,sleep(1);就是休眠1秒。而MFC下的sleep()函數是以微秒為單位的,sleep(1000);才是休眠1秒。原來如此啊。而如果在Linux下也用微妙為單位休眠,可以使用線程休眠函數:void usleep(unsigned long usec);當然,使用的時候別忘記#include <system.h>哦。
另外值得一提的是,linux下還有個delay()函數,原型為extern void delay(unsigned int msec);它可以延時msec*4毫秒,也就是如果想延時一秒鍾的話,可以這么用 delay(250);