OO第二单元总结

OO第二单元总结

(1)总结分析三次作业中同步块的设置和锁的选择,并分析锁与同步块中处理语句直接的关系

三次作业锁的设计基本相同,都是有processqueue锁和waitqueue锁,processqueue锁是每个电梯的处理队列,waitqueue是在输入到调度器中的等待调度的队列,调度器执行时需要设置以waitqueue为锁的同步块,因为会改变waitqueue里的值,在分配人员到电梯时则需要设置每个电梯不同的以processqueue为锁的同步块,此处是等待电梯相应动作执行完后释放锁再加入人员进processqueue,之后notify电梯,而电梯在处理processqueue到elevator时也要对processqueue加锁,不然会与调度其中对电梯process的加入操作产生冲突。

 

(2)总结分析三次作业中的调度器设计,并分析调度器如何与程序中的线程进行交互

如果没有输入,调度器则等待,当有输入唤醒调度器后,调度器开始分配任务给电梯,第一次作业中只需直接把任务加给电梯就行,第二次作业则是遵循均摊的策略分配任务,第三次则按照不同的任务类型以及比例系数分配任务。与电梯线程的交互是利用每个电梯的共享变量processqueue来完成的,调度器拿到对应电梯的processqueue锁以后往里面加任务,notify电梯,再释放锁,接着电梯开始执行分配给自己的任务。第三次作业略微不同的是存在换乘,即电梯在拿到waitqueue锁以后往waitqueue里添加请求(来自换乘人员的请求),notify调度器,再释放锁。

 

(3)从功能设计与性能设计的平衡方面,分析和总结自己第三次作业架构设计的可扩展性

UML类图

 

 

 

UML协作图

 

 

 

 

 

 

 

 

 

 

 

第三次作业由于在调度器分配时根据电梯的类型以及电梯当前运行的状态给予了不同电梯不同的偏置系数,所以基本能保证多部电梯工作量相当,同时电梯内部对应其类型有着根据类型执行的Constructor,所以改变电梯属性,种类等方面扩展性良好,但是性能方面体现并不好,由于我针对几个特殊情况例如4-18,6-18等乘客需求去进行4-3(A),3-18(C)类似的换乘时没考虑到更多的因素,例如电梯当前所在楼层等所以可能会出现耗时更多的情况,例如A中有人本来要从3到18层,A中也没满,但是此时请求是4-3的,所以A不会捎带该请求,而是先把电梯里的人送到18层在返回4楼接该请求,导致时间大大增加,所以该代码在性能上还可以进行不少优化。

 

(4)分析自己程序的bug

本单元第一次作业强测有三个点RTE了,是最后某线程不能正确结束导致的这是由于对代码结构把握不清晰造成的,process中存在AB锁,而schedule里又存在BA锁的可能,导致最后死锁,只是因为AB锁相隔很近所以本地多次测试都未发现,这个问题出现的原因是没有分析好各个类锁,同步块之间的关系

 

第二次作业未发现bug

 

第三次作业强测中未发现bug,但是有一个bug在互测中被发现出来了,在换乘时我先将人员踢回调度队列再电梯person--,导致存在一种情况换乘的那个人被踢回调度队列后又被分配到了一个电梯里运行,而此时还未从上一个电梯中出来。

 

(5)分析自己发现别人程序bug所采用的策略

列出自己所采取的测试策略及有效性

测试方法,利用C语言写了一个随机数据生成器来提供大量输入数据,同时利用C语言写了一个Answercheck判断答案正确性,即判断电梯是否正常运行,人员进出是否正常等等,根据时间输入的方法则是借用的讨论区同学的timeInput代码,这种测试方法可以有效发现输出是否有异常的,但是不足之处是具有随机性,如果代码存在死锁问题不能很好的检测出来。

 

分析自己采用了什么策略来发现线程安全相关的问题

如果存在同时修改共享数据这类线程安全问题则通过上述方法可以发现,但是对于死锁则没有很好的测试手段,只能通过阅读代码,理清各个锁和同步块之间的关系,然后枚举各种进程运行的情况判断是否会发生死锁。

 

分析本单元的测试策略与第一单元测试策略的差异之处

第一单元的测试可以借助python进行搭建,不用自己写正确性判断的代码,但是这一单元只有自己去写检测程序代码了,还有一点是这单元题目的输入需要按时间输入也与第一单元有所不同。

 

(6) 心得体会

从线程安全和层次化设计两个方面来梳理自己在本单元三次作业中获得的心得体会

在完成本单元作业后明显体会到如果在写代码之前理清楚哪些是共享变量,哪些操作需要给同步块加锁,以及各个类之间调用锁的顺序,那么写出来的代码大概率是有线程安全问题的,完成本单元第一次作业时就没有分析清楚类之间对于共享锁的调用,导致出现了死锁,在第一次修复bug时我好好分析了代码结构再开始着手第二次作业,死锁的隐患便没再出现过。

对于修改共享变量的线程安全问题,只要清楚对于共享变量的写操作需要加锁便可避免这类线程安全问题。

在层次化设计方面,这次的电梯作业能很好的体现出架构设计对于代码书写流畅性的影响,首先把架构设计好,一共三种线程,输入线程,调度线程,电梯线程,调度从输入中取数据然后分配给电梯线程,电梯也可能在处理过程中向调度线程加请求(换乘),框架清晰以后再去着手代码便会写得得心应手。

posted @ 2021-04-23 20:01  CloudZD  阅读(72)  评论(1)    收藏  举报