C语言实现时间片轮转法的cpu调度模拟

/*小弟初出茅庐,菜鸟一个,各路大神请多指教。*/
/*这是实验课题目,上课时写的,不是很完整,仅当留着做个纪念,有问题大家一起学习讨论。*/
/*第一次发博客,哈哈,挺乐的。废话不多说,直接上代码!*/

/*****时间片轮转法进行CPU调度算法********/
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#define N 10   //定义最大进程数
#define TIME 2//定义时间片大小
typedef struct pcb{
	char id[10];//进程标识数
	int arrivetime;//到达时间
	int runtime;//进程已经占用的cpu时间
	int needtime;//进程还需要的时间
	char state[12];//进程运行状态:wait or runing
	struct pcb *next;
}pcb,*PCB;
PCB head;//设置全局变量用来修改就绪队列
PCB tail;
int count=0;//记录就绪队列中进程数
void CreatProcess(){
	//创建进程
	PCB p,q;//进程的头尾指针都有
	int num;//记录要创建的进程数
	int i,j;
	int arrive[N];
	head=tail=(PCB)malloc(sizeof(pcb));
	head->next=NULL;
	p=head;
	printf("输入你要创建的进程数:");
	scanf("%d",&num);
	count=num;
	printf("********按照进程到达时间从小到大创建就绪队列******\n");
	 //初始对其排序来创建就绪队列
	for(i=1;i<=num;i++){
		p->next=(PCB)malloc(sizeof(pcb));
		p=p->next;
		tail=p;
		printf("输入进程%d的标示符:",i);
		scanf("%s",p->id);
		printf("输入进程%d的到达时间:",i);
		scanf("%d",&p->arrivetime);
		printf("输入进程%d已占用的cpu时间:",i);
		scanf("%d",&p->runtime);
		printf("输入进程%d还需要的cpu时间:",i);
		scanf("%d",&p->needtime);
		printf("输入进程%d当前状态:(run 或者wait):",i);
		scanf("%s",p->state);
	}
	tail->next=p->next=NULL;
}
void RR_RunProcess(){
	//运行进程,简单轮转法Round Robin
	PCB p,q,temp;
	p=head->next;
	while(1){
	if(head->next==NULL)
	{
		printf("此时就绪队列中已无进程!\n");
			return ;
	}
	else 
	{
		while(p){
			if((p->needtime>0)&&!(strcmp(p->state,"wait"))){
				printf("进程%s开始,\n",p->id );
				strcpy(p->state,"run");
				p->runtime+=TIME;
				p->needtime-=TIME;
				if(p->needtime<0)
					p->needtime=0;
			}
			 temp=p;//把该时间片内运行完的进程存到临时temp中
			 //把temp接到链表尾部,销毁P; 
			 if(temp->needtime>0){//把该时间片内运行完的进程接到就绪队列的尾部
				 if(count>1){
				 head->next=temp->next;
				 tail->next=temp;
				 tail=tail->next;
				 strcpy(tail->state,"wait");
				 tail->next=NULL;
				 }
				 else if(count==1){//当只有一个进程等待时,分开讨论
					 head->next=temp;
					 tail=temp;
					 strcpy(tail->state,"wait");
					 tail->next=NULL;

				 }
				 
			 }
			 if(temp->needtime==0){//销毁就绪队列中已经结束的进程
				 count--;//此时就绪队列中进程数减1
				 printf("进程%s结束.\n",p->id);
				 head->next=temp->next;
				 free(temp);//撤销就绪队列中已经结束的进程

			 }

			p=head->next;

		}

	}
	}
}
void main(){
	printf("**************进程的初始状态!**************\n");
    CreatProcess();
    printf("*******************************************\n\t\t程序运行结果如下:\n\n");
    printf("*******************************************\n");
    RR_RunProcess();//简单轮转法Round Robin
 
}

运行结果如下附件:

时间: 2024-10-05 07:14:09

C语言实现时间片轮转法的cpu调度模拟的相关文章

操作系统实验二(调度算法模拟-先进先出-时间片轮转法-优先服务调度算法)

实验二 进程调度 一.     实验目的 1.       理解进程运行的并发性. 2.       理解处理器的三级调度. 3.       掌握先来先服务的进程调度算法. 4.       掌握短进程优先的进程调度算法. 5.       掌握时间片轮转的进程调度算法. 二.     实验设备 1.     安装windows或者linux操作系统的PC机 2.     C程序编译环境 三.     实验内容 用c语言编程模拟实现至少一个操作系统的常见进程调度算法.常见的进程调度算法有先来先

SMP CPU调度 &nbsp; 用于多道程序

SMP CPU调度   用于多道程序 SMP(Symmetric Multi-Processor) :对称多处理器SMP 服务器的主要特征是共享,系统中所有资源 (CPU .内存. I/O 等 ) 都是共享的.也正是由于这种特征,导致了 SMP 服务器的主要问题,那就是它的扩展能力非常有限.对于 SMP 服务器而言,每一个共享的环节都可能造成 SMP 服务器扩展时的瓶颈,而最受限制的则是内存.由于每个 CPU 必须通过相同的内存总线访问相同的内存资源,因此随着 CPU 数量的增加,内存访问冲突将

【转】CPU调度

转自:http://blog.csdn.net/xiazdong/article/details/6280345 CPU调度   用于多道程序 以下先讨论对于单CPU的调度问题. 回顾多道程序,同时把多个进程导入内存,使得一个进程在CPU中执行I/O时,一个进程用来填补CPU的时间. 通常进程都是在CPU区间和I/O区间之间转换. CPU调度程序称为短期调度程序,从内存调度到CPU. 在内存中等待的就绪队列的节点是PCB.有许多不同的队列实现方法. 抢占调度和非抢占调度(协作):前者为一个进程还

6.CPU调度

总论:所有的程序都是CPU和I/O等待交替执行 CPU调度器的操作时机 调用CPU调度器的时机,通常发生在 某一进程从执行状态转化为等待状态 某一进程从执行状态转化为就绪状态 某一进程从等待状态转为就绪状态 某一进程终止 注意,调度时机不限于此4种情况,有非抢占式调度,和抢占式调度 CPU调度器 决定了将CPU分配给谁 后续操作就是, CPU分配器将CPU控制权交给该进程,操作内容通常包括 上下文切换 从内核态转移至用户态 跳转至用户程序中PC寄存器所指示的位置 分配延迟 CPU分配暂停前一进程

go语言之行--golang核武器goroutine调度原理、channel详解

一.goroutine简介 goroutine是go语言中最为NB的设计,也是其魅力所在,goroutine的本质是协程,是实现并行计算的核心.goroutine使用方式非常的简单,只需使用go关键字即可启动一个协程,并且它是处于异步方式运行,你不需要等它运行完成以后在执行以后的代码. go func()//通过go关键字启动一个协程来运行函数 二.goroutine内部原理 概念介绍 在进行实现原理之前,了解下一些关键性术语的概念. 并发 一个cpu上能同时执行多项任务,在很短时间内,cpu来

第五章 CPU调度

基本概念: CPU和I/O的交替序列: CPU-burst CPU调度 CPU调度方案 抢占的原则 CPU调度算法 调度的准则 调度算法只影响等待时间,而不能影响进程真正使用CPU的时间和I/O时间 具体算法 先来先服务 产生问题 SJF 优先级算法(Priority Scheduling) 优先级的确定 时间片轮转 多级队列(Multilevel Queue) 队列的调度       多级反馈队列调度(Multilevel Feedback Queue) 原文地址:https://www.cn

[OS] CPU调度

调度准则 为了比较CPU调度算法,分析员提供了许多准则,用于比较的特征对确定最佳算法有很大影响.这些准则包括: ·CPU使用率:需要使CPU尽可能忙. ·吞吐量:一个时间单元内完成进程的数量. ·周转时间:从进程提交到进程完成的时间. ·等待时间:进程在就绪队列中等待所花时间之和. ·响应时间:对于分时系统,从提交请求到第一次响应的时间. 调度算法 ·先来先服务调度(FCFS) 采用这种方案,先请求CPU的进程先分配到CPU.FCFS策略可以用FIFO队列来容易的实现. 缺点:1.周转时间与响应

操作系统概念学习笔记 10 CPU调度

操作系统概念学习笔记 10 CPU调度 多道程序操作系统的基础.通过在进程之间切换CPU,操作系统可以提高计算机的吞吐率. 对于单处理器系统,每次只允许一个进程运行:任何其他进程必须等待,直到CPU空闲能被调度为止. 多道程序的目标是在任何时候都有某些进程在运行,以使CPU的使用率最大化.多道程序的思想较为简单,当一个进程必须等待时,操作系统会从该进程拿走CPU的使用权,而将CPU交给其他进程. CPU-I/O 区间周期 CPU的成功调度依赖于进程的如下属性: 进程执行由CPU执行周期和I/O等

进程与线程之间的关系和区别 及 CPU调度

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位. 进程和线程的关系: (1)一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程. (2)资源分配给进程,同一进程的所有线程共享该进程的所有资源. (3)处理机分给线程,即真正在处理机上运行的是线程. (4)线程在执行过程中,需要协作同步.不同进程的线程间要利用消息通信的办法实现同步.