文档库 最新最全的文档下载
当前位置:文档库 › 进程创建与撤销

进程创建与撤销

进程创建与撤销
进程创建与撤销

实验一:进程创建与撤消

一、实验目的

1、加深对进程概念的理解和进程创建与撤消算法;

2、进一步认识并发执行的实质。

二、实验内容

本实验完成如下三个层次的任务:

(1)系统级—以普通用户身份认识windows的进程管理。通过windows的“任务管理器”观察进程的状态,进行进程的创建、切换和撤销。

(2)语言级—以普通程序员身份认识高级语言VC++/Java/C#的进程创建与撤销工具。

(3)模拟级—以OS设计师身份编程模拟实现进程创建与撤销功能,并在屏幕上观察进程活动的结果。

三、实验步骤

1、windows的进程管理

2、VC++/Java/C#的进程创建与撤销工具

3、进程创建与撤销的模拟实现

(1)总体设计:

①数据结构定义:

结构体PCB:进程名、ID、运行时间、优先级等,队列的排序按创建时间或优先级排序。PCB空间—结构体PCB数组

就绪队列指针

空队列指针

②函数

CREATE()—进程创建:从PCB空间申请一个空PCB,填入进程参数,插入就绪队列;KILL()—进程终止:将指定的就绪进程移出就绪队列,插入空队列;

就绪队列输出函数Display()—输出就绪队列中的进程信息,以观察创建或撤消活动的结果;

主函数M ain()—功能选择、输入新进程参数、调用创建函数、输出就绪队列;输入进程名称、调用终止函数、输出就绪队列;

③主界面设计:进程创建、进程撤销、就绪队列显示菜单;数据输入和就绪队列显示区。

④功能测试:从显示出的就绪队列状态,查看操作的正确与否。

(2)详细设计:

①数据结构定义:

结构体PCB:

PCB空间

就绪队列指针

空队列指针

struct PCB

{ char NAME[20];

long ID;

float TIME;

int PRIORITY;

};

PCB pcb[10];

typedef struct QNode

{ int data;

struct QNode*next;

}QNode,*QueuePtr;

typedef struct

{ QueuePtr front;

QueuePtr rear;

}LinkQueue;LinkQueue Ready,Empty;

②函数设计

给出create()、destroy()、Display()、M ain()的流程图描述;

create()流程图:

destroy()流程图:

Display()流程图:

M ain()流程图: (3)调试与测试

四、实验总结

通过对本实验课题的研究,对队列中进程的创建和删除情况有了一定的了解。并对程序的编制,又了深一步的体会。

通过这次试验了解到了进程创建与撤销的过程,更好的了解了操作系统的工作模式,通过使用结构体和指针,对以前的知识进行了复习。

五、附录

带注释的源程序。

#include

#include

#include

#define OK 1

#define ERROR 0

#define OVERFLOW -2

struct PCB

{ char NAME[20];

long ID;

float TIME;

int PRIORITY;

};

PCB pcb[10]

typedef struct QNode

{ int data;

struct QNode*next;

}QNode,*QueuePtr;

typedef struct

{ QueuePtr front;

QueuePtr rear;

}LinkQueue;LinkQueue Ready,Empty;

int InitQueue()

{ Ready.front=Ready.rear=new QNode;

Empty.front=Empty.rear=new QNode;

Ready.front->next=NULL;

Empty.front->next=NULL;

return OK;}

void menu()

{ cout<<"****=========="<<"1.进程创建\n";

cout<<"****=========="<<"2.进程撤销\n";

cout<<"****=========="<<"3.就绪队列显示\n";

cout<<"****=========="<<"4.退出\n";

int choice;

cout<<"请选择:";

cin>>choice;

switch(choice)

{case 1:create();break;

case 2:destroy();break;

case 3:display();break;

case 4:exit();

}

}void create()

{ char name[20]; long id; float time; int priority; int n; QNode *p;

cout<<"请输入要创建进程的数目:";

cin>>n;

for(int i=1;i<=n;i++)

{

cout<<"进程ID:"; cin>>id;

for(int j=i-1;j<=N;j++)

{

while(id==pcb[j].ID)

{ cout<<"进程ID已存在"<

cout<<"进程ID:"; cin>>id;

}

}

cout<<"进程名:";cin>>name;

cout<<"运行时间:"; cin>>time;

cout<<"优先级:"; c in>>priority;

N++;//保存当前就绪进程数

strcpy(pcb[N].NAME,name);

pcb[N].ID =id;

pcb[N].TIME =time;

pcb[N].PRIORITY =priority;

p=new QNode;//插入就绪队列

p->data=N;

p->next=NULL;

Ready.rear->next=p;

Ready.rear=p;

}

}

for(i=1;i<=N;i++)//按优先级排队

{

for(int j=i+1;j<=N;j++)

if(pcb[i].PRIORITY

{

pcb[0]=pcb[i];

pcb[i]=pcb[j];

pcb[j]=pcb[0];

}

}

menu();

}

void destroy()//进程终止

{

long id; QNode *p,*q;

cout<<"请输入要终止的进程ID:";

cin>>id;

p=Ready.front->next;

if(p==NULL)

cout<<"就绪进程为空!";

while(p!=NULL)

{

if(id==pcb[N].ID)//终止进程是队列最后一个

{

if(N==1) //队列中只有一个进程,且是终止进程

{

q=new QNode;

q->data=Ready.rear->data;

Empty.rear->next=p;

Empty.rear=p;

Ready.front =Ready.rear;

Ready.front ->next =NULL;

N--;

cout<<"进程已终止!";

break;

}

else //队列中进程多个

{

while(p!=NULL)

{

if(p->next->next ==NULL)

{

q=new QNode;

q->data=Ready.rear->data;

Empty.rear->next=p;

Empty.rear=p;

p->next =NULL;

Ready.rear =p;

N--;

cout<<"进程已终止!";

break;

}

p=p->next ;

}}}

if(id==pcb[p->data].ID)

{

if(Ready.front==Ready.rear)

cout<

while(p!=NULL)

{

pcb[p->data]=pcb[p->data+1];//修改PCB数组里的值

if(p->next ->next ==NULL)

{

q=new QNode;

q->data=Ready.rear->data;

Empty.rear->next=p;

Empty.rear=p;

p->next =NULL;

Ready.rear =p;

cout<<"进程已终止!";

break;

}

p=p->next;

}

N--;

break;

}

p=p->next ;

}

menu();

}

void display()

{

QNode *p;

p=Ready.front->next;

cout<<"ID"<<" "<<"名字"<<" "<<"运行时间"<<" "<<"优先级"<

while(p!=NULL)

{ cout<data].ID<<" "<data].NAME<<" "<data].TIME <<"

"<data].PRIORITY<

p=p->next ; }

menu(); }

void main()

{ InitQueue();

pcb[0].ID =0;

menu();}}

操作系统第三章作业答案

第三章 一、问答题 1、某系统采用响应比高者优先的处理机调度算法,某个时刻根据用户要求创建了一个进程P,进程P在其存在过程中依次经历了: 进程调度选中了进程P占用处理机运行(就绪—>运行),进程P运行中提出资源申请,要求增加主存使用量,没有得到(运行—>阻塞); 进程等待一段时间后得到主存(阻塞—>就绪); 进程调度再次选中了进程P占用处理机运行(就绪—>运行); 有紧急进程Q进入,系统停止进程P的运行,将处理机分配进程Q(运行—>就绪); 进程Q运行完,进程调度再次选中了进程P占用处理机运行(就绪—>运行);进程P运行完。 请分析进程P在其整个生命过程中的状态变化。 2、何谓进程,它与程序有哪些异同点?61 3、引起创建进程的事件通常有哪些?69 4、简述时间片轮转调度算的基本思想。大多数时间片轮转调度算法使用一个固定大小的时间片,请给出选择小时间片的理由。然后,再给出选择大时间片的理由。75 5、进程有哪几种基本状态?试举出使进程状态发生变化的事件并描绘它的状态转换图。63 6、进程创建、撤销、唤醒和阻塞原语的流程69、70、71 7、进程控制块的作用是什么?它主要包括哪几部分内容?65 8、用户级线程与内核级线程的区别是什么?81 9、PCB中包含哪些信息?进程状态属于哪类信息?65 10、列举引起进程创建和撤销的事件69、70 11、试比较进程和线程的区别。81 12、什么是操作系统的内核?67 13、简述操作系统的三级调度(简述其各级调度的基本功能即可)。72

二、计算题 1、就绪队列中有4个进程P1,P2,P3,P4同时进入就绪队列,它们进入就绪队列2秒之后开始进程调度,它们需要的处理器时间如表所示。 忽略进行调度等所花费的时间,且进程执行过程中不会发生阻塞,请回答下列问题:分别写出采用时间片轮转调度算法(时间片为4秒)、响应比高者优先调度算法选中进程执行的次序。 答: 时间片轮转调度算法:P1,P2,P3,P4 ,P1,P2,P4,P1,P2,P2 响应比高者优先调度算法:P3,P4,P1,P2 2、在某计算机系统中,时钟以固定的频率中断CPU,以增加日历计数或控制系统中的一些定时操作,时钟中断处理程序每次执行的时间为2ms(包括进程切换开销)。若时钟中断频率为60Hz,试问CPU用于时钟中断处理的时间比率为多少?答: 时钟中断频率为60Hz,所以时钟周期为:1/60s=50/3ms 在每个时钟周期中,CPU要用2ms时间执行中断程序,所以CPU用于时钟中断处理的时间比率为:2/(50/3)=6/50=12% 3、若程序Pa,Pb和Pc单独执行时间分别Ta,Tb和Tc,Ta=1小时,Tb=1.5小时,Tc=2小时,其中处理机工作时间分别为Sa=10分钟,Sb=15分钟,Sc=35分钟。如果采用多道程序设计的方法,让Pa,Pb和Pc并行工作,假定处理机利用率达到60%,另加20分钟系统开销,请问系统效率能提高百分之几? 答: Ta,Tb和Tc并行工作共用CPU时间: (10+15+35)/60%=100(3分) 系统效率提高: [(60+90+120)-(100+20)]/(60+90+120)*100% =(270-120)/270*100%

线程的创建与撤销

师范大学 操作系统(本科) 实验报告 院系:计算机科学技术学院班级: 学生姓名: 学号:20141602141041 指导教师: 教师评阅结果: 教师评语: 实验日期年月日

实验名称: 实验二:线程的创建与撤销 一、实验目的和要求: 熟悉windows系统提供线程的创建与撤销系统调用。 掌握windows系统环境下的线程的创建与撤销方法。 二、实验内容: 使用系统调用createthread()创建一个子线程,并在子线程中显示:thread is runing!,并使用sleep()使线程挂起5s之后使用exitthread(0)撤销线程。 三、实验技术和方法: 1.创建线程 2.撤销线程 3.终止线程 四、实验环境: 使用vc++ 6.0

五、实验步骤和结果:

实验代码: #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////// //////// // The one and only application object CWinApp theApp;

using namespace std; void ThreadName1(); static HANDLE hHandle1=NULL; DWORD dwThreadID1; int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; hHandle1=CreateThread((LPSECURITY_ATTRIBUTES) NULL, 0, (LPTHREAD_START_ROUTINE) ThreadName1, (LPVOID) NULL, 0, &dwThreadID1); Sleep(5000); CloseHandle(hHandle1); ExitThread(0); return nRetCode; }

进程创建与撤消

实验一:进程创建与撤消(模拟) 一、实验目的 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)调试与测试:列出你的测试结果,包括输入和输出。 四、实验总结 通过这次试验了解到了进城创建与撤销,并对以前的知识进行了复习,通过使用结构体和指针,实行进程的创建与撤销,我的程序设计能力得到

实验三 进程的创建和简单控制(学生

实验三进程的创建和简单控制 实验目的: 1.掌握进程的概念和进程的状态,对进程有感性的认识; 2.掌握进程创建方法; 3.认识进程的并发执行,了解进程族之间各种标识及其存在的关系; 4.熟悉进程的创建、阻塞、唤醒、撤销等控制方法。 实验内容: 1.了解有关Linux进程的属性和进程的层次结构; 2.学习有关Linux的前台和后台进程; 3.学习有关Linux命令的顺序执行和并发执行; 4.学习有关挂起和终止进程; 5.了解并发程序的不可确定性,进行简单并发程序设计。 实验步骤: (一)Shell下的进程控制 1.进入Linux系统。 2.用ps查看进程。 a)linux的ps命令是用来监视系统进程和资源使用情况的命令,可显示 瞬间进程的动态。 b)ps 的参数非常多,常用的参数有: i.-A 列出所有的进程; ii.-w 显示加宽可以显示较多的信息; iii.-au 显示较详细的信息; iv.-aux 显示所有包含其他使用者的进程。

3.用kill终止某些进程。 a)kill命令通过向进程发送指定的信号来结束进程。 b)先使用ps查到进程号,再使用kill杀出进程。

4.用pstree命令显示系统中进程层次结构。 a)pstree指令用ASCII字符显示树状结构,清楚地表达进程间的相互关 系。 b)语法格式pstree [-acGhlnpuUV][-H <程序识别码>][<程序识别 码>/<用户名称>]

(二)Linux简单进程编程 1.理解系统调用fork()的使用。 a)fork()会产生一个与父程序相同的子程序,唯一不同之处在于其进程 号,如图1所示。 图 1 系统调用fork() b)编辑下面的程序,要求实现父进程产生两个子进程,父进程显示字 符“a”、两个子进程,分别显示字符“b”、“c”,如图2所示。 #include main( ) { int p1,p2;

进程的创建与撤销

实验一进程创建与撤销 一.实验目的 1.通过创建进程,观察正在运行的进程和终止进程的程序设计与调试操作,进一步熟悉操作系统的进程概念,理解windows 2007进程生存过程. 2.通过阅读和分析实验程序,学习创建进程,观察进程和终止进程的程序设计方法。 二.背景知识 三.1.创建进程:CreateProcess()调用的核心参数是可执行文件运行时的文件名以及其命令行。其核心参数和名称和类型如下: lpApplicationName:指定要执行的模块,包括可执行代码的EXE文件的文件名。lpCommandLine:指向一个以空结尾的串,该串定义了要执行。该命令行是可以在Windows 提示符下执行的的命令行命令行。 lpProcessAttributes:指向一个SECURITY_A TTRIBUTES结构,该结构决定了返回的句柄是否可被子进程继承。 lpThreadAttributes:指向一个SECURITY_A TTRIBUTES结构,该结构决定了返回的句柄是否可被子进程继承。 bInheritHandles:表明新进程是否可继承创建者进程的句柄。 dwCreationFlags:定义控制优先类和进程创建的附加标志。 lpEnvironment:指向一个新进程的环境块。 lpCurrentDirectory:指向一个以空结尾的串,该串定义了子进程的当前驱动器和当前目录。lpStartupInfo:指向一个STARTUPINFO结构,该结构定义了新进程的主窗口将如何显示。lpProcessInformation:指向进程信息描述结构,该结构接受关于新进程的描述信息。 可执行文件运行时的文件名及其命令行,如lpCommandLine="c:\\windows\\system32\\cmd.exe” 或lpApplicationName=“c:\windows\system32\cmd.exe” lpStartupInfor描述新进程的窗口显示情况。定义STARTUPINFO结构,并赋予初始值,如:STARTUPINFO si; memset(&si,0,sizeof(si)); si.cb=sizeof(si); lpProcessInformation指向进程信息描述结构,接受关于新进程的描述信息,如:PROCESS_INFORMA TION pi 所有进程都是以调用ExitProcess() 或者TerminateProcess() 函数结束的。TerminateProcess() API函数只要打开带有PROCESS_TERMINATE访问权的进程对象,就可以终止进程,并向系统返回指定的代码。 如果不知道所创建进程中所有线程的状态,最好使用TerminateProcess() 终止进程。 四.进程创建和撤销的代码 #include #include #include

实验一 进程状态转换

实验一进程的状态及其转换 一、实验目的: 自行编制模拟程序,通过形象化的状态显示,加深理解进程的概念、进程之间的状态转换及其所带来的PCB内容、组织的变化,理解进程与其PCB间的一一对应关系。 二、实验内容及要求: 1)设计并实现一个模拟进程状态转换及其相应PCB内容、组织结构变化的程序。 2)独立编写、调试程序。进程的数目、进程的状态模型(三状态、五状态、七状 态或其它)以及PCB的组织形式可自行选择。 3)合理设计与进程PCB相对应的数据结构。PCB的内容要涵盖进程的基本信息、控 制信息、资源需求及现场信息。 4)设计出可视性较好的界面,应能反映出进程状态的变化引起的对应PCB内容、 组织结构的变化。 三、程序流程图:

四、使用的数据结构及说明: 在本实验中,主要用到的数据结构是PCB的结构,其中PCB的数据结构如下: struct PCB { int P_Id; //PCB的ID号 char P_Name[10]; //PCB的名称 char P_State[10]; //PCB状态 int P_Runtime; //PCB的所需要的运行时间 int P_Requiry; //PCB所需要的资源要求 struct PCB * next ; //PCB块的下一个指针 } ; 其中,P_Id,和P_Name用来标示一个进程,而P_State用来标示进程的五种状态:Create_state,Ready_state,Block_state,Run_state,Exit_state。P_Runtime标示要完成一个进程所需要的时间。P_Requiry标示一个进程的执行所需要的其他条件,当其他的条件满足,则P_Requiry置1,否则置0。Struct PCB * next 用来指向同一队列中的下一个PCB 块。 五、参考程序源代码: #include"stdlib.h" #include"stdio.h" #include"string.h" #include /*全局结构体及变量定义*/ struct PCB { int P_Id; //PCB的ID号 char P_Name[10]; //PCB的名称 char P_State[10]; //PCB状态 int P_Runtime; //PCB的所需要的运行时间 int P_Requiry; //PCB所需要的资源要求 struct PCB * next ; //PCB块的下一个指针 } ; struct PCB * Create_state; //创建状态 struct PCB * Run_state; //运行状态 struct PCB * Ready_state; //就绪状态 struct PCB * Block_state; //阻塞状态 struct PCB * Exit_state; //退出状态 int signal4=0; //标示进程4的完成状态 int signal5=0; //标示进程5的完成状态 void InsertQueue(struct PCB **head,struct PCB *node) //将进程插入到队列的尾部

(完整版)操作系统第二章作业答案

第二章作业 1.操作系统中为什么要引入进程的概念?为了实现并发进程中的合作和协调,以及保证系统的安全,操作系统在进程管理方面要做哪些工作? 答:为了从变化角度动态地分析研究可以并发执行的程序,真实的反应系统的独立性、并发性、动态性和相互制约,操作系统中不得不引入进程的概念。 为了防止操作系统及其关键的数据结构如:PCB等,受到用户程序破坏,将处理机分为核心态和用户态。对进程进行创建、撤销以及在某些进程状态之间的转换控制。 2.试描述当前正在运行的进程状态改变时,操作系统进行进程切换的步骤。答:分为两种情况: (1):运行状态就绪状态:根据进程的自身的情况插入到就绪队列的适当位置,系统收回处理及转入进程调度程序重新进行调度。 (2):运行状态→阻塞状态:系统会调用进程调度程序重新选择一个进程投入运行。 3.现代操作系统一般都提供多任务的环境,是回答以下问题。 为支持多进程的并发执行,系统必须建立哪些关于进程的数据结构? 答:系统必须建立PCB。 为支持进程的状态变迁,系统至少应该供哪些进程控制原语? 答:阻塞、唤醒、挂起和激活原语。 当进程的状态变迁时,相应的数据结构发生变化吗? 答:会根据状态的变迁发生相应的变化。例如:将进程PCB中进程的状态从阻塞状态改为就绪状态,并将进程从阻塞队列摘下,投入到就绪队列中。 4.什么是进程控制块?从进程管理、中断处理、进程通信、文件管理、设备管理及存储管理的角度设计进程控制块应该包含的内容。 答:PCB:描述进程本身的特征、状态、调度信息以及对资源占有情况等的数据结构,是进程存在的唯一标识。 进程控制块所包含的内容: ①进程信息描述;②CPU信息状态;③进程调度信息;④进程控制和资源占用信息。 5.假设系统就绪队列中有10个进程,这10个进程轮换执行,每隔300ms轮换一次,CPU在进程切换时所花费的时间是10ms,试问系统化在进程切换上的开销占系统整个时间的比例是多少? 解:P=(10*10)/[(300+10)*10]=3.2% 6.试述线程的特点及其与进程之间的关系。 答:线程的特点:是被独立分派和调度的基本单位。线程与进程的关系:线程是进程的一部分,是进程内的一个实体;一个进程可以有多个线程,但至少必须有一个线程。

操作系统实验报告(进程的创建)

实验题目进程的创建小组合作否姓名班级学号 一、实验目的 1、了解进程的创建。 2、了解进程间的调用以及实现。 3、分析进程竞争资源的现象,学习解决互斥的方法。 4、加深对进程概念的理解,认识并发执行的本质。 二.实验环境 Windows 系统的计算机一台,安装了Linux虚拟机 三、实验内容与步骤 1、fork()系统调用的使用例子 程序代码: #include #include #include int glob=3; int main(void) { pid_t pid;int loc=3; printf("before fork();glod=%d,loc=%d.\n",glob,loc); if((pid=fork())<0) { printf("fork() error. \n"); exit(0); } else if(pid==0) { glob++; loc--; printf("child process changes glob and loc: \n"); } else

wait(0); printf("parent process doesn't change the glob and loc:\n"); printf("glob=%d,loc=%d\n",glob,loc); exit(0); } 运行结果: 2、理解vofork()调用: 程序代码: #include #include #include int glob=3; int main(void) { pid_t pid; int loc=3; if((pid=vfork())<0) { printf("vfork() error\n"); exit(0); } else if(pid==0) { glob++; loc--; printf("child process changes the glob and loc\n"); exit(0); } else printf ("parent process doesn't change the glob and loc\n"); printf("glob=%d,val=%d\n",glob,loc);

进程创建和撤销

操作系统 实 验 报 告 实验题目:进程的创建与撤销指导老师:杜俊俐 专业班级:软工086班 学号:200877054611 姓名:胡同涛 中原工学院?软件学院

实验一:进程创建与撤消 一.实验目的 (1)加深对进程概念的理解和进程创建与撤消算法; (2)进一步认识并发执行的实质。 二.实验属性 该实验为验证性+设计性实验。 三.实验仪器设备及器材 普通PC386以上微机 四.实验要求 本实验要求2学时完成。 本实验要求完成如下三个层次的任务: (1)系统级—以普通用户身份认识windows的进程管理。通过windows的“任务管理器”观察进程的状态,进行进程的创建、切换和撤销。 (2)语言级—以普通程序员身份认识高级语言VC++/Java/C#的进程创建与撤销工具。 (3)模拟级—以OS设计师身份编程模拟实现进程创建与撤销功能,并在屏幕上观察进程活动的结果。 实验前应复习实验中所涉及的理论知识和算法,针对实验要求完成基本代码编写并完成预习报告;实验中认真调试所编代码并进行必要的测试、记录并分析实验结果。实验后认真书写符合规范格式的实验报告(参见附录A),并要求用正规的实验报告纸和封面装订整齐,按时上交。

五.实验提示--模拟级编程 5.1数据结构定义 #define OK 1 成功返回OK定义为1 #define EVERFLOW -1 越界用-1 #define PCBSIZE 10 //空闲队列初始数组空间 #define NULL 0 //空定义为0 typedef struct PCB //定义进程结构体 { int id; //进程的序号 int priority; //进程的优先级 struct PCB *next; //进程指向下一个节点 }PCB,*PCBList; PCB pcb[PCBSIZE];//创建pcb块,初始空间大小为10 PCBList nullPcb;//空闲队列 PCBList readyPcb;//就绪队列 PCBList readyPcbtail;//就绪队列队尾指针 5.2函数 InitPcb(PCBList &nullPcb)——初始化空闲队列 Create(PCBList &nullPcb)——//创建一个pcb进程从PCB空间申请一个空PCB,填入进程参数,创建一个pcb进程。 InsertReadyPcb(PCBList &readyPcb,PCBList &pcb)——将刚刚创建的进程插入到有序的就绪队列中 Delete(int id,PCBList &readyPcb,PCBList &nullPcb)——用于销毁一个pcb进程,指定销毁队列的序列号,销毁该进程,并将它插入到空闲队列中 PrintPCB(PCBList &readyPcb)——就绪队列输出函数—输出就绪队列中的进程信息,以便观察创建或撤消活动的结果 主函数—功能选择,1.创建进程2.销毁进程3.输出就绪队列4.退出系统

进程创建与撤销

实验一:进程创建与撤消 一、实验目的 1、加深对进程概念的理解和进程创建与撤消算法; 2、进一步认识并发执行的实质。 二、实验内容 本实验完成如下三个层次的任务: (1)系统级—以普通用户身份认识windows的进程管理。通过windows的“任务管理器”观察进程的状态,进行进程的创建、切换和撤销。 (2)语言级—以普通程序员身份认识高级语言VC++/Java/C#的进程创建与撤销工具。 (3)模拟级—以OS设计师身份编程模拟实现进程创建与撤销功能,并在屏幕上观察进程活动的结果。 三、实验步骤 1、windows的进程管理 2、VC++/Java/C#的进程创建与撤销工具 3、进程创建与撤销的模拟实现 (1)总体设计: ①数据结构定义: 结构体PCB:进程名、ID、运行时间、优先级等,队列的排序按创建时间或优先级排序。PCB空间—结构体PCB数组 就绪队列指针 空队列指针 ②函数 CREATE()—进程创建:从PCB空间申请一个空PCB,填入进程参数,插入就绪队列;KILL()—进程终止:将指定的就绪进程移出就绪队列,插入空队列; 就绪队列输出函数Display()—输出就绪队列中的进程信息,以观察创建或撤消活动的结果;

主函数M ain()—功能选择、输入新进程参数、调用创建函数、输出就绪队列;输入进程名称、调用终止函数、输出就绪队列; ③主界面设计:进程创建、进程撤销、就绪队列显示菜单;数据输入和就绪队列显示区。 ④功能测试:从显示出的就绪队列状态,查看操作的正确与否。 (2)详细设计: ①数据结构定义: 结构体PCB: PCB空间 就绪队列指针 空队列指针 struct PCB { char NAME[20]; long ID; float TIME; int PRIORITY; }; PCB pcb[10]; typedef struct QNode { int data; struct QNode*next; }QNode,*QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; }LinkQueue;LinkQueue Ready,Empty; ②函数设计 给出create()、destroy()、Display()、M ain()的流程图描述; create()流程图: destroy()流程图:

实验二 进程撤销模拟

实验二进程撤销模拟 一实习内容 (一).设计并说明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-6所示: ③撤销进程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;

实验三 进程的创建和简单控制

大学城市学院实验报告 课程名称操作系统原理实验 实验项目名称实验三进程的创建和简单控制 学生专业班级学号 实验成绩指导老师(签名)日期 一. 实验目的和要求 1.掌握进程的概念和进程的状态,对进程有感性的认识; 2.掌握进程创建方法; 3.认识进程的并发执行,了解进程族之间各种标识及其存在的关系; 4.熟悉进程的创建、阻塞、唤醒、撤销等控制方法。 二、实验容 1.了解有关Linux进程的属性和进程的层次结构; 2.学习有关Linux的前台和后台进程; 3.学习有关Linux命令的顺序执行和并发执行; 4.学习有关挂起和终止进程; 5.了解并发程序的不可确定性,进行简单并发程序设计。

三、实验步骤 (一)Shell下的进程控制 1、用ps查看进程。查看ps命令的帮助文件,尝试不同的参数,并观察结果ps –help查看更多ps的参数 ps –A 列出所有的进程

ps –au 显示较详细的信息 USER 进程创建者的用户名 PID 进程的ID号 %CPU 进程占用的CPU百分比 %MEN 进程占用存的百分比 VSZ 进程占用虚拟存的大小 RSS 存中页的数量(页是管理存的单位,在PC上通常为4K) TTY 进程所在终端的ID号 STA T 进程的状态 START 进程启动的时间 TIME 进程已经占用的CPU时间 COMMAND 命令和参数 ps –aux 显示所有包含其他使用者的进程 注: top命令即时跟踪进程信息 观察了下大概是5s更新一次使用CPU最多的程序排在最前面。最后用q命令退出这个监视程序。 2、kill命令使用 3、pstree命令使用

实验三进程的创建和简单控制

浙江大学城市学院实验报告 课程名称操作系统原理实验 实验项目名称实验三进程的创建和简单控制 学生姓名专业班级学号 实验成绩指导老师(签名)日期 一. 实验目的和要求 1.掌握进程的概念和进程的状态,对进程有感性的认识; 2.掌握进程创建方法; 3.认识进程的并发执行,了解进程族之间各种标识及其存在的关系; 4.熟悉进程的创建、阻塞、唤醒、撤销等控制方法。 二、实验内容 1.了解有关Linux进程的属性和进程的层次结构; 2.学习有关Linux的前台和后台进程; 3.学习有关Linux命令的顺序执行和并发执行; 4.学习有关挂起和终止进程; 5.了解并发程序的不可确定性,进行简单并发程序设计。

三、实验步骤 (一)Shell下的进程控制 1、用ps查看进程。查看ps命令的帮助文件,尝试不同的参数,并观察结果ps –help查看更多ps的参数 ps –A 列出所有的进程

ps –au 显示较详细的信息 USER 进程创建者的用户名 PID 进程的ID号 %CPU 进程占用的CPU百分比 %MEN 进程占用内存的百分比 VSZ 进程占用虚拟内存的大小 RSS 内存中页的数量(页是管理内存的单位,在PC上通常为4K) TTY 进程所在终端的ID号 STAT 进程的状态 START 进程启动的时间 TIME 进程已经占用的CPU时间 COMMAND 命令和参数 ps –aux 显示所有包含其他使用者的进程 注: top命令即时跟踪进程信息 观察了下大概是5s更新一次使用CPU最多的程序排在最前面。最后用q命令退出这个监视程序。 2、kill命令使用

3、pstree命令使用 显示系统中进程的层次结构 (二)Linux简单进程编程 每个步骤请运行程序、截图,并解释运行结果,回答实验指导书的问题。 1、 i 先执行子进程,最后执行父进程,代表程序运行结束 ii 2个子进程分别执行一次,然后P1子进程执行一次,接着父进程执行,代表P1进程结束。P2子进程执行,父进程再执行,代表P2结束。

操作系统:进程创建与撤消

操作系统实验报告 试验一:进程创建与撤销 计科112康岩岩201100814220 2013/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; //ID long startTime; //开始时间 long pcbRuntime = 0; //运行时间 int pcbLeve; //线程优先级 } 对于所有的进程信息,用以下表储存: DictionaryThreadTable=new Dictionary(); 容器ThreadTable用来储存所有进程简直key 表示进程id,值为Hashtable,储存的为线程信息,

实验三-进程管理

实验三进程管理 一、实验目的 1.熟悉和理解进程和进程树的概念,掌握有关进程的管理机制 2.通过进程的创建、撤销和运行加深对进程并发执行的理解 3.明确进程与程序、并行与串行执行的区别 4.掌握用C 程序实现进程控制的方法 二、实验学时 2学时 三、实验背景知识 所涉及的系统调用 1、exec( )系列(exec替换进程映像) 系统调用exec( )系列,也可用于新程序的运行。fork( )只是将父进程的用户级上下文拷贝到新进程中,而exec( )系列可以将一个可执行的二进制文件覆盖在新进程的用户级上下文的存储空间上,以更改新进程的用户级上下文。exec( )系列中的系统调用都完成相同的功能,它们把一个新程序装入内存,来改变调用进程的执行代码,从而形成新进程。如果exec( )调用成功,调用进程将被覆盖,然后从新程序的入口开始执行,这样就产生了一个新进程,新进程的进程标识符id与调用进程相同。 exec( )没有建立一个与调用进程并发的子进程,而是用新进程取代了原来进程。所以exec( )调用成功后,没有任何数据返回,这与fork( )不同。exec( )系列系统调用在UNIX系统库unistd.h中,共有execl、execlp、execle、execv、execvp五个,其基本功能相同,

只是以不同的方式来给出参数。 #include int execl(const char *pathname, const char *arg, …); int execlp(const char *filename, const char *arg, …); int execle(const char *pathname, const char *arg, …, const char *envp[ ]); int execv(const char *pathname, char *const argv[ ]); int execvp(const char *filename, char *const argv[ ]); 参数: path参数表示你要启动程序的名称包括路径名。 arg参数表示启动程序所带的参数,一般第一个参数为要执行命令名,不是带路径且arg必须以NULL结束。 返回值:成功返回0,失败返回-1 注:上述exec系列函数底层都是通过execve系统调用实现. 1)带l 的exec函数:execl,execlp,execle,表示后边的参数以可变参数的形式给出且都以一个空指针结束。 #include #include #include int main(void) { printf("entering main process---\n"); execl("/bin/ls","ls","-l",NULL);

《操作系统》习题集:第2章 进程与线程(第1部分)

第2章进程与线程-习题集 一、选择题 1.以下关于进程的描述中,正确的是()。【*,联考】 A. 进程获得CPU运行是通过调度得到的 B. 优先级是进程调度的重要依据,一旦确定就不能改变 C. 在单CPU的系统中,任意时刻都有一个进程处于运行状态 D. 进程申请CPU得不到满足时,其状态变为阻塞 2.一个进程是()。【*,联考】 A. 由处理机执行的一个程序 B. 一个独立的程序+数据集 C. PCB结构、程序和数据的组合 D. 一个独立的程序 3.并发进程指的是()。【*,★,联考】 A. 可并行执行的进程 B. 可同一时刻执行的进程 C. 可同时执行的进程 D. 不可中断的进程 4.当一个进程处于这样的状态时,(),称为阻塞态。【*,★,联考】 A. 它正等着输入一批数据 B. 它正等着进程调度 C. 它正等着分给它一个时间片 D. 它正等进入内存 5.某个运行中的进程要申请打印机,它将变为()。【*,联考】 A. 就绪态 B. 阻塞态 C. 创建态 D. 撤销态 6.以下进程状态转变中,()转变是不可能发生的。【**,★,联考】 A. 运行→就绪 B. 运行→阻塞 C. 阻塞→运行 D. 阻塞→就绪 7.当()时,进程从执行状态转变为就绪状态。【*,联考】 A. 进程被调度程序选中 B. 时间片到 C. 等待某一事件 D. 等待的事件发生 8.一个进程的基本状态可以从其他两种基本状态转变过来,这个基本状态一定是()。【**,联考】 A. 运行状态 B. 阻塞状态 C. 就绪状态 D. 完成状态 9.当一个进程完成一个时间片后,系统需要将该进程的状态由运行状态转变为()。【*,联考】 A. 就绪状态 B. 阻塞状态 C. 撤销状态 D. 创建状态 10.进程状态由就绪态转换为运行态是由()引起的。【**,联考】 A. 中断事件 B. 进程状态转换 C. 进程调度 D. 为程序创建进程 11.下列选项中,降低进程优先级的合理时机是()。【***,10考研】 A. 进程的时间片用完 B. 进程刚完成I/O,进入就绪队列 C. 进程长期处于就绪队列中 D. 进程从就绪状态转为运行态 12.()必会引起进程切换。【**,★,联考】

实验二 进程撤销模拟实现

计算机操作系统综合设计 实验二 实验名称:进程撤销模拟实现 学号: 学生姓名: 班级: 指导教师: 实验地点: 实验日期: 评分:

一、实验目的 1)理解进程撤销相关理论; 2)掌握进程撤销流程。 二、实验平台 windows 10Visual C++ 6.0 三、实验步骤 1、实验内容 1)采用动态或静态方法生成一颗进程树(进程数目≥20); 2)设计进程撤销算法; 3)实现进程撤销函数,采用级联方式撤销; 4)可动态撤销进程; 5)可动态观察进程树的情况; 6)测试程序并得到正确结果。 2、实验步骤 1)输入给定的实验指导书中提供的代码 A、打开Visual C++ 6.0; B、新建c++文件,创建basic.h头文件,并且创建deletepc.cpp; 2)进行功能测试并得出正确结果 A、编译、运行deletepc.cpp: B、输入createpc命令创建进程,再输入showdetail显示每个进程及其子进程的信息。

C 、输入deletepc 命令删除进程,再输入showdetail 显示删除后的每个进程及子进程信息。 1.如果输入是两个参数,则会提示参数输入错误。 1 2 3 5 4 6 7 8 9 112 11 19 18 17 16 15 14 13 20

2.如果输入一个参数,则正常运行,并且相关进程以及其子进程均被删除了。 D、输入exit命令退出程序:

四、实验总结 在这次实验中,输入createpc(进程,父进程,优先级)指令来创建进程,因为默认有个父进程0,所以第一次输入时可以输入createpc(1,0,1),在多次输入createpc指令后,可以通过showdetail指令来查看已经创建好进程。进程撤销的核心内容是:进入函数后,判断当前节点的左子树是不是为空。当不为空的时候,递归调用以当前节点左子树为参数的deletepc 函数以及当前节点为参数deletepc函数。如果为空,则说明当前节点没有子节点,判断父节点的左子树是不是当前节点,如果是,将当前节点的兄弟节点赋给父节点的左子树;如果不是,遍历父节点的子节点,找到临时节点的兄弟节点为当前节点,然后将当前节点的兄弟节点赋给临时节点的兄弟节点。最后遍历所有节点找到当前节点的位置,并把它删除。通过本

操作系统实验二(进程撤销模拟实现)

计算机操作系统实验报告 实验内容:进程撤销模拟实现 实验类型:设计型 指导教师:范太华 专业班级: 姓名: 学号: 512015 实验地点:东6E304 实验时间:2017/10/16 一、实验目的 1.掌握进程撤销相关理论 2.掌握进撤销流程

二、实验内容 1.采用动态或静态方法生成一颗进程树(进程数目≥20) 2.设计进程撤销算法 3.实现进程撤销函数,采用级联方式撤销 4.可动态撤销进程 5.可动态观察进程树的情况 6.测试程序并得到正确结果 三、实验要求 1.编写程序完成实验内容 2.画出撤销函数流程图

3.撰写实验报告 四、实验设备 1.PC机1台安装visual c++ 6.0 五、测试 1.构建1棵进程树,该树至少包含4层 2.对该树中的多个进程进行删除,至少对一个含有孙子进程的进程进行删 除

六、实验思考 1.进程撤销的核心内容是什么? 根据撤销进程的标志号从相应对列中查找并移除它;将此进程所拥有的资源归还给其父进程或操作系统;若此进程有拥有子进程,先撤销其所有字进程以防止它们脱离控制;回收pcb并将其归还至pcb池;最后转向进程调度程序工作。 2.可否采用其它的撤销方法? 可以,在撤销进程的时候可以通过递归撤销进程的子孙进程来一步一步撤销进程。 附:核心代码

int revokepc(int para){ int nid[101]; int counter=0; pnode *p,*p1,*p2,*pp; int pflag; int parent;//父节点id号 pflag=0; p1=plink; for(p=p1->next;p;p=p->next){ if(p->node->pid == para){ //find the process parent = p->node->ppid; //找p的父节点 pp = find(parent); pflag = 1; break; }else{ p1 = p; } } if(!pflag) { //the process is not exist printf("process id %d is not exist!\n",para); return -1; } if(pp->sub == p){ //p是pp的第一个子节点 if(p->brother){ pp->sub = p->brother; }else{ pp->sub = NULL; } }else{ //p不是pp的第一个子节点 if(p->brother){ p1->brother = p->brother; }else{ p1->brother = NULL; } } p1->next = p->next; //找子孙节点

相关文档