用戶程序中的睡眠:
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)。
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
新聞熱點(diǎn)
疑難解答
圖片精選