logo资料库

用html5和javascript实现进程同步模拟——司机售票员问题.docx

第1页 / 共26页
第2页 / 共26页
第3页 / 共26页
第4页 / 共26页
第5页 / 共26页
第6页 / 共26页
第7页 / 共26页
第8页 / 共26页
资料共26页,剩余部分请下载后查看
进程同步模拟设计——司机和售票员问题
1、需求分析
1.1、问题描述
1.2、问题分析
1.3、解决方案
1.3.1、 使用linux进程
1.3.2、 使用java线程
1.3.3、 使用html5和javascript脚本
1.4、方案确定
2、功能设计
3、开发平台及源程序的主要部分
4、运行结果与运行情况分析
4.1、运行结果
4.2、运行情况分析
5、自我评价与总结
6、参考资料
学 号: 0121010340310 课 程 设 计 进程同步模拟设计——司机 题 目 和售票员问题 学 院 计算机科学与技术学院 专 业 班 级 姓 名 指导教师 物联网工程 物联网 1001 班 邝佛德 吴利军(老师) 2013 年 1 月 16 日
课程设计任务书 学生姓名: 邝佛德 专业班级: 物联网 指导教师: 吴利军(老师) 工作单位: 计算机科学与技术学院 题 目: 进程同步模拟设计——司机和售票员问题 初始条件: 1.预备内容:阅读操作系统的进程管理章节内容,对进程的同步和互 斥,以及信号量机制度有深入的理解。 2.实践准备:掌握一种计算机高级语言的使用。 要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明 书撰写等具体要求) 1.模拟公共汽车司机和售票员开关门及行车操作的同步模型。 2.设计报告内容应说明: ⑴ 需求分析; ⑵ 功能设计(数据结构及模块说明); ⑶ 开发平台及源程序的主要部分; ⑷ 测试用例,运行结果与运行情况分析; ⑸ 自我评价与总结: i)你认为你完成的设计哪些地方做得比较好或比较出色; ii)什么地方做得不太好,以后如何改正; iii)从本设计得到的收获(在编写,调试,执行过程中的经验 和教训); iv)完成本题是否有其他方法(如果有,简要说明该方法); 时间安排: 设计安排一周:周 1、周 2:完成程序分析及设计。 周 2、周 3:完成程序调试及测试。 周 4、周 5:验收、撰写课程设计报告。 (注意事项:严禁抄袭,一旦发现,一律按 0 分记) 指导教师签名: 年 月 日 系主任(或责任教师)签名: 年 月 日
目录 进程同步模拟设计——司机和售票员问题............................................................... 2 1、 需求分析.............................................................................................................2 1.1、 问题描述.................................................................................................. 2 1.2、 问题分析.................................................................................................. 3 1.3、 解决方案.................................................................................................. 3 1.3.1、 使用 linux 进程............................................................................... 4 1.3.2、 使用 java 线程.................................................................................4 1.3.3、 使用 html5 和 javascript 脚本........................................................ 4 1.4、 方案确定.................................................................................................. 6 功能设计......................................................................................................... 7 开发平台及源程序的主要部分..................................................................... 8 运行结果与运行情况分析........................................................................... 10 4.1、运行结果.................................................................................................... 10 4.2、运行情况分析............................................................................................ 11 自我评价与总结........................................................................................... 12 参考资料....................................................................................................... 13 2、 3、 4、 5、 6、 1
进程同步模拟设计——司机和售票员问题 1、需求分析 1.1、问题描述 司机售票员问题是指模拟公交的司机和人工售票员以及车的行驶过程,其主 要包括以下 3 点: a. 车行驶时,售票员不能开门;只有当车停稳后,售票员才可以开门。 b. 车门开着时,司机不能开车;等待售票员把门关好后,司机才能开车。 c. 车在行驶时,售票员可以售票;车到站时,司机要停车。 为了更清楚地描述上述问题,我选择了使用伪代码来阐述。问题描述中共涉 及到两个进程——司机和售票员进程,其中司机进程负责启动车辆、正常驾驶和 到站停车这三个任务,售票员进程负责关门、售票和开门。具体示意图如图 1 所示。 司机进程: while(1) { 启动车辆 正常驾驶 到站停车 }… 售票员进程: while(1) { 关门 售票 开门 }… 图 1 司机和售票员任务分配示意图 2
1.2、问题分析 在汽车不断地到站、停车和行驶的过程中,售票员要同时完成关门、售票和 开门的任务,课设的要求就是模拟这两个进程合作完成公交运营的过程。其实这 是一个典型的进程同步问题,即在异步环境中的各进程(在这里是司机和售票进 程)并发执行,并以各自独立的速度向前推进,这些进程由于合作完成同一任务 (这里是公交的正常运营)而相互支持依赖。 司机进程到站停车,发送消息通知售票员进程,售票员进程做出开车门的动 作,待乘客都上车后,售票员进程关车门,并发送消息通知司机进程,司机继续 启动车辆,如此循环共同推进。这我们可以称两个进程为合作进程。 既然是典型的进程同步问题,自然先想到的解决方案是使用信号量及 PV 操 作,这个机制既能保证该进程把其它进程需要的消息发送出去,也能测试自己等 待的消息是否到达。 1.3、解决方案 先假设有两个信号 S_door 表示是否关门,初值为 0; S_stop 表示是否到站 停车,初值为 0 。则使用 PV 操作的解决方案如图 2 所示。 司机进程: while(1) { P(S_door) 启动车辆 正常驾驶 到站停车 V(S_stop) }… 售票员进程: while(1) { 关门 V(S_door) 售票 P(S_stop) 开门 }… 图 2 使用 PV 操作解决方案示意图 3
如何将上述方案的伪代码表示转变成现代计算机系统可以接受的程序是这 个问题的关键,根据需要,我提出了下面 3 个解决方案。 1.3.1、 使用 linux 进程 就我的认识范围内,我首先想到了使用现代操作系统中的进程机制。以 linux 系统为例,我们可以使用 fork()系统调用来创建新的进程,然后再使用进程自身 的管理及进程之间的通信等操作,完成任务是没有问题的。 考虑到进程是系统资源分配的实体,即每个系统进程拥有自己独立的存储单 元,这就使得进程之间的切换极大地浪费系统开销,这是现代程序设计不想看到 的。 1.3.2、 使用 java 线程 既然进程是重量级的,那我可以使用轻量级的进程——线程,作为它的替代 品。在支持多线程的 OS 中,线程是 CPU 调度的最小单位。线程中的实体基本 上不拥有系统资源,只是有一点必不可少的、能保证独立运行的资源,比如,在 每个线程中都应具有一个用于控制线程运行的线程控制块 TCB,用于指示被执 行指令序列的程序计数器、保留局部变量、少数状态参数和返回地址等的一组寄 存器和堆栈。 以 java 线程为例,我们可以通过继承 java.lang.Thread 类或者实现 Runnable 接口来实现自己的线程类。Thread 提供了很多操作线程的方法,使我们可以轻松 地完成任务。 1.3.3、 使用 html5 和 javascript 脚本 方案二中采用的 java 线程机制虽然实现简单,但是要做图形界面展示出进 程同步的效果且不容易。虽然 java 提供了 GUI 开发包(awt 和 swing),但是确 实不好用,且图形化界面的实现的代码臃肿,比实现线程同步逻辑的代码要长的 多,这就是我放弃使用 java 线程实现的原因之一。 4
HTML5 草案的前身名为 Web Applications 1.0,于 2004 年被 WHATWG 提 出,于 2007 年被 W3C 接纳,并成立了新的 HTML 工作团队。HTML 5 的第一 份正式草案已于 2008 年 1 月 22 日公布。HTML5 仍处于完善之中。然而,大部 分现代浏览器已经具备了某些 HTML5 支持。 这次我主要用到了 html5 的 Canvas 二维图像功能,Canvas 本身不能画图, 它必需结合 javascript 脚本在网页上绘图。这个特性正好为我所用,程序简单且 功能强大。 但我必须指出的一点是 js 引擎执行 js 代码的时候是单线程的,即同一时刻 只会有一个进程执行 JS 代码,回调函数也是一个一个执行的(按照事件发生的 顺序,而不是代码的顺序)。也就是说浏览器无论在什么时候都只且只有一个线 程在运行 JavaScript 程序。那么单线程的 JavaScript 引擎是怎么配合浏览器内核 处理这些定时器和响应浏览器事件的呢?下面结合浏览器内核处理方式简单说明。 浏览器内核实现允许多个线程异步执行,这些线程在内核制控下相互配合以 保持同步.假如某一浏览器内核的实现至少有三个常驻线 程:javascript 引擎线程, 界面渲染线程,浏览器事件触发线程,除些以外,也有一些执行完就终止的线程, 如 Http 请求线程,这些异步线程都会产 生不同的异步事件,下面通过一个图来 阐明单线程的 JavaScript 引擎与另外那些线程是怎样互动通信的.虽然每个浏览 器内核实现细节不同,但这其中的 调用原理都是大同小异,如图 3 所示。 浏览器内核 浏览器 GUI 渲染线程 定 时 触 发 器 异 步 通 信 请 求 事 件 触 发 线 程 t1 t 2 t 3 t 4 Javascript 引擎线程 Javascript Callback Javascript Callback Timer Interval 当 前 正 在 处 理的函数块 鼠 标 点 击回调 setTimer setInterval 图 3 浏览器内核处理方式示意图 5
GUI 渲染线程负责渲染浏览器界面,当界面需要重绘(Repaint)或由于某种操 作引发回流(reflow)时,该线程就会执行。该线程和 JavaScript 引擎线程是互斥的, 在 JavaScript 引擎运行脚本期间,浏览器渲染线程都是处于挂起状态的,也就是 说被”冻结”了,GUI 渲染线程只有在 JavaScript 引擎空闲时才有机会执行。 定时触发器和 JavaScript 引擎线程可以同时执行。由图可知,在这 t1 的时间 段内,继鼠标点击事件触发后,先前已设置的 setTimeout 定时也到达了,此刻对 JavaScript 引擎来说,定时触发线程产生了一个异步定时事件并放到任务队列中, 该事件被排到点击事件回调之后,等待处理。同理, 还是在 t1 时间段内,接下 来某个 setInterval 定时器也被添加了,由于是间隔定时,在 t1 段内连续被触发了 两次,这两个事件被排到队尾等待处理。 可见,假如时间段 t1 非常长,远大于 setInterval 的定时间隔,那么定时触发 线程就会源源不断的产生异步定时事件并放到任务队列尾而不管它 们是否已被 处理,但一旦 t1 和最先的定时事件前面的任务已处理完,这些排列中的定时事 件就依次不间断的被执行,这是因为,对于 JavaScript 引擎来 说,在处理队列 中的各任务处理方式都是一样的,只是处理的次序不同而已。 1.4、方案确定 既然上面我用了那么长的篇幅去讲 javascript 和浏览器,我肯定选择方案三作 为我的最终方案。而且上面讲的浏览器内核的几个线程特性也是我要用到了,所 以请原谅我花那么大的篇幅讲解。 既然 javascript 执行引擎是单线程的,那么读者可能会问,如何去模拟这司机 进程和售票员进程同步呢?或者说怎么去模拟司机线程和售票员线程呢?又该 如何让 GUI 渲染线程在 js 执行引擎线程的空隙中将 js 执行结果渲染出来呢?我 想在上面介绍浏览器特性时我已经给出答案了。没错,就是定时触发器触发器。 相信计算机相关专业出身的人都知道,程序在单核 CPU 中的并发执行,是伪 并行,并不是在一个时刻多个进程或线程一起执行,而是在一个时间段,完成多 个进程或线程的执行。根据并发这一点特性,我们就可以利用只有一个线程的 js 执行引擎模拟多线程同步,甚至多线程之间的相互通信。 6
分享到:
收藏