前言

本单元作业在优化方面确实有一些想法值得分享,故单开一篇博客分享一下三次作业的优化以及架构。

三次作业的共同之处在于线程之间通讯所依赖的都是共享对象,采用生产者消费者模式。

这样做的好处是框架清晰,迭代起来往往不需要再添加很多类,改调度也是一个函数的事情:D

HW5

第一次作业是单部电梯可捎带,主体上采用的是look算法,电梯在可达楼层上下扫描,当前方向无请求则掉头,两边都无请求则等待,这里用了个小trick,开门等待,小概率能捡一些时间。共享对象“托盘”持有一个Hashmap,以楼层号为键,楼层类为值,楼层类持有上行请求和下行请求两个线程安全队列,与电梯方向相同的队列将会被查询接收请求。托盘负责接收输入线程的输送请求以及向电梯输入请求,托盘这个类的实现是线程安全的,故输入线程和电梯线程无需加锁。

HW6

第二次作业加入电梯的数量可以是1-5台,单部电梯采取的策略还是选择了沿用第一次作业的look,多部电梯每一部一个线程,除了电梯线程和输入线程外还增加了一个主调度线程MasterScheduler,负责任务的分派。

依然采取生产者消费者模式,不过这一次是两级的,输入与主调度之间有一个简单的共享对象Tray负责协调、主调度和每部电梯之间都有一个共享对象Scheduler负责协调,这个共享对象实现了子调度器接口ChildScheduler。由于主调度器负责任务分派,因此调度函数实现在主调度器中,电梯对于请求分派不可见,只管跑就完事了。

考虑到如果有多部电梯且电梯还有容量限制,请求集中在少部分电梯上会造成忙闲不均浪费资源,因此负载均衡会取得很好的收益,所以电梯与主调度器之间还应共享一个电梯状态对象ElevatorStatus,实例化在子调度器中,调度函数依据此来分派请求,以期取得较优效率。具体来讲,就是根据实际在电梯里的人数,对应楼层已经分派的人数以及电梯获得请求后需要移动的距离作为参考条件计算惩罚值,惩罚值最小的电梯将获得此请求,这几个条件还需要加权,经历了调参之后发现电梯人数所占的比例应该稍大一些,最后取得的性能分还不错。

第二次作业uml协作图

电梯线程只管往子调度器拿人跑,故暂未列入

HW7

第三次作业最大的不同在于动态加入电梯并且有ABC三种可达楼层不相同电梯,有些请求需要电梯之间的协作才能完成。这次基调还是生产者消费者思想,受教学视频点拨,又采用了workerThreads模式,在上一次的基础上将电梯线程创建和启动放置在主调度器MasterScheduler中,同时为每部电梯实例化一个子调度器Scheduler作为“托盘”。

这次的调度还是秉承着负载均衡的原则,事先决定A类电梯作为负数楼层和15-20层之间的高速列车,B类主要负责出发地是偶数楼层的请求,C类主要负责出发地是奇数楼层的请求,当然,笔者首先在主调度器中对请求进行一定粒度的分割Dispatch,让目的地在相应电梯的可达楼层范围之内,每个子调度器在上一次的基础上增加一个nextStage线程安全队列用于储存被分配到的具有依赖关系的请求,如此一来,换乘问题只需要分割请求、完成先决请求后回调另外两类子调度器(例如B类子调度器通知AC类)、进行下一阶段请求这样的系列操作就得以解决。

同类电梯之间也涉及到调度,笔者直接在子调度器复用了第二次作业的调度函数,最终达到的效果也差强人意。

第三次作业uml协作图

  • 主调度器视角:主调度器与电梯线程之间只有create关系,其他联系均通过子调度器协调。

  • 电梯视角:getOut的时候有callBack函数查询有无下一阶段任务

OO电梯系列优化分享的更多相关文章

  1. 学会拒绝,是一种智慧——OO电梯章节优化框架的思考

    在本章的三次作业里,每次作业我都有一个主题,分别是:托盘型共享数据.单步电梯运行优化.多部电梯运行优化,因而电梯优化实际是第二.三次作业.虽然后两次作业从性能分上看做得还不错,但阅读其他大佬博客,我深 ...

  2. OO电梯系列总结与反思

    目录 前言 HW5 度量分析 UML类图与协作图 bug分析 HW6 度量分析 UML类图与协作图 bug分析 HW7 度量分析 UML类图与协作图 bug分析 SOLID原则 感想 前言 紧张刺激的 ...

  3. OO第三次电梯作业优化

    目录 第三次电梯作业个人优化 前言 优化思路 一.调度器 二.电梯 第三次电梯作业个人优化 前言 由于个人能力有限,第二次电梯作业只能完成正确性设计,没能进行优化,也因此损失了强测分数,于是第三次电梯 ...

  4. OO第二单元优化博客

    OO第二单元优化博客 第五次作业没有性能分,但是,我在这一单元的宗旨就是写一个日常生活中 最常见的那种电梯,所以第五次我没有写傻瓜电梯,而是直接写了个\(look\),和第六次基本相同. 总计一下lo ...

  5. OO第一单元优化博客

    OO第一单元优化博客 第一次作业: 合并同类项+提正系数项+优化系数指数0/1=满分 第二次作业: 初始想法 一开始是想以\(sin(x)​\)和\(cos(x)​\)的指数作为坐标,在图上画出来就可 ...

  6. MySQL系列-优化之like关键字 创建索引

    原文: https://blog.csdn.net/ufo___/article/details/81164996 MySQL系列-优化之覆盖索引:  https://blog.csdn.net/UF ...

  7. 电梯系列——OO Unit2分析和总结

    一.摘要 本文是BUAA OO课程Unit2在课程讲授.三次作业完成.自测和互测时发现的问题,以及倾听别人的思路分享所引起个人的一些思考的总结性博客.主要包含设计策略.代码度量.BUG测试和心得体会等 ...

  8. SmartJS 系列规划分享和背景介绍

    发布了smartjs后,有朋友问:“没看懂究竟是干嘛的”.唉,打击了,每次我都想高唱其实你不懂我的心. 今天把相关的东西都整理了一遍,给大家介绍一下.里面绝大多数都已经实现过,有些则是有新的思路重做或 ...

  9. OO电梯调度

    告别了三次奇妙无比的求导作业之后,我们就开始搭建一部自己的电梯了.相信我们不同同学的电梯运行方式肯定各具特色吧,但值得肯定的是,在艰苦的走完了三次电梯逐步改进的作业之后,我们的电梯在正常情况下应该是可 ...

随机推荐

  1. 2021 NGK新机遇!---NGK生态所、星空计划双赛道爆发

    2021年数字加密货币行业迎来几大发展机遇:1.比特币为首的数量加密资产正处于另类资产向数字黄金定位的历史性巨大发展机遇中,2.Defi等新项目异军提起,形成丰富的行业生态,将在未来对旧有的金融格局产 ...

  2. 「NGK每日快讯」2021.2.8日NGK公链第97期官方快讯!

  3. PAA养老房产:以情怀打造精细化服务

    养老服务工作需要从业者具备尊老.爱老.敬老的职业道德,这种职业道德的培养非一朝一夕可锻造,而是需要长年累月.一点一滴的渗透和养成.PAUL ADAMS ARCHITECT(以下简称PAA)(公司编号: ...

  4. 你真的懂 MP4 格式吗?

    MP4 文件格式又被称为 MPEG-4 Part 14,出自 MPEG-4 标准第 14 部分 .它是一种多媒体格式容器,广泛用于包装视频和音频数据流.海报.字幕和元数据等.(顺便一提,目前流行的视频 ...

  5. 用Vue3构建企业级前端应用,TS能让你更轻松点

    摘要:Vue 3已经发布有一段时间了,到底有哪些新特性值得关注,如何用它构建企业级前端项目,怎样快速上手Vue 3?本篇文章将对此进行详细讲解. 前言 工欲善其事,必先利其器 --<论语> ...

  6. Svelte 码半功倍

    你未注意到的最重要的指标. 注意:原文发表于2019-04-20,随着框架不断演进,部分内容可能已不适用. 所有代码都有 BUG,你写的越多,BUG 越多,这很合情合理. 同时,写的越多,费时越多,留 ...

  7. 【HTB系列】靶机Chaos的渗透测试详解

    出品|MS08067实验室(www.ms08067.com) 本文作者:大方子(Ms08067实验室核心成员) 知识点: 通过域名或者IP可能会得到网站的不同响应 Wpscan的扫描wordpress ...

  8. const成员函数可以将非const指针作为返回值吗?

    先给出一段代码 class A { int *x; public: int *f() const { return x; } }; 成员函数f返回指向私有成员 x 的非常量指针,我认为这会修改成员x ...

  9. SVHN数据集 Format1 剪裁版

    SVHN数据集官网:http://ufldl.stanford.edu/housenumbers/ SVHN数据集官方提供的有两种格式 Format1是那种在街上拍的照片,每张照片的尺寸都不同,然后l ...

  10. FreeBSD jail 折腾记(一)

    创建jail目录 mkdir -p /usr/jail/ 放入基本系统 方案一 make buildworld #编译基本系统 make installworld DESTDIR=/usr/jail/ ...