操作系统进程调度模拟算法(C实现)

1、“先来先服务”调度算法
编程思路:
对各进程按照到达时间进行排序,挑选最先到达的进程一次性执行完毕,判断是否所有进程都被调度,若是则结束,否则返回挑选最先到达的进程一次性执行完毕步骤,继续执行后续程序。按照进程进入的先后次序来分配处理器。先进入就绪队列的进程优先被挑选,运行进程一旦占有处理器将一直运行下去,直到运行结束或者被阻塞,这是非抢占式调度。
代码如下:

//排序: 按照进程的arrivetime(从小到大)对pcb数组中的N个进程进行排序 
void sort(pcb *p, int N)   
{
        
	for(int i=0; i < N-1; i++)
	{
   
		for(int j=0; j<N-1-i; j++)  
		{
   
			if(p[j].arrivetime > p[j+1].arrivetime)   
			{
       
				pcb temp;    
				temp=p[j];    
				p[j]=p[j+1];    
				p[j+1]=temp;    
			}
		}
	}
} 
 
//运行
void run(pcb *p, int N)     
{
   
	int k;    
	for(k=0; k<N; k++)    
	{
       
		if(k==0) //第1个进程   
		{
        
			p[k].starttime = p[k].arrivetime; //第1个进程到达之后即可执行   
			p[k].finishtime = p[k].starttime + p[k].servicetime; 
		}    
		else 
		{
       
			p[k].starttime = (p[k-1].finishtime >= p[k].arrivetime)? p[k-1].finishtime: p[k].arrivetime;    
			p[k].finishtime = p[k].starttime + p[k].servicetime;
		}    
	}    
	for(k=0; k<N; k++)    
	{
       
		p[k].zztime = p[k].finishtime - p[k].arrivetime;    
		p[k].dqzztime = p[k].zztime / p[k].servicetime;    
     }    
} 
  
//显示
void Print(pcb*p, int N)    
{
   
	int k;  
	printf("调用先来先服务算法以后进程运行的顺序是: ");
	printf("%s", p
  • 6
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
1. 进程控制块PCB的结构设计 a. 适用于优先权调度算法的PCB结构 - 进程标识符pid - 进程状态status - 进程优先级priority - 进程PC指针pc - 进程寄存器状态reg_state - 进程堆栈指针stack_pointer - 进程存储器分配表memory_allocation_table b. 适用于时间片轮转调度算法的PCB结构 - 进程标识符pid - 进程状态status - 进程优先级priority - 进程PC指针pc - 进程寄存器状态reg_state - 进程堆栈指针stack_pointer - 进程时间片remaining_time_slice - 进程存储器分配表memory_allocation_table 2. 进程就绪队列的建立 在进程控制块PCB中,加入一个就绪队列指针ready_queue,用来指向该进程所属的就绪队列,然后建立一个就绪队列数组ready_queue_array,用来存放所有的就绪队列。在进程调度时,根据进程优先级和时间片等因素将进程加入到相应的就绪队列中。 3. 进程调度算法的实验步骤 a. 优先权调度算法 步骤一:建立就绪队列数组ready_queue_array,用来存放所有的就绪队列。 步骤二:建立进程控制块PCB,包含进程标识符pid、进程状态status、进程优先级priority等信息。 步骤三:创建进程并将其加入到相应的就绪队列中。 步骤四:从就绪队列中选择一个优先级最高的进程运行,并将其从就绪队列中移除。 步骤五:进程运行完毕后,如果还有其他进程在就绪队列中,根据优先级选择下一个进程运行。 b. 时间片轮转调度算法 步骤一:建立就绪队列数组ready_queue_array,用来存放所有的就绪队列。 步骤二:建立进程控制块PCB,包含进程标识符pid、进程状态status、进程优先级priority等信息。 步骤三:创建进程并将其加入到相应的就绪队列中。 步骤四:从就绪队列中选择一个进程运行,并将其时间片减1。 步骤五:如果进程运行完毕后,时间片还未用完,则将其加入到就绪队列的队尾;如果时间片已经用完,则将其加入到下一个就绪队列的队尾,并将其时间片重置为默认值。 步骤六:重复步骤四和步骤五,直到所有进程运行完毕。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值