项目开发大致流程 ( 多道程序缓冲区协调操作 )
1. 项目概述
2. 项目要求
3. 总体设计
4. 结果演示
5. 项目配置
6. 项目源代码
1. 项目概述
文字描述
有多个 PUT 操作要不断循环地向 Buffer1 送字符数据,有 Move1 操作不断地将 Buffer1 的数据取到 Buffer2 。
Move2 操作不断地将Buffer1的数据取到 Buffer3 ,有多个 GET 操作要不断地从 Buffer2 和 Buffer3 中取数据。
- PUT、 MOVE、 GET每次操作一个数据,为了在操作的过程中要保证数据不丢失, 每个 Buffer 每次只能接受一个 PUT 或一个 Move 或一个 Get 。
- 运用进程同步和互斥机制设计一个多道程序完成上述操作。
操作图示
2. 项目要求
- 可以随机产生字符数据,由put操作将数据放入Buff,buffer中容量单位是字符;
- 提供良好图形界面,显示Buffer的操作过程,可以暂停和继续系统的执行;
- 可以设定各Buffer的容量、PUT、GET、Move操作的个数;
- 可以设定PUT、GET、Move操作的速度;
- 实时显示每个Buffer中已放入的数据和数据个数,当前Buffer中数据的个数和数据的内容,空闲Buffer的空间的个数;
- 实时显示线程、进程所处于等待(阻塞)状态的个数;
- 程序运行结束,显示汇总数据:
- 总的运行时间;Buffer中数据的个数;已放入BUFFER的数据个数;
- 已取出的数据个数;平均每个buffer中的数据个数。
- 能够将每次的实验输入和实验结果存储起来,下次运行时或以后可查询。
- 可以根据题目的基本要求进行丰富的创意和想象。
3. 总体设计
3.1 课题分析
课题实质探究
- 由项目的描述可知该课题为 “多生产者 – 多消费者” 问题, 因此可以分析出其同步和互斥关系。
- 同步关系:
多个生产者和多个消费者之间要按一定顺序访问缓冲区, 共同协作来保障进程顺利执行。 - 互斥关系:
对缓冲区(临界资源)的访问是互斥的,缓冲区域每次只能接受一个PUT或一个Move或一个Get(互斥访问)。
- 同步关系:
3.2 解读课题
以书本所学信号量方式为例 , 来实现同步和互斥
3.2.1 信号量的设计
- 信号量
- empty1: 缓冲区Buffer1的空位数
- empty2: 缓冲区Buffer2的空位数
- empty3: 缓冲区Buffer3的空位数
- full1: 缓冲区1内的数据个数
- full2: 缓冲区2内的数据个数
- full2: 缓冲区3内的数据个数
3.2.2 以信号量来实现同步和互斥
3.3 主要功能设计
3.3.1 产生随机字符数据
- 要求:
- 产生的数据是字符类型,且是随机产生的
- 实现:
- Step1:
定义一个String字符串,包含1-9所有数字和a-z的小写字符以及A-Z的大写字符 - Step2:
创建Random类,产生一个从0到上述String字符串长度-1的随机整型量,
调用String类的charAt(int i)方法获取字符 - Step3:
封装成静态类的方法(RandomChar),返回值为获取的字符, 方便调用
- Step1:
3.3.2 实时显示操作内容,暂停和继续
- 要求:
- 图形界面,显示Buffer的操作过程,可以暂停和继续系统的执行
- 实现:
- 界面部分: html+css+js+jquery+ajax (后面会详细介绍)
- 显示Buffer操作过程:
- Step1:
页面部分创建三个文本域, 分别对应Buffer1,Buffer2,Buffer3的操作内容 - Step2:
每次对Buffer操作的内容(放入或拿出字符)存放到数据库表中 - Step3:
页面使用ajax,访问后台,后台查询数据库,将查到的数据转
为json格式返回给前台, 前台将获取的数据送入对应的文本域 - 暂停的实现:
分别在put线程,move线程,get线程的run方法末尾中加入While(boolean pause)循环,pause为true则一直睡眠,pause为false 则跳出循环, 用暂停对应的按钮来控制pause - 继续的实现: 将pause的值改为false, 则可以跳出循环
- Step1:
3.3.3 设定操作个数 容量 速度
- 要求:
- 可以设定各Buffer的容量、PUT、GET、Move操作的个数
- 实现:
- 界面部分相关实现: 创建多个input输入框用来存放要设置的参数
- 后台实现:
- Step1:
创建一个类(Common类), 设置对应的Static静态属性,对应各操作的个数,容量,速度,
并设置默认值,以便在不输入参数时能保证系统正常运行 - Step2:
Common类写一个setParams方法, 用来将从数据库获取到的数据赋值
给Common的静态属性,来实现参数的设置
- Step1:
- 前后交互的实现:
- 涉及技术: ajax异步通信
将前台传入的参数值通过 ajax传入到后台, 后台获取到参数,存入数据库,
然后后台使用的数据可以从数据库中获取
- 涉及技术: ajax异步通信
3.3.4 设定PUT、GET、Move操作的速度
- 要求:
- 可以设定PUT、GET、Move操作的速度
- 实现:
- 界面部分实现:
创建对应个数的input的框来存放将要输入的各个线程对应的执行速度 - 后台实现实现:
用线程的sleep()延迟函数来延迟线程的执行,控制线程的执行速度,每个Put,Move
,Get线程内部都调用了sleep()函数,延迟时间为(0-100)的随机值乘以(50-速度值),
速度值越大, 延迟时间越短,执行速度越快
- 界面部分实现:
3.3.5 实时显示Buffer中的内容
- 要求:
- 实时显示Buffer中已放入的数据和数据个数,以及空闲的空间数
实现:
前台部分的实现:
用table表格存放要显示的数据。数据通过设置定时器,每间隔
一段时间就访问后台获取数据, 获取到数据后将数据放入对应
table表格项后台部分的实现:
将线程产生的数据存入数据库, 每次ajax访问后台的Servlet时从数据库查询数据, 返回给前台
获取Buffer已放入的数据和数据个数:
在Common中定义static类型的ArrayList,来作为课题中的Buffer 缓冲区, Buffer的size()属性
即为放入的数据个数, 内容即为放入的字符获取buffer的空闲空间数:
Common中设定static类型的BufferSize来代表每个Buffer的容量, BufferSize和Buffer的
size()值之差即为空闲空间数
3.3.6 实时显示线程阻塞个数
要求:
- 实时显示线程、进程所处于等待(阻塞)状态的个数
分析:
引入线程概念后, 线程成了调度的独立单位, 而进程则是资源分配的独立单位,
因此进程的阻塞即可用线程的阻塞个数代表实现:
前台实现:
table表格显示,ajax获取数据。后台实现:
在Common中定义static类型的整型变量,用来表示被阻塞的线程数目,当执行到线程的
wait()(线程的阻塞方法)时执行++操作,当执行到线程的notify()(线程的唤醒方法)
时执行 – 操作
3.3.7 结果汇总显示
- 要求:
- 程序运行结束,显示汇总数据
- 实现:
- 总的运行时间:
线程开始前调用System.currentTimeMillis()方法获取当前时间,当线程终止时 (点击结束按钮)时再调用System.currentTimeMillis()方法获取结束时间,两时间之差即为总运行时间 - Buffer中数据的个数:
Common中各Buffer的size()值之和 - 已放入BUFFER的数据个数:
Common中创建static变量, 每次取出时变量值加1 - 已取出的数据个数:
Common中创建static变量, 每次取出时变量值加1 - 平均每个buffer中的数据个数:
Common中各Buffer的size()值之和比上Buffer的数量(3个)
- 总的运行时间:
3.1.8 保存实验输入和实验结果
- 要求:
- 能够将每次的实验输入和实验结果存储起来,下次运行时或以后可查询。
- 实现:
- 执行产生的数据都保存在数据库中, 可以通过转储数据库文件来保存,
查询的话直接查询数据库表中的记录即可
- 执行产生的数据都保存在数据库中, 可以通过转储数据库文件来保存,
4. 结果演示
4.1 项目主要界面展示
主页
参数设置界面
4.2 项目运行演示
腾讯云对象存储COS视频地址:
https://video-1254265973.cos.ap-beijing.myqcloud.com/MyOsProject.mp4
5. 项目配置
5.1 数据库配置
(1) 数据库连接信息可在项目下的 src/jdbc.properties 文件中修改,
下图标红线的位置对应的是 自己数据库的名字(类型为Mysql数据库)。
(2) 将项目中的 osmessage.sql 导入自己电脑的本地数据库
演示Navicat导入的方式:
右键连接-->选择运行SQL文件-->选中osmessage.sql-->运行完毕点击关闭-->右键刷新。
完成以上步骤后, osmessage数据库便成功导入到了你的本地数据库中。
6. 项目源代码
百度网盘下载 ( 包含项目报告 )
- 百度网盘链接: 链接:https://pan.baidu.com/s/1vj8FrbuPTJnummNpnxcVwA
- 提取码:pk5z
github下载 ( 只含源代码 )
- github下载地址: https://github.com/fyf2016/MyOsProject.git
注: 两个地址都可以下载