操作系统进程调度实验
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一. 实验目的及实验环境
1.实验目的
通过观察、分析实验现象,深入理解进程及进程在调度执行和内存空间等方面的特点,掌握在POSIX 规范中fork和kill系统调用的功能和使用。
2.实验环境
(1)硬件
CPU:I7-4500U
内存:8G DDR3 1600
显示器:华硕笔记本显示器
硬盘空间:80G
(2)软件
虚拟机名称及版本:非虚拟机
操作系统名称及版本:Ubuntu Kylin 16.04
编译器:gcc
二. 实验内容
1、实验前准备工作
学习man 命令的用法,通过它查看fork 和kill 系统调用的在线帮助,并阅读参考资料,学会fork 与kill 的用法,复习C 语言的相关内容。
2、实验内容
根据下发的Linux进程管理实验PPT内容,将实验代码补充完整。并考虑:先猜想一下这个程序的运行结果。假如运行“./process 20”,输出会是什么样?然后按照注释里的要求把代码补充完整,运行程序。可以多运行一会儿,并在此期间启动、关闭一些其它进程,看process 的输出结果有什么特点,记录下这个结果。开另一个终端窗口,运行“ps aux|grep proc ess”命令,看看process 究竟启动了多少个进程。回到程序执行窗口,按“数字键+回车”尝试杀掉一两个进程,再到另一个窗口看进程状况。按q 退出程序再看进程情况。
3、回答问题
编写、编译、链接、执行实验内容设计中的代码,并回答如下问题:
1)你最初认为运行结果会怎么样?
手动输入进程数,选择输入要杀死的进程编号,按q杀死所有进程。
2)实际的结果什么样?有什么特点?试对产生该现象的原因进行分析。
需手动输入进程数,然后键入编号杀死进程,键入q杀死父进程即杀死所有进程。
3)proc_number 这个全局变量在各个子进程里的值相同吗?为什么?
不相同,proc_number是存储各个子进程的编号的,所以在各个子进程中
是不同的。
4)kill 命令在程序中使用了几次?每次的作用是什么?执行后的现象是什么?
使用了2次,第一次是在while循环中的if语句中使用,用来杀死用户键入的指定进程。第二次是杀死父进程,回到程序的开始。
5)使用kill 命令可以在进程的外部杀死进程。进程怎样能主动退出?这两种退出方式哪种更好一些?
调用return 函数或exit函数都可以正常退出,而使用kill函数是异常退出,使用正常退出的方法比较好。
6)写出fork()和kill()函数原型,并解释函数的功能和参数的含义?
原型:#include
#include
pid_t fork( void);
功能:
一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进
程被称为子进程。fork函数被调用一次但返回两次。两次返回的唯一区
别是子进程中返回0值而父进程中返回子进程ID。
原型:#include
#include
int kill(pid_t pid, int sig);
功能:
向某个进程传递一个信号
7)ps aux|grep process命令功能是什么?并解释结果的含义。
ps命令是最基本进程查看命令.使用该命令可以确定有进程正在运行数
量和运行的状态、进程是否结束、是否有僵尸进程、进程占用的资源。
grep命令查看某进程的状态并打印在屏幕上,ps aux是显示所有进程和
他们的状态。
ps aux输出格式:
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
三.方案设计
每创建一个子进程时,将其pid存储在数组pid[i]中,i存储在proc_number 中,然后调用死循环函数do_something(),输出该进程的proc_number,当输入数字是主进程执行kill(pid[pid-48],SIGTERM),杀死ch-48进程。当输入q时循环退出,kill(0,SIGTERM),杀死本组所有进程,程序退出。
四.测试数据及运行结果
注释:由于我的电脑运行这段代码报错,所以我和我组高宏伟同学使用的是同一实验数据,同一代码。
五.总结
1.实验过程中遇到的问题及解决办法;
实验中由于代码中的大部分已经给出,只需填写重要部分。遇到了不懂fork 的返回值,所以if和else语句会同时执行,知道了fork的原理后,fork会返回两个值一个到子进程,一个到父进程。
2.对设计及调试过程的心得体会。
本次实验学会了创建进程命令fork和杀死进程命令kill。在开始的时候不理解fork 和kill的原理,有点懵。后来通过看书和上网查询知道了fork和kill 的原理后明白了代码要填写的空白。
六.附录:源代码(电子版)
#include
#include
#include
#include
#include
#include
#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;