复习课件操作系统实验二进程管理.doc
- 格式:doc
- 大小:277.50 KB
- 文档页数:17
操作系统实验实验二进程管理学号姓名班级华侨大学电子工程系实验目的1、理解进程的概念,明确进程和程序的区别。
2、理解并发执行的实质。
3、掌握进程的创建、睡眠、撤销等进程控制方法。
实验内容与要求基本要求:用C语言编写程序,模拟实现创建新的进程;查看运行进程;换出某个进程;杀死进程等功能。
实验报告内容1、进程、进程控制块等的基本原理。
进程是现代操作系统中的一个最基本也是最重要的概念,掌握这个概念对于理解操作系统实质,分析、设计操作系统都有其非常重要的意义。
为了强调进程的并发性和动态性,可以给进程作如下定义:进程是可并发执行的程序在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位。
进程又就绪、执行、阻塞三种基本状态,三者的变迁图如下:由于多个程序并发执行,各程序需要轮流使用CPU,当某程序不在CPU上运行时,必须保留其被中断的程序的现场,包括:断点地址、程序状态字、通用寄存器的内容、堆栈内容、程序当前状态、程序的大小、运行时间等信息,以便程序再次获得CPU时,能够正确执行。
为了保存这些内容,需要建立—个专用数据结构,我们称这个数据结构为进程控制块PCB (Process Control Block)。
进程控制块是进程存在的惟一标志,它跟踪程序执行的情况,表明了进程在当前时刻的状态以及与其它进程和资源的关系。
当创建一个进程时,实际上就是为其建立一个进程控制块。
在通常的操作系统中,PCB应包含如下一些信息:①进程标识信息。
为了标识系统中的各个进程,每个进程必须有惟一的标识名或标识数。
②位置信息。
指出进程的程序和数据部分在内存或外存中的物理位置。
③状态信息。
指出进程当前所处的状态,作为进程调度、分配CPU的依据。
④进程的优先级。
一般根据进程的轻重缓急其它信息。
这里给出的只是一般操作系统中PCB所应具有的内容,不同操作系统的PCB结构是不同的,我们将在2.8节介绍Linux系统的PCB结构。
程度为进程指定一个优先级,优先级用优先数表示。
⑤进程现场保护区。
当进程状态变化时(例如一个进程放弃使用CPU),它需要将当时的CPU现场保护到内存中,以便再次占用CPU时恢复正常运行,有的系统把要保护的CPU 现场放在进程的工作区中,而PCB中仅给出CPU现场保护区起始地址。
⑥资源清单。
每个进程在运行时,除了需要内存外,还需要其它资源,如I/O设备、外存、数据区等。
这一部分指出资源需求、分配和控制信息。
⑦队列指针或链接字。
它用于将处于同一状态的进程链接成一个队列,在该单元中存放下一进程PCB首址。
⑧其它信息。
这里给出的只是一般操作系统中PCB所应具有的内容,不同操作系统的PCB结构是不同的,我们将在2.8节介绍Linux系统的PCB结构。
2、程序流程图。
3、程序及注释。
#include<stdio.h>#include<stdlib.h>#include<string.h>struct jincheng_type{ // 定义表示进程信息的结构体int pid; //进程IDint youxian; //优先级int daxiao; //大小int zhuangtai; //进程的状态,这里用0表示没有建立或被杀死,1表示执行,2表示换出int info; //内容};struct jincheng_type neicun[20]; //定义20个内存单位给进程使用int shumu=0,guaqi=0,pid,flag=0; //定义正在执行进程数目,被挂起进程数目,进程ID,运行标志位void create() //函数——创建一个新进程{if(shumu>=20) printf("\n内存已满,请先换出或杀死进程\n"); //判断内存空间是否已满else{for(int i=0;i<20;i++)if(neicun[i].zhuangtai==0) break; //选出空着的内存单元给新进程使用printf("\n请输入新进程pid\n"); //输入新进程ID存至选出的内存单元scanf("%d",&(neicun[i].pid));for(int j=0;j<i;j++)if(neicun[i].pid==neicun[j].pid) //当输入的新进程与原有进程ID相同时,显示“该进程已存在”{printf("\n该进程已存在\n");return;}printf("\n请输入新进程优先级\n"); //输入新进程的优先级、大小和内容scanf("%d",&(neicun[i].youxian));printf("\n请输入新进程大小\n");scanf("%d",&(neicun[i].daxiao));printf("\n请输入新进程内容\n");scanf("%d",&(neicun[i].info));neicun[i].zhuangtai=1; //将新进程的内存单元状态(zhuangtai)设成“1”,以表示存在且未被换出shumu++; //正在运行的进程数目加一}}void run() //函数——查看正在运行的进程{for(int i=0;i<20;i++){if(neicun[i].zhuangtai==1) //将存在且未被挂起(即zhuangtai=1)的进程显示出来,若存在这样的程序,则将flag设成1{printf("\n pid=%d",neicun[i].pid);printf("youxian=%d",neicun[i].youxian);printf("daxiao=%d",neicun[i].daxiao);printf("zhuangtai=%d",neicun[i].zhuangtai);printf("info=%d",neicun[i].info);flag=1;}}if(!flag) printf("\n当前没有运行进程\n"); //若当前没有运行进程(即flag=0),则显示“当前没有运行进程”}void huanchu() //函数——换出进程{if(!shumu) //判断是否无进程存在{printf("\n当前没有进程存在\n");return;}printf("\n 输入唤出进程ID值"); //输入需要换出的进程ID,scanf("%d",&pid);for(int i=0;i<20;i++){if(pid==neicun[i].pid){if(neicun[i].zhuangtai==1) //若该ID代表的进程正在运行,则将其挂起,即将zhuangyai置成2,并将guaqi加一{neicun[i].zhuangtai=2;guaqi++;printf("\n已经成功换出进程\n");}else if(neicun[i].zhuangtai==2) printf("\n要唤出的进程已被挂起\n"); //若该ID代表的进程已被挂起,即zhuangtai==2,则显示‘要唤出的进程已被挂起’flag=1;break;}}if(!flag) printf("\n要唤出的进程不存在\n"); //若进程不存在,给出显示}void kill() //函数——杀死进程{if(!shumu) //判断是否无进程存在{printf("\n当前没有进程存在\n");return;}printf("\n 输入杀死进程的ID值"); //读入要杀死的进程IDscanf("%d",&pid);for(int i=0;i<20;i++){if(pid==neicun[i].pid){if(neicun[i].zhuangtai==1) //若进程正在运行则再次询问是否要杀死,通过用户的反馈执行不同操作{printf("\n该进程正在运行,您确定要杀死吗?\n");printf("\n请输入1:确定;0:不确定\n");scanf("%d",&flag);if(flag){neicun[i].zhuangtai=0; //将zhuangtai置为0,表示进程被杀死,并将shumu自减一shumu--;printf("\n已经成功杀死进程\n");}else printf("\要杀死的进程正在运行\n");}else if(neicun[i].zhuangtai==2) //若该进程已经被挂起,则直接杀死{neicun[i].zhuangtai=0;shumu--;printf("\n已经成功杀死进程\n");}flag=1;break;}}if(flag==0) printf("\n要杀死的进程不存在\n"); //若进程不存在,给出显示}void huanxing() //函数——唤醒进程{if(!shumu) //判断是否无进程存在{printf("\n当前没有运行进程\n");return;}if(!guaqi) //判断是否无进程被挂起{printf("\n当前没有挂起进程\n");return;}printf("\n输入pid\n"); //输入需要唤醒进程IDscanf("%d",&pid);for(int i=0;i<20;i++){if(pid==neicun[i].pid){flag=false;if(neicun[i].zhuangtai==2) //判断该进程是否被挂起,若没有则将其唤醒并将guaqi自减一{neicun[i].zhuangtai=1;guaqi--;printf("\n已经成功唤醒进程\n");}else if(neicun[i].zhuangtai==2) printf("\n要唤醒的进程已被挂起\n"); //若目标进程已被挂起,则显示‘要唤醒的进程已被挂起’flag=1;break;}}if(!flag) printf("\n要唤醒的进程不存在\n"); //若要唤醒的进程不存在,给出显示}void viewall() //函数——查看内存状态{for(int i=0;i<20;i++) //显示所有20个内存单元的状态{printf("\n pid=%d",neicun[i].pid);printf("youxian=%d",neicun[i].youxian);printf("daxiao=%d",neicun[i].daxiao);printf("zhuangtai=%d",neicun[i].zhuangtai);printf("info=%d",neicun[i].info);}}void main() //主函数{int n=1;int num;for(int i=0;i<20;i++) //先将内存zhuangtai位清零neicun[i].zhuangtai=0;while(n){printf("\n**********************************\n"); //用户操作界面printf("\n**********************************\n");printf("\n***********进程演示系统***********\n");printf("\n 1.创建新的进程 2.查看运行进程\n");printf("\n 3.唤出某个进程 4.杀死某个进程\n");printf("\n 5.唤醒某个进程 6.查看内存状态\n");printf("\n 7.退出进程\n");printf("\n**********************************\n");printf("\n请选择(1-7)\n");scanf("%d",&num);switch(num) //功能选择{case 1:create();break;case 2:run();break;case 3:huanchu();break;case 4:kill();break;case 5:huanxing();break;case 6:viewall();break;case 7:exit(0);default:n=0;}flag=0;}}4、程序运行演示与截图(1)创建新进程,依次建立进程1、2、3,图中为建立进程2。