操作系统第一次实验报告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)形式。最后运行试验与单线程的进行比较,强烈感受到多线程的并发同步运行的特点。

总之,这次试验使我对课堂知识有了更深的体会和巩固,为以后的课程学习打下了基础。

(注:可编辑下载,若有不当之处,请指正,谢谢!)

本文来源:https://www.bwwdw.com/article/tjcq.html

Top