当前位置:   article > 正文

操作系统--进程调度(C语言)_进程调度算法c语言代码

进程调度算法c语言代码
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
#include<malloc.h>
 
using namespace std;
 
struct PCB_type
{
	int pid;		//进程名
	int state;		//进程状态	2--表示"执行"状态	 1--表示"就绪"状态	0--表示"阻塞"状态
	int cpu_time;	//运行需要的cpu时间(需运行的时间片个数)               
};
 
typedef struct QueueNode			//队列链表
{
	struct PCB_type PCB;
	struct  QueueNode  *next;
}*QueueLink;
 
 
//设置全程变量
struct QueueNode	*ready_head=NULL,       //ready队列队首指针
					*ready_tail=NULL ,       //ready队列队尾指针
					*blocked_head=NULL,    //blocked队列队首指针
					*blocked_tail=NULL;     //blocked队列队尾指针
 
 
int t;		//定义一个全局变量个时间片系统释放资源,唤醒处于阻塞队列队首的进程
 
//设置相应的子程序
void start_state()  //读入假设的数据,设置系统初始状态
{
	int i,n,m;				//用来计数循环
	QueueLink p,p1,p2;		//一个节点指针
	printf("输入n个进程处于就绪状态,m个进程处于阻塞状态,且每过t个时间片系统释放资源,唤醒处于阻塞队列队首的进程。");
	scanf("%d,%d,%d",&n,&m,&t);
	//创建链表
	//创建一个节点
	p1=(QueueLink)malloc(sizeof(QueueNode));		//以免ready和blocked指向相同
	p2=(QueueLink)malloc(sizeof(QueueNode));
	p1->next=NULL;
	p2->next=NULL;
	
//初始化就绪队列全程变量
	ready_head=ready_tail=p1;
	//吧ready队列链表创建好
	for(i=0 ; i<n ; i++)
	{
		p=(QueueLink)malloc(sizeof(QueueNode));
		p->next=NULL;
		p->PCB.state=1;			//进程状态	2--表示"执行"状态	 1--表示"就绪"状态	0--表示"阻塞"状态
		printf("亲!请输入第 %d 个就绪进程的进程名和进程时间:",i+1);
		scanf("%d,%d",&p->PCB.pid,&p->PCB.cpu_time);
	//	cout<<p->PCB.pid<<endl;
		ready_tail->next=p;		//把p加入表尾
		ready_tail=p;			//吧表尾指针指向新的表尾
	}
 
//初始化阻塞队列的全程变量
	blocked_head=blocked_tail=p2;
	//吧blocked队列链表创建好
	for(i=0 ; i<m ; i++)
	{
		p=(QueueLink)malloc(sizeof(QueueNode));
		p->next=NULL;
		p->PCB.state=0;	//进程状态	2--表示"执行"状态	 1--表示"就绪"状态	0--表示"阻塞"状态
		printf("亲!请输入第 %d 个阻塞队列的进程名和进程时间:",i+1);
		scanf("%d,%d",&p->PCB.pid,&p->PCB.cpu_time);
	//	cout<<"ddddddddddd"<<endl;
		blocked_tail->next=p;			//吧p加入阻塞队列的表尾
		blocked_tail=p;			//吧表尾指针指向新的表尾
	}
 
}
 
float use_cpu=0,unuse_cpu=0;	//use_cpu记录cpu运行时间,unuse_cpu记录CPU空闲时间,x用来计数是否该唤醒阻塞队列了
 
void dispath( )     //模拟调度
{
	int x=0; 
	QueueLink p;			//指针用于指向队列的位置
		while(ready_head!=ready_tail || blocked_head!=blocked_tail)		//判断ready队列或block队列不为空
		{
			if(ready_head!=ready_tail)		//判断就绪队列不为空
			{
				//取出ready队列的队首节点
				p=ready_head->next;
				p->PCB.state=2;		//开始执行
				printf("当前正在执行的PCB名称是:%d   ",p->PCB.pid);
				p->PCB.cpu_time--;		//需要的时间减少,这里是表示每个进程的时间片是1
				use_cpu++;
				if(ready_head->next != ready_tail)		//判断是否只剩下一个节点了
				{
					if(p->PCB.cpu_time > 0)		//判断时间是否够了,程序执行完成
					{
						ready_head->next=p->next;		//吧队首向后移动一位
						//吧原来的队首放到队尾
						ready_tail->next=p;
						ready_tail=p;		//队尾指向新的节点
						p->next=NULL;		//吧队尾重置为空
						p->PCB.state=1;
					}
					else
					{
						//cout<<"sssssssss"<<endl;
						ready_head->next=p->next;
						printf("  进程%d完成  ",p->PCB.pid);
						p->next=NULL;
						free(p);
					}
				}
				else
				{
					if(p->PCB.cpu_time <= 0)
					{
						ready_tail=ready_head;		//链队列为空,头尾连到一起
						printf("  进程%d完成  ",p->PCB.pid);
						p->next=NULL;
						free(p);
					}}
			}
			else				//进程状态	2--表示"执行"状态	 1--表示"就绪"状态	0--表示"阻塞"状态
			{
				unuse_cpu++;
				printf("时间片轮空一回!         ");
			}
			x++;		//执行过后吧用掉的时间加上,这里每次为一
			if(x==t && blocked_head != blocked_tail)		//到时候向就绪队列送节点,且阻塞队列不为空
			{
				if(blocked_head->next != blocked_tail)
				{
					p=blocked_head->next;
					printf("  唤醒进程%d",p->PCB.pid );
		        	blocked_head->next=p->next;		//吧阻塞队列头指针指向下一个
					ready_tail->next=p;
					ready_tail=p;		//指向新的队尾
					p->next=NULL;
			//		printf("xxxxxx\n");			
					x=0;		//把x重新赋值为零
				}
				else		//如果是只剩下最后一个节点
				{
					p=blocked_head->next;
					printf("  唤醒进程%d",p->PCB.pid );
					blocked_tail=blocked_head;		//吧头尾指针指向一起
					ready_tail->next=p;
					ready_tail=p;		//指向新的队尾
					p->next=NULL;
				}
			}
			printf("\n");
		} 
} 
 
void calculate()    //计算CPU利用率
{
	float rate;		//CPU利用率
	rate=use_cpu/(use_cpu+unuse_cpu);
	printf("CPU利用率是:%f\n",rate);
 
}
 
void main()
{ 
	start_state();

//	cout<<ready_head->PCB.pid<<endl;
 	dispath(); 
	calculate(); 
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 116
  • 117
  • 118
  • 119
  • 120
  • 121
  • 122
  • 123
  • 124
  • 125
  • 126
  • 127
  • 128
  • 129
  • 130
  • 131
  • 132
  • 133
  • 134
  • 135
  • 136
  • 137
  • 138
  • 139
  • 140
  • 141
  • 142
  • 143
  • 144
  • 145
  • 146
  • 147
  • 148
  • 149
  • 150
  • 151
  • 152
  • 153
  • 154
  • 155
  • 156
  • 157
  • 158
  • 159
  • 160
  • 161
  • 162
  • 163
  • 164
  • 165
  • 166
  • 167
  • 168
  • 169
  • 170
  • 171
  • 172
  • 173
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/964658
推荐阅读
相关标签
  

闽ICP备14008679号