The first homework for OS
忘了放图床了。图片看不到
本项目设计的是一个电梯调度系统。
在本项目实现的电梯调度系统中:共有5部电梯,楼层总共高度为20层,每层楼设有一个“向上”按钮和一个“向下”按钮。每一部电梯内设置有各楼层的数字键按钮,和报警键与通话键。
电梯调度算法支持多电梯独立运行,联合调度。对于每一个单独电梯采用LOOK算法进行调度,对于外部楼层按钮产生的请求通过调度器联合调度电梯来响应任务,通过将任务根据算法计算分配给一个电梯,从而在当前时间下使得在最短的时间内响应楼层请求并不会出现饥饿现象。
为了有更清晰的可视化界面和更好的交互体验,选择采用以网页的方式呈现项目内容。项目支持通过点击楼层按钮或电梯内部按钮来模拟实际电梯中的功能,并通过通过UI的变化来展示电梯的具体调度过程。
- 每个电梯里面设置必要功能键:如数字键、关门键、开门键、上行键、下行键、报警键、当前电梯的楼层数、上升及下降状态以及空闲状态等。
- 每层楼的每部电梯门口,应该有上行和下行按钮。
- 五部电梯门口的按钮是互联结的,即当一个电梯按钮按下去时,其他电梯也会收到外部请求,所以每层楼设置一组上下行按钮即可。
- 所有电梯初始状态都在第一层。每个电梯如果在它的上层或者下层没有相应请求情况下,则应该在原地保持不动。
- 开发环境: Macbook Pro
- 开发软件:
- Vscode
- 开发语言: html,js,css
- 主要引用块内容:
- Vue.js
- element UI
-
进入项目网页,初始界面如下
- 最上方是20层,每层都有上下按钮,其中第一层的下行按钮点击无效并有警告,20层的上行按钮同理
- 下方是5个电梯的内部视图,包含上行下行以及空闲状态,以及开门关门状态,以及20个楼层选择按钮和点击会发出对应警告的报警以及通信键。
- 每个电梯内部视图的右侧是宏观的电梯运动状态,可以清晰并生动地观察到目前电梯运行到哪一层。
-
点击每部电梯的功能键(开/关键, 报警器, 楼层按钮), 进行单部电梯内命令处理模拟
- 内部电梯视图上方卡片会进行颜色变化,并标志电梯状态以及上行下行
- 内部电梯试图按钮在点击后会变色,直到到达这一层开门后恢复原状
- 宏观电梯视图会根据当前电梯楼层进行颜色变化来表示电梯的移动。
-
在上方中选择所在楼层, 并点击上/下按钮, 根据相应的外部调度算法进行多部电梯外命令处理模拟(此时外部11楼要求向上,调度第一号电梯)
-
电梯维修
- 点击红色警报键,此时电梯会禁用,即发生故障,电梯内按钮失效,并且外调度中排除此电梯
- 点击绿色按钮,如果电梯正常则无效,否则,将电梯送入维修,一定时间后回到初始状态。
-
运行截图
变量 | 类型 | 含义 |
---|---|---|
elevatorId | Number | 电梯编号 |
floorCount | Number | 楼层总数 |
pressFloor | Number | 电梯外部用户按键时所处楼层(由该电梯相应其请求) |
isUp | Boolen | 电梯外部用户按键为上:1,为下:0 |
currentFloor | Number | 当前电梯楼层 |
isOpen | Boolen | 当前电梯是否开门,是:1,否:0 |
aimFloor | Number | 当前电梯目标楼层 |
isGoingUp | Boolen | 为0:电梯静止;为1:电梯上升;为-1:电梯下降 |
isSelect | Boolen Array | 电梯消息队列(包括电梯内部和电梯外部请求) |
isOk | Boolen | 电梯是否可用 |
这里的aimFloor,当电梯上升时是消息队列中最大楼层;当电梯下降时是消息队列中最小楼层
![image-20210520002326885](/Users/fanqing_m/Library/Application Support/typora-user-images/image-20210520002326885.png)
-
-
内部事件:
- 用户点击楼层按钮
- 系统一定时间后自动关门
- 用户点击报警器
-
预期响应:
若用户点击禁用电梯,则发出警报,并没有动作
若用户点击可用电梯
若用户点击的正是当前楼层
- 电梯开门,并等待用户关门
若用户点击的不是当前楼层
- 若电梯为静止状态 => 将该楼层信息加入消息队列中
- 若所有消息队列所有楼层都在电梯当前楼层上或下,则电梯正常向上或下运动
- 否则,电梯默认先向上到消息队列中最高楼层,再向下运动
- 若电梯忙碌 => 将该楼层信息加入消息队列中
- 若电梯正在上行且按键楼层大于电梯此时楼层 => 电梯会顺路到达该层停下,开门
- 若电梯正在下行且按键楼层小于电梯此时楼层 => 电梯会顺路到达该层停下,开门
- 若电梯正在下行且按键楼层大于电梯此时楼层 => 电梯会先顺路到达当前最低楼层,在返回到按键楼层
- 若电梯正在下行且按键楼层大于电梯此时楼层 => 电梯会先顺路到达当前最高楼层,在返回到按键楼层
-
-
-
外部事件:
- 用户选择所在楼层
- 用户选择上/下行方式
-
预期响应:
-
筛选可以响应的电梯
-
筛选方式:
电梯开门,并让用户进入,在一定时间后自动关门。
- 向上顺路:
若某电梯正在向上运动并且用户选择楼层大于等于该电梯当前楼层 => "可调度性"定义为(用户楼层 - 该电梯当前楼层)
- 向上不顺路
若某电梯正在向上运动并且用户选择楼层小于该电梯当前楼层 => "可调度性"定义为(该电梯当前所要达到的最高楼层 - 用户楼层 + 该电梯当前所要达到的最高楼层 - 该电梯当前楼层)
- 向下顺路:
若某电梯正在向下运动并且用户选择楼层小于等于该电梯当前楼层 => "可调度性"定义为(该电梯当前楼层 - 该电梯最低楼层+用户楼层-改电梯最低楼层)
- 向下不顺路:
若某电梯正在向下运动并且用户选择楼层大于该电梯当前楼层 => "可调度性"定义为(该电梯当前楼层-该电梯当前所要达到的最低楼层 + 用户楼层 - 该电梯当前所要达到的最低楼层)
- 某电梯静止:
若某电梯当前处于静止状态 => "可调度性"定义为(|该电梯当前楼层 - 用户楼层|)
- 向下顺路:
若某电梯正在向下运动并且用户选择楼层小于该电梯当前楼层 => "可调度性"定义为(该电梯当前楼层 - 用户楼层)
- 向下不顺路:
若某电梯正在向下运动并且用户选择楼层大于该电梯当前楼层 => "可调度性"定义为(该电梯当前楼层-该电梯当前所要达到的最低楼层 + 用户楼层 - 该电梯当前所要达到的最低楼层)
- 向上顺路:
若某电梯正在向上运动并且用户选择楼层大于等于该电梯当前楼层 => "可调度性"定义为(该电梯当前所要达到的最高楼层-该电梯当前楼层 + 该电梯当前所要达到的最高楼层-用户楼层)
- 向上不顺路
若某电梯正在向上运动并且用户选择楼层小于该电梯当前楼层 => "可调度性"定义为(该电梯当前所要达到的最高楼层-该电梯当前楼层 + 该电梯当前所要达到的最高楼层 -用户楼层)
- 某电梯静止:
若某电梯当前处于静止状态 => "可调度性"定义为(|该电梯当前楼层 - 用户楼层|)
-
选择可调度性最好的并且可用的最好作为最佳电梯
-
若存在可用的电梯
- 若最佳电梯当前就在用户选择的楼层 => 该电梯开门(并等待用户自行关闭)
- 否则 => 将用户楼层信息加入该最佳电梯的消息队列中
-
若不存在可用的电梯
- 则发出警报,无可用电梯,并且无后续动作。
-
-
学号 | 1950679 |
---|---|
姓名 | 孟繁青 |
指导老师 | 张惠娟 |
上课时间 | 周三,周五/早一二 |
联系方式 | 1950679@tongji.edu.cn |
github repo | https://github.com/FanqingM/TJOS_ElevatorDispatch |