1、西安邮电大学操作系统进程管理进程调度实验报告 资料仅供参考 西 安 邮 电 大 学 (计算机学院) 课内实验报告 实验名称: 进程管理-进程调度 专业名称: 计算机科学与技术 班 级: 计科1501 学生姓名: 赵阳 学号(8位): 05141123 指导教师: 张老师 实验日期: 4月 一. 实验目的及实验环境 1.实
2、验目的 经过观察、分析实验现象,深入理解进程及进程在调度执行和内存空间等方面的特点,掌握在POSIX 规范中fork和kill系统调用的功能和使用。 2.实验环境 (1)硬件 Ø CPU:I7-6700HQ Ø 内存:8G DDR4 2133 Ø 显示器:笔记本显示器 Ø 硬盘空间:80G (2)软件 Ø 虚拟机名称及版本:非虚拟机 Ø 操作系统名称及版本:Ubuntu 16.04 Ø 编译器:gcc 二. 实验内容 1、实验前准备工作 学习man 命令的用法,经过它查看fork 和kill 系统调用的在线帮助,并阅读参考资料,学会for
3、k 与kill 的用法,复习C 语言的相关内容。 2、实验内容 根据下发的Linux进程管理实验PPT内容,将实验代码补充完整。并考虑: 先猜想一下这个程序的运行结果。假如运行“./process 20”,输出会是什么样?然后按照注释里的要求把代码补充完整,运行程序。能够多运行一会儿,并在此期间启动、关闭一些其它进程,看process 的输出结果有什么特点,记录下这个结果。开另一个终端窗口,运行“ps aux|grep process”命令,看看process 究竟启动了多少个进程。回到程序执行窗口,按“数字键+回车”尝试杀掉一两个进程,再到另一个窗口看进程状况。按q 退出程序再看进程
4、情况。 3、回答问题 编写、编译、链接、执行实验内容设计中的代码,并回答如下问题: 1)你最初认为运行结果会怎么样? 最初认为结果会产生一定数量的进程,然后输入数字加回车杀死单个进程,按下q杀死全部进程。 2) 实际的结果什么样?有什么特点?试对产生该现象的原因进行分析。 实际结果产生一部分子进程,且数目最多是10个,而且不超过10个,因为程序设定了子进程数目最大为10。 3) proc_number 这个全局变量在各个子进程里的值相同吗?为什么? 不相同,proc_number是每一个进程的编号,从0到10。 4) kill 命令在程序中使用了几次?每次的作用是什么?
5、执行后的现象是什么?
使用了2次,while循环一次,q命令一次,第一次是为了杀死单个进程,第二次是杀死全部进程,第一次执行后只能杀死单个进程,第二次能够杀死对应进程组内的全部进程。
5)使用kill 命令能够在进程的外部杀死进程。进程怎样能主动退出?这两种退出方式哪种更好一些?
进程主动退出就是进程执行完,到了return语句自行退出,主动退出更好一些。
6)写出fork()和kill()函数原型,并解释函数的功能和参数的含义?
#include
6、函数经过系统调用创立一个与原来进程几乎完全相同的进程,也就是两个进程能够做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也能够做不同的事。
#include
7、她们的状态。 $ ps aux | grep ./a.out 三.方案设计 四.测试数据及运行结果 五.总结 1. 实验过程中遇到的问题及解决办法; 实验过程没有大的问题,就是在进行ps aux|grep的时候刚开始输入ps aux|grep process,没有进程列表出来,后来经过向同学请教得知在我的环境下需要输入ps aux|grep ./a.out 故解决问题。 2. 对设计及调试过程的心得体会。 这次设计及调试让我深入理解进程及进程在调度执行和内存空间等方面的特点,初步掌握在POSIX 规范
8、中fork和kill系统调用的功能和使用,以及感受linux系统的魅力。
六.附录:源代码(电子版)
#include
9、char* argv[]){
int child_proc_number=MAX_CHILD_NUMBER ;
int i,ch;
pid_t child_pid;
pid_t pid[10]={0};
if(argc>1){
child_proc_number = atoi(argv[1]);
child_proc_number = (child_proc_number>10)?10:child_proc_number;
for(i=0;i 10、umber=i;
if(child_pid==0){do_something();
}else if(child_pid>0){
pid[i]=child_pid;
printf("A Parent process,the pid is %d\n",getpid());
}
}
printf("input the number you want to kill\n");
while((ch=getchar())!='q')
{
if(isdigit(ch)){
ch=(int)ch-48; 11、
if(kill(pid[ch],SIGKILL)<0){
perror("kill");
exit(1);
}else{
printf("process %d has been killed!\n\n",pid[ch]);
}
}else{
printf("is not digit\n");
}
getchar();
printf("input the number you want to kill:\n");
}
kill(0,SIGTERM);
}
return 0;
}
void do_something() {
for(;;)
{
printf("This is process No.%*d\n",proc_number+3,proc_number);
sleep(SLEEP_INTERVAL);
}
}






