濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > linux下nanosleep() & sleep()的區(qū)別

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

熱門標(biāo)簽:地圖標(biāo)注的牌子 地址高德地圖標(biāo)注 桂林市ai電銷機(jī)器人公司 磁力導(dǎo)航地圖標(biāo)注 新科火車站地圖標(biāo)注點(diǎn) 商店地圖標(biāo)注外賣入駐 制作地圖標(biāo)注 外呼系統(tǒng)鏈接 外呼系統(tǒng)怎么弄

用戶程序中的睡眠:

    sleep()
    usleep()
    nanosleep()

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

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

alarm()也是通過(guò)定時(shí)器實(shí)現(xiàn)的,但是其精度只精確到秒級(jí),另外,它設(shè)置的定時(shí)器執(zhí)行函數(shù)是在指定時(shí)間向當(dāng)前進(jìn)程發(fā)送SIGALRM信號(hào)。


復(fù)制代碼
代碼如下:

#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
時(shí)鐘中斷的時(shí)間間隔:                   4 ms   (1000ms/250)
----------------------------------------
nanosleep() time is 4019 us        (4.019 ms)
說(shuō)明nanosleep的睡眠定時(shí)器依賴于時(shí)鐘中斷

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

標(biāo)簽:湘西 衡陽(yáng) 三門峽 仙桃 慶陽(yáng) 茂名 衡陽(yáng) 六盤水

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《linux下nanosleep() & sleep()的區(qū)別》,本文關(guān)鍵詞  linux,下,nanosleep,amp,sleep,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《linux下nanosleep() & sleep()的區(qū)別》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于linux下nanosleep() & sleep()的區(qū)別的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    拉萨市| 佛冈县| 思南县| 遵化市| 乃东县| 荃湾区| 九江市| 玉田县| 广水市| 万载县| 石屏县| 洪泽县| 云阳县| 昆山市| 迁西县| 无锡市| 惠安县| 杭锦旗| 泉州市| 美姑县| 河西区| 突泉县| 娄烦县| 南昌县| 三门县| 宝清县| 清远市| 浮梁县| 刚察县| 富顺县| 汝阳县| 衢州市| 北京市| 城口县| 闽侯县| 吉木乃县| 铜山县| 兴宁市| 子洲县| 张家口市| 将乐县|