【操作系统】使用C语言实现轮转法进程调度(有代码)

代码见文章结束处

轮转法实现进程调度思想:

  • 将CPU的处理时间分成固定大小的时间片
  • 按照就绪队列中进程的顺序,调度各进程轮流使用CPU
  • 每个进程执行一个时间片后,就释放CPU,排到就绪队列的末尾,等待下一次调度

使用C语言实现思路:

  • 系统中的每个进程用一个进程控制块PCB表示
  • 将多个进程按输入顺序排成就绪队列链表(进程信息从键盘录入)
  • 按进程在链表中的顺序依次调度,每个被调度的进程执行一个时间片,然后回到就绪队列,“已运行时间”加1
  • 若进程“要求运行时间”==“已运行时间”,则将其状态置为“结束”,并退出队列
  • 运行程序,显示每次调度时被调度运行的进程id,以及各进程控制块的动态变化过程

     

根据轮转法的思想,其重点是各进程轮流使用时间片以及进程的队列,所以进程控制块(PCB)需要包含如下信息:

  1. 进程id,即pid
  2. 需要运行的是时间,即req_time
  3. 已近运行的时间,即cpu_time
  4. 状态,R为进程未结束,E为进程结束
  5. 指针next,指向进程队列中的下一个指针

PCB形式如下:

进程队列如下:

       综上所述,我们只需要使用结构体去包含PCB的所有内容去表示每一个进程,并使用数据结构为链式结构去连接每个进程,当一个进程拥有一个时间段时,使该进程的cpu_time加1,并使用next指针执行下一个进程,如果此时cpu_time和req_time相等,表示该进程运行完成,将该进程states改为“E”,并将该进程从进程队列中删除。说完就冻手

//轮转法
typedef struct pcb {
	int pid;//进程id
	char state;//状态
	int total_time;//要求运行的时间
	int cputime;//已经运行的时间
	struct pcb* next;//next指针
}*proc;

int proc_num;
proc head, tail;//head是头,tail是尾

int init_pcb() {
	int i;
	proc p, tmp;
	//设置进程数量
	printf("please input the number of processes:\n");
	scanf("%d", &proc_num);
	printf("there are %d pricesses,please input pcb info:\n", proc_num);
	//初始化
	p = (proc)malloc(sizeof(struct pcb));
	printf("process id:");
	scanf("%d", &p->pid);
	printf("cputime required:");
	scanf("%d", &p->total_time);
	p->state = 'R';
	p->cputime = 0;
	//为头指针head
	head = p;

	//初始化中间的进程
	for (i = proc_num; i > 1; i--) {
		tmp = p;
		p = (proc)malloc(sizeof(struct pcb));
		printf("process id:");
		scanf("%d", &p->pid);
		printf("cputime required:");
		scanf("%d", &p->total_time);
		p->state = 'R';
		p->cputime = 0;
		tmp->next = p;
	}
	//最后一个进程为尾进程,并将尾指向头
	tail = p;
	p->next = head;
	return 0;
}

//输出每个进程的pid、已经运行的时间、总共需要的时间
void display() {
	int i;
	proc p = head;
	printf("pid\tcpu\treq_time\n");
	for (i = 0; i < proc_num; i++) {
		printf("%d\t%d\t%d\n", p->pid, p->cputime, p->total_time);
		p = p->next;
	}
}

//tail和head是全局变量
void sched() {
	int round = 1;
	proc tmp = tail;
	proc p = head;
	//从头开始执行每一个进程
	while (p->total_time > p->cputime) {
		printf("\nRound %d, Process %d is running\n", round, p->pid);
		p->cputime++;
		display();
		//一个进程完成
		if (p->total_time == p->cputime) {
			p->state = 'E';
			proc_num--;
			tmp->next = p->next;
			if (p == head) {
				head = p->next;
			}
			printf("process %d is finished\n", p->pid);
		}
		else
			tmp = p;
		p = p->next;
		round++;
	}
}

int main() {
	init_pcb();
	display();
	sched();
	return 0;
}

基于动态优先级的进程调度算法C语言实现下次见!!!!

猜你喜欢

转载自blog.csdn.net/peng_lv/article/details/127700112