资源描述
西 安 邮 电 大 学
(计算机学院)
课内实验报告
实验名称: 进程管理-进程调度
专业名称: 计算机科学与技术
班 级: 计科1501
学生姓名: 赵阳
学号(8位): 05141123
指导教师: 张老师
实验日期: 2023年4月
一. 实验目的及实验环境
1.实验目的
通过观测、分析实验现象,进一步理解进程及进程在调度执行和内存空间等方面的特点,掌握在POSIX 规范中fork和kill系统调用的功能和使用。
2.实验环境
(1)硬件
Ø CPU:I7-6700HQ
Ø 内存:8G DDR4 2133
Ø 显示器:笔记本显示器
Ø 硬盘空间:80G
(2)软件
Ø 虚拟机名称及版本:非虚拟机
Ø 操作系统名称及版本:Ubuntu 16.04
Ø 编译器:gcc
二. 实验内容
1、实验前准备工作
学习man 命令的用法,通过它查看fork 和kill 系统调用的在线帮助,并阅读参考资料,学会fork 与kill 的用法,复习C 语言的相关内容。
2、实验内容
根据下发的Linux进程管理实验PPT内容,将实验代码补充完整。并考虑:
先猜想一下这个程序的运营结果。假如运营“./process 20”,输出会是什么样?然后按照注释里的规定把代码补充完整,运营程序。可以多运营一会儿,并在此期间启动、关闭一些其它进程,看process 的输出结果有什么特点,记录下这个结果。开另一个终端窗口,运营“ps aux|grep process”命令,看看process 究竟启动了多少个进程。回到程序执行窗口,按“数字键+回车”尝试杀掉一两个进程,再到另一个窗口看进程状况。按q 退出程序再看进程情况。
3、回答问题
编写、编译、链接、执行实验内容设计中的代码,并回答如下问题:
1)你最初认为运营结果会怎么样?
最初认为结果会产生一定数量的进程,然后输入数字加回车杀死单个进程,按下q杀死所有进程。
2) 实际的结果什么样?有什么特点?试对产生该现象的因素进行分析。
实际结果产生一部分子进程,且数目最多是10个,并且不超过10个,由于程序设定了子进程数目最大为10。
3) proc_number 这个全局变量在各个子进程里的值相同吗?为什么?
不相同,proc_number是每一个进程的编号,从0到10。
4) kill 命令在程序中使用了几次?每次的作用是什么?执行后的现象是什么?
使用了2次,while循环一次,q命令一次,第一次是为了杀死单个进程,第二次是杀死所有进程,第一次执行后只能杀死单个进程,第二次可以杀死相应进程组内的所有进程。
5)使用kill 命令可以在进程的外部杀死进程。进程如何能积极退出?这两种退出方式哪种更好一些?
进程积极退出就是进程执行完,到了return语句自行退出,积极退出更好一些。
6)写出fork()和kill()函数原型,并解释函数的功能和参数的含义?
#include <sys/types.h> #include <unistd.h> pid_t fork(void);
功能:
fork()函数通过系统调用创建一个与本来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但假如初始参数或者传入的变量不同,两个进程也可以做不同的事。
#include <sys/types.h>#include <signal.h> int kill(pid_t pid, int sig);
功能:
Kill()用于向任何进程组或进程发送信号。
7) ps aux|grep process命令功能是什么?并解释结果的含义。
ps是显示当前状态正在运营的进程以及发出该命令的终端,所使用的CPU的时间以及正在执行的命令,grep表达在这些进程里进行搜索,ps aux是显示所有进程和他们的状态。
$ ps aux | grep ./a.out
三.方案设计
四.测试数据及运营结果
五.总结
1. 实验过程中碰到的问题及解决办法;
实验过程没有大的问题,就是在进行ps aux|grep的时候刚开始输入ps aux|grep process,没有进程列表出来,后来通过向同学请教得知在我的环境下需要输入ps aux|grep ./a.out 故解决问题。
2. 对设计及调试过程的心得体会。
这次设计及调试让我进一步理解进程及进程在调度执行和内存空间等方面的特点,初步掌握在POSIX 规范中fork和kill系统调用的功能和使用,以及感受linux系统的魅力。
六.附录:源代码(电子版)
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
#include <ctype.h>
#define MAX_CHILD_NUMBER 10
#define SLEEP_INTERVAL 2
int proc_number=0;
void do_something();
int main(int argc,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<child_proc_number;i++){
child_pid=fork();
proc_number=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;
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);
}
}
展开阅读全文