操作系统实验一
- 格式:doc
- 大小:690.74 KB
- 文档页数:13
.
. 重庆大学实验报告
实验题目: 多线程和多进程的管理与调度
学 院: 计算机学院
专业班级:
年 级: 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) 创建进程
编写进程,实现父进程创建子进程,返回后父子进程都分别循环输出字符串“I am parent.”或“I am child.”5次,每输出一次延时1秒,然后进入下一次循环。观察并分析运行结果,然后将程序改为父子进程同步执行:子进程循环输出字符串“I am child.”5次,然后父进程再循环输出字符串“I am parent.”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)创建进程
编写进程,实现父进程创建子进程,返回后父子进程都分别循环输出字符串“I am parent.”或“I am child.”5次,每输出一次延时1秒,然后进入下一次循环。观察并分析运行结果,然后将程序改为父子进程同步执行:子进程循环输出字符串“I am child.”5次,然后父进程再循环输出字符串“I am parent.”5次。观察并分析运行结果。
2.线程管理
1)线程创建
主程序创建两个线程,每个线程循环打印一句话,观察运行结果。
2)线程传参
创建两个线程,分别向线程传递如下两种类型的参数:传递整数值传递字符 .
. 二、 实验过程或算法(源程序)
#include
#include
#include
#include
#include
#include
//线程 1:求 1~n 之间的素数
void *MyThread1(void* in)
{
int n; int h =
0, leap = 1,k, m, i;
printf("input the value of n:\n"); //输入 n 的值
scanf("%d",&n);
printf("the prime between 1 ~ %d is:
\n",n); for( int m = 2; m <= n;
m++){ for( int i = 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("\n thread1 exit! \n"); //线程 1 退出
pthread_exit(0);
}
//线程 2:生成 Fibonacci 序列
void *MyThread2(void* in)
{
int fib0 = 0, fib1 = 1, fib2, i, N;
printf("input fib value N:\n"); //输入
N 值 scanf("%d",&N); printf("the fib sequence as following:\n"); .
. for( i = 0; i < N;
i++){ if( i == 0 )
printf("0 "); else if
( i == 1) printf("1 ");
else { fib2 = fib0
+ fib1; printf("%d
",fib2); fib0 =
fib1; fib1 = fib2;
} }
printf("\n thread2 exit! \n"); //线程 2 退出
pthread_exit(0);
}
//4 号进程来创建 2 个线程
int MainThread4()
{
int ret1 = 0, ret2 = 0;
pthread_t id1, id2; //定义两个线程 id
//调用 pthread_create()函数来创建线程 1
ret1 = pthread_create(&id1, NULL, MyThread1, NULL);
// ret1 == 1 表示创建失败;
// ret1 == 0 表示创建成功;
if(ret1){
//如果出错,报错提示
printf("Creat pthread1 error!\n");
return 1;
}
//调用 pthread_create()函数来创建线程 2
ret2 = pthread_create(&id2, NULL, MyThread2, NULL);
// ret2 == 1 表示创建失败;
// ret2 == 0 表示创建成功;
if(ret2){
//如果出错,报错提示
printf("Creat pthread2 error!\n");
return 1; } .
.
pthread_join(id1, NULL); //主线程等待线程 1 结束
pthread_join(id2, NULL); //主线程等待线程 2 结束
printf("main thread4 exit!\n");//主线程退出
return 0;
}
//3 号进程创建的子进程分别调用下面这个函数来完成不同任务
void ChildFun(int i)
{
switch
(i)
{ case
4:
printf("This is No.4 process,ID is %d,parent ID
is %d,will creat 2 thread\n",getpid(),getppid());
MainThread4(); break; case 5:
printf("This is No.5 process,ID is %d,parent ID