前言
在计算机科学领域中,进程调度是操作系统中一个重要的组成部分,它负责决定哪个进程能够获得 CPU 的执行权,以及如何合理地分配 CPU 时间。通过合理的进程调度算法,可以提高系统的性能和响应能力。在本篇博客中,我们将深入理解进程调度和优先级算法,并通过一个实验来实现一个简单的进程调度程序。
进程调度中的优先级算法与PCB管理
进程调度的目标是在有限的资源下,通过合理的算法来选择合适的进程进行执行。在实验中,我们采用了优先级调度算法,即根据进程的优先级将其插入到就绪队列中的合适位置。优先级越高的进程,越有可能获得 CPU 的执行权。我们通过排序函数将新创建的进程按照优先级插入到就绪队列中,并每次选择优先级最高的进程进行执行。
在实验过程中,我们还使用了进程控制块(PCB)来管理进程的相关信息。PCB 是一个数据结构,用于存储和管理进程的各种属性,如进程名、状态、优先级等。通过合理地使用 PCB,我们可以方便地管理进程的创建、调度和执行过程。在代码中,我们定义了 PCB 的结构体,并使用动态内存分配来创建和释放 PCB。
另一个重要的概念是时间片,它表示进程在 CPU 中执行的时间段。在每个时间片中,我们选择一个进程进行执行,并进行相应的检查和更新操作。通过不断循环执行,多个进程可以交替执行,提高了系统的并发性和效率。
代码实现:
完整代码:
#include<stdio.h>
#include<stdlib.h>
struct PCB{
char name[10];
char state;
int super;
int ntime;
int rtime;
struct PCB*next;
}*Ready=NULL,*p;
void Sort(){
PCB*first,*second;
int insert=0;
if((Ready==NULL)||((p->super)>(Ready->super)))
{
p->next=Ready;
Ready=p;
}
else
{
first=Ready;
second=first->next;
while(second!=NULL)
{
if((p->super)>(second->super))
{
p->next=second;
first->next=p;
second=NULL;
insert=1;
}
else
{
first=first->next;
second=second->next;
}
}
if(insert==0) first->next=p;
}
}
void Input(){
int i,num;
printf("请输入进程总数:");
scanf("%d",&num);
printf("\n");
for(i=1;i<=num;i++)
{
printf("进程号No.%d: \n",i);
p=(PCB*)malloc (sizeof(PCB));
printf("输入进程名、优先数、需要运行时间:");
scanf("%s%d%d",p->name,&p->super,&p->ntime);
printf("\n");
p->rtime=0;
p->state='w';
p->next=NULL;
Sort();
}
}
void Disp(PCB*pr)
{
printf("进程名: 状态: 优先级: 请求服务时间:已运行时间:\n");
printf(" %s %c %d %d %d\n",pr->name,pr->state,pr->super,pr->ntime,pr->rtime);
}
void Check()
{
PCB *pr;
printf("****当前正在运行的进程是:%s\n",p->name);
(p->rtime)++;
Disp(p);
pr=Ready;
if(pr!=NULL)
{
printf("****当前就绪队列中的进程为:\n");
while(pr!=NULL)
{
Disp(pr);
pr=pr->next;
}
}
}
void Running()
{
if(p->rtime==p->ntime)//运行完后回收PCB
{
printf("\n");
printf("进程%s已完成!\n",p->name);
free(p);
}
else
{
(p->super)--;
p->state='w';
Sort(); //重新排序
}
}
int main()
{
int h=0;
Input();
while(Ready!=NULL)
{
getchar();
h++;
printf("正在执行的时间片为: %d\n",h);
p=Ready;
Ready=p->next;
p->next=NULL;
p->state='R';
Check();
Running();
printf("按回车键继续......\n");
}
printf("进程已全部执行完毕!\n");
return 0;
}
思路及流程图:
段代码实现了一个使用优先级调度算法进行进程调度的程序。以下是该段代码的功能和执行流程的简要说明:
- 定义了一个结构体 PCB,用于表示进程的属性,包括进程名、状态、优先级、需要运行时间和已运行时间等信息。
- 实现了一个排序函数 Sort(),用于将新创建的进程按照优先级插入到就绪队列中的合适位置。
- 实现了一个输入函数 Input(),用于输入进程的数量和相关属性,创建进程并插入到就绪队列中。
- 实现了一个显示函数 Disp(),用于显示进程的信息。
- 实现了一个检查函数 Check(),用于检查当前正在运行的进程和就绪队列中的进程,并显示其信息。
- 实现了一个运行函数 Running(),用于模拟进程的执行过程,包括更新已运行时间和调整进程的优先级。
- 在主函数中,首先调用输入函数 Input(),创建并初始化就绪队列。然后通过循环进行时间片的执行,每次选择优先级最高的进程进行执行,直到就绪队列为空。
- 每次执行一个时间片后,调用检查函数 Check()显示当前进程和就绪队列的状态,并调用运行函数 Running()模拟进程的执行过程。
- 最后输出所有进程已全部执行完毕的提示。
需要注意的是,这段代码只是一个简单的模拟程序,并没有涉及真正的进程调度和并发控制机制。它仅仅通过优先级调度算法和就绪队列来模拟进程的执行顺序。如果需要实现真正的进程调度算法和并发控制,还需要考虑诸如时间片轮转、进程状态切换、互斥访问等更复杂的机制。