操作系统中的进程调度与优先级算法:理论与实践探索

909 阅读4分钟

前言

在计算机科学领域中,进程调度是操作系统中一个重要的组成部分,它负责决定哪个进程能够获得 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;
}

思路及流程图:

段代码实现了一个使用优先级调度算法进行进程调度的程序。以下是该段代码的功能和执行流程的简要说明:

  1. 定义了一个结构体 PCB,用于表示进程的属性,包括进程名、状态、优先级、需要运行时间和已运行时间等信息。
  2. 实现了一个排序函数 Sort(),用于将新创建的进程按照优先级插入到就绪队列中的合适位置。
  3. 实现了一个输入函数 Input(),用于输入进程的数量和相关属性,创建进程并插入到就绪队列中。
  4. 实现了一个显示函数 Disp(),用于显示进程的信息。
  5. 实现了一个检查函数 Check(),用于检查当前正在运行的进程和就绪队列中的进程,并显示其信息。
  6. 实现了一个运行函数 Running(),用于模拟进程的执行过程,包括更新已运行时间和调整进程的优先级。
  7. 在主函数中,首先调用输入函数 Input(),创建并初始化就绪队列。然后通过循环进行时间片的执行,每次选择优先级最高的进程进行执行,直到就绪队列为空。
  8. 每次执行一个时间片后,调用检查函数 Check()显示当前进程和就绪队列的状态,并调用运行函数 Running()模拟进程的执行过程。
  9. 最后输出所有进程已全部执行完毕的提示。

需要注意的是,这段代码只是一个简单的模拟程序,并没有涉及真正的进程调度和并发控制机制。它仅仅通过优先级调度算法和就绪队列来模拟进程的执行顺序。如果需要实现真正的进程调度算法和并发控制,还需要考虑诸如时间片轮转、进程状态切换、互斥访问等更复杂的机制。

image.png

运行截图

image.png

image.png