操作系统实验报告
实验名称:线程控制实验
计算机科学与技术学院
目录
一、实验目的和要求................................................................................................. 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;i<LOOP;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)(end.tv_sec - start.tv_sec)*1000000+(float)
(end.tv_usec - start.tv_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 <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <time.h>
#include <sys/time.h>
#define LOOP 25000
pthread_mutex_t mutex;
float SUM=0;
void ADD(int * k)
{
int i;
srand(time(NULL));
for(i=0;i<LOOP;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)(end.tv_sec - start.tv_sec)*1000000 + (float)(end.tv_usec - start.tv_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)形式。最后运行试验与单线程的进行比较,强烈感受到多线程的并发同步运行的特点。
总之,这次试验使我对课堂知识有了更深的体会和巩固,为以后的课程学习打下了基础。
《进程间通信机制》实验报告
实验序号: 八 实验项目名称:消息传递
《计算机操作系统》实验报告班级:姓名:学号:实验一进程控制与描述一、实验目的通过对Windows2000编程,进一步熟悉操作系统的…
操作系统实验报告实验名称理解UNIXLINUXShell及UNIX的进程树成绩专业班级计科姓名学号联系电话实验日期20xx年12月…
目录实验一进程的创建2实验二进程控制3实验三进程的管道通信4实验四消息通信6实验五进程调度算法8实验六FIFO页面置换算法12实验…
操作系统实验报告学号姓名班级实验一实验报告实验名称并发程序设计实验1实验目的掌握在程序中创建新进程的方法观察并理解多道程序并发执行…
《操作系统原理》实验报告院(部):管理工程学院专业:信息管理与信息系统实验项目:实验一二三五班级:信管102姓名:学号:目录引言.…
1-1:通过这次小实验,是我更加了解Linux一些常用指令的操作以及其作用,对于一个刚开始接触lniux操作系统的初学者来说非常有…
学号:姓名:班级:在本学期的计算机操作系统这门课学习当中,为了更好的了解操作系统相关知识,我们通过OSLab平台做了几个实验。在实…
《计算机操作系统》实验报告班级:姓名:学号:实验一进程控制与描述一、实验目的通过对Windows2000编程,进一步熟悉操作系统的…
操作系统实验总结学号学生姓名专业班级111进程创建UNIX中进程既是一个独立拥有资源的基本单位又是一个独立调度的基本单位一个进程实…
武汉理工大学学生实验报告书实验课程名称操作系统开课学院计算机科学与技术学院指导老师姓名刘军学生姓名学生专业班级20xx20xx学年…