- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
操作系统实验报告
实验名称: 线程控制实验
计算机科学与技术学院
目录
一、实验目的和要求 2
二、实验内容 2
三、实验步骤 2
四、实验结果与分析 3
1.单线程 3
2.单线程(睡眠4s) 3
3.多线程 4
4.多线程(每个子线程睡眠1s) 4
5.单线程与多线程对比 5
五、程序源代码 5
1.单线程实验代码 5
2.单线程实验代码 6
六、实验体会 7
一、实验目的和要求
通过本实验掌握在Linux操作系统中遵循Posix线程标准接口进行多线程程序编程,熟练掌握线程的创建pthread_create(),线程的终止pthread_exit(),等待线程合并pthread_join()等线程控制操作,利用信号量或者互斥锁实现线程建的同步。
二、实验内容
问题:求1000000个浮点数(精确到小数点后4位)的平均值(和,最大值,最小值),具体的问题描述流程图如下图图1所示:
三、实验步骤
1、随机生成1000000个浮点数;
2、创建4个子线程,分别求250000个浮点数之和;
3、完成1000000个浮点数之和并打印结果;
4、统计多线程并发执行完成计算的时间;
5、写一个单线程程序,同样完成1000000个随机数求和的计算,统计计算时间,并和前面结果进行对比;
6、让单线程程序睡眠四秒钟、多线程程序各子程序睡一秒的条件下(两个程序总的睡眠时间相同),对比执行结果;
7、分析两次对比结果的差异,写出自己的见解。
四、实验结果与分析
1、单线程完成1000000个浮点数的求和运算所用的时间情况如下图图2所示:
图2 单线程计算时间
分析:实验中每次随机产生一个0到1之间的浮点数,1000000个这样的数相加的话的平总和大概就在500000左右(按照随机数的平均值原理),实验中sum=499919.3750,显然结果正确,整个计算运行时间为0.1086s。
2、单线程完成1000000个浮点数的求和运算,单线程中睡眠4秒钟,所用的时间情况如下图图3所示:
图3 单线程计算时间(睡眠4秒)
分析:根据上一次单线程的执行情况来看,这一次让单线程睡眠4秒钟,最后执行时间刚好就是4秒加上计算时间。也就是说计算1000000个浮点数的总和平均时间约为0.1s。
3、四个子线程共同完成1000000个浮点数的求和计算所用时间情况如下图图4所示:
图4 多线程计算时间
分析:因为这次是4个子线程并发运行,每个子线程只需计算250000个浮点数的总和,理想情况下这时候的运行时间应该是这单线程中计算时间的四分之一。从图中可以看到执行时间是0.0233s,很显然这个时间约为单线程求1000000个浮点数之和的时间(0.1086)的四分之一,符合预期的结果。
4、四个子线程共同完成1000000个浮点数的求和计算,其中每个子线程睡眠1秒钟,最终所用时间情况如下图图5所示:
图5 多线程计算时间(每个子线程睡眠1秒)
分析:这里四个子线程每个子线程睡眠一秒,但由于四个子线程并发同步的在执行,当一个子线程在睡眠时,另外一个子线程却仍然在继续求和计算,因此他们一起合作同步完成1000000个浮点数的计算所需的时间就是1秒加上上图中不睡眠的时候的计算时间。从图中可以看到1.0261s≈1s+0.0233s,所以最终的结果符合预期值。
5、单线程计算时间(睡眠4s)与多线程计算时间(每个子线程睡眠1s)对比效果如下图图6所示:
图6 单线程 (睡眠4s)与多线程 (每个子线程睡眠1s)计算时间对比图
五、程序源代码
/*************************
*FileName:signal_thread.c
*Author:
*Date:2013/11/22
***************************/
#include stdio.h
#include stdlib.h
#include pthread.h
#include time.h
#include sys/time.h
#define LOOP 1000000
float SUM=0;
void *ADD()
{
int i;
srand(time(NULL));
for(i=0;iLOOP;i++)
{
SUM += (float)(rand()/(float)RAND_MAX);
}
sleep(4);
}
int main()
{
pthread_t p;
int result;
float time;
struct timeval start;
struct timeval end;
gettimeofday(sta
文档评论(0)