Atitit sleep原理 node.js sleep解決方案 timerhtml
sleep()的實現分爲三步:node
1.註冊一個信號signal(SIGALRM,handler)。接收內核給出的一個信號。算法
2.調用alarm()函數。數據庫
3.pause()掛起進程。函數
分析:我認爲關鍵的是pause().當執行到這個函數的時候,當前進程被掛起,等時鐘alarm函數4秒以後,內核發送一個SIGALRM信號。致使控制從pause函數轉到信號的處理函數。信號處理函數中的代碼被執行,而後控制返回。當信號被處理完畢以後,pause函數返回,進程繼續。ui
操做系統中,CPU競爭有不少種策略。Unix系統使用的是時間片算法,而Windows則屬於搶佔式的。spa
在時間片算法中,全部的進程排成一個隊列。操做系統按照他們的順序,給每一個進程分配一段時間,即該進程容許運行的時間。若是在 時間片結束時進程還在運行,則CPU將被剝奪並分配給另外一個進程。若是進程在時間片結束前阻塞或結束,則CPU立即進行切換。調度程 序所要作的就是維護一張就緒進程列表,,當進程用完它的時間片後,它被移到隊列的末尾。操作系統
所謂搶佔式操做系統,就是說若是一個進程獲得了 CPU 時間,除非它本身放棄使用 CPU ,不然將徹底霸佔 CPU 。所以能夠看出,在搶 佔式操做系統中,操做系統假設全部的進程都是「人品很好」的,會主動退出 CPU 。.net
Sleep函數就是幹這事的,他告訴操做系統「在將來的多少毫秒內我不參與CPU競爭」。線程
看完了 Thread.Sleep 的做用,咱們再來想一想文章開頭的兩個問題。
對於第一個問題,答案是:不必定。由於你只是告訴操做系統:在將來的1000毫秒內我不想再參與到CPU競爭。那麼1000毫秒過去以後,這時候也許另一個線程正在使用CPU,那麼這時候操做系統是不會從新分配CPU的,直到那個線程掛起或結束;何況,即便這個時候恰巧輪到操做系統進行CPU 分配,那麼當前線程也不必定就是總優先級最高的那個,CPU仍是可能被其餘線程搶佔去。
與此類似的,Thread有個Resume函數,是用來喚醒掛起的線程的。好像上面所說的同樣,這個函數只是「告訴操做系統我從如今起開始參與CPU競爭了」,這個函數的調用並不能立刻使得這個線程得到CPU控制權。
所以,Thread.Sleep(0)的做用,就是「觸發操做系統馬上從新進行一次CPU競爭」。競爭的結果也許是當前線程仍然得到CPU控制權,也許會換成別的線程得到CPU控制權。這也是咱們在大循環裏面常常會寫一句Thread.Sleep(0) ,由於這樣就給了其餘線程好比Paint線程得到CPU控制權的權力,這樣界面就不會假死在那裏。
末了說明一下,雖然上面提到說「除非它本身放棄使用 CPU ,不然將徹底霸佔 CPU」,但這個行爲仍然是受到制約的——操做系統會監控你霸佔CPU的狀況,若是發現某個線程長時間霸佔CPU,會強制使這個線程掛起,所以在實際上不會出現「一個線程一直霸佔着 CPU 不放」的狀況。至於咱們的大循環形成程序假死,並非由於這個線程一直在霸佔着CPU。實際上在這段時間操做系統已經進行過屢次CPU競爭了,只不過其餘線程在得到CPU控制權以後很短期內立刻就退出了,因而就又輪到了這個線程繼續執行循環,因而就又用了好久才被操做系統強制掛起。。。所以反應到界面上,看起來就好像這個線程一直在霸佔着CPU同樣。
末了再說明一下,文中線程、進程有點混亂,其實在Windows原理層面,CPU競爭都是線程級的,本文中把這裏的進程、線程當作同一個東西就行了。
這裏實際上進行了封裝,因此有點難理解。
實際上,在系統內部,是經過SuspendThread和ResumeThread這兩個API函數來實現線程的掛起/恢復。Windows內部維護一個掛起計數器,每執行一次SuspendThread,計數器加一,每執行一次ResumeThread,計數器減一。若計數器值大於0,則系統不爲此線程分配時間片,即線程實際上不能運行,但其數據仍駐留在內存中,能夠被訪問,其餘線程也能夠修改它的狀態,或者用ResumeThread來讓他恢復運行。
sleep其實是對這兩個API的封裝。
C:\0workspace\atiplat_eeJS\aaa\picfileGenderSelector.js
var allFile=new Array();
var nowIdx=0;
function timeEvent()
{
var f=allFile[nowIdx];
// var f_str= f.path+pm.sep+ f.filename;
// var data=fs.readFileSync(f_str,"utf-8");
try {
timeEventItem(f);
/* */
}catch(e)
{
console.log("--processOnePicV2 ex:"+ e);
throw e;
}
nowIdx++;
console.log( "--timeEvent processing :"+f);
}
function timeEventItem(f)
{
if(!f)
return;
for(idx in fls)
{
var f_obj = fls[idx];
console.log(" cur file is:"+ JSON.stringify(f_obj) );
let f=f_obj.path+"\\"+f_obj.filename;
allFile.push(f);
}
setInterval(timeEvent,3000);
Thread.Sleep原理 - 八木_八木 - 博客園.html
做者:: 綽號:老哇的爪子claw of Eagle 偶像破壞者Iconoclast image-smasher
捕鳥王"Bird Catcher kok 虔誠者Pious 宗教信仰捍衛者 Defender Of the Faith. 卡拉卡拉紅斗篷 Caracalla red cloak 萬獸之王
簡稱:: Emir Attilax Akbar 埃米爾 阿提拉克斯 阿克巴
全名::Emir Attilax Akbar bin Mahmud bin attila bin Solomon bin adam Al Rapanui 埃米爾 阿提拉克斯 阿克巴 本 馬哈茂德 本 阿提拉 本 所羅門 本亞當 阿爾 拉帕努伊
經常使用名:艾提拉(艾龍), EMAIL:1466519819@qq.com
頭銜:uke總部o2o負責人,全球網格化項目創始人,
uke交友協會會長 uke捕獵協會會長 Emir Uke部落首席大酋長,
uke宗教與文化融合事務部部長, uke宗教改革委員會副主席
uke制度與重大會議委員會委員長,uke保安部首席大隊長,uke制度檢查委員會副會長,
uke 首席cto 軟件部門總監 技術部副總監 研發部門總監主管 產品部副經理 項目部副經理 uke科技研究院院長 uke軟件培訓大師
uke波利尼西亞區大區連鎖負責人 湯加王國區域負責人 uke克爾格倫羣島區連鎖負責人,萊恩羣島區連鎖負責人,uke布維島和南喬治亞和南桑威奇羣島大區連鎖負責人
Uke軟件標準化協會理事長理事長 Uke 數據庫與存儲標準化協會副會長
uke終身教育學校副校長 Uke醫院 與醫學院方面的創始人
uec學院校長, uecip圖像處理機器視覺專業系主任 uke文檔檢索專業系主任
Uke圖像處理與機器視覺學院首席院長
Uke 戶外運動協會理事長 度假村首席大村長 uke出版社編輯總編
轉載請註明來源:attilax的專欄 http://blog.csdn.net/attilax
http://www.cnblogs.com/attilax/
Microblog
http://weibo.com/u/5941179815 (common)
http://weibo.com/u/5487832265 (tech)
--Atiend v10