您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 设计及方案 > 用html5 +javascript实现 进程同步模拟
学号:0121010340310课程设计题目进程同步模拟设计——司机和售票员问题学院计算机科学与技术学院专业物联网工程班级物联网1001班姓名邝佛德指导教师吴利军(老师)2013年1月16日课程设计任务书学生姓名:邝佛德专业班级:物联网指导教师:吴利军(老师)工作单位:计算机科学与技术学院题目:进程同步模拟设计——司机和售票员问题初始条件:1.预备内容:阅读操作系统的进程管理章节内容,对进程的同步和互斥,以及信号量机制度有深入的理解。2.实践准备:掌握一种计算机高级语言的使用。要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.模拟公共汽车司机和售票员开关门及行车操作的同步模型。2.设计报告内容应说明:⑴需求分析;⑵功能设计(数据结构及模块说明);⑶开发平台及源程序的主要部分;⑷测试用例,运行结果与运行情况分析;⑸自我评价与总结:i)你认为你完成的设计哪些地方做得比较好或比较出色;ii)什么地方做得不太好,以后如何改正;iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训);iv)完成本题是否有其他方法(如果有,简要说明该方法);时间安排:设计安排一周:周1、周2:完成程序分析及设计。周2、周3:完成程序调试及测试。周4、周5:验收、撰写课程设计报告。(注意事项:严禁抄袭,一旦发现,一律按0分记)指导教师签名:年月日系主任(或责任教师)签名:年月日1目录进程同步模拟设计——司机和售票员问题................................................................21、需求分析.............................................................................................................21.1、问题描述...................................................................................................21.2、问题分析...................................................................................................31.3、解决方案...................................................................................................31.3.1、使用linux进程...............................................................................41.3.2、使用java线程.................................................................................41.3.3、使用html5和javascript脚本.........................................................41.4、方案确定...................................................................................................62、功能设计..........................................................................................................73、开发平台及源程序的主要部分......................................................................84、运行结果与运行情况分析............................................................................104.1、运行结果.....................................................................................................104.2、运行情况分析.............................................................................................115、自我评价与总结............................................................................................126、参考资料........................................................................................................132进程同步模拟设计——司机和售票员问题1、需求分析1.1、问题描述司机售票员问题是指模拟公交的司机和人工售票员以及车的行驶过程,其主要包括以下3点:a.车行驶时,售票员不能开门;只有当车停稳后,售票员才可以开门。b.车门开着时,司机不能开车;等待售票员把门关好后,司机才能开车。c.车在行驶时,售票员可以售票;车到站时,司机要停车。为了更清楚地描述上述问题,我选择了使用伪代码来阐述。问题描述中共涉及到两个进程——司机和售票员进程,其中司机进程负责启动车辆、正常驾驶和到站停车这三个任务,售票员进程负责关门、售票和开门。具体示意图如图1所示。图1司机和售票员任务分配示意图31.2、问题分析在汽车不断地到站、停车和行驶的过程中,售票员要同时完成关门、售票和开门的任务,课设的要求就是模拟这两个进程合作完成公交运营的过程。其实这是一个典型的进程同步问题,即在异步环境中的各进程(在这里是司机和售票进程)并发执行,并以各自独立的速度向前推进,这些进程由于合作完成同一任务(这里是公交的正常运营)而相互支持依赖。司机进程到站停车,发送消息通知售票员进程,售票员进程做出开车门的动作,待乘客都上车后,售票员进程关车门,并发送消息通知司机进程,司机继续启动车辆,如此循环共同推进。这我们可以称两个进程为合作进程。既然是典型的进程同步问题,自然先想到的解决方案是使用信号量及PV操作,这个机制既能保证该进程把其它进程需要的消息发送出去,也能测试自己等待的消息是否到达。1.3、解决方案先假设有两个信号S_door表示是否关门,初值为0;S_stop表示是否到站停车,初值为0。则使用PV操作的解决方案如图2所示。图2使用PV操作解决方案示意图4如何将上述方案的伪代码表示转变成现代计算机系统可以接受的程序是这个问题的关键,根据需要,我提出了下面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线程实现的原因之一。5HTML5草案的前身名为WebApplications1.0,于2004年被WHATWG提出,于2007年被W3C接纳,并成立了新的HTML工作团队。HTML5的第一份正式草案已于2008年1月22日公布。HTML5仍处于完善之中。然而,大部分现代浏览器已经具备了某些HTML5支持。这次我主要用到了html5的Canvas二维图像功能,Canvas本身不能画图,它必需结合javascript脚本在网页上绘图。这个特性正好为我所用,程序简单且功能强大。但我必须指出的一点是js引擎执行js代码的时候是单线程的,即同一时刻只会有一个进程执行JS代码,回调函数也是一个一个执行的(按照事件发生的顺序,而不是代码的顺序)。也就是说浏览器无论在什么时候都只且只有一个线程在运行JavaScript程序。那么单线程的JavaScript引擎是怎么配合浏览器内核处理这些定时器和响应浏览器事件的呢?下面结合浏览器内核处理方式简单说明。浏览器内核实现允许多个线程异步执行,这些线程在内核制控下相互配合以保持同步.假如某一浏览器内核的实现至少有三个常驻线程:javascript引擎线程,界面渲染线程,浏览器事件触发线程,除些以外,也有一些执行完就终止的线程,如Http请求线程,这些异步线程都会产生不同的异步事件,下面通过一个图来阐明单线程的JavaScript引擎与另外那些线程是怎样互动通信的.虽然每个浏览器内核实现细节不同,但这其中的调用原理都是大同小异,如图3所示。图3浏览器内核处理方式示意图浏览器内核浏览器GUI渲染线程Javascript引擎线程t1t2t3t4JavascriptCallback当前正在处理的函数块JavascriptCallbackTimerInterval定时触发器异步通信请求事件触发线程鼠标点击回调setTimersetInterval6GUI渲染线程负责渲染浏览器界面,当界面需要重绘(Repaint)或由于某种操作引发回流(reflow)时,该线程就会执行。该线程和JavaScript引擎线程是互斥的,在JavaScript引擎运行脚本期间,浏览器渲染线程都是处于挂起状态的,也就是说被”冻结”了,GUI渲染线程只有在JavaScript引擎空闲时才有机会执行。定时触发器和JavaScript引擎线程可以同时执行。由图可知,在这t1的时间段内,继鼠标点击事件触发后,先前已设置的setTimeout定时也到达了,此刻对JavaScript引擎来说,定时触发线程产生了一个异步定时事件并放到任务队列中,该事件被排到点击事件回调之后,等待处理。同理,还是在t1时间段内,接下来某个setInterval定时器也被添加了,由于是间隔定时,在t1段内连续被触发了两次,这两个事件被排到队尾等待处理。可见,假如时间段t1非常长,远大于setInterval的定时间隔,那么定时触发线程就会源源不断的产生异步定时事件并放到任务队列尾而不管它们是否已被处理,但一旦t1和最先的定时事件前面的任务已处理完,这些排列中的定时事件就依次不间断的被执行,这是因为,对于JavaScript引擎来说,在处理队列中的各任务处理方式都是一样的,只是处理的次序不同而已。1.4、方案确定既然上面我用了那么长的篇幅去讲
本文标题:用html5 +javascript实现 进程同步模拟
链接地址:https://www.777doc.com/doc-3805580 .html