其他分享
首页 > 其他分享> > BUAA OO UNIT2 目的选层电梯单元总结

BUAA OO UNIT2 目的选层电梯单元总结

作者:互联网

BUAA OO UNIT2 目的选层电梯 单元总结

同步块&锁

hw5

Qu Rlist Elv ElvMotor
IN run()
Trans Close(), tr(), run()
Rlist add(), done(), qry(), poll()
Elv setClsd(), add(), done(), redir(),port(), run() redir(), port(), wk(), run()
ElvMotor flr(), gate(), up(), dn(), open(), close(), cmd(), run()

hw6

Qu Trans Elv ElvMotor
IN run()
Trans close(), launch(), nalloc(), run() Newelv(), launch(), run() Launch()
Elv porti(), run() wtf(), dir(), launch(), tp(), dis(), done(), ori(),wk(), run()
ElvMotor flr(), gate(), cmd(), up(), dn(), run()

hw7

Qu Elv
Base req(), alloc() alloc()
Elv release() go(), open(), close(), port()s

调度器&线程交互

hw5

调度器仅负责把请求从主等待队列转储到电梯等待队列中,直接用synchronized块解决即可。

hw6

调度器负责把电梯“发射”至目标楼层,目标楼层可以是出现请求的楼层,也可以是约定好当没有可分配请求时应去往的停泊楼层。

调度器有主动入口和被动入口:新增请求时输入线程激活调度器,使用主动入口;电梯轿厢为空时调用调度方法,使用被动入口。

hw7

调度器每隔200ms扫描一遍等待队列,刷新每个请求分配的电梯号码,刷新每个电梯的目标楼层。依次trylock所有电梯,若成功则signal()。除sleep(200)外,调度器永不休眠,因而也不需要被唤醒。调度器给每个电梯设置目标楼层时赋值语句是原子语句,不需要加锁。

平衡&可拓展性

hw5

电梯自身调度是魔改的莫队算法,希望利用请求出现的局部性,优先在一段小区间里往返送人。人少的时候效果极差。类图中Rlist类是莫队实现的主要基础。在此基础上增加电梯非常容易,只要继承电梯类,并重写与停靠楼层、运行速度相关的方法即可,调度器也只需改为转储时向不同电梯写入请求即可。

性能:失败;可拓展性:良好。

diagram5

main5sequence5

hw6

使用共享等待队列,Rlist被弱化为仅包含判断方向是否相同、比较距离远近的静态方法。共享队列 + 调度器分配目标楼层 的架构兼具抢人和分配两种思路的优势,性能优秀。但共享队列带来了一些线程安全问题,其解决较复杂。由于调度时认为各电梯之间没有属性上的差异,因此增加电梯种类可能导致调度器出现较大改动。

性能:优秀;可拓展性:一般。

diagram6

main6sequence6

hw7

共享队列plus。调度器每隔200ms刷新一次,重新分配请求,设置每部电梯的目标楼层。每个请求增加权限部分,可以只允许指定电梯载客,考虑了每部电梯之间属性差异。通过删除调度器唤醒电梯以外的所有唤醒操作、删除与等待队列或电梯线程无关的所有临界区,成功杜绝了线程安全问题。实现了简单的换乘,但总体性能似乎没有不换乘好。

性能:较优秀;可拓展性:尚可。

diagram7 main7

sequence7

bug

hw5

hw6

hw7

分析别人bug

心得

IMG_0157IMG_0158

IMG_0159IMG_BDD641B0C356-1IMG_0161

IMG_0160IMG_0162

IMG_0164

标签:OO,run,BUAA,调度,电梯,线程,UNIT2,Elv,bug
来源: https://www.cnblogs.com/fallqs/p/14695358.html