校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > linux下nanosleep() & sleep()的區別

linux下nanosleep() & sleep()的區別

熱門標簽:地圖標注的牌子 地址高德地圖標注 桂林市ai電銷機器人公司 磁力導航地圖標注 新科火車站地圖標注點 商店地圖標注外賣入駐 制作地圖標注 外呼系統鏈接 外呼系統怎么弄

用戶程序中的睡眠:

    sleep()
    usleep()
    nanosleep()

sleep()和nanosleep()都是使進程睡眠一段時間后被喚醒,但是二者的實現完全不同。
Linux中并沒有提供系統調用sleep(),sleep()是在庫函數中實現的,它是通過調用alarm()來設定報警時間,調用sigsuspend()將進程掛起在信號SIGALARM上,sleep()只能精確到秒級上。

    nanosleep()則是Linux中的系統調用,它是使用定時器來實現的,該調用使調用進程睡眠,并往定時器隊列上加入一個timer_list型定時器,time_list結構里包括喚醒時間以及喚醒后執行的函數,通過nanosleep()加入的定時器的執行函數僅僅完成喚醒當前進程的功能。系統通過一定的機制定時檢查這些隊列(比如通過系統調用陷入核心后,從核心返回用戶態前,要檢查當前進程的時間片是否已經耗盡,如果是則調用schedule()函數重新調度,該函數中就會檢查定時器隊列,另外慢中斷返回前也會做此檢查),如果定時時間已超過,則執行定時器指定的函數喚醒調用進程。當然,由于系統時間片可能丟失,所以nanosleep()精度也不是很高。

alarm()也是通過定時器實現的,但是其精度只精確到秒級,另外,它設置的定時器執行函數是在指定時間向當前進程發送SIGALRM信號。


復制代碼
代碼如下:

#include stdio.h>
#include stdlib.h>
#include unistd.h>
#include sys/time.h>
#include sched.h>
#define COUNT 1000
#define MILLION 1000000L/p> p>int main(void)
{
int i;
struct timespec slptm;
long tdif;
struct timeval tend, tstart;/p> p> slptm.tv_sec = 0;
slptm.tv_nsec = 1000; //1000 ns = 1 us/p> p> //struct sched_param param;
//param.sched_priority = 0;
//sched_setscheduler(getpid(), SCHED_FIFO, param);/p> p> if (gettimeofday(tstart, NULL) == -1) {
fprintf(stderr, "Failed to get start time\n");
return 1;
}
for (i = 0; i COUNT; i++) {
if (nanosleep(slptm, NULL) == -1) {
perror("Failed to nanosleep");
return 1;
}
}
if (gettimeofday(tend, NULL) == -1) {
fprintf(stderr, "Failed to get end time\n");
return 1;
}
tdif = MILLION * (tend.tv_sec - tstart.tv_sec) + (tend.tv_usec - tstart.tv_usec);
printf("nanosleep() time is %ld us\n", tdif/COUNT);
return 0;
}

HZ                                 250HZ
時鐘中斷的時間間隔:                   4 ms   (1000ms/250)
----------------------------------------
nanosleep() time is 4019 us        (4.019 ms)
說明nanosleep的睡眠定時器依賴于時鐘中斷

HZ                                 1000HZ
時鐘中斷的時間間隔:                   1 ms
----------------------------------------
nanosleep() time is 12 us
注: 最小睡眠時間為1 us

標簽:湘西 衡陽 三門峽 仙桃 慶陽 茂名 衡陽 六盤水

巨人網絡通訊聲明:本文標題《linux下nanosleep() & sleep()的區別》,本文關鍵詞  linux,下,nanosleep,amp,sleep,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《linux下nanosleep() & sleep()的區別》相關的同類信息!
  • 本頁收集關于linux下nanosleep() & sleep()的區別的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 开封县| 汉川市| 屯昌县| 柯坪县| 泰来县| 宝鸡市| 伽师县| 垫江县| 鄱阳县| 灵台县| 长治县| 酉阳| 皮山县| 丽水市| 大石桥市| 湘潭县| 涿鹿县| 隆化县| 望江县| 桂平市| 保德县| 桃园县| 青铜峡市| 盘山县| 电白县| 东港市| 西贡区| 章丘市| 英吉沙县| 安塞县| 金平| 泽普县| 乡宁县| 荥阳市| 奉新县| 亚东县| 汶上县| 东乌珠穆沁旗| 江孜县| 广宁县| 新田县|