前言

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

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

这样做的好处是框架清晰,迭代起来往往不需要再添加很多类,改调度也是一个函数的事情: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. asm movbe 指令

    movbe MOVBE 目标操作数,源操作数 复制源操作数的数据,交换字节后,移动数据 假如: movbe eax,(float)1000.0 eax == 0x00007A44 movbe eax, ...

  2. 05.其他创建numpy数组的方法

    >>> import numpy as np >>> np.zeros(10,dtype=int) array([0, 0, 0, 0, 0, 0, 0, 0, 0 ...

  3. 03.Jupyter Notebook高级-魔法命令

    %run %run C:\Users\User\Desktop\hello.py hello world %timeit %timeit L = [i for i in range(1000)] 29 ...

  4. ipv4ipv6 地址字符串表示最大长度

    1 for IPV4 #define INET_ADDRSTRLEN 16 111.112.113.114 32位IPV4地址,使用10进制+句点表示时,所占用的char数组的长度为16,其中包括最后 ...

  5. linux 安装node和pm2

    用yum安装 curl -sL https://rpm.nodesource.com/setup_10.x | bash - yum install -y nodejs npm install -g ...

  6. IDEA如何快速查看类中的属性和方法?

    在idea中,当需要快速的查看一个类的所有属性和方法时,直接去代码中查看,就显得非常的麻烦,idea是有快捷键的,可显示所有的属性和方法,方法如下. 打开一个类,使用快捷键ALT+7,就可以在左侧看到 ...

  7. JS遍历对象的属性和值

    对于需要动态获取对象的某些属性和对应的值的时候,就需要遍历对象的属性和值. const user = { name: '张三', age: 20, addr: '湖北武汉', sex: '男' } / ...

  8. Jump Server在docker中安装部署

    安装部署: 1.准备机器: 官方环境要求: 硬件配置: 2个CPU核心, 4G 内存, 50G 硬盘(最低) 操作系统: Linux 发行版 x86_64 Python = 3.6.x Mysql S ...

  9. Vue框架简介及简单使用

    目录 一.前端框架介绍 二.vue框架简介 三.vue使用初体验 1. vue如何在页面中引入 2. 插值表达式 3. 文本指令 4. 方法指令(事件指令) 5. 属性指令 四.js数据类型补充 1. ...

  10. 行业动态 | 通过使用Apache Cassandra实现实时供应链管理

    借助基于Apache Cassandra的DataStax Enterprise,C&S Wholesale确实得到了他们所需要的东西--一个持续在线的仓库运作整体视图.   视图中包含了原本 ...