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

相关文章
相关标签/搜索