Atitit sleep原理 node.js sleep解決方案 timer

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;

 

 

 

 

 

 

 

 

 

 

Main

 

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

http://weibo.com/u/5487832265 (tech)

 

 

--Atiend  v10

相關文章
相關標籤/搜索