操作系统课设(多道程序缓冲区协调操作)

项目开发大致流程 ( 多道程序缓冲区协调操作 )

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. 项目要求

  1. 可以随机产生字符数据,由put操作将数据放入Buff,buffer中容量单位是字符;
  2. 提供良好图形界面,显示Buffer的操作过程,可以暂停和继续系统的执行;
  3. 可以设定各Buffer的容量、PUT、GET、Move操作的个数;
  4. 可以设定PUT、GET、Move操作的速度;
  5. 实时显示每个Buffer中已放入的数据和数据个数,当前Buffer中数据的个数和数据的内容,空闲Buffer的空间的个数;
  6. 实时显示线程、进程所处于等待(阻塞)状态的个数;
  7. 程序运行结束,显示汇总数据:
  8. 总的运行时间;Buffer中数据的个数;已放入BUFFER的数据个数;
  9. 已取出的数据个数;平均每个buffer中的数据个数。
  10. 能够将每次的实验输入和实验结果存储起来,下次运行时或以后可查询。
  11. 可以根据题目的基本要求进行丰富的创意和想象。

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),返回值为获取的字符, 方便调用

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, 则可以跳出循环

3.3.3 设定操作个数 容量 速度

  • 要求:
    • 可以设定各Buffer的容量、PUT、GET、Move操作的个数
  • 实现:
    • 界面部分相关实现: 创建多个input输入框用来存放要设置的参数
    • 后台实现:
      • Step1:
        创建一个类(Common类), 设置对应的Static静态属性,对应各操作的个数,容量,速度,
        并设置默认值,以便在不输入参数时能保证系统正常运行
      • Step2:
        Common类写一个setParams方法, 用来将从数据库获取到的数据赋值
        给Common的静态属性,来实现参数的设置
    • 前后交互的实现:
      • 涉及技术: 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. 项目源代码

百度网盘下载 ( 包含项目报告 )

github下载 ( 只含源代码 )

注: 两个地址都可以下载


Previous
计算机组成原理课程设计 计算机组成原理课程设计
1. 课程设计简介综合运用所学的计算机组成原理知识,掌握计算机各条指令运行的过程,设计并实现较为完整的计算机运算过程。设计并实现任意两个八位二进制数的原码一位乘法,实现带有符号位的运算。 2. 实验设备TDN—CM+ 计算机组成原理实验教学
2018-07-29
Next
算法三级项目(管道铺设系统) 算法三级项目(管道铺设系统)
项目开发大致流程1. 摘要 2. 项目要求 3. 总体设计 4. 结果演示 5. 项目配置 6. 项目源代码 1. 摘要 本次课程的三级项目是要求设计实现一个管线铺
2018-07-22
目录