队列的应用 之 M/D/1队列

      说明:参考内容 :http://introcs.cs.princeton.edu/java/43stack/ 

 

      很有幸结识排队行业,由于工作的原因,平时会多多关注排队,关注排队对列的问题。今天就跟大家分享我所结识的队列。

 

      在过去的一个世纪中,已经证明在各种各样的广泛的应用中FIFO是准确并有用的模型,应用的范围从制造业程序到电话网络,到交易模拟。称为排队论(quecing theory)的数学领域已经成功的帮助理解和控制所有这类复杂的系统。FIFO在计算中也扮演这一个重要的角色。当你使用计算机时,经常会遇到队列:队列可能是播放列表上的歌曲,正在等待打印的文档甚至是游戏机中的事件。

 

     或许最终的队列应用是因特网本身,它是基于在数量庞大的队列中移动的大量的信息,这些队列具有各种不同的属性,并且他们以各种不同的复杂方式相连。理解并控制这样的复杂系统包括队列抽象,排队论数学成果的应用,还涉及两个模拟的研究。下面我们分析一个经典的实例体会这个与众不同的过程。

 

     M/D/1 队列

     一个最简单的队列模型成为M/D/1队列。

     M表明到达服从Markov过程,在这个文本中,泊松过程到达服从特定的概率分布,此分布以准确表明了许多真实世界的模拟;

     D表明离开是确定的并以固定的速度发生;

     1表明只有一台服务器。

 

     它是像单行汽车等待进行收费所这类情况的合适模拟:他们以随机的间隔时间到达,但是以固定的时间间隔离开。

     M/D/1队列由它的到达率(arrival rate)λ和离开率(departure rate)μ参数化。

     对于到达率λ,举个例子,每分钟到达收费所的汽车的数量;

     对于离开率μ,举个例子,每分钟通过收费所的汽车数量;可通过3个属性对其进行描述:

     ·  这有一台服务器(FIFO队列)

     ·  到达使用λ的泊松过程来描述,到达来自指数分布

     ·  当队列非空时,以固定的速率μ离开

 

     注意,队列将没有边界的增长,除非μ>λ。否则,顾客以蛮有兴趣的动态过程进入或留在队列中。也要注意到达之间的时间是1/λ分钟,当队列非空时,平均的离开之间的时间是1/μ分钟。


     分析

     在实际应用中,人们对参数值队列的不同属性的影响感兴趣。如果你是顾客,你可能想要知道你在队列中必须等待的时间;如果你设计系统,你可能想要知道在队列中可能有多少名顾客,有时候会更加复杂,例如有这种可能性,队列大小将超过了给定的最大值。为了简化模拟,概率论使用公式来表示这些量作为μ和λ的函数。对于M/D/1队列,我们知道:

     ·  平均队列长度L是(λ平方)/(2μ(μ-λ))+λ/μ。

     ·  平均等待时间W是λ/(2μ(μ-λ))+1/μ。


     例如,如果汽车以每分钟为10的平均率到达,而服务费率是每分钟15,那么在队列中汽车的平均数将是4/3,而平均等待时间将是2/15Min或8S。这些公式证实当λ逼近μ时,等待时间和队列增长没有边界。它们也服从为利特尔定律(little' law)的通用规则:对于许多队列类型,平均队列长度类型,平均队列长度是λ乘以平均等待时间(L=λW)。

 

     时间原因,先写这些,有关模拟的部分稍后待续。。。

 

                                                                                                                                  

                                                                                                   于2011年/6月/24日 01:32

     

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一段 C++ 代码,其中包含了一些条件语句和函数调用。逐行解释如下: ```if ( m_env->m_ClearSendQueFlag )``` 如果 `m_env->m_ClearSendQueFlag` 变量为真(非零),则执行下面的代码块。 ```m_asduSendQue.ClearAllDataBuff();``` 调用 `m_asduSendQue` 对象的 `ClearAllDataBuff()` 函数,清空发送队列的所有数据缓冲区。 ```memset(m_sendBuf,0,MaxLen_Buf);``` 使用 `memset()` 函数将 `m_sendBuf` 数组的所有元素都设置为 0,该数组的长度为 `MaxLen_Buf`。 ```this->m_env->m_TxBuf.ResetBuf();``` 调用 `m_env` 对象的 `m_TxBuf` 成员的 `ResetBuf()` 函数,重置该成员对象的缓冲区。 ```m_Flag |= IEC104_FLAG_STARTDT;``` 将 `m_Flag` 变量的二进制表示中的第 0 位(从右往左数)设置为 1,表示启动传输(STARTDT)。 ```OutputLogMsgToLogFile("var/log/s104.log",320000,"%s:%d INFO! STARTDT! 104startdtresrt=%d ClearSendQueFlag=%d RtuNo=%d\n",__FILE__,__LINE__,m_env->m_104startdtresrt,m_env->m_ClearSendQueFlag,m_env->m_sRtuNo);``` 调用 `OutputLogMsgToLogFile()` 函数,将日志信息记录到文件中。该函数的第一个参数是文件名,第二个参数是日志文件的最大大小,第三个参数是日志信息的格式化字符串,后面的参数是对应的参数值。 ```this->m_dataTransflag = 0x01;``` 将 `m_dataTransflag` 变量的值设置为 1,表示数据传输。 ```this->m_env->m_appLayer->StartDTProcess();``` 调用 `m_env` 对象的 `m_appLayer` 成员的 `StartDTProcess()` 函数,启动应用层的 STARTDT 过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值