进程创建与撤销
实验目的实现总体设计代码实现
实验目的
模拟进程的创建、就绪、撤销,并按优先级对进程排序。
实现
总体设计
数据结构定义 结构体PCB: 进程名、ID、运行时间、优先级等,队列的排序按优先级排序。 PCB空间: 结构体PCB数组 队列: 就绪队列,消息缓冲队列函数 Create()—进程创建: 从PCB空间申请一个空PCB,填入进程参数,插入就绪队列; kill()—进程终止: 将指定的就绪进程移出就绪队列,清楚PCB信息; display()-就绪队列输出: 输出就绪队列中的进程信息,以便观察创建或撤消活动的结果; Sort()—进程优先级排序: 根据你定义的优先级,把进程进行排序。 menu()—功能选择 :调用创建函数;显示就绪队列;调用终止函数;退出程序等功能测试 从显示出的就绪队列状态,查看操作的正确与否。
代码实现
#include <stdio.h>
#include <stdlib.h>
typedef struct P_node
{
char t_name
[20];
long t_id
;
float t_time
;
int priority
;
}PCB
;
typedef struct Tnode
*T
;
struct Tnode
{
int data
;
T next
;
};
typedef struct Linkqueue
{
T front
,rear
;
}LQ
;
LQ L
;
PCB pcb
[100];
int N
=0;
void InitQueue(){
L
.rear
=L
.front
=malloc(sizeof(T
));
if(!L
.front
)
exit(-2);
L
.front
->next
=NULL;
return 0;
}
void Create(){
int n
;
printf("请输入要创建的进程的数目:");
scanf("%d",&n
);
if(n
>100){
printf("当前内存已满");
return 0;
}
int i
,j
;
long id
;
T t
;
for(i
=1;i
<=n
;i
++){
if(L
.front
->next
==NULL){
printf("请输入进程id:");
scanf("%ld",&pcb
[i
+N
].t_id
);
getchar();
printf("请输入进程名:");
gets(pcb
[i
+N
].t_name
);
printf("请输入进程运行时间:");
scanf("%f",&pcb
[i
+N
].t_time
);
getchar();
printf("请输入进程优先级:");
scanf("%d",&pcb
[i
+N
].priority
);
N
++;
}else{
printf("请输入进程id:");
scanf("%ld",&id
);
for(j
=1;j
<i
+N
;){
if(id
==pcb
[j
].t_id
){
printf("进程ID已经存在!\n请重新输入:");
scanf("%ld",&id
);
j
=0;
}else{
j
++;
}
}
pcb
[i
+N
].t_id
=id
;
getchar();
printf("请输入进程名:");
gets(pcb
[i
+N
].t_name
);
printf("请输入进程运行时间:");
scanf("%f",&pcb
[i
+N
].t_time
);
getchar();
printf("请输入进程优先级:");
scanf("%d",&pcb
[i
+N
].priority
);
N
++;
}
t
=malloc(sizeof(T
));
t
->data
=N
;
t
->next
=NULL;
L
.rear
->next
=t
;
L
.rear
=t
;
}
Sort();
return 0;
}
void Sort(){
int i
,j
;
for(i
=1;i
<=N
;i
++){
for(j
=i
+1;j
<=N
;j
++){
if(pcb
[i
].priority
<pcb
[j
].priority
){
PCB temp
=pcb
[i
];
pcb
[i
]=pcb
[j
];
pcb
[j
]=temp
;
}
}
}
}
void display(){
T p
;
p
=L
.front
;
if(p
->next
==NULL){
printf("当前无进程!");
}
while(p
->next
!=NULL){
p
=p
->next
;
printf(" 进程ID:%ld\n 进程名:%s \n运行时间:%f \n优先级:%d\n",pcb
[p
->data
].t_id
,pcb
[p
->data
].t_name
,pcb
[p
->data
].t_time
,pcb
[p
->data
].priority
);
}
}
void kill(){
int id
;
T p
;
p
=L
.front
;
if(p
->next
==NULL){
printf("当前无进程!\n\n");
}else{
printf("输入要终止的进程的id:");
scanf("%ld",&id
);
while(pcb
[p
->next
->data
].t_id
!=id
){
if(p
->next
==NULL){
printf("该进程不存在!\n");
return 0;
}
p
=p
->next
;
}
if(pcb
[p
->next
->data
].t_id
==id
){
p
->next
=p
->next
->next
;
if(L
.front
->next
==NULL){
L
.front
=L
.rear
;
}
if(p
->next
==NULL){
L
.rear
=p
;
}
while(p
->next
!=NULL){
p
->next
->data
--;
pcb
[p
->next
->data
]=pcb
[p
->next
->data
+1];
p
=p
->next
;
}
}
printf("成功杀死进程!\n");
return 0;
}
}
void menu(){
int n
;
while(1){
printf("进程演示系统\n");
printf("**************************************************\n");
printf("1.创建进程\n");
printf("2.查看进程\n");
printf("3.杀死进程\n");
printf("4.退出程序\n");
printf("请输入你的选择(1-4):");
scanf("%d",&n
);
switch(n
){
case 1:Create();
break;
case 2:display();
break;
case 3:kill();
break;
case 4:return 0;
default:printf("没有这个选项!");
break;
}
}
return 0;
}
int main()
{
InitQueue();
menu();
return 0;
}