- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作 系统 实验报告
实验名称
线程 控制实验
计算机科学与技术学院
目录
一、实验目的和要求 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()等线程控制操作,利用信号量或者互斥锁实现线程建的同步。
二、实验内容
问题求 1 个浮点数(精确到小数点后 4 位)的平均值(和,最大值,最小值),具体的问题描述流程图如下图图 1 所示
三 、 实验 步骤
1、随机生成 1个浮点数; 2、创建 4个子线程,分别求 25个浮点数之和; 3、完成 1 个浮点数之和并打印结果; 4、统计多线程并发执行完成计算的时间; 5、写一个单线程程序,同样完成 1 个随机数求和的计算,统计计算时间,并和前面结果进行对比; 6、让单线程程序睡眠四秒钟、多线程程序各子程序睡一秒的条件下(两个程序总的睡眠时间相同),对比执行结果; 7、分析两次对比结果的差异,写出自己的见解。
四、实验结果与分析 1、单线程完成 1 个浮点数的求和运算所用的时间情况如下图图 2 所示
图 图 2 单线程计算 时间
分析实验中每次随机产生一个 到 1 之间的浮点数,1 个这样的数相加的话的平总和大概就在 5 左右(按照随机数的平均值原理),实验中 sum=,显然结果正确,整个计算运行时间为。
2、单线程完成 1 个浮点数的求和运算,单线程中睡眠 4 秒钟,所用的时间情况如下图图3 所示
图 图 3 单线程计算 时间( 睡眠 4 秒) 分析根据上一次单线程的执行情况来看,这一次让单线程睡眠 4 秒钟,最后执行时间刚好就是4 秒加上计算时间。也就是说计算 1 个浮点数的总和平均时间约为。
3、四个子线程共同完成 1 个浮点数的求和计算所用时间情况如下图图 4所示
图 图 4 多线程计算时间
分析因为这次是 4 个子线程并发运行,每个子线程只需计算 25个浮点数的总和,理想情况下这时候的运行时间应该是这单线程中计算时间的四分之一。从图中可以看到执行时间是,很显然这个时间约为单线程求 1 个浮点数之和的时间()的四分之一,符合预期的结果。
4、四个子线程共同完成 1 个浮点数的求和计算,其中每个子线程睡眠 1 秒钟,最终所用时间情况如下图图 5所示
图 图 5 多线程计算时间( 每个 子线程眠 睡眠 1 秒)
分析这里四个子线程每个子线程睡眠一秒,但由于四个子线程并发同步的在执行,当一个子线程在睡眠时,另外一个子线程却仍然在继续求和计算,因此他们一起合作同步完成1个浮点数的计算所需的时间就是 1 秒加上上图中不睡眠的时候的计算时间。从图中可以
看到≈1s+,所以最终的结果符合预期值。
5、单线程计算时间(睡眠 4s)与多线程计算时间(每个子线程睡眠 1s)对比效果如下图图 6 所示:
图 图 6 单线程 ( 睡眠 4s)与 与 多线程 ( 每个眠 子线程睡眠 1s) 计算时间 对比图 五、程序源代码 #include <> #include <> #include <> #include <> #include <sys/> #define LOOP 1 float SUM=; void *ADD() {
int i;
srand(time(NULL));
for(i=;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!=)
{
printf("Create Thread of ADD Failure\n");
exit(-1);
}
pthread_join(p,NULL);
gettimeofday(&end
1亿VIP精品文档
相关文档
最近下载
- 试论判例作为民法第1 条之习惯法 【台】吴从周教授 《台大法学论丛》第39卷第2期.pdf
- 民用建筑通用规范GB55031-2022(完整清晰版).pdf
- 【申报表】基于语言建构与运用的“读思达“ 教学法实践研究.doc
- 校园安全稳定工作“日报告、零报告”.docx
- 2024年深圳市高三年级第二次调研考试(二模)数学试卷(含官方答案).pdf
- 甲亢健康教育课件.pptx VIP
- 九下《出师表》文言文对比阅读35篇(含答案).pdf
- 小区智能化弱电系统维护工程报价清单.xls VIP
- 《中国行政制度史》.ppt
- 中国行业标准 NB/T 11118.5-2023煤矿综采工作面机电设备EtherNet/IP通信接口和协议 第5部分:供液系统设备数据表.pdf
文档评论(0)