进程创建与撤消

更新时间:2024-04-08 17:53:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验一:进程创建与撤消

一、实验目的

1、 加深对进程概念的理解和进程创建与撤消算法; 2、 进一步认识并发执行的实质。

二、实验内容

本实验完成如下三个层次的任务: (1)系统级—以普通用户身份认识windows的进程管理。通过windows的“任务管理器”观察进程的状态,进行进程的创建、切换和撤销。

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

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

三、实验步骤

1、windows的进程管理 当前状态

切换前

1

切换后

2

撤销

2、VC++进程创建与撤销工具 3、进程创建与撤销的模拟实现 (1)总体设计: ①数据结构定义:

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

就绪队列指针 空队列指针 ②函数

CREATE()—进程创建:从PCB空间申请一个空PCB,填入进程参数,插入就绪队列;

KILL()—进程终止:将指定的就绪进程移出就绪队列,插入空队列; 就绪队列输出函数Display()—输出就绪队列中的进程信息,以便观察创建或撤消活动的结果;

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

3

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

④功能测试:从显示出的就绪队列状态,查看操作的正确与否。 (2)详细设计: ①数据结构定义: 结构体PCB: struct PCB {

char NAME[10]; long ID; float TIME; int PRIORITY;

};PCB pcb[100]; ②函数设计 给出CREATE()、KILL()、Display()、Main()的流程图描述; 以CREATE()为例如下:

输入进程数 For循环 N+1 优先级大到小排序 输入参数 是 进程已存在 否 (3)调试与测试:列出你的测试结果,包括输入和输出。

Menu() 插入就绪队 4

四、实验总结

5

通过这次试验了解到了进城创建与撤销,并对以前的知识进行了复习,通过使用结构体和指针,实行进程的创建与撤销,我的程序设计能力得到提高,

五、附录

带注释的源程序。 #include #include #include #include

#define OK 1 #define ERROR 0

#define OVERFLOW -2

struct PCB //结构体PCB {char NAME[20];

long ID;

float TIME; int PRIORITY;

};PCB pcb[100]; //结构体数组 typedef struct QNode //单链表 { int data;

struct QNode *next; }QNode,*QueuePtr;

typedef struct LinkQueue //链队列 { QueuePtr front; QueuePtr rear;

}LinkQueue;LinkQueue R,E; int N,m;// N为当前进程数

void menu();

int InitQueue()// 就绪队、空队的初始化

{ R.front=R.rear=(QueuePtr)malloc(sizeof(QNode)); E.front=E.rear=(QueuePtr)malloc(sizeof(QNode)); if(!R.front) exit(OVERFLOW); if(!E.front) exit(OVERFLOW); R.front->next=NULL;

E.front ->next =NULL;

6

return OK;

}

void create()//进程创建

{ char name[20];long id;float time; int priority; int n; QNode *p; cout<<\请输入要创建进程的数目:\

cin>>n;

cin>>id;

for(int i=1;i<=n;i++) { cout<<\进程ID:\

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

{ while(id==pcb[j].ID) { cout<<\进程ID已存在\ cout<<\进程ID:\cin>>id;

} }

cout<<\进程名:\

cout<<\运行时间:\cin>>time; cout<<\优先级:\cin>>priority; N++;//保存当前就绪进程数

strcpy(pcb[N].NAME,name); pcb[N].ID =id; pcb[N].TIME =time;

pcb[N].PRIORITY =priority;

p=(QueuePtr)malloc(sizeof(QNode));//插入就绪队列

if(!p) exit(OVERFLOW); p->data=N; p->next=NULL; R.rear->next=p; R.rear=p;

}

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

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

if(pcb[i].PRIORITY

pcb[j]=pcb[0];

menu();

}

void kill()//进程终止

7

{ long id; QNode *p;

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

cin>>id;

p=R.front->next;

if(p==NULL) cout<<\就绪进程为空!\

while(p!=NULL)

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

{

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

{R.front =R.rear;R.front ->next =NULL;N--;cout<<\进程已终else //队列中进程多个

{ while(p!=NULL)

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

{p->next =NULL;R.rear =p;N--;cout<<\进程已终止!

\

}

}

p=p->next ;

止!\

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

{ if(R.front==R.rear) cout<

while(p!=NULL) { pcb[p->data]=pcb[p->data+1];//修改PCB数组里的值

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

{p->next =NULL;R.rear =p;cout<<\进程已终止!\ p=p->next;

} N--; break; }

p=p->next ; } menu(); }

void display() { QNode *p;

p=R.front->next;

cout<<\名字\运行时间\优先级\

while(p!=NULL) {

cout<data].ID<<\

\

\ \

8

p=p->next ; }

menu();

}

void exit()//退出系统; {exit(0);} void main() { InitQueue(); }

void menu()

{ cout<<'\\n'<<\进程创建\进程撤销\就绪队列显示\退出\ }

int choice;

cout<<\请选择:\cin>>choice; switch(choice)

{ case 1:create();break; case 2:kill();break; case 3:display();break; case 4:exit(); default :exit(); }

pcb[0].ID =0; menu();

9

本文来源:https://www.bwwdw.com/article/36pr.html

Top