进程调度算法和银行家算法实现

一、实验目的

1)掌握周转时间、等待时间、平均周转时间等概念及其计算方法。

2)理解五种常用的进程调度算法(FCFSSJFHRRFHPF),区分算法之间的差异性,并用 C 语言模拟实现各算法。

3)了解操作系统中高级调度、中级调度和低级调度的区别和联系。

(4)经过对银行家算法的设计,加深了解有关资源申请、避免死锁、状态安全性等概念,并体会和运用避免死锁的具体实施方法。

使用C语言对银行家算法模拟。

二、实验内容和步骤

1.进程调度算法实现

实验说明:本实验选用的调度算法均为非抢占式

代码实现:

#include<stdio.h>
#define MAX 10
struct task_struct
   {
     int number;             /*进程编号*/
     float come_time;         /*到达时间*/
     float run_begin_time;     /*开始运行时间*/
     float run_time;           /*运行时间*/
     float run_end_time;       /*运行结束时间*/
     int priority;              /*优先级*/
     int order;               /*运行次序*/
     int run_flag;             /*调度标志*/
   }tasks[MAX];
int counter;                  /*实际进程个数*/
int fcfs();                     /*先来先服务*/
int ps();            		 /*优先级调度*/
int sjf();           		 /*短作业优先*/
int hrrn();            		/*响应比高优先*/
int pinput();          		/*进程参数输入*/
int poutput();        		 /*调度结果输出*/
void main()
{
int option;
pinput();
printf("请选择调度算法(0~4):\n");
printf("1.先来先服务\n");
printf("2.优先级调度\n");
printf("3.短作业优先\n");
printf("4.响应比高优先\n");
printf("0.退出\n");
scanf("%d",&option);
switch (option)
{ 
case 0:
     printf("运行结束。\n");
     break; 
case 1:
     printf("对进程按先来先服务调度。\n\n");
     fcfs();
     poutput();
     break;
case 2:
     printf("对进程按优先级调度。\n\n");
     ps();
     poutput();
     break;
case 3:
     printf("对进程按短作业优先调度。\n\n");
     sjf();
     poutput();
     break;
case 4:
     printf("对进程按响应比高优先调度。\n\n");
     hrrn();
     poutput();
     break;
}
}
int fcfs()    /*先来先服务*/
{
float time_temp=0;
int i,j;
int number_schedul=0;
int first_come_time=0;
//find the first come
i=0;
time_temp=-1;
first_come_time=tasks[0].come_time;
for(i=0;i<counter;i++)
{
  //find the first come
   for(j=0;j<counter;j++)
{
     if((tasks[j].come_time<=first_come_time)&&(!tasks[j].run_flag))
      {
          first_come_time=tasks[j].come_time;
          number_schedul=j;         
} 
}
  printf("number_schedul=%d\n",number_schedul);
   if(time_temp==-1)
   tasks[number_schedul].run_begin_time=tasks[number_schedul].come_time;
   else tasks[number_schedul].run_begin_time=time_temp;
   tasks[number_schedul].run_end_time=tasks[number_schedul].run_begin_time+tasks[number_schedul].run_time;
   tasks[number_schedul].run_flag=1;
   first_come_time=time_temp=tasks[number_schedul].run_end_time;
   number_schedul=number_schedul;
   tas
  • 3
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,Python并不是操作系统,也不是用于操作系统开发的编程语言,因此Python本身并没有实现银行家算法。但是,我们可以使用Python编写模拟银行家算法的程序来进行资源分配和进程调度模拟。 以下是一个简单的Python程序,用于模拟银行家算法的资源分配和进程调度: ```python 定义银行家算法数据结构 class Banker: def __init__(self, available, max_need, allocation): self.available = available # 可用资源 self.max_need = max_need # 进程最大需求量 self.allocation = allocation # 进程已分配资源量 self.need = max_need - allocation # 进程尚需资源量 # 检查是否存在安全序列 def is_safe(self): work = self.available.copy() finish = [False] * len(self.max_need) safe_sequence = [] while True: found = False for i in range(len(self.max_need)): if not finish[i] and all(need <= work for need, work in zip(self.need[i], work)): work = [work[j] + self.allocation[i][j] for j in range(len(work))] finish[i] = True safe_sequence.append(i) found = True if not found: break return all(finish), safe_sequence # 分配资源 def allocate(self, process_id, request): if all(request <= self.need[process_id]) and all(request <= self.available): self.available -= request self.allocation[process_id] += request self.need[process_id] -= request return True else: return False # 释放资源 def release(self, process_id, release): self.available += release self.allocation[process_id] -= release self.need[process_id] += release # 测试程序 if __name__ == '__main__': # 初始化银行家算法数据结构 available = [3, 3, 2] max_need = [[7, 5, 3], [3, 2, 2], [9, 0, 2], [2, 2, 2], [4, 3, 3]] allocation = [[0, 1, 0], [2, 0, 0], [3, 0, 2], [2, 1, 1], [0, 0, 2]] banker = Banker(available, max_need, allocation) # 模拟进程请求资源 process_id = 0 request = [0, 2, 0] if banker.allocate(process_id, request): print('分配成功') if banker.is_safe()[0]: print('存在安全序列') else: print('不存在安全序列,分配失败') banker.release(process_id, request) else: print('分配失败') ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值