实验二 进程撤销模拟
操作系统实验二进程管理

操作系统实验二进程管理以下是为大家整理的操作系统实验二进程管理的相关范文,本文关键词为操作系统,实验,进程,管理,,您可以从右上方搜索框检索更多相关文章,如果您觉得有用,请继续关注我们并推荐给您的好友,您可以在综合文库中查看更多范文。
操作系统实验实验二进程管理学号姓名班级华侨大学电子工程系实验目的1、理解进程的概念,明确进程和程序的区别。
2、理解并发执行的实质。
3、掌握进程的创建、睡眠、撤销等进程控制方法。
实验内容与要求基本要求:用c语言编写程序,模拟实现创建新的进程;查看运行进程;换出某个进程;杀死进程等功能。
实验报告内容1、进程、进程控制块等的基本原理。
进程是现代操作系统中的一个最基本也是最重要的概念,掌握这个概念对于理解操作系统实质,分析、设计操作系统都有其非常重要的意义。
为了强调进程的并发性和动态性,可以给进程作如下定义:进程是可并发执行的程序在一个数据集合上的运行过程,是系统进行资源分配和调度的一个独立单位。
进程又就绪、执行、阻塞三种基本状态,三者的变迁图如下:就绪I/o完成时间片完进程调度I/o请求阻塞执行由于多个程序并发执行,各程序需要轮流使用cpu,当某程序不在cpu上运行时,必须保留其被中断的程序的现场,包括:断点地址、程序状态字、通用寄存器的内容、堆栈内容、程序当前状态、程序的大小、运行时间等信息,以便程序再次获得cpu时,能够正确执行。
为了保存这些内容,需要建立—个专用数据结构,我们称这个数据结构为进程控制块pcb(processcontrolblock)。
进程控制块是进程存在的惟一标志,它跟踪程序执行的情况,表明了进程在当前时刻的状态以及与其它进程和资源的关系。
当创建一个进程时,实际上就是为其建立一个进程控制块。
在通常的操作系统中,pcb应包含如下一些信息:①进程标识信息。
为了标识系统中的各个进程,每个进程必须有惟一的标识名或标识数。
②位置信息。
指出进程的程序和数据部分在内存或外存中的物理位置。
1407070225--郭飞--(二)进程的控制实验

实验二进程管理(二)进程的控制实验一、实验目的1、掌握进程另外的创建方法2、熟悉进程的睡眠、同步、撤消等进程控制方法二、实验内容1、用fork( )创建一个进程,再调用exec( )用新的程序替换该子进程的内容2、利用wait( )来控制进程执行顺序三、实验过程进入LINUX系统。
打开虚拟机,在vi中编写程序,在终端输入文件名,执行指令,得出运行结果。
1.运行程序:2.运行实验结果:四、回答问题(1)可执行文件加载时进行了哪些处理?可执行文件加载时首先是创建一个新进程的fork系统调用,然后用于实现进程自我终止的exit系统调用;改变进程原有代码的exec系统调用;用于将调用进程挂起并等待子进程终止的wait系统调用;获得进程标识符的getpid系统调用等处理过程。
(2)什么是进程同步?wait( )是如何实现进程同步的?a.我们把异步环境下的一组并发进程因直接制约而互相发送消息、进行互相合作、互相等待,使得各进程按一定的速度执行的过程称为进程间的同步。
b.首先程序在调用fork()建立一个子进程后,马上调用wait(),使父进程在子进程调用之前一直处于睡眠状态,这样就使子进程先运行,子进程运行exec()装入命令后,然后调用wait(0),使子进程和父进程并发执行,实现进程同步。
五、实验总结通过进程创建和进程控制两节课实验,让我们掌握了进程的基本概念及其含义,了解了系统是怎样创建进程的,首次调用新进程时,其入口地址在哪,应该开始从哪执行;搞明白可执行文件加载时进行的那些处理,进一步深刻认识到进程同步的概念以及wait()实现进程同步的方式方法。
六、参考程序#include<stdio.h>#include<unistd.h>main( ){int pid;pid=fork( ); /*创建子进程*/switch(pid){case -1: /*创建失败*/printf("fork fail!\n");exit(1);case 0: /*子进程*/ execl("/bin/ls","ls","-1","-color",NULL); printf("exec fail!\n");exit(1);default: /*父进程*/ wait(NULL); /*同步*/printf("ls completed !\n");exit(0);}}。
操作系统实验二:进程管理

操作系统实验二:进程管理操作系统实验二:进程管理篇一:操作系统实验报告实验一进程管理一、目的进程调度是处理机管理的核心内容。
本实验要求编写和调试一个简单的进程调度程序。
通过本实验加深理解有关进程控制块、进程队列的概念,并体会和了解进程调度算法的具体实施办法。
二、实验内容及要求1、设计进程控制块PCB的结构(PCB结构通常包括以下信息:进程名(进程ID)、进程优先数、轮转时间片、进程所占用的CPU时间、进程的状态、当前队列指针等。
可根据实验的不同,PCB结构的内容可以作适当的增删)。
为了便于处理,程序中的某进程运行时间以时间片为单位计算。
各进程的轮转时间数以及进程需运行的时间片数的初始值均由用户给定。
2、系统资源(r1…rw),共有w类,每类数目为r1…rw。
随机产生n进程Pi(id,s(j,k)t),0<=i<=n,0<=j<=m,0<=k<=dt为总运行时间,在运行过程中,会随机申请新的资源。
3、每个进程可有三个状态(即就绪状态W、运行状态R、等待或阻塞状态B),并假设初始状态为就绪状态。
建立进程就绪队列。
4、编制进程调度算法:时间片轮转调度算法本程序用该算法对n个进程进行调度,进程每执行一次,CPU时间片数加1,进程还需要的时间片数减1。
在调度算法中,采用固定时间片(即:每执行一次进程,该进程的执行时间片数为已执行了1个单位),这时,CPU时间片数加1,进程还需要的时间片数减1,并排列到就绪队列的尾上。
三、实验环境操作系统环境:Windows系统。
编程语言:C#。
四、实验思路和设计1、程序流程图2、主要程序代码//PCB结构体struct pcb{public int id; //进程IDpublic int ra; //所需资源A的数量public int rb; //所需资源B的数量public int rc; //所需资源C的数量public int ntime; //所需的时间片个数public int rtime; //已经运行的时间片个数public char state; //进程状态,W(等待)、R(运行)、B(阻塞)//public int next;}ArrayList hready = new ArrayList();ArrayList hblock = new ArrayList();Random random = new Random();//ArrayList p = new ArrayList();int m, n, r, a,a1, b,b1, c,c1, h = 0, i = 1, time1Inteval;//m为要模拟的进程个数,n为初始化进程个数//r为可随机产生的进程数(r=m-n)//a,b,c分别为A,B,C三类资源的总量//i为进城计数,i=1…n//h为运行的时间片次数,time1Inteval为时间片大小(毫秒)//对进程进行初始化,建立就绪数组、阻塞数组。
进程创建与撤消

实验一:进程创建与撤消(模拟)一、实验目的1、加深对进程概念的理解和进程创建与撤消算法;2、进一步认识并发执行的实质。
二、实验内容本实验完成如下三个层次的任务:(1)系统级—以普通用户身份认识windows的进程管理。
通过windows 的“任务管理器”观察进程的状态,进行进程的创建、切换和撤销。
(2)语言级—以普通程序员身份认识高级语言VC++/Java/C#的进程创建与撤销工具。
(3)模拟级—以OS设计师身份编程模拟实现进程创建与撤销功能,并在屏幕上观察进程活动的结果。
三、实验步骤1、windows的进程管理当前状态切换前切换后撤销2、VC++进程创建与撤销工具3、进程创建与撤销的模拟实现(1)总体设计:①数据结构定义:结构体PCB:进程名、ID、运行时间、优先级等,队列的排序按创建时间或优先级排序。
PCB空间—结构体PCB数组就绪队列指针空队列指针②函数CREATE()—进程创建:从PCB空间申请一个空PCB,填入进程参数,插入就绪队列;KILL()—进程终止:将指定的就绪进程移出就绪队列,插入空队列;就绪队列输出函数Display()—输出就绪队列中的进程信息,以便观察创建或撤消活动的结果;主函数Main()—功能选择、输入新进程参数、调用创建函数、输出就绪队列;输入进程名称、调用终止函数、输出就绪队列;③主界面设计:进程创建、进程撤销、就绪队列显示菜单;数据输入和就绪队列显示区。
④功能测试:从显示出的就绪队列状态,查看操作的正确与否。
(2)详细设计:①数据结构定义:结构体PCB:struct PCB {char NAME[10];long ID;float TIME;int PRIORITY;};PCB pcb[100];②函数设计给出CREATE()、KILL()、Display()、Main()的流程图描述;以CREATE()为例如下:(3)调试与测试:列出你的测试结果,包括输入和输出。
电大操作系统实验2进程管理实验

电大操作系统实验2进程管理实验进程管理是操作系统的核心功能之一,它负责控制和协调计算机系统中的进程,以提高系统的效率和资源利用率。
在电大操作系统实验2中,我们需要进行进程管理实验,通过实际操作和观察,深入理解和掌握进程管理的相关知识。
进程是操作系统分配资源和执行程序的基本单位。
在实验中,我们可以通过创建、销毁、调度、挂起等操作来模拟进程的管理和调度过程。
首先,我们需要了解进程的创建和销毁。
进程的创建可以通过fork(系统调用来实现,它会创建一个子进程并复制当前进程的状态。
子进程可以执行不同的程序,也可以通过exec(系统调用加载一个新的程序。
进程的销毁可以通过exit(系统调用来实现,它会释放进程占用的资源,并将控制权返回给父进程或操作系统。
其次,我们需要了解进程的调度和挂起。
进程的调度是指操作系统如何从就绪队列中选择下一个要执行的进程,可以根据优先级、时间片轮转等算法进行选择。
实验中,我们可以通过设置进程的优先级来观察不同优先级对进程调度的影响。
进程的挂起是将进程从运行状态转换为阻塞状态,通常是因为需要等待一些事件的发生。
实验中,我们可以通过设置定时器等待一段时间来模拟进程的挂起操作。
此外,进程间的通信也是进程管理的重要内容之一、进程间通信可以通过管道、共享内存、信号量等方式实现,它们可以实现进程之间的数据交换和共享。
实验中,我们可以通过管道或共享内存来实现简单的进程间通信,观察不同通信方式的性能差异。
在实验过程中,我们需要对进程的状态进行监控和统计。
可以通过系统调用来获取和记录进程的状态信息,包括进程的ID、状态、优先级等。
可以通过编写监控程序或脚本来实现进程状态的实时监控和统计。
通过进行进程管理实验,我们可以深入理解操作系统中进程的管理原理和机制。
通过实际操作和观察,我们可以更加直观地感受进程的创建、销毁、调度和挂起过程,并从中总结经验和教训。
总的来说,电大操作系统实验2的进程管理实验是一个非常重要的实验,它可以帮助我们更好地理解和掌握操作系统中进程管理的相关知识。
操作系统:进程创建与撤消

操作系统实验报告试验一:进程创建与撤销计科112康岩岩2011008142202013/4/10实验一:进程创建与撤消一、实验目的1、加深对进程概念的理解和进程创建与撤消算法;2、进一步认识并发执行的实质。
二、实验内容本实验完成如下三个层次的任务:(1)系统级—以普通用户身份认识windows的进程管理。
通过windows的“任务管理器”观察进程的状态,进行进程的创建、切换和撤销。
(2)语言级—以普通程序员身份认识高级语言VC++/Java/C#的进程创建与撤销工具。
(3)模拟级—以OS设计师身份编程模拟实现进程创建与撤销功能,并在屏幕上观察进程活动的结果。
三、实验步骤1、windows的进程管理以下是win7的人物管理器,可以进行进程的查看、创建、撤销等操作,由于操作比较简单与琐碎,这里不再具体描述。
2、VC++/Java/C#的进程创建与撤销工具对于本次试验,我使用C#进行进程创建、撤销等测试,具体内容在下面给出。
3、进程创建与撤销的模拟实现(1)总体设计:此次程序完全由c#实现,能够通过窗体界面详细地生动地显示进程的运行状态。
下面一步一步的进行实现①数据定义:类PCB的定义如下:class PCB{string pcbName; //进程名int pcbId; //IDlong startTime; //开始时间long pcbRuntime = 0; //运行时间int pcbLeve; //线程优先级}对于所有的进程信息,用以下表储存:Dictionary<int,Hashtable>ThreadTable=new Dictionary<int,Hashtable>();容器ThreadTable用来储存所有进程简直key 表示进程id,值为Hashtable,储存的为线程信息,②函数CREATE(PCB pcb)—进程创建:创建进程需要传入一个PCB 对象,然后启动一个单独的线程来操作该对象,操作该对象就是把线程运行的状态传送给PCB同时PCB也唯一地标示其所在的线程。
操作系统实验(模拟进程管理)

操作系统实验————(1)模拟进程管理专业:信息管理与信息系统班级:信管082姓名:温静实验一进程管理1.目的和要求通过实验理解进程的概念,进程的组成(PCB结构),进程的并发执行和操作系统进行进程管理的相关原语(主要是进程的创建、执行、撤消)。
2.实验内容用C语言编程模拟进程管理,至少要有:创建新的进程;查看运行进程;换出某个进程;杀死运行进程以及进程之间通信等功能。
3.主体程序#include <conio.h>#include <stdio.h>#include <stdlib.h>struct PCB_type{ int pid;int priority;int cputime;int state;int shumu=0,pid_l;struct PCB_type neicun[20];struct PCB_type hc[10];int max=0;int number=0;void create();void run();void huanchu();void kill();/* 创建新进程*/void create(){if(shumu>=20){printf("\n内存已满,请先结束或换出进程\n");}else{shumu++;printf("\n请输入新进程的程序名\n");scanf("%d",&neicun[shumu-1].pid);printf("\n请输入新进程的优先级\n");scanf("%d",&neicun[shumu-1].priority);printf("\n请输入新进程的运行时间\n");scanf("%d",&neicun[shumu-1].cputime);printf("\n创建进程时令其状态为就绪\n");neicun[shumu-1].state=2;}printf("\n创建进程成功!\n");}/* 查看当前运行进程*/void run(){int max=0;for(int i=0;i<shumu;i++){if((neicun[i].state==1)&&(neicun[i].priority>=neicun[max].priority)) max=i;}neicun[max].state=3;printf("当前运行进程程序名:\n%d",neicun[max].pid);printf("\n该进程的优先级:\n%d",neicun[max].priority);printf("\n该进程的运行时间:\n%d",neicun[max].cputime);printf("\n该进程的状态:\n%d",neicun[max].state);}/* 换出*/void huanchu(){int k;printf("请输入要换出程序的程序名:");scanf("%d",&k);for(int j=0;j<shumu;j++){if(neicun[j].state==1){hc[number].pid=neicun[j].pid;hc[number].state=neicun[j].state;hc[number].priority=neicun[j].priority;hc[number].cputime=neicun[j].cputime;number++;neicun[j].pid=0;neicun[j].state=0;neicun[j].priority=0;neicun[j].cputime=0;pid_1++;}else printf("进程%d无法换出的pid:%d\n",j.neicun[j].pid);if(number!=0)for(int i=0;i<number;i++){printf("当前运行进程程序名:\n%d",hc[i].pid);printf("\n该进程的优先级:\n%d",hc[i].priority);printf("\n该进程的运行时间:\n%d",hc[i].cputime);printf("\n该进程的状态:\n%d",hc[i].state);}}PCB_type temp=neicun[0];for(k=0;k<=shumu;k++){if(neicun[k].priority>temp.priority)tmpe=neicun[k];}neicun[k].state=1;}/* 杀死进程*/void kill(){neicun[max].pid=0;neicun[max].priority=0;neicun[max].cputime=0;neicun[max].state=0;if(max==(shumu-1))shumu--;else{for(int j=max+1;j<shumu;j++){neicun[j-1].pid=neicun[j].pid;neicun[j-1].priority=neicun[j].priority;neicun[j-1].cputime=neicun[j].cputime;neicun[j-1].state=neicun[j].state;}shumu--;}max=0;run();}/* int k=0;printf("请输入要杀死程序的进程名:");scanf("%d",&k);if(neicun[k].state=1)neicun[k].state=2;neicun[k].cputime=0;neicun[k].pid=0;neicun[k].priority=0;neicun[k].state=0;if(k==(shumu-1))shumu--;else{for(int j=k+1;j<shumu;j++){neicun[j-1].pid=neicun[j].pid;neicun[j-1].priority=neicun[j].priority;neicun[j-1].cputime=neicun[j].cputime;neicun[j-1].state=neicun[j].state;}shumu--;}printf("进程%d已被杀死!,k");}*/int main(){int n,a;n=1;while(n==1){system("cls");printf("\n**********************************************");printf("\n* 进程演示系统*");printf("\n**********************************************");printf("\n 1.创建新的进程 2.查看运行进程");printf("\n 3.换出某个进程 4.杀死运行进程");printf("\n 5.退出系统");printf("\n**********************************************");printf("\n请选择(1~5):");scanf("%d",&a);switch(a){ case 1:create( );printf("\npress anykey to go on~");getch();break;case 2 :run();printf("\npress anykey to go on~");getch();break;case 3 :huanchu();printf("\npress anykey to go on~");getch();break;case 4 :kill();printf("\npress anykey to go on~");getch();break;case 5 :exit(0);default:n=0;break;}}}5.感想与心得体会做了两周的实验,问了很多同学,可程序还是有很多问题。
进程的创建和撤销模拟实验

计算机科学与技术本科专业《操作系统原理》课程设计任务书(2012级)题目:进程的创建和撤销模拟实验学生姓名:学号:班级:题目类型:软件工程(R)指导教师:一、设计目的学生通过该题目的设计过程,可以初步掌握进程创建系统的原理、软件开发方法并提高解决实际问题的能力。
二、设计任务1、了解Windows XP的操作接口及系统调用方式,熟悉Windows XP常用操作的实现过程,练习并掌握Visual C++开发环境。
2、利用Windows SDK(System Development Kit)提供的API(应用程序接口)编程模拟实现进程的创建和撤销。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符,如父进程显示'a',子进程分别显示字符'b'和字符'c'。
试观察记录屏幕上的显示结果,并分析原因;修改程序,每一个进程循环显示一句话,如子进程显示'daughter …'及'son ……',父进程显示'parent ……',观察结果,分析原因。
子进程被挂起5秒之后自动撤销。
三、设计要求1、分析设计要求,给出解决方案(要说明设计实现所用的原理、采用的数据结构)。
2、设计合适的测试用例,对得到的运行结果要有分析。
3、设计中遇到的问题,设计的心得体会。
4、文档:课程设计打印文档每个学生一份,并装在统一的资料袋中,资料袋前面要贴有学校统一的资料袋封面。
5、光盘:每个学生文档和程序资料分别建在一个以自己学号和姓名命名的文件夹下,并要求每班负责人汇总每个学生的文件放在以班级姓名命名的文件夹下,刻录成5寸光盘,并复制一份(共两张内容相同的光盘),放在一个资料袋中。
四、提交的成果1. 设计任务书一本(学校统一格式)2. 设计说明书一份,内容包括:1) 中文摘要100字;关键词3-5个;2) 设计思想;3)各模块的伪码算法;4)测试结果;5)设计总结;6)参考文献、致谢等;7) 附录:部分源程序代码。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二进程撤销模拟
一实习内容
(一).设计并说明delete(para)函数的功能,并以流程图或文字的形式展现;
int deletepc(pnode *pp,pnode *pc) 函数主要用于删除进程,此函数是在主函数找到要删除进程的父进程之后调用,其函数功能流程图如图1-1所示:
图1-1deletepc(pnode *pp,pnode *pc)函数功能示意图
(二)实习步骤如下:
1.在实验一的基础上进行进程的创建,创建出的进程如图2-1所示:
图2-1 创建进程的进程总链示意图其在程序中执行显示如下图4-2所示:
图2-2 程序显示进程的创建2.进程的撤销过程
①撤销进程P12,撤销进程后进程链示意图如图2-3所示:
图2-3 撤销进程P12后进程链示意图
其在程序中执行显示如下图2-4所示:
图2-4 撤销进程P12程序显示图
②撤销进程P7,P11,撤销进程后进程链示意图如图2-5所示:
图2-5 撤销进程P7,P11后进程链示意图
其在程序中执行显示如下图2-6所示:
图2-6 撤销进程P7,P11程序显示图
③撤销进程P2,P3,P4,撤销进程后进程链示意图如图2-7所示:
图2-7 撤销进程P2,P3,P4后进程链示意图
其在程序中执行显示如下图2-8所示:
图2-8撤销进程P2,P3,P4程序显示图
④撤销进程P1,撤销进程后进程链中只有根进程P0,结构示意图如图2-9所示:
图2-9 撤销进程P1后进程链示意图
其在程序中执行显示如下图2-10所示:
图2-10撤销进程P1程序显示图
(三)delete(para)函数代码如下:
//delete process
int deletepc(pnode *pp,pnode *pc)
{
if (pc->sub==NULL) //如果要撤销进程无子进程{
if(pp->sub==pc)
{
pp->sub=pc->brother;
}
else
{
pnode *p;
for (p=pp->sub; p->brother!=pc; p=p->brother);
p->brother=pc->brother;
}
pnode *temp;
for (temp=plink; temp; temp=temp->next) //删除并释放进程
{
if (temp->next->node->pid==pc->node->pid)
{
temp->next=temp->next->next;
delete pc; //释放进程资源
break;
}
}
}
else //要删除的进程存在子进程
{
deletepc(pc,pc->sub);
deletepc(pp,pc);
}
return 0;
}
在主函数中增加的代码如下:
else if(s2)
{
cflag=1;
para = (int *)malloc(2);
s2 = substr(s2,instr(s2,'(')+1,strlen(s2)-2);
para=strtoarray(s2);
pnode *pp=plink,*pc=plink;
pnode *p,*p1;
bool findflag=false;
for(p=plink; p; p=p->next)
{
if(p->node->pid==para[0])//找到要删除的进程
{
for (p1=plink; p1; p1=p1->next)
{
if((p1->node->pid)==p->node->ppid) //找到父进程
{
pp=p1;//pp 父进程
pc=p; //p 当前进程
break;
}
}
findflag=true;
break;
}
}
if(findflag)
{
if(pp==pc)
{
printf("你不能删除进程号为0的根进程!\n");
}
else
{
deletepc(pp,pc);
}
}
else
printf("你要删除的进程不存在!\n");
pflag=1;
}
二、思考题
1)进程撤销的核心内容是什么?
答:根据标识符,检索出该进程的PCB,读出状态;若正处于执行状态,应立即终止,置调度标志为真;若该进程还有子孙进程,终止其所有子孙进程;归还全部资源给其父进程或者系统;将被终止进程(它的PCB)从所在队列(或链表)中移出。
2)进程总链在进程撤销过程中有什么作用?
答:识别要撤销的进程的子进程,以及在撤消进程后重新组织进程之间的关系,依次维持进程总链的稳定。
三、实验总结
通过本次实验,进一步加深了对进程的终止过程理解和认识,同时对进程的创建过程进行了复习。