pcb[PCBNum];//创建进程结构体数组
时间: 2024-06-02 22:05:14 浏览: 77
在计算机科学中,进程控制块(PCB)是操作系统用于跟踪进程的数据结构。在C语言中,可以通过定义结构体来创建进程控制块数组。下面是一个简单的例子[^1]:
```c
struct Process
{
int processID;
char processName[20];
float processTime;
};
struct Process pcb[PCBNum]; //定义进程控制块数组
```
这个例子定义了一个包含三个成员的 `Process` 结构体,分别是进程 ID、进程名称和进程运行时间。`pcb[PCBNum]` 便是一个进程控制块数组, `PCBNum`是数组的大小。在这个数组中,每个元素都是一个 `Process` 结构体,可以使用下标来访问每个元素。
相关问题
优化下列代码://先来先服务 #include <stdlib.h> #include <stdio.h> struct pcb{ // 定义一个结构体,里面包含的有一个进程相关的信息 char name[10]; //进程名称 (输入) float arrivetime; //到达时间 (输入) float servicetime; //服务时间 (输入) float starttime; //开始时间 float finishtime; //结束时间 float zztime; //周转时间=finishtime-arrivetime float dqzztime; //带权周转时间=zztime/servicetime }; //输入进程信息 void input(pcb *p, int N) //p为pdb数组名, N为pcb数组的元素个数 { int i; prin
下面是优化后的代码:
```c
#include <stdlib.h>
#include <stdio.h>
struct pcb {
char name[10]; //进程名称 (输入)
float arrivetime; //到达时间 (输入)
float servicetime; //服务时间 (输入)
float starttime; //开始时间
float finishtime; //结束时间
float zztime; //周转时间=finishtime-arrivetime
float dqzztime; //带权周转时间=zztime/servicetime
};
//输入进程信息
void input(pcb *p, int N) {
int i;
for (i = 0; i < N; i++) {
printf("请输入第%d个进程的信息:\n", i + 1);
printf("进程名称:");
scanf("%s", p[i].name);
printf("到达时间:");
scanf("%f", &p[i].arrivetime);
printf("服务时间:");
scanf("%f", &p[i].servicetime);
}
}
//先来先服务算法
void FCFS(pcb *p, int N) {
int i;
float sum_zztime = 0, sum_dqzztime = 0;
p[0].starttime = p[0].arrivetime;
p[0].finishtime = p[0].starttime + p[0].servicetime;
p[0].zztime = p[0].finishtime - p[0].arrivetime;
p[0].dqzztime = p[0].zztime / p[0].servicetime;
for (i = 1; i < N; i++) {
if (p[i].arrivetime <= p[i - 1].finishtime) {
p[i].starttime = p[i - 1].finishtime;
} else {
p[i].starttime = p[i].arrivetime;
}
p[i].finishtime = p[i].starttime + p[i].servicetime;
p[i].zztime = p[i].finishtime - p[i].arrivetime;
p[i].dqzztime = p[i].zztime / p[i].servicetime;
}
for (i = 0; i < N; i++) {
sum_zztime += p[i].zztime;
sum_dqzztime += p[i].dqzztime;
}
printf("先来先服务算法:\n");
printf("进程名称 到达时间 服务时间 开始时间 完成时间 周转时间 带权周转时间\n");
for (i = 0; i < N; i++) {
printf("%-10s %-9.2f %-9.2f %-9.2f %-9.2f %-9.2f %-9.2f\n", p[i].name, p[i].arrivetime,
p[i].servicetime, p[i].starttime, p[i].finishtime, p[i].zztime, p[i].dqzztime);
}
printf("平均周转时间:%.2f\n", sum_zztime / N);
printf("平均带权周转时间:%.2f\n", sum_dqzztime / N);
}
int main() {
int N;
printf("请输入进程数:");
scanf("%d", &N);
pcb *p = (pcb *) malloc(N * sizeof(pcb));
input(p, N);
FCFS(p, N);
free(p);
return 0;
}
```
主要的优化点包括:
1. 在输入函数中使用了循环,减少了代码的重复部分。
2. 在输入函数中,结构体数组名直接作为参数传递,而不是再次定义一个变量来表示。
3. 在先来先服务算法函数中,使用了更简洁的代码来计算每个进程的开始时间、结束时间、周转时间和带权周转时间。
4. 在输出结果时,使用了更合理的格式化字符串,使输出结果更加美观。
5. 在主函数中,使用动态内存分配来申请结构体数组的内存,更加灵活。
帮我解释一下这段代码struct pcb { /* 定义进程控制块PCB */ char name[10];//进程名称 char state;//状态 R--正在运行状态,W--等待状态 int pri;//优先数 int rtime;//已经运行时间 struct pcb* link; }*ready=NULL,*p; /* ready作为就绪队列的头结点*/ typedef struct pcb PCB;//定义结构体变量 void sort() /* 建立对进程进行优先级排列函数*/ { /* 插入排序*/ PCB *first, *second; int insert=0; if((ready==NULL)||((p->pri)>(ready->pri))) /*优先级最大者,插入队首*/ { p->link=ready; ready=p; } else /* 进程比较优先级,插入适当的位置中*/ { first=ready; second=first->link; while(second!=NULL) { if((p->pri)>(second->pri)) /*若插入进程比当前进程优先数大,*/ { /*插入到当前进程前面*/ p->link=second; first->link=p; second=NULL; insert=1; } else /* 插入进程优先数最低,则插入到队尾*/ { first=first->link; second=second->link; } } if(insert==0) first->link=p; } }
这段代码是定义了一个进程控制块 PCB 的结构体,包括进程名称、状态、优先数、已经运行时间和指向下一个 PCB 的指针。同时,还定义了一个 PCB 结构体类型别名为 PCB。
代码中的 sort() 函数是用来建立对进程进行优先级排列的函数,采用了插入排序的方法。首先判断就绪队列是否为空,如果为空或者插入的进程的优先级最高,则将其插入到队首。否则,遍历就绪队列,找到适当的位置插入进程。如果插入进程的优先级最低,则将其插入到队尾。
最终,代码定义了两个 PCB 指针变量 ready 和 p,其中 ready 作为就绪队列的头结点,p 则是要插入的进程。
阅读全文