前言
之前看到一篇博客说每个程序员在进入电梯是否都在想着电梯优化算法,这篇文章吸引了我,是呀,日常随处可见的电梯,其算法是如何实现的,引起了我的兴趣与思考,因此在这次的电梯系统的设计种,我也对电梯的调度算法进行思考、实现。
多电梯系统避免资源抢占
在多电梯系统中,最让人头痛的就是多台电梯去抢占同一资源,举个例子,就是当俩台电梯都停在1楼时,如果有一个人按下了5楼的电梯,并且该乘客是要下去2楼的,那么此时就只需要出动1台电梯就可以解决了,倘若在此时刚好也有一个人在5楼,并且想要向下去3楼,那么该电梯系统仍然只需要出动一台电梯就行,因为他们运动的方向一致。但是如果有1哥人在5楼,但是他是要向上的,那么就需要出动另一台电梯了,因为运动方向不同。电梯1从1楼上升到5楼的过程中,如果有人按下电梯,而且运动方向也是一致,那么就响应他,让他进入电梯,如果运动方向不同就需要出动另一台电梯了。这就是他们之间复杂的关系,总结成一句话就是同向且容得下,就只需要一台电梯,如果多个方向,目前的电梯搞不定,就需要出动处于等待状态的电梯。
那么还存在一个问题,就是如果在电梯响应该层后,该层同向的乘客再按电梯时,电梯系统中处于等待的电梯如何做到不响应该请求,就是假设乘客1在5楼按下向下的电梯按钮,电梯1响应,乘客2再按下向下按钮,其他电梯都不再响应,只有电梯1能响应,避免资源抢占。这个时候就需要借助操作系统中资源锁的概念了,只要系统中的某个电梯响应该层向上(向下)的请求,就把该层的按钮锁住,其他乘客再按也没有用,然后该电梯到达后再释放该锁。通过设置资源锁就能轻松地避免资源抢占。
电梯优先的响应策略
为了更好地理解该算法设计的思路,我们先设想一个情景:现在整个系统有2台电梯,电梯1,电梯2,假设电梯送完2个乘客后,电梯1停留在4楼,电梯2停留在3楼,乘客3在2楼按下了向下的按钮,那么到底是出动电梯1还是电梯2呢?如果是乘客利益优先的话,那么肯定是出动电梯2,这样就能减少时间的花销,但是在本系统中,采用的并不是这种乘客之上的设计思路,而是采用电梯优先的设计思想,就是以电梯为载体,整个电梯通过轮询每台处于等待状态的电梯,让其响应距离自己最近的乘客请求。回到