sleep實現原理

2022-03-23 14:22:14 字數 991 閱讀 8505

a、sleep():linux中並沒有提供系統呼叫sleep(),sleep()是在庫函式中實現的,它是通過呼叫alarm()來設定報警時間,呼叫sigsuspend()將程序掛起在訊號sigalarm上,sleep()只能精確到秒級上。

b、nanosleep():則是linux中的系統呼叫,它是使用定時器來實現的,該呼叫使呼叫程序睡眠,並往定時器佇列上加入乙個timer_list型定時器,time_list結構裡包括喚醒時間以及喚醒後執行的函式,通過nanosleep()加入的定時器的執行函式僅僅完成喚醒當前程序的功能。**或參考:sleep實現原理

使用者程式中的睡眠:

sleep()

usleep()

nanosleep()

sleep()和nanosleep()都是使程序睡眠一段時間後被喚醒,但是二者的實現完全不同。

linux中並沒有提供系統呼叫sleep(),sleep()是在庫函式中實現的,它是通過呼叫alarm()來設定報警時間,呼叫sigsuspend()將程序掛起在訊號sigalarm上,sleep()只能精確到秒級上。

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

alarm()也是通過定時器實現的,但是其精度只精確到秒級,另外,它設定的定時器執行函式是在指定時間向當前程序傳送sigalrm訊號。

sleep被打斷的例子應該是,sigalarm,因為本身sleep就是用sigalarm實現的。

sleep實現原理

使用者程式中的睡眠 sleep usleep nanosleep sleep 和nanosleep 都是使程序睡眠一段時間後被喚醒,但是二者的實現完全不同。linux中並沒有提供系統呼叫sleep sleep 是在庫函式中實現的,它是通過呼叫alarm 來設定報警時間,呼叫sigsuspend 將程...

批處理實現sleep

linux的shell裡,提供了sleep命令,參考了不少前輩的帖子,我也用批處理實現了sleep。sleep.bat echo off setlocal echo time call sleep 1 echo time endlocal goto eof sleep setlocal enable...

PHP實現 輸出 sleep 輸出

sleep 函式一般用在暫停上,但是乙個php一旦有了sleep,其他的輸出 print,echo 就都要等待sleep 函式的完成,這是因為緩衝區,這裡有詳細解釋 在這裡不贅述,而如果要實現先輸出再等待再輸出,則用到了ob flush 和flush 在沒有開啟快取時,指令碼輸出的內容都在伺服器端處...