㈠ linux中如何實現sleep(0)的功能
前段時間從windows移植了一個程序到linux上,不知為何性能奇差。查了下原因,發現是由於一個函數ZeroSleep特別耗時,這個函數的代碼很簡單,如下:
void ZeroSleep()
{
Sleep(0);
}
Sleep(0)作用是用來釋放cpu的時間片,避免忙等待。於是想當然的在linux上實現為:
void ZeroSleep()
{
msleep(0);
}
但其實msleep API的源代碼如下:
void msleep(unsigned int msecs)
{
unsigned long timeout = msecs_to_jiffies(msecs) + 1;
while (timeout)
timeout = schele_timeout_uninterruptible(timeout);
}
如此一來,即使參數為0,也至少要睡眠一個jiffies單位的時間,因此導致嚴重的性能問題。
該問題的解決方法是:
既然ZeroSleep的目的是釋放cpu資源,那麼就可以通過調用schele()函數替換msleep 。而且實際上msleep本身也是通過調用schele_timeout_uninterruptible實現的,所以這個做法也是合理的。
http://tassardge.blog.163.com/blog/static/17230170820100275580656/
㈡ linux 中sleep是什麼意思
sleep
睡眠,參數為時間,單位:秒
shell中,用法:
sleep seconds,表示睡眠多少秒
代碼中,用法:
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
視實際需要,有時需要睡眠若干秒後繼續執行,如:
執行某一過程,但並不關心是否執行完畢、執行成功還是失敗,也可能執行過程中掛住,這時又不想一直卡在這里不動,就可設定一個睡眠時間x秒,x秒後繼續向下執行。
㈢ sleep休眠怎麼喚醒 linux
sleep命令
常用工具命令 sleep命令暫停指定的時間。
語法
sleep(參數)
參數
時間:指定要暫停時間的長度。
時間長度,後面可接 s、m、h 或 d,其中 s 為秒,m 為 分鍾,h 為小時,d 為日數。 實例 有時在寫一些以循環方式運行的監控腳本,設置時間間隔是必不可少的,下面是一個Shell進度條的腳本演示在腳本中生成延時。
#!/bin/bash
b='' for ((i=0;$i<=100;i++)) do printf "Progress:[%-100s]%d%%\r" $b $i sleep 0.1 b=#$b done
㈣ Linux下的sleep是睡眠還是忙等佔用CPU資源不
sleep時佔用資源很少,主機斷網,中止正在運行的程序,只有少量的守護進程還在運行,init仍在運行,還有獲取你讓其蘇醒的守護進程,用top或者free都可看百分比
㈤ linux shell 中的sleep命令
linux shell 中的sleep命令
在有的shell(比如linux中的bash)中sleep還支持睡眠(分,小時)
sleep 1 睡眠1秒
sleep 1s 睡眠1秒
sleep 1m 睡眠1分
sleep 1h 睡眠1小時
㈥ 請教Linux下的sleep函數
函數名: sleep、usleep
功 能: 執行掛起一段時間
頭文件: #include <unistd.h>
區 別: unsigned sleep (unsigned int seconds);//n秒
int usleep (useconds_t usec);//n微秒
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<stdio.h>
#include<unistd.h>
int main()
{
int sec = 0,
usec = 0;
while(1)
{
printf("sec = %d \n",++sec);
sleep(1);
printf("usec = %d \n",++usec);
usleep(1000000);
}
return 0;
}
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)。
Linux下還有個delay()函數,原型為extern void delay(unsigned int msec);它可以延時msec*4毫秒,也就是如果想延時一秒鍾的話,可以這么用 delay(250)。
㈦ linux中的sleep怎麼用
sleep函數: #include <unistd.h> unsigned int sleep(unsigned int seconds); 此函數使調用進程被掛起,直到滿足以下條件之一: 1)已經過了seconds所指定的牆上時鍾時間 2)調用進程捕捉到一個信號並從信號處理程序返回 註:由於其他系統活動,實際返回時間比所要求的會遲一些,像alarm一樣。 sleep的返回值: 1)在上述第一種情形中,返回值是0 2)當由於捕捉到某個信號sleep提前返回時,返回值是未睡夠的時間(所要求的時間減去實際休眠時間) 看看下面的例子,猜猜sleep()的返回值是多少 1 #include <stdio.h> 2 #include <time.h> 3 #include <signal.h> 4 5 #define DIAPAUSE 30 //sleep time 30s 6 #define TIMEOUT 5 7 8 void sigalrm(int signo); 9 10 int main() 11 { 12 struct sigaction sa; 13 14 sa.sa_handler = sigalrm; 15 sa.sa_flags = 0; 16 sigemptyset(&sa.sa_mask); 17 if(sigaction(SIGALRM, &sa, NULL) < 0) 18 { 19 printf("sigaction error!\n"); 20 return; 21 } 22 23 while(1) 24 { 25 printf("alarm(TIMEOUT)...\n"); 26 alarm(TIMEOUT); 27 printf("...\n"); 28 printf("sleep(DIAPAUSE) == %d\n", sleep(DIAPAUSE)); 29 } 30 31 return 0; 32 } 33 34 void sigalrm(int signo) 35 { 36 printf("timeout...\n"); 37 return; 38 } sleep函數的返回值是25。 如果將TIMEOUT的值改為大於DIAPAUSE的值,如50的話,sleep函數在睡夠了DIAPAUSE後就會返回,返回值為0。 如果我們即需要alarm又需要sleep一個預訂的事件怎麼辦?如上面的例子,我想在...後再sleep 30s然後再進入循環。這在socket通訊過程中,在設置超時的時候可能會用到。 注意到alarm函數。 #include <unistd.h> unsigned int alarm(unsigned int senconds); 使用alarm函數可以設置一個計時器,在將來某個指定的時間該計時器會超時。當計時器超時時,產生SIGALARM信號。如果不捕捉或不忽略此信號,則其默認動作是終止調用該alarm函數的進程。 每個進程只能有一個鬧鍾時鍾,如果在調用alarm時,已經為該進程設置過鬧鍾時鍾,而且它還沒有超時,則將該鬧鍾時鍾的余留值作為本次alarm函數調用的返回值。以前登記的鬧鍾時鍾將被新值代替。 如果有以前為進程登記的尚未超過的鬧鍾時鍾,而且本次調用的seconds為0,則取消以前的鬧鍾時鍾,其餘留值仍作為alarm的返回值。 (以上這幾段話摘自《unix環境高級編程》)。 所以在while循環的printf("...\n");後面添加一句alarm(0);就可以滿足我的要求,即在...後再sleep 30s然後再進入循環。