操作系统进程调度实验_操作系统实验进程调度
操作系统进程调度实验由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“操作系统实验进程调度”。
一.实验目的及实验环境 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内容,将实验代码补充完整。并考虑: 先猜想一下这个程序的运行结果。假如运行“./proce 20”,输出会是什么样?然后按照注释里的要求把代码补充完整,运行程序。可以多运行一会儿,并在此期间启动、关闭一些其它进程,看proce 的输出结果有什么特点,记录下这个结果。开另一个终端窗口,运行“ps aux|grep proce”命令,看看proce 究竟启动了多少个进程。回到程序执行窗口,按“数字键+回车”尝试杀掉一两个进程,再到另一个窗口看进程状况。按q 退出程序再看进程情况。
3、回答问题
编写、编译、链接、执行实验内容设计中的代码,并回答如下问题: 1)你最初认为运行结果会怎么样?
手动输入进程数,选择输入要杀死的进程编号,按q杀死所有进程。需手动输入进程数,然后键入编号杀死进程,键入q杀死父进程即杀死2)实际的结果什么样?有什么特点?试对产生该现象的原因进行分析。所有进程。
3)proc_number 这个全局变量在各个子进程里的值相同吗?为什么? 不相同,proc_number是存储各个子进程的编号的,所以在各个子进程中
是不同的。
4)kill 命令在程序中使用了几次?每次的作用是什么?执行后的现象是什么?
使用了2次,第一次是在while循环中的if语句中使用,用来杀死用户键入的指定进程。第二次是杀死父进程,回到程序的开始。
5)使用kill 命令可以在进程的外部杀死进程。进程怎样能主动退出?这两种退出方式哪种更好一些?
调用return 函数或exit函数都可以正常退出,而使用kill函数是异常退出,使用正常退出的方法比较好。
6)写出fork()和kill()函数原型,并解释函数的功能和参数的含义?
原型: #include
功能:
一个现有进程可以调用fork函数创建一个新进程。由fork创建的新进程被称为子进程。fork函数被调用一次但返回两次。两次返回的唯一区别是子进程中返回0值而父进程中返回子进程ID。原型:#include #include
int kill(pid_t pid, int sig);
功能:
向某个进程传递一个信号
7)ps aux|grep proce命令功能是什么?并解释结果的含义。
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),杀死本组所有进程,程序退出。
#include pid_t fork(void);
四.测试数据及运行结果
注释:由于我的电脑运行这段代码报错,所以我和我组高宏伟同学使用的是同一实验数据,同一代码。五.总结
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;
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_pid=fork();
proc_number=i;
if(child_pid==0){do_something();
}else if(child_pid>0){
pid[i]=child_pid;
printf(“A Parent proce,the pid is %dn”,getpid());
}
}
printf(“input the number you want to killn”);
while((ch=getchar())!='q')
{
if(isdigit(ch)){
ch=(int)ch-48;
if(kill(pid[ch],SIGKILL)
perror(“kill”);
exit(1);
}else{
printf(“proce %d has been killed!nn”,pid[ch]);
}
}else{
printf(“is not digitn”);
}
getchar();
printf(“input the number you want to kill:n”);
}
kill(0,SIGTERM);} return 0;}
void do_something(){ for(;;){
printf(“This is proce No.%*dn”,proc_number+3,proc_number);
sleep(SLEEP_INTERVAL);} }
实验一进程控制与处理机调度综合实验一、实验目的通过模拟进程控制方法及单处理机系统的进程调度,了解进程的结构,进程的创建与撤消,进程的组织及进程的状态及其转换,掌握进程调......
一.实验目的用高级语言编写和调实一个进程调度程序,以加深对进程的概念及进程调度算法的理解. 二.实验要求:设计一个有 N个进程并发执行的进程调度程序。 三.算法讲解进程调度算法......
进程调度算法模拟专业:XXXXX 学号:XXXXX 姓名:XXX 实验日期:20XX年XX月XX日一、实验目的通过对进程调度算法的模拟加深对进程概念和进程调度算法的理解。二、实验要求编写程序实......
一.实验内容描述1.目的(1)了解Windows内存管理器 (2)理解Windows的地址过程 2.内容任意给出一个虚拟地址,通过WinDbg观察相关数据并找到其物理地址二.理论分析Windows采用页式虚......
操作系统课程设计进 程 调 度 实 践 报 告姓名: 董宇超 班级:计算机一班 学号:0906010124目录: 实践内容 实践目的及意义 功能设计及数据结构 调试运行及测设分析 存在的问......
