欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

软件构造lab6

程序员文章站 2024-02-09 15:57:58
...

目录

1 实验目标概述 1
2 实验环境配置 1
3 实验过程 1
3.1 ADT设计方案 1
3.2 Monkey线程的run()的执行流程图 1
3.3 至少两种“*选择”策略的设计与实现方案 2
3.3.1 策略1 2
3.3.2 策略2 2
3.3.3 策略3(可选) 2
3.4 “猴子生成器”MonkeyGenerator 2
3.5 如何确保threadsafe? 2
3.6 系统吞吐率和公平性的度量方案 2
3.7 输出方案设计 2
3.8 猴子过河模拟器v1 2
3.8.1 参数如何初始化 2
3.8.2 使用Strategy模式为每只猴子随机选择决策策略 2
3.9 猴子过河模拟器v2 2
3.9.1 对比分析:固定其他参数,选择不同的决策策略 3
3.9.2 对比分析:变化某个参数,固定其他参数 3
3.9.3 分析:吞吐率是否与各参数/决策策略有相关性? 3
3.9.4 压力测试结果与分析 3
4 实验进度记录 3
5 实验过程中遇到的困难与解决途径 3
6 实验过程中收获的经验、教训、感想 4
6.1 实验过程中收获的经验和教训 4
6.2 针对以下方面的感受 4

1实验目标概述
根据实验手册简要撰写。

本次实验训练学生的并行编程的基本能力,特别是 Java 多线程编程的能力。
根据一个具体需求,开发两个版本的模拟器,仔细选择保证线程安全(threadsafe)
的构造策略并在代码中加以实现,通过实际数据模拟,测试程序是否是线程安全
的。另外,训练学生如何在 threadsafe 和性能之间寻求较优的折中,为此计算吞
吐率和公平性等性能指标,并做仿真实验。
⚫ Java 多线程编程
⚫ 面向线程安全的 ADT 设计策略选择、文档化
⚫ 模拟仿真实验与对比分析

2实验环境配置
简要陈述你配置本次实验所需环境的过程,必要时可以给出屏幕截图。
特别是要记录配置过程中遇到的问题和困难,以及如何解决的。
实验环境设置请参见 Lab-0 实验指南。

3实验过程
请仔细对照实验手册,针对三个问题中的每一项任务,在下面各节中记录你的实验过程、阐述你的设计思路和问题求解思路,可辅之以示意图或关键源代码加以说明(但千万不要把你的源代码全部粘贴过来!)。
3.1ADT设计方案
设计了哪些ADT、各自的作用、属性、方法;
给出每个ADT的specification;
Monkey-猴子类

int id; // 猴子id
int vel; // 猴子过河速度
int dre; // 猴子所在*编号,不在为0
int num; // 猴子所在踏板编号,不在为0
String direction; // 猴子方向
int state; // 当前猴子状态,猴子一共有三个状态,分别是1-在河岸等待,2-处于*上,3-已经到达对岸
int lifetime;// 猴子存活时间
int borntime;// 产生时间
方法
构造函数和getter,setter函数
Ladder-*类

int ladderIndex; // *编号
List monkeys; // *上猴子列表
int monkeynum; // *上猴子数量
方法:
构造函数和getter,setter函数
3.2Monkey线程的run()的执行流程图
这里无需考虑具体采用的*选择策略。

3.3至少两种“*选择”策略的设计与实现方案
3.3.1策略1
策略 1:优先选择没有猴子的*,若所有*上都有猴子,则优先
选择没有与我对向而行的猴子的*;若满足该条件的*有很多,
则随机选择;

3.3.2策略2
策略 2:优先选择没有猴子的*,若所有*上都有猴子,则在岸
边等待,直到某个*空闲出来;

3.3.3策略3(可选)
3.4“猴子生成器”MonkeyGenerator
域:
private int[] parameters = new int[6]; //存文件参数
String[] direction = new String[] {“L->R”, “R->L”}; ////随机方向数组
方法:
public int[] getpara() //读文件
public List creatladders() //建*
public List creatmonkeys(int here) //构建猴子,here是已有猴子数
Getter和setter函数

3.5如何确保threadsafe?
多线程可能产生问题的地方在多个猴子可能同时想要进行选择*和猴子前进下一步的时候。

对于猴子上*操作,包括选*和上*两个步骤,这两个步骤必须作为一个原子操作,所以同一时刻只能安排有一只猴子上*,在本实验中, synchronized表示当前线程,独占 对象 someObject当前线程独占 了对象someObject,如果有其他线程试图占有对象someObject,就会等待,直到当前线程释放对someObject的占用。someObject 又叫同步对象,所有的对象,都可以作为同步对象为了达到同步的效果,必须使用同一个同步对象
释放同步对象的方式: synchronized 块自然结束,或者有异常抛出 另外,对于多线程共享的数据结构还需要考虑使用线程安全的类型或者请求锁的方式来保证一般操作的线程安全。
3.6系统吞吐率和公平性的度量方案
计算吞吐率和公平性:计算并输出本次仿真的吞吐率和公平性。
⚫ “吞吐率”是指:假如N只猴子过河的总耗时为T秒,那么每只猴子的
平均耗时为T/N秒,则吞吐率N/T表征每秒钟可过河的猴子数目。
⚫ “公平性”是指:如果 Monkey 对象 A 比 B 出生得早,那么 A 应该不 晚于 B 抵达对岸,则为“公平”;若 A 比 B 晚到对岸,则为“不公 平”。设 A 和 B 的产生时间分别为Ya和Yb,抵达对岸的时间分别为Za和Zb,那么公平性F(A,B)=1,如果( Ya-Yb)*(Za-Zb)>=0;反之为-1。对只猴子两两计算其之间的公平性并综合到一起,得到本次模拟的整体 公平性你的程序应追求吞吐率尽可能大。公平性并非程序追求的目标,每次模
拟时只需计算出公平性的值即可(但如果你的程序能在最大化吞吐率的情况
如何实现计算吞吐率和公平性?
将所有线程加入主线程
关于时间统计,每一个猴子都有一个计数器lifetime,过河线程每执行一次 他的时间都会续一秒 ,所有猴子过河的时间就是最大的borntime+lifetime。所以本程序吞吐率完全依赖于上*策略的选择。
3.7输出方案设计
日志
日志输出格式按照实验报告要求完成。如图:

GUI
可视化(可选)
3.8猴子过河模拟器v1
3.8.1参数如何初始化
使用配置文件的方式设置好初始化参数,程序中只需要从配置文件中读入即可。配置文件位于src/txt.txt
3.8.2使用Strategy模式为每只猴子选择决策策略
设计Interface CrossriverStrategy,提供函数monkeycrossriver(Monkey aMonkey, List aLadder);,monkey按照既定策略选择一个可用的*,如果有,则跳上*的第一个踏板。

因为选*过程中涉及到访问线程共享数据,所以每一个实现类都需要在构造方法中传入的List引用。

3.9猴子过河模拟器v2
在不同参数设置和不同“*选择”模式下的“吞吐率”和“公平性”实验结果及其对比分析。
3.9.1对比分析:固定其他参数,选择不同的决策策略
3.9.2对比分析:变化某个参数,固定其他参数
3.9.3分析:吞吐率是否与各参数/决策策略有相关性?
下面对三个要求统一分析:

说明:

     Strategy1:策略1

     Strategy3:策略2
        
          
          报告中选用的都是多次试验之后能够代表普遍规律的图。

EXP1:
实验数据:n=1-5,h=20,t=3,N=100,k=3,MV=5

n Strategy 吞吐率 公平性
1 Strategy1 0.07267441860465117 4304
Strategy3 0.05361930294906166 3906
2 Strategy1 0.11098779134295228 4568
Strategy3 0.10070493454179255 4516
3 Strategy1 0.10090817356205853 4562
Strategy3 0.10869565217391304 4582
4 Strategy1 0.1141552511415525 4642
Strategy3 0.11389521640091116 4628
5 Strategy1 0.11778563015312132 4632
Strategy3 0.12391573729863693 4708

实验结果:

分析结果:
随着*数目n的增加,首先从n=1变化到n=2吞吐率得到很大提高,在n=2到n=5的变化中,吞吐率变化不大。对于公平性,规律类似。说明两种策略对于增加*的利用效率不高。
与具体算法策略关系不大。

EXP2:
实验数据:n=3,h=20,t=1-5,N=100,k=3,MV=5
t Strategy 吞吐率 公平性
1 Strategy1 0.11299435028248588 3600
Strategy3 0.1179245283018868 3734
2 Strategy1 0.10362694300518134 4250
Strategy3 0.1148105625717566 4324
3 Strategy1 0.11148272017837235 4652
Strategy3 0.10384215991692627 4584
4 Strategy1 0.11363636363636363 4692
Strategy3 0.11123470522803114 4694
5 Strategy1 0.10787486515641856 4778
Strategy3 0.12484394506866417 4804

实验结果:

结果分析:
随着生猴子间隔时间t的增加,吞吐率总体降低,公平性总体提高。生猴子频率太低密度太小,不能很好利用*。
与具体算法策略关系不大。

EXP3:
实验数据:n=3,h=20,t=3,N=200,400,…1000,k=3,MV=5
N Strategy 吞吐率 公平性
200 Strategy1 0.11607661056297155 19248
Strategy3 0.10718113612004287 19108
400 Strategy1 0.10700909577314072 78322
Strategy3 0.11484352569623887 78444
600 Strategy1 0.10871534698314912 177424
Strategy3 0.11325028312570781 177786
800 Strategy1 0.10990520675917022 316742
Strategy3 0.11218622914037302 316904
1000 Strategy1 0.11181930001118193 496002
Strategy3 0.11403808872163303 495990

实验结果:

结果分析:
随着生猴子总数的上升,吞吐率与公平性整体变化不大。当生猴子总数非常大的时候,主要是生猴子的频率与密度在起着影响。
与具体算法策略关系不大。Strategy3始终较低。

EXP4:
实验数据:n=3,h=20,t=3,N=100,k=6,12,24,36,48,MV=5
k Strategy 吞吐率 公平性
6 Strategy1 0.09727626459143969 4174
Strategy3 0.08361204013377926 4070
12 Strategy1 0.07668711656441718 3442
Strategy3 0.049554013875123884 2024
24 Strategy1 0.099601593625498 4240
Strategy3 0.030721966205837174 1122
36 Strategy1 0.07446016381236038 1812
Strategy3 0.021119324181626188 1252
48 Strategy1 0.08635578583765112 2108
Strategy3 0.018832391713747645 2334

实验结果:

结果分析:
随着每轮生的猴子的数目的增加,吞吐率整体上升,公平性整体下降。猴子密度提上去,有效利用了*。
吞吐率而言在12之后Strategy1总体高于另外一个。

EXP5:
实验数据:n=3,h=20,t=3,N=100,k=3,MV=2,4,6,8,10
n Strategy 吞吐率 公平性
2 Strategy1 0.06729475100942127 4648
Strategy3 0.06729475100942127 4654
4 Strategy1 0.10515247108307045 4648
Strategy3 0.09233610341643583 4558
6 Strategy1 0.1404494382022472 4768
Strategy3 0.11402508551881414 4582
8 Strategy1 0.1594896331738437 4644
Strategy3 0.1394700139470014 4572
10 Strategy1 0.18726591760299627 4752
Strategy3 0.17513134851138354 4656

实验结果:

结果分析:
随着每轮生的猴子的数目的增加,吞吐率整体上升,公平性整体下降。猴子密度提上去,有效利用了*。
吞吐率而言在4之后Strategy1总体高于另外一个。

3.9.4压力测试结果与分析
压力测试1:
实验数据:n=2,h=20,t=1,N=1000,k=25,MV=10

Strategy 吞吐率 公平性
Strategy1 0.08669267446900737 346672
Strategy3 0.027876895628902765 169372

结果分析:
吞吐率比较低,公平性差。
算法对比, Strategy3吞吐率低于strategy1算法,公平性较好。

压力测试2:
实验数据:n=2,h=2000,t=3,N=100,k=5,MV=100

Strategy 吞吐率 公平性
Strategy1 0.004900279315921008 626
Strategy3 0.008465250148141878 1464

结果分析:
吞吐率极低。
Strategy1吞吐率表现较好,Strategy3公平性表现较好。

3.10猴子过河模拟器v3
针对教师提供的三个文本文件,分别进行多次模拟,记录模拟结果。
均采用strategy1
吞吐率 公平性
Competiton_1.txt
第1次模拟 0.09943652635067948 39612
第2次模拟 0.07029053420805999 35472
第3次模拟 0.07869884575026233 37600
第4次模拟 0.051688490696071676 31702
第5次模拟 0.0788229111928534 39042
第6次模拟 0.07966011683483802 37180
第7次模拟 0.08688097306689835 39030
第8次模拟 0.10121457489878542 38660
第9次模拟 0.09640102827763496 39616
第10次模拟 0.06281407035175879 36850
平均值 0.080591 37476.4
Competiton_2.txt
第1次模拟 0.10237510237510238 101850
第2次模拟 0.11061946902654868 100944
第3次模拟 0.09889240506329114 103290
第4次模拟 0.10123506782749545 105784
第5次模拟 0.11253657438667566 107950
第6次模拟 0.11178180192264699 109126
第7次模拟 0.12330456226880394 107340
第8次模拟 0.1115822361080116 105480
第9次模拟 0.09157509157509157 95318
第10次模拟 0.12651821862348178 107464
平均值 0.109042 104454.6
Competiton_3.txt
第1次模拟 0.061274509803921566 3752
第2次模拟 0.05434782608695652 3596
第3次模拟 0.06775067750677506 3478
第4次模拟 0.08045052292839903 3476
第5次模拟 0.054377379010331704 3654
第6次模拟 0.04084967320261438 2708
第7次模拟 0.03772161448509996 3248
第8次模拟 0.07087172218284904 3366
第9次模拟 0.048828125 2444
第10次模拟 0.039093041438623924 3290
平均值 0.055557 3301.2