<?php
while(1){
 do something...
}上面这段代码会让服务器崩溃<?php
while(1){
 do something...
 usleep( 100000);
}这样就不会了这是什么道理呢?
还有usleep这个值设为1行不行?

解决方案 »

  1.   

    很简单,
    以人来比喻,
    第一段代码的意思就是让一个人不停的跑,早晚会跑死的.
    第二段代码的意思就是让一个人跑一会停一会,所以一直跑下去没有任何问题.
    usleep参数是microseconds, 1000000ms = 1s,所以你改成1和第一段代码基本上没有区别了.
      

  2.   

    一个用户态php程序,不能崩溃OS吧。
      

  3.   

    象第一段那样的程序,CPU根本没有时间(时间片)去处理别的事务,从而呈现“假死”状态。而sleep的一段时间中,本程序交出了执行权,直到休眠过后CPU再次调度该程序运行。如果我们在sleep(...)过后打印系统时间,可以看到每个间隔都不一定是很严格的我们所设置的间隔。这个是CPU多进程调度的机制。
      

  4.   


    现代OS一般都是可抢占的,执行php死循环程序时,可以被抢占OS调度器,如果发现有处于TASK_RUNNING却没有得到时间片的进程,会等php时间片用完时,强制将其
    剥离CPU,并且调整动态优先级,放入到相应运行队列,然后取一个其它的等待时间片的进程,放入到CPU。时钟中断会让OS定时执行调度工作的,不管用户进程是否愿意,都不得的下来。
    这个时钟中断的周期,跟HZ有关,所以编译内核时,调整HZ也是门学问,
    大时间片有更大吞吐量,但是响应时间却更长了,小时间片响应很快,但是吞吐量下去了。用户态程序无论怎么死循环,都搞不掉系统。