操作系统第一次实验报告Word版
更新时间:2023-04-14 13:54:01 阅读量: 实用文档 文档下载
- 操作系统第一次在线作业推荐度:
- 相关推荐
操作系统实验报告实验名称:线程控制实验
计算机科学与技术学院
目录
一、实验目的和要求 (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
#include
#include
#include
#include
#define LOOP 1000000
float SUM=0;
void *ADD()
{
int i;
srand(time(NULL));
for(i=0;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(&start,NULL); result=pthread_create(&p,NULL,ADD,NULL); if(result!=0) { printf("Create Thread of ADD Failure\n"); exit(-1); } pthread_join(p,NULL); gettimeofday(&end,NULL); time = ((float)(a30350d4f042336c1eb91a37f111f18583d00c83_sec - a30350d4f042336c1eb91a37f111f18583d00c83_sec)*1000000+(float) (a30350d4f042336c1eb91a37f111f18583d00c83_usec - a30350d4f042336c1eb91a37f111f18583d00c83_usec))/1000000; printf("Signal_Thread_Sum:%.4f\n",SUM); printf("Signal_Thread_Execution_Time:%.4fs(sleep 4 sec)\n",time); return 0; } /************************* *FileName:multi_thread.c *Author:wangtao *Date:2013/11/22 ***************************/ #include #include #include #include #include #define LOOP 25000 pthread_mutex_t mutex; float SUM=0; void ADD(int * k) { int i; srand(time(NULL)); for(i=0;i { pthread_mutex_lock(&mutex); SUM += (float)((float)rand()/RAND_MAX); pthread_mutex_unlock(&mutex); } printf("pthread%d:%.4f\n",*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; gettimeofday(&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("Create 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)(a30350d4f042336c1eb91a37f111f18583d00c83_sec - a30350d4f042336c1eb91a37f111f18583d00c83_sec)*1000000 + (float)(a30350d4f042336c1eb91a37f111f18583d00c83_usec - a30350d4f042336c1eb91a37f111f18583d00c83_usec))/1000000; printf("SUM = %.4f\n",SUM); printf("Multi_thread_time = %.4fs(Each child thread sleep 1 sec)\n",time); return 0; } 六、实验体会 这是第一次使用多线程编程编写代码,第一次直观感受到这种多线程编程对程序的执行速率的影响。虽然说操作系统课程已经上了好几个星期了,课堂上一直在学习多线程编程 的算法思想,但是那只是书面上的讲授,真正直观的感受和体会还是得依靠实验来了解。因为之前就接触过linux系统,所以对于程序的编译执行方面还是问题不大,最主要的就是代码的编写问题。一开始到实验室完全不知道要做什么,因为根本连实验内容都不知道,直到助教在大屏幕上显示这个实验题目,我才开始了解实验的题目和要求。这里我就是想建议一下老师您可以应该给我们实验题目,让我们在实验前就了解一下实验内容,不然到了实验室都不知道到底要干嘛。读懂了解题意之后,我就开始参考所给的一些线程创建函数说明来编写多线程同步完成1000000个浮点数的求和运算。因为对这些线程函数不是很了解,在使用pthread_create()函数创建线程时,老是传入函数参数不对,后来百度之后了解到传入的子线程函数的类型应该为void * (*start_thread)(void)形式。最后运行试验与单线程的进行比较,强烈感受到多线程的并发同步运行的特点。 总之,这次试验使我对课堂知识有了更深的体会和巩固,为以后的课程学习打下了基础。 (注:可编辑下载,若有不当之处,请指正,谢谢!)
正在阅读:
操作系统第一次实验报告Word版04-14
PS经典试题04-11
人际沟通案例分析09-02
镇江市2013届第一学期期中调研测试高三语文参考答案及评分标准07-24
Φ850SMW工法桩施工方案10-06
十三五(2016-2020年)膜气体分离系统行业市场发展现状及投资决05-17
房产置业顾问年终工作总结05-08
重点初中化学物质的量浓度练习测试题04-10
旋挖钻孔灌注桩(支护桩)监理实施细则12-09
回忆爸爸教学设计 任小红10-17
- 教学能力大赛决赛获奖-教学实施报告-(完整图文版)
- 互联网+数据中心行业分析报告
- 2017上海杨浦区高三一模数学试题及答案
- 招商部差旅接待管理制度(4-25)
- 学生游玩安全注意事项
- 学生信息管理系统(文档模板供参考)
- 叉车门架有限元分析及系统设计
- 2014帮助残疾人志愿者服务情况记录
- 叶绿体中色素的提取和分离实验
- 中国食物成分表2020年最新权威完整改进版
- 推动国土资源领域生态文明建设
- 给水管道冲洗和消毒记录
- 计算机软件专业自我评价
- 高中数学必修1-5知识点归纳
- 2018-2022年中国第五代移动通信技术(5G)产业深度分析及发展前景研究报告发展趋势(目录)
- 生产车间巡查制度
- 2018版中国光热发电行业深度研究报告目录
- (通用)2019年中考数学总复习 第一章 第四节 数的开方与二次根式课件
- 2017_2018学年高中语文第二单元第4课说数课件粤教版
- 上市新药Lumateperone(卢美哌隆)合成检索总结报告
- 操作系统
- 第一次
- 实验
- 报告
- Word
- 葵花籽项目可行性研究报告-范文
- 精选计划书学生模板六篇
- 中国少数民族音乐教案
- 小学语文的三维目标
- 房产证加名:加父母、配偶、子女流程分类讲解
- 《C语言程序设计》课程标准
- 庆祝五一劳动节晚会主持词
- 2022年南京大学地理与海洋科学学院921管理学原理之管理学原理考
- 2015国家公务员考试行测高频考点分析之多次相遇问题
- 2022互联网金融行业分析报告报告材料报告材料
- 人教版高三政治一轮复习精品:哲学生活1单元 生活智慧与时代精神
- 2010江西省教师招聘考试公共基础知识真题演练汇总
- 2014年中心学校会工作总结
- 怎样科学的种植核桃树
- 不锈钢焊接工艺规程
- 七年级第一学期班主任工作总结3篇
- 国有企业劳动合同简易版参考文本
- 情态动词总复习练习
- 2015年银行从业资格考试:《公司信贷》常用术语(四)
- 《辽宁省2008市政工程预算定额》说明及工程量计算规则分析