操作系统第一次实验报告_第1页
操作系统第一次实验报告_第2页
操作系统第一次实验报告_第3页
操作系统第一次实验报告_第4页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、操作系统第一次实验报告 操作 系统 实验报告 实验名称: 线程 控制实验 计算机科学与技术学院 目录 一、实验目的和要求 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(),等待线程

2、合并 pthread_join()等线程控制操作,利用信号量或者互斥锁实现线程建的同步。 二、实验内容 问题:求 1000000 个浮点数(精确到小数点后 4 位)的平均值(和,最大值,最小值),具体的问题描述流程图如下图图 1 所示: 三 、 实验 步骤 1、随机生成 1000000个浮点数; 2、创建 4个子线程,分别求 250000个浮点数之和; 3、完成 1000000 个浮点数之和并打印结果; 4、统计多线程并发执行完成计算的时间; 5、写一个单线程程序,同样完成 1000000 个随机数求和的计算,统计计算时间,并和前面结果进行对比; 6、让单线程程序睡眠四秒钟、多线程程序各子程序

3、睡一秒的条件下(两个程序总的睡眠时间相同),对比执行结果; 7、分析两次对比结果的差异,写出自己的见解。 四、实验结果与分析 1、单线程完成 1000000 个浮点数的求和运算所用的时间情况如下图图 2 所示: 图 图 2 单线程计算 时间 分析:实验中每次随机产生一个 0 到 1 之间的浮点数,1000000 个这样的数相加的话的平总和大概就在 500000 左右(按照随机数的平均值原理),实验中 sum=,显然结果正确,整个计算运行时间为。 2、单线程完成 1000000 个浮点数的求和运算,单线程中睡眠 4 秒钟,所用的时间情况如下图图3 所示: 图 图 3 单线程计算 时间( 睡眠 4

4、 秒) 分析:根据上一次单线程的执行情况来看,这一次让单线程睡眠 4 秒钟,最后执行时间刚好就是4 秒加上计算时间。也就是说计算 1000000 个浮点数的总和平均时间约为。 3、四个子线程共同完成 1000000 个浮点数的求和计算所用时间情况如下图图 4所示: 图 图 4 多线程计算时间 分析:因为这次是 4 个子线程并发运行,每个子线程只需计算 250000个浮点数的总和,理想情况下这时候的运行时间应该是这单线程中计算时间的四分之一。从图中可以看到执行时间是,很显然这个时间约为单线程求 1000000 个浮点数之和的时间()的四分之一,符合预期的结果。 4、四个子线程共同完成 10000

5、00 个浮点数的求和计算,其中每个子线程睡眠 1 秒钟,最终所用时间情况如下图图 5所示: 图 图 5 多线程计算时间( 每个 子线程眠 睡眠 1 秒) 分析:这里四个子线程每个子线程睡眠一秒,但由于四个子线程并发同步的在执行,当一个子线程在睡眠时,另外一个子线程却仍然在继续求和计算,因此他们一起合作同步完成1000000个浮点数的计算所需的时间就是 1 秒加上上图中不睡眠的时候的计算时间。从图中可以 看到1s+,所以最终的结果符合预期值。 5、单线程计算时间(睡眠 4s)与多线程计算时间(每个子线程睡眠 1s)对比效果如下图图 6 所示: 图 图 6 单线程 ( 睡眠 4s)与 与 多线程

6、( 每个眠 子线程睡眠 1s) 计算时间 对比图 五、程序源代码 /* *filename: *author: *date:2021/11/22 */ #include #include #include #include #include sys/ #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;

7、 float time; struct timeval start; struct timeval end; gettimeofday(start,null); result=pthread_create(p,null,add,null); if(result!=0) printf(create thread of add failuren); exit(-1); pthread_join(p,null); gettimeofday(end,null); time = (float) - *1000000+(float) - )/1000000; printf(signal_thread_su

8、m:%.4fn,sum); printf(signal_thread_execution_time:%.4fs(sleep 4 sec)n,time); return 0; /* *filename: *author:wangtao *date:2021/11/22 */ #include #include #include #include #include sys/ #define loop 25000 pthread_mutex_t mutex; float sum=0; void add(int * k) int i; srand(time(null); for(i=0;iloop;i

9、+) pthread_mutex_lock(mutex); sum += (float)(float)rand()/rand_max); pthread_mutex_unlock(mutex); printf(pthread%d:%.4fn,*k,sum); sleep(1); int main(void) pthread_t p1,p2,p3,p4; int result1,result2,result3,result4; int k1=1,k2=2,k3=3,k4=4; struct timeval start; struct timeval end; float time; gettim

10、eofday(start,null); pthread_mutex_init(mutex,null); result1=pthread_create(p1,null,(void*)add,k1); result2=pthread_create(p2,null,(void*)add,k2); result3=pthread_create(p3,null,(void*)add,k3); result4=pthread_create(p4,null,(void*)add,k4); if(result1!=0|result2!=0|result3!=0|result4!=0) printf(creat

11、e child thread failure!n); exit(1); pthread_join(p1,null); pthread_join(p2,null); pthread_join(p3,null); pthread_join(p4,null); gettimeofday(end,null); time = (float) - *1000000 + (float) - )/1000000; printf(sum = %.4fn,sum); printf(multi_thread_time = %.4fs(each child thread sleep 1 sec)n,time); re

12、turn 0; 六、实验体会 这是第一次使用多线程编程编写代码,第一次直观感受到这种多线程编程对程序的执行速率的影响。虽然说操作系统课程已经上了好几个星期了,课堂上一直在学习多线程编程的算法思想,但是那只是书面上的讲授,真正直观的感受和体会还是得依靠实验来了解。 因为之前就接触过 linux 系统,所以对于程序的编译执行方面还是问题不大,最主要的就是代码的编写问题。一开始到实验室完全不知道要做什么,因为根本连实验内容都不知道,直到助教在大屏幕上显示这个实验题目,我才开始了解实验的题目和要求。这里我就是想建议一下老师您可以应该给我们实验题目,让我们在实验前就了解一下实验内容,不然到了实验室都不知道到底要干嘛。读懂了解题意之后,我就开始参考所给的一些线程创建函数说明来编写多线程同步完成1000000个浮

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论