操作系统实验一.docx
《操作系统实验一.docx》由会员分享,可在线阅读,更多相关《操作系统实验一.docx(16页珍藏版)》请在冰豆网上搜索。
操作系统实验一
重庆大学实验报告
实验题目:
多线程和多进程的管理与调度学院:
计算机学院专业班级:
年级:
2015级姓名:
学号:
完成时间:
2017年11月1日指导教师:
重庆大学教务处制
实验项目指导教师评定成绩表
学号:
姓名:
班级:
项目
分值
参考标准
评分
学习态度
10
积极与老师、助教讨论(10分)
学习马虎,纪律涣散(5分)
缺勤(0分)
软件
/系统质量
60
功能考虑完善,界面友好,Bug极少,针对异常情况有处理(55-60分)
功能考虑完善,界面良好,有一定Bug(49-54分)
功能较完善,Bug较多(43-48分)
完成程序基本功能(36-42分)
部分实现,无法运行(1-35分)
抄袭、被抄袭(0分)
实验演示答辩
10
重点突出、有特色、专业知识掌握好、能流畅回答老师提问(9-10分)
有一定特色、能较好地回答老师提问(7-8分)
能讲解项目的关键实现,能回答基本问题(0-6分)
实验报告撰写质量
20
文档规范,文字、图表表达清楚(18-20分)
文档较规范,文字、图表表达较清楚(11-17分)
文档不规范,内容空泛、结构混乱(0-10分)
指导教师评定成绩:
指导教师签名:
年月日
实验1多线程和多进程的管理与调度
实验目的
1.加深对进程概念的理解,明确进程与线程的区别。
2.掌握Linux进程创建和撤销的方法,进一步认识并发执行的实质。
3.了解多线程的程序设计方法。
实验内容
1.进程管理
1)获取进程信息
编写程序,获取系统当前执行进程的信息,包括进程名称与ID、PID和PGID等。
2)创建进程
编写进程,实现父进程创建子进程,返回后父子进程都分别循环输出字符串“Iamparent.”或“Iamchild.”5次,每输出一次延时1秒,然后进入下一次循环。
观察并分析运行结果,然后将程序改为父子进程同步执行:
子进程循环输出字符串“Iamchild.”5次,然后父进程再循环输出字符串“Iamparent.”5次。
观察并分析运行结果。
2.线程管理
1)线程创建
主程序创建两个线程,每个线程循环打印一句话,观察运行结果。
2)线程传参
创建两个线程,分别向线程传递如下两种类型的参数:
●传递整数值
●传递字符
实验要求
1.按照要求编写程序,放在相应的目录中,编译成功后执行,并分析实验结果。
2.比较进程退出的不同方式之间的区别:
exit,return,abort
3.根据实际完成内容写实验报告,在报告中记录实验过程中遇到的问题和针对问题的解决方案。
实验提示
1.进程管理相关命令和函数:
ps,top,pstree,getpid(),getpgid(),fork(),exit()
2.线程管理相关函数:
pthread_create(),pthread_join(),pthread_exit()
3.因为pthread的库不是Linux系统的库,所以编译多线程程序时要加上-lpthread。
年级、专业、班级
2015级物联网工程2班
姓名
徐冲
实验题目
多线程和多进程的管理与调度
实验时间
2017年10月25日
实验地点
主教409
实验成绩
实验性质
□验证性□设计性□综合性
教师评价:
□算法/实验过程正确;□源程序/实验内容提交□程序结构/实验步骤合理;□实验结果正确;□语法、语义正确;□报告规范;其他:
评价教师签名:
一、实验目的
1.加深对进程概念的理解,明确进程与线程的区别。
2.掌握Linux进程创建和撤销的方法,进一步认识并发执行的实质。
3.了解多线程的程序设计方法。
二、实验内容
1.进程管理
1)获取进程信息
编写程序,获取系统当前执行进程的信息,包括进程名称与ID、PID和PGID等。
2)创建进程
编写进程,实现父进程创建子进程,返回后父子进程都分别循环输出字符串“Iamparent.”或“Iamchild.”5次,每输出一次延时1秒,然后进入下一次循环。
观察并分析运行结果,然后将程序改为父子进程同步执行:
子进程循环输出字符串“Iamchild.”5次,然后父进程再循环输出字符串“Iamparent.”5次。
观察并分析运行结果。
2.线程管理
1)线程创建
主程序创建两个线程,每个线程循环打印一句话,观察运行结果。
2)线程传参
创建两个线程,分别向线程传递如下两种类型的参数:
传递整数值传递字符
二、实验过程或算法(源程序)
#include
#include
#include
#include
#include
#include
//线程1:
求1~n之间的素数
void*MyThread1(void*in)
{
intn;inth=0,leap=1,k,m,i;
printf("inputthevalueofn:
\n");//输入n的值scanf("%d",&n);
printf("theprimebetween1~%dis:
\n",n);for(intm=2;m<=n;m++){for(inti=2;i<=m/2;i++){if(m%i==0){leap=0;break;
}}if(leap){printf("%4d",m);h++;if(h%10==0)printf("\n");
}leap=1;}
printf("\nthread1exit!
\n");//线程1退出
pthread_exit(0);
}
//线程2:
生成Fibonacci序列
void*MyThread2(void*in)
{
intfib0=0,fib1=1,fib2,i,N;printf("inputfibvalueN:
\n");//输入N值scanf("%d",&N);
printf("thefibsequenceasfollowing:
\n");
for(i=0;i}}
printf("\nthread2exit!
\n");//线程2退出
pthread_exit(0);
}
//4号进程来创建2个线程
intMainThread4()
{
intret1=0,ret2=0;
pthread_tid1,id2;//定义两个线程id
//调用pthread_create()函数来创建线程1
ret1=pthread_create(&id1,NULL,MyThread1,NULL);
//ret1==1表示创建失败;
//ret1==0表示创建成功;
if(ret1){
//如果出错,报错提示
printf("Creatpthread1error!
\n");
return1;
}
//调用pthread_create()函数来创建线程2
ret2=pthread_create(&id2,NULL,MyThread2,NULL);
//ret2==1表示创建失败;
//ret2==0表示创建成功;
if(ret2){
//如果出错,报错提示
printf("Creatpthread2error!
\n");
return1;
}
pthread_join(id1,NULL);//主线程等待线程1结束pthread_join(id2,NULL);//主线程等待线程2结束
printf("mainthread4exit!
\n");//主线程退出
return0;
}
//3号进程创建的子进程分别调用下面这个函数来完成不同任务voidChildFun(inti)
{
switch(i){case4:
printf("ThisisNo.4process,IDis%d,parentIDis%d,willcreat2thread\n",getpid(),getppid());MainThread4();break;case5:
printf("ThisisNo.5process,IDis%d,parentIDis%d,willexcute./proc2\n",getpid(),getppid());execl("proc2","./proc2",NULL);
break;default:
break;}exit(0);
}
//3号进程来创建两个子进程
intCreatProcess()
{
inti;
for(inti=4;i<=5;i++)
{pid_tchild;
child=fork();
//创建失败
if(child==-1){
printf("Errorhappenedinforkfuction!
\n");
return0;
}
//子进程返回值为0
elseif(child==0)ChildFun(i);//调用函数执行不同操作
}
for(inti=0;i<=1;i++)
{
//进程等待其他子进程的退出
pid_tcpid=wait(NULL);
printf("Theprocess%dexit\n",cpid);}
return0;
}
//父进程创建的两个进程分别调用下面这个函数来完成不同任务voidFun(inti)
{
switch(i){case2:
printf("ThisisNo.2process,IDis%d,parentIDis%d,willexecutecommand:
ls-l:
\n",getpid(),getppid());
//2号进程调用execl函数来执行ls-l命令
execl("/bin/ls","ls","-l",NULL);
break;case3:
printf("ThisisNo.3process,IDis%d,parentIDis%d,willcreat2process\n",getpid(),getppid());
CreatProcess();//3号进程调用这个函数来创建2个子进程break;default:
break;}
for(inti=0;i<=1;i++)
{
//父进程等待其子进程的退出
pid_tcpid=wait(NULL);
printf("Theprocess%dexit\n",cpid);
}exit(0);
}
intmain()
{
inti;
for(i=2;i<=3;i++)
{pid_tchild;
child=fork();
//创建失败
if(child==-1){
printf("Errorhappenedinforkfuction!
\n");
return0;
}
//子进程返回值为0
elseif(child==0){
//printf("NowtheprocessIDis%d:
\n",getpid());
Fun(i);//调用函数执行不同操作
}}
for(i=0;i<=1;i++)
{
//父进程等待子进程的退出
pid_tcpid=wait(NULL);
printf("Theprocess%dexit\n",cpid);
}
//最后父进程退出
printf("TheNo.1parentprocessIDis%dexit\n",getpid());return0;
}
三、实验结果及分析和(或)源程序调试过程