操作系统原理与系统——实验十三多道批处理作业调度(作业可移动)

关键代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
typedef struct  data{
    int hour;//当前小时
    int min;//当前分钟
}time;
struct node{
    char name[20];//进程名
    time arrive;//到达就绪队列时间
    int zx;//执行时间(预期时间)
    int size;
    int tai;
    int flag;
    time zhuangru; 
    time start;//开始执行时间(进程调度)
    time finish;//执行完成时间
    int zz;//周转时间=完成时间-到达就绪队列时间
    float zzxs;//带权周转时间系数=周转时间/执行时间
    struct node* next;
};
//内存结构体

typedef struct memory_node{
    int size; //内存大小
    int address; //内存始址
} memoryNode;
memoryNode memory;

int resource;
//函数名:in参数:无
node* in(){
//函数功能:输入访问序列信息
	int n;
	node *q,*head;
	head = NULL; 
	printf("请输入内存大小:");
	scanf("%d",&memory.size);
	printf("请输入起始地址大小为:");
	scanf("%d",&memory.address);
	printf("请输入磁带机资源:");
	scanf("%d",&resource); 
	printf("请输入进程数量:");
	scanf("%d",&n);
	printf("请输入进程的参数:\n"); 
	for(int i=0;i<n;i++)
	{
		node *p = (node *)malloc(sizeof(node));
		p->flag = 0;
		p->next = NULL;
		scanf("%s %d:%d %d分钟 %dK %d台",&p->name,&p->arrive.hour,&p->arrive.min,&p->zx,&p->size,&p->tai);
		if(head == NULL)
		{
			head = p;
			q = p;
		} 
		else
		{
			q->next = p;
			q = p;
		}
	}
	return head;
}

void output(node *p) {
    //函数功能:按进程执行顺序分别输出每个进程全部结果信息和系统平均时间
   int sum=0,count=0; 
   float sum1=0; 
   printf("\n模拟进程FCFS调度过程输出结果:\n作业名   到达时间   执行时间(分钟)    装入时间   开始时间   完成时间  周转时间(分钟)  带权周转系数\n");
   while(p!=NULL)
   {
    	printf("%5s ",p->name);
    	printf("%5d:%02d ",p->arrive.hour,p->arrive.min);
    	printf("%8d(分钟) ",p->zx);
    	printf("%14d:%02d ",p->zhuangru.hour,p->zhuangru.min);
    	printf("%6d:%02d ",p->start.hour,p->start.min);
    	printf("%7d:%02d ",p->finish.hour,p->finish.min);
    	printf("%7d ",p->zz);
    	printf("%20.2f\n",p->zzxs);
    	sum=sum+p->zz;
    	sum1=sum1+p->zzxs;
    	count++;
    	p=p->next;
   }
   printf("系统平均周转时间为:%.2f\n",sum*1.0/count);
   printf("系统平均带权周转系数为:%.2f\n\n",sum1/count);
}
//函数名:FCFS参数:无
void FCFS(){
//函数功能:调用先来先服务算法
	printf("\n***********FCFS多道批处理作业调度***********\n");
	node *head = in();
	node *h,*q;
	h = NULL;
	q = head;
	while(q!=NULL)
	{
		node *p = (node *)malloc(sizeof(node));
		*p = *q;
		p->next = NULL;
		if(h == NULL)
		{
			h = p;
		}
		else
		{
			node *a = h,*b;
			while(a!=NULL)
			{
				if(p->arrive.hour*60+p->arrive.min<a->arrive.hour*60+a->arrive.min)
				break;
				b = a;
				a = a->next;
			}
			if(a == h)
			{
				p->next = h;
				h = p;
			}
			else
			{
				p->next = a;
				b->next = p;
			}
		}
		q = q->next; 
	}
	
	time now;
	now.hour = 0;
	now.min = 0;
	int qaq = 0,available = resource,space = memory.size;
	q = h;
	node *duilie = NULL,*flow,*flagh;
	node *k,*flowk,*KK=NULL; 
	
	while(h!=NULL)
	{
		flagh = h;
		//每一次大循环都找在自己执行完的时间内并且符合条件的 摘下来 
		//大循环每次末尾都回收第一个 
		q = h;
		if(duilie==NULL)
		{
			h = q->next;
			q->next = NULL;
			duilie = q;
			flow = duilie;
			if(duilie->arrive.hour*60+duilie->arrive.min>now.hour*60+now.min)
			{
				now.hour = duilie->arrive.hour;
				now.min = duilie->arrive.min;
			}
			duilie->start.hour = now.hour;
			duilie->start.min = now.min;
			duilie->zhuangru.hour = now.hour;
			duilie->zhuangru.min = now.min;
			
			available -=q->tai;
			space = memory.size - duilie->size;
		}
			//如果不是第一个,则遍历去找符合条件的 
		node *hh = h,*hhpre;
		while(hh!=NULL)
		{
			if(hh->arrive.hour*60+hh->arrive.min<=duilie->start.hour*60+duilie->start.min+duilie->zx&&space - hh->size>=0&&available-hh->tai>=0)
			{
				//满足条件
				hh->start.hour = duilie->start.hour + (duilie->start.min + duilie->zx )/60;
				hh->start.min = (duilie->start.min + duilie->zx )%60;
				hh->zhuangru.hour = now.hour;
				hh->zhuangru.min = now.min;
				available -=hh->tai;
				space -=hh->size;
				
				if(hh==h)
				{
					h=hh->next;
					hh->next = NULL;
					if(duilie == NULL)
					{
						duilie = hh;
						flow = hh;
					}
					else
					{
						flow->next = hh;
						flow = hh;
					}
					hh = h;
				}
				else
				{
					hhpre->next = hh->next;
					hh->next = NULL;
					if(duilie == NULL)
					{
						duilie = hh;
						flow = hh;
					}
					else
					{
						flow->next = hh;
						flow = hh;
					}
					hh = hhpre->next;
				}
			}
			else
			{
				//不满足条件——————>空间不满足 or 磁带机不满足
				hhpre = hh;
				hh=hh->next;
			}
		}
		//回收资源
		k=duilie;
		k->finish.hour = k->start.hour+(k->start.min+k->zx)/60;
		k->finish.min = (k->start.min + k->zx)%60;
		
		k->zz = k->finish.hour*60 + k->finish.min - (k->arrive.hour*60 + k->arrive.min);
		k->zzxs = k->zz*1.0/k->zx; 
		now.hour = k->finish.hour;
		now.min = k->finish.min;
		available +=k->tai;
		space +=k->size;

		duilie = duilie->next;
		if(KK==NULL)
		{
			KK=k;
			flowk = k;
			k->next = NULL;
		}
		else
		{
			flowk->next = k;
			flowk = k;
			k->next = NULL;
		}		
	}
		while(duilie!=NULL)//h==NULL但是duilie不等于NULL 
	{
		k=duilie;
		k->start.hour = now.hour;
		k->start.min = now.min;
		k->finish.hour = k->start.hour+(k->start.min+k->zx)/60;
		k->finish.min = (k->start.min + k->zx)%60;
		
		k->zz = k->finish.hour*60 + k->finish.min - (k->arrive.hour*60 + k->arrive.min);
		k->zzxs = k->zz*1.0/k->zx; 
		now.hour = k->finish.hour;
		now.min = k->finish.min;
		available +=k->tai;memory.size +=k->size;
		
		duilie = duilie->next;
		if(KK==NULL)
		{
			KK=k;
			flowk = k;
			k->next = NULL;
		}
		else
		{
			flowk->next = k;
			flowk = k;
			k->next = NULL;
		}
	}
	output(KK);
}
//函数名:SSTF参数:无
void SPF(){
//函数功能:调用短进程优先调度算法
	printf("\n***********SPF多道批处理作业调度***********\n");
	node *head = in();
	node *h,*q,*H;
	h = NULL;
	q = head;
	H = q;
	q = q->next;
	while(q!=NULL)
	{
		node *p = (node *)malloc(sizeof(node));
		*p = *q;
		p->next = NULL;
		if(h == NULL)
		{
			h = p;
		}
		else
		{
			node *a = h,*b;
			while(a!=NULL)
			{
				if(p->zx<a->zx)
				break;
				b = a;
				a = a->next;
			}
			if(a == h)
			{
				p->next = h;
				h = p;
			}
			else
			{
				p->next = a;
				b->next = p;
			}
		}
		q = q->next; 
	}
	H->next = h;
	h = H;
	
	time now;
	now.hour = 0;
	now.min = 0;
	int qaq = 0,available = resource,space = memory.size;
	q = h;
	node *duilie = NULL,*flow,*flagh;
	node *k,*flowk,*KK=NULL; 
	while(h!=NULL)
	{
		flagh = h;
		//每一次大循环都找在自己执行完的时间内并且符合条件的 摘下来 
		//大循环每次末尾都回收第一个
		q = h;
		if(duilie==NULL)
		{
			h = q->next;
			q->next = NULL;
			duilie = q;
			flow = duilie;
			if(duilie->arrive.hour*60+duilie->arrive.min>now.hour*60+now.min)
			{
				now.hour = duilie->arrive.hour;
				now.min = duilie->arrive.min;
			}
			duilie->start.hour = now.hour;
			duilie->start.min = now.min;
			duilie->zhuangru.hour = now.hour;
			duilie->zhuangru.min = now.min;
			
			space -= q->size;
			available -=q->tai;
		}
		//如果不是第一个,则遍历去找符合条件的 
		node *hh = h,*hhpre;
		while(hh!=NULL)
		{
			if(hh->arrive.hour*60+hh->arrive.min<=duilie->start.hour*60+duilie->start.min+duilie->zx&&space-hh->size>=0&&available-hh->tai>=0)
			{
				//满足条件
				hh->start.hour = duilie->start.hour + (duilie->start.min + duilie->zx )/60;
				hh->start.min = (duilie->start.min + duilie->zx )%60;
				hh->zhuangru.hour = now.hour;
				hh->zhuangru.min = now.min;
				available -=hh->tai;
				space -= hh->size;
				
				if(hh==h)
				{
					h=hh->next;
					hh->next = NULL;
					if(duilie == NULL)
					{
						duilie = hh;
						flow = hh;
					}
					else
					{
						flow->next = hh;
						flow = hh;
					}
					hh = h;
				}
				else
				{
					hhpre->next = hh->next;
					hh->next = NULL;
					if(duilie == NULL)
					{
						duilie = hh;
						flow = hh;
					}
					else
					{
						flow->next = hh;
						flow = hh;
					}
					hh = hhpre->next;
				}
			}
			else
			{
				//不满足条件——————> 空间不满足  or 磁带机不满足
				hhpre = hh;
				hh=hh->next;
			}	
		}
		//回收资源
		k=duilie;space += k->size; 
		k->finish.hour = k->start.hour+(k->start.min+k->zx)/60;
		k->finish.min = (k->start.min + k->zx)%60;
		
		k->zz = k->finish.hour*60 + k->finish.min - (k->arrive.hour*60 + k->arrive.min);
		k->zzxs = k->zz*1.0/k->zx; 
		now.hour = k->finish.hour;
		now.min = k->finish.min;
		available +=k->tai;

		duilie = duilie->next;
		if(KK==NULL)
		{
			KK=k;
			flowk = k;
			k->next = NULL;
		}
		else
		{
			flowk->next = k;
			flowk = k;
			k->next = NULL;
		}		
	}
	while(duilie!=NULL)//h==NULL但是duilie不等于NULL 
	{
		k=duilie;
		k->start.hour = now.hour;
		k->start.min = now.min;
		k->finish.hour = k->start.hour+(k->start.min+k->zx)/60;
		k->finish.min = (k->start.min + k->zx)%60;
		
		k->zz = k->finish.hour*60 + k->finish.min - (k->arrive.hour*60 + k->arrive.min);
		k->zzxs = k->zz*1.0/k->zx; 
		now.hour = k->finish.hour;
		now.min = k->finish.min;
		available +=k->tai;memory.size +=k->size;
		
		duilie = duilie->next;
		if(KK==NULL)
		{
			KK=k;
			flowk = k;
			k->next = NULL;
		}
		else
		{
			flowk->next = k;
			flowk = k;
			k->next = NULL;
		}
	}
	output(KK);
}
//函数名:Elevator参数:无
void HRRF(){
//函数功能:调用电梯调度算法
	printf("\n***********HRRF多道批处理作业调度***********\n");
	node *head = in();
	node *h,*q;
	h = NULL;
	q = head;
	while(q!=NULL)
	{
		node *p = (node *)malloc(sizeof(node));
		*p = *q;
		p->next = NULL;
		if(h == NULL)
		{
			h = p;
		}
		else
		{
			node *a = h,*b;
			while(a!=NULL)
			{
				if(p->arrive.hour*60+p->arrive.min<a->arrive.hour*60+a->arrive.min)
				break;
				b = a;
				a = a->next;
			}
			if(a == h)
			{
				p->next = h;
				h = p;
			}
			else
			{
				p->next = a;
				b->next = p;
			}
		}
		q = q->next; 
	}
	
	time now;
	now.hour = 0;
	now.min = 0;
	int qaq = 0,available = resource,flag=0,space = memory.size;
	q = h;
	node *duilie = NULL,*flow,*flagh;
	node *k,*flowk,*KK=NULL; 
	while(h!=NULL)
	{
		flagh = h;
		//每一次大循环都找在自己执行完的时间内并且符合条件的 摘下来 
		//大循环每次末尾都回收第一个			
		q = h;
		if(flag==0)
		{
			flag=1;
			//如果duilie为NULL去找先到达的
			node *first = h,*b = h;
			while(b!=NULL)
			{
				if(b->arrive.hour*60+b->arrive.min<first->arrive.hour*60+first->arrive.min)
				first = b;
				b = b->next; 
			} 
			b = h;
			while(b!=NULL)
			{
				if(b->next == first)
				break;
				b = b->next;
			}
			if(first == h)
			{
				h = first->next;
				first->next = NULL;
				duilie = first;
			}
			else
			{
				b->next = first->next;
				first->next = NULL;
				duilie = first;
			}
			flow = duilie;
			now.hour = duilie->arrive.hour;
			now.min = duilie->arrive.min;
			
			duilie->start.hour = now.hour;
			duilie->start.min = now.min;
			duilie->zhuangru.hour = now.hour;
			duilie->zhuangru.min = now.min;
			now.hour = duilie->start.hour + (duilie->start.min + duilie->zx)/60;
			now.min =  (duilie->start.min + duilie->zx)%60;
			duilie->finish.hour = now.hour;
			duilie->finish.min = now.min;
			
			duilie->zz = duilie->finish.hour*60 + duilie->finish.min - (duilie->arrive.hour*60 + duilie->arrive.min);
			duilie->zzxs = duilie->zz*1.0/duilie->zx; 
			
			duilie  = duilie->next;
			KK = flow;
			flowk = KK;
		}
	q = h;
	node *xyb=NULL;
	while(q!=NULL)
	{
		node *p = (node *)malloc(sizeof(node));
		*p = *q;
		p->next = NULL;
		if(xyb == NULL)
		{
			xyb = p;
		}
		else
		{
			node *a = xyb,*b;
			while(a!=NULL)
			{
				if((now.hour*60+now.min-q->arrive.hour*60-q->arrive.min+q->zx)*1.0/q->zx>(now.hour*60+now.min-a->arrive.hour*60-a->arrive.min+a->zx)*1.0/a->zx)
				break;
				b = a;
				a = a->next;
			}
			if(a == xyb)
			{
				p->next = xyb;
				xyb = p;
			}
			else
			{
				p->next = a;
				b->next = p;
			}
		}		
		q = q->next; 
	}	 
			//如果不是第一个,则遍历去找符合条件的 
	node *hh = xyb,*hhpre;
	while(hh!=NULL)
	{
		if(memory.size - hh->size>=0&&available-hh->tai>=0)
		{
			//满足条件
			available -=hh->tai;memory.size -=hh->size;
			node *xybh = h,*xybhpre;
			while(xybh!=NULL)
			{
				if(strcmp(xybh->name,hh->name) == 0)
				{
					xybh->zhuangru.hour = now.hour;
					xybh->zhuangru.min = now.min;
					break;
				}
				xybhpre = xybh;
				xybh = xybh->next;
			}
			if(xybh == h)
			{
				h = h->next;
				xybh->next = NULL;
				if(duilie == NULL)
				{ 
					duilie = xybh;
					flow = xybh; 
				} 
				else
				{
					flow->next = xybh;
					flow = xybh;
				}
			}
			else
			{
				xybhpre->next = xybh->next;
				xybh->next = NULL;
				if(duilie == NULL)
				{ 
					duilie = xybh;
					flow = xybh; 
				} 
				else
				{
					flow->next = xybh;
					flow = xybh;
				} 
			}
		}
			//否则不满足条件——————>  空间不满足 or 磁带机不满足
		hh = hh->next;				
	}
		//回收资源
		k=duilie;
		k->start.hour = now.hour;
		k->start.min = now.min;
		k->finish.hour = k->start.hour+(k->start.min+k->zx)/60;
		k->finish.min = (k->start.min + k->zx)%60;
		
		k->zz = k->finish.hour*60 + k->finish.min - (k->arrive.hour*60 + k->arrive.min);
		k->zzxs = k->zz*1.0/k->zx; 
		now.hour = k->finish.hour;
		now.min = k->finish.min;
		available +=k->tai;memory.size +=k->size;
		
		duilie = duilie->next;
		if(KK==NULL)
		{
			KK=k;
			flowk = k;
			k->next = NULL;
		}
		else
		{
			flowk->next = k;
			flowk = k;
			k->next = NULL;
		}
	}
	while(duilie!=NULL)//h==NULL但是duilie不等于NULL 
	{
		k=duilie;
		k->start.hour = now.hour;
		k->start.min = now.min;
		k->finish.hour = k->start.hour+(k->start.min+k->zx)/60;
		k->finish.min = (k->start.min + k->zx)%60;
		
		k->zz = k->finish.hour*60 + k->finish.min - (k->arrive.hour*60 + k->arrive.min);
		k->zzxs = k->zz*1.0/k->zx; 
		now.hour = k->finish.hour;
		now.min = k->finish.min;
		available +=k->tai;memory.size +=k->size;
		
		duilie = duilie->next;
		if(KK==NULL)
		{
			KK=k;
			flowk = k;
			k->next = NULL;
		}
		else
		{
			flowk->next = k;
			flowk = k;
			k->next = NULL;
		}
	}
	output(KK);
}

//函数名:Out参数:无
void Out(){
//函数功能:输出选项菜单
	printf("***************多道批处理作业调度***************\n");
	printf("  *        1.先来先服务调度算法(FCFS)          *\n");
	printf("  *        2.最短作业优先算法(SPF)             *\n");
	printf("  *        3.响应比最高者优先算法(HRRF)        *\n");
	printf("  *        0.退出                              *\n");
	printf("           请输入选项[ ]\b\b");
}
int main()
{
    while (1)
    {
        Out();//给出选项
        int c;
        scanf("%d", &c);
        switch (c){//选择算法
        case 1:FCFS();
            break;
        case 2:SPF();
            break;
        case 3:HRRF();
            break;
        default:printf("\n调度结束!");
            exit(1);
        }
    }
    return 0;
}

实验结果

实验总结

如果学会了作业不可移动的话,对于可移动来说就是不用实际分配内存给作业。

tips:本题思路

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 多道程序作业调度是操作系统中的重要内容,它的主要任务是合理地安排和调度多个作业的执行顺序,以提高计算机系统的效率和吞吐量。 在CSDN操作系统实验中,多道程序系统作业调度主要包括几个方面: 1. 批处理作业调度批处理作业调度是指按照一定的算法和策略,根据作业的属性和优先级,合理安排作业的执行顺序。常见的批处理作业调度算法有先来先服务(FCFS)、短作业优先(SJF)、优先级调度等。这些算法通过优化作业的执行顺序,可以减少作业的等待时间、提高系统的运行效率。 2. 资源分配和回收:多道程序系统中,各个作业需要共享计算机的资源,如内存、CPU等。作业调度需要合理地分配这些资源,并在作业执行完毕后进行回收。通过优化资源分配和回收,可以最大限度地提高计算机系统资源利用率,避免资源的浪费。 3. 死锁避免和处理:多道程序系统在调度作业时,可能会出现死锁的情况作业调度需要具备避免和处理死锁的能力,及时检测和解决死锁问题,以保证系统的正常运行。 总之,在csdn操作系统实验中,多道程序系统作业调度是一个复杂而重要的任务。通过合理地安排作业的执行顺序、优化资源分配和回收以及避免和处理死锁等措施,可以提高计算机系统的效率和吞吐量,从而更好地满足用户的需求。 ### 回答2: CSDN操作系统实验中的多道程序系统作业调度是指在一个计算机系统中同时执行多个作业的调度方式。在多道程序系统中,多个作业可以同时进入内存并执行,从而提高了系统资源利用率和作业处理的效率。 作业调度是指在多道程序系统中选择下一个要执行的作业的过程。作业调度的目标是提高作业的响应时间、提高系统的吞吐量和优化系统资源利用率。常见的作业调度算法有先来先服务(FCFS)、最短作业优先(SJF)、优先级调度、时间片轮转等。 先来先服务是最简单的作业调度算法,在队列中的作业按照到达顺序依次执行,没有考虑作业的执行时间。这种调度算法对于长作业而言响应时间较长,但是对于短作业而言,吞吐量较高。 最短作业优先算法是根据作业的执行时间来决定下一个执行的作业,执行时间短的作业有更高的优先级。这种调度算法能够提供较短的响应时间和较高的吞吐量,但是可能会导致长作业的饥饿。 优先级调度是根据作业的优先级来决定下一个执行的作业,优先级较高的作业被优先执行。这种调度算法比较灵活,可以根据系统的需要对作业进行调度,较高的优先级可以保障较短作业的响应时间。 时间片轮转调度算法是将CPU的执行时间划分为多个时间片,每个作业在一个时间片内轮流执行,如果某个作业没有完成,则切换到下一个作业执行。这种调度算法可以公平地分配CPU资源,并且可以较好地平衡响应时间和吞吐量。 总之,CSDN操作系统实验中的多道程序系统作业调度通过选择合适的调度算法,可以提高作业的响应时间、提高系统的吞吐量和优化系统资源利用率。不同的调度算法有着不同的特点和适用场景,需要根据具体的需求来选择合适的调度策略。 ### 回答3: 多道程序系统作业调度是操作系统中的重要任务,旨在合理地分配系统资源,提高系统的利用率和性能。 在CSDN的操作系统实验中,多道程序系统作业调度主要包括进程队列管理和调度策略的设计。进程队列管理主要负责管理和维护系统中所有进程的状态,以及将进程按照一定的规则组织为不同的队列。调度策略则决定了系统对这些队列中的进程进行调度的顺序和方式。 在多道程序系统中,通常会将进程划分为不同的优先级队列,例如高优先级队列、中优先级队列和低优先级队列。通过设置不同优先级的队列,并根据进程的优先级将其放入相应的队列中,可以实现对进程的优先调度。 在作业调度时,可以采用不同的调度算法,如先来先服务(FCFS)、短作业优先(SJF)、高响应比优先(HRRN)等。这些算法根据作业的特性和系统的需要,决定了进程是否会等待以及如何进行调度。 此外,多道程序系统作业调度还可以考虑进程的并发执行情况,即在一个时间片内,是否应该启动多个进程并让它们并发执行。这涉及到进程的抢占和非抢占调度,以及调度算法的选择。 综上所述,CSDN的操作系统实验中的多道程序系统作业调度涉及进程队列管理、调度策略的设计、优先级调度、调度算法的选择以及进程的并发执行等方面。这些内容都是为了合理利用系统资源,提高系统的性能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值