操作系统实验一

  • 格式: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