欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

linux中nanosleep()和sleep()有什么區(qū)別

linux中nanosleep() 和 sleep()有什么區(qū)別?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

在田陽等地區(qū),都構建了全面的區(qū)域性戰(zhàn)略布局,加強發(fā)展的系統(tǒng)性、市場前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務理念,為客戶提供成都網(wǎng)站設計、成都做網(wǎng)站 網(wǎng)站設計制作按需開發(fā),公司網(wǎng)站建設,企業(yè)網(wǎng)站建設,品牌網(wǎng)站設計,成都營銷網(wǎng)站建設,外貿(mào)營銷網(wǎng)站建設,田陽網(wǎng)站建設費用合理。

什么是Linux系統(tǒng)

Linux是一種免費使用和自由傳播的類UNIX操作系統(tǒng),是一個基于POSIX的多用戶、多任務、支持多線程和多CPU的操作系統(tǒng),使用Linux能運行主要的Unix工具軟件、應用程序和網(wǎng)絡協(xié)議。

用戶程序中的睡眠:

    sleep()
    usleep()
    nanosleep()

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

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

alarm()也是通過定時器實現(xiàn)的,但是其精度只精確到秒級,另外,它設置的定時器執(zhí)行函數(shù)是在指定時間向當前進程發(fā)送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()有什么區(qū)別問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關知識。

網(wǎng)頁名稱:linux中nanosleep()和sleep()有什么區(qū)別
URL分享:http://chinadenli.net/article42/gohshc.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、企業(yè)網(wǎng)站制作、域名注冊響應式網(wǎng)站、微信小程序、網(wǎng)站設計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設