• Welcome to the world's largest Chinese hacker forum

    Welcome to the world's largest Chinese hacker forum, our forum registration is open! You can now register for technical communication with us, this is a free and open to the world of the BBS, we founded the purpose for the study of network security, please don't release business of black/grey, or on the BBS posts, to seek help hacker if violations, we will permanently frozen your IP and account, thank you for your cooperation. Hacker attack and defense cracking or network Security

    business please click here: Creation Security  From CNHACKTEAM

Recommended Posts

BUAA OO 第二单元总结

同步块与锁分析

在第五个任务中,我设计了一个线程安全的类OrderQueue。在这个类中,有与请求队列、等待表和数据相关的类。请求队列和等待表的线程安全性和并行性能通过单独锁定它们来保证。因为这个封装的类不需要对外考虑线程安全,只需要使用OrderQueue,保证了整个程序的线程安全和简洁。

在第六个作业中,OrderQueue增加了返回队列中请求数的功能,增加了与请求队列相同的锁。

在第七个操作中,OrderQueue增加了获取对应电梯参数的功能,该参数是常量,不需要锁定。

调度器分析

调度器分为总调度器和电梯策略,电梯策略包含在每台电梯中,总调度器与每台电梯对应的OrderQueue进行交互。

在第五次操作中,总调度采用直接分配到对应电梯的方法,电梯策略采用LOOK算法。

在第六操作中,总调度器采用通过比较对应于可到达电梯的顺序队列中的指令数量,将指令分配给具有最低指令数量的电梯的策略。对于电梯策略,垂直电梯采用LOOK算法,水平电梯采用循环扫描策略。

在第七个作业中,总调度器通过DFS和代价函数寻找最短路径,用除法分解指令,根据电梯ID号将指令分配到对应的电梯。电梯策略与第六种操作大致相同,在水平电梯策略中增加了判断门能否打开的功能。

架构设计与扩展能力

由于方法名称众多且复杂,为了将重点放在架构分析上,本次作业的UML类图只留下了类之间的关系。

第五次作业:

pzjwzac25uu5257.jpg

经过慎重考虑,我没有把调度器作为一个线程来使用,因为我们可以发现,调度器和InputHandler没有速度上的差别,所以调度器不应该是一个单独的线程。所以这段代码有三个线程:主线程、输入处理线程和电梯线程。

在调度上,我使用总调度器将指令分配给电梯,分配方法将由分配策略SdlStrategy控制。类似地,电梯本身的运行也由电梯策略EleStrategy控制,从而将策略与实体解耦。同时,两种策略抽象类都采用了工厂模式,为各种策略的扩展打下了良好的基础。

在线安全,OrderQueue是一个自己设计的线程安全类,也就是生产者-消费者模型中的传送带,线程之间的数据交互会通过传送带发生。通过这种设计,不需要考虑代码其他部分的线程安全性,从而保证了程序结构的简单性。但是官方的输出包本身并不是线程安全的,所以通过封装的方式将其封装到SafeOutput类中,实现了输出的线程安全。

第六次作业:

evnvml5d22o5258.jpg

第六次作业的结构和第五次作业相比没有太大变化。水平电梯的实现对我的架构来说非常简单,因为电梯和策略是解耦的,我只需要单独写一个。

个横向电梯的运行策略Circle,并将其加入电梯策略的工厂即可。这体现了我的架构的良好可拓展性和低耦合度。

又因为同一层可能有多个横向电梯,所以我的调度器策略采用了Balance策略,将请求分配给可达电梯中队列指令数量最少的电梯,实现了效率的优化。

第七次作业:

nuiy5tnampn5259.jpg

第七次作业需要实现换乘功能,这次作业电梯的运行策略只需要在横向电梯策略Circle中加入判断是否可以开门即可,而主要的工作是如何在总调度器中实现分解指令的功能。

本次作业总调度器通过DFS与代价函数找到耗时最短的路径,并通过divide方法分解指令并储存在Scheduler的哈希表里,通过AccordId策略基于电梯ID号将指令分配到对应的电梯上去。当电梯出人时,使用Update方法,从HashMap中根据ID查找指令,如果查到,就通过AccordId策略将指令分配到对应的队列中,以此实现换乘。

线程之间的协作关系通过UML协作图(sequence diagram)来展示:

cwop1uf414s5260.jpg

bug分析

本单元三次作业在强测与互测中均无BUG被找到,

体现了一个合理的架构对代码的质量起到了决定性作用。

hack策略分析

通过自动化评测与构造特殊数据相结合的方式进行Hack,实践证明Hack策略非常有效。

通过构造几组容易导致线程安全的数据来发现线程安全问题。比如所有指令只涉及同一座的电梯,多个运行的电梯同时输出等。

本单元的测试策略主要是发现线程不安全的代码并将bug复现出来,而第一单元的测试策略是覆盖性测试所有表达式结构,也不需要考虑bug复现的问题。

心得体会

线程安全心得:

高并发的设计需要让每个不相关的任务独立,彼此独立地执行自己的任务。而相关的地方最好通过设计线程安全类解决,这样可以保证各个线程的行为是安全的,同时可以保证代码的简洁性。

层次化设计

使用了JAVA 设计结构中的 生产者-消费者模式,利用抽象层次与工厂模式提高了代码的可拓展性,实现了代码复用。同时通过合理的抽象层次降低了代码的耦合度,提高了代码质量。

在设计过程中,我遵循了设计原则SRPOCP

SRP: 类与方法的职责单一,不要承担过多的职责。

OCP:修改时不得修改原有代码,只能通过新增代码实现以修改目的。

Link to comment
Share on other sites