• python模拟银行家算法


    前言:

    大二第一学期学习了操作系统,期末实验课题要求模拟算法。遂根据自己学习的python写下此文。以此锻炼自己编码能力。虽说是重复造轮子,但还是自己的思路体现

    代码及注释如下(银行家算法不再赘述):

     1 #-*- coding: UTF-8 -*-
     2 #@author:若鸟
     3 #@version: 2.0   .
     4 #@date : 2016-12-18
     5 #function:命令行界面实现对各进程请求通过银行家算法实现分配资源
     6 import numpy as np                                                                      #导入numpy模块
     7 
     8 #初始化各数据结构
     9 Available = np.array([3,3,2])                                             #可利用各资源总数
    10 Max = np.array([[7,5,3],[3,2,2],[9,0,2],[2,2,2],[4,3,3]])                 #各进程最大需求资源数
    11 Allocation = np.array([[0,1,0],[2,0,0],[3,0,2],[2,1,1],[0,0,2]])          #已分配各进程的资源数
    12 Need = np.array([[7,4,3],[1,2,2],[6,0,0],[0,1,1],[4,3,1]])                #各进程尚需的资源数
    13 safeList=[]                                                               #安全进程执行序列
    14 Request=[]                                                                #各进程对各资源的请求
    15 Request_name=""                                                           #进程名称
    16 
    17 
    18 def input_Request():
    19     global Allocation,Available,Max,Need,safeList,Request,Request_name
    20     try:
    21         Request_name=input("请输入请求线程的编号:
    0   1    2    3    4
    ")
    22         Request_name=int(Request_name)
    23         Request_new=input("请输入P{}的请求资源数(如:* * *) :
    ".format(Request_name))
    24         Request_new=list(Request_new)
    25 
    26         for x in range(0,5,2):                                                          #去除输入的空格
    27             i=int(Request_new[x])
    28             Request.append(i)
    29 
    30         Request=np.array(Request)
    31     except:
    32         print("输入错误,请重新输入")
    33         input_Request()
    34 
    35 
    36 
    37 def BankerAlgorithm():
    38     global Allocation,Available,Max,Need,safeList,Request,Request_name
    39     input_Request()
    40 
    41     if ((Request<=Need[Request_name]).all()):
    42         if ((Request<=Available).all()):
    43             Available -=Request                                                          #可利用资源减少
    44 
    45             Need[Request_name] -= Request                                                #尚需的资源数减少
    46             Allocation[Request_name] +=Request                                           #已分配资源增加
    47             safeAlgorithm()                                                              #执行安全算法
    48         else:
    49             print("请求超出可利用的资源,请等待")
    50     else:
    51         print("线程请求超出所需总资源数")
    52 
    53 def safeAlgorithm():
    54     work = Available                                                                      #分配work向量
    55     Finish=[False]*5                                                                    #分配Finish向量
    56 
    57 
    58     while False in Finish:
    59         for i in range(0,5):
    60            for j in range(0,3):
    61                 if ((Finish[i]==False) and ((Need[i]<=work).all())):
    62                     for m in range(3):
    63                         work[m] =work[m]+ Allocation[i][m]
    64                     Finish[i]=True
    65                     safeList.append(i)
    66                 else:
    67                     break
    68 
    69     if False in Finish:
    70         print("*"*45)
    71         print("您输入的请求资源数:{}".format(Request))
    72         print("您输入的请求进程是{}".format(Request_name))
    73         print("系统安全性:不安全状态")
    74         print("*"*45)
    75     else:
    76         print("*"*45)
    77         print("您输入的请求进程是{}".format(Request_name))
    78         print("您输入的请求资源数:{}".format(Request))
    79         print("系统安全性:系统安全")
    80         print("安全序列为:",safeList)
    81         print("*"*45)
    82 
    83 
    84 
    85 if __name__ =="__main__":
    86 
    87     BankerAlgorithm()
  • 相关阅读:
    <mvc:annotation-driven>新增标签
    关于Spring中的<context:annotation-config/>配置
    <mvc:default-servlet-handler/>的作用
    各种WEB服务器自带的默认Servlet名称
    常用邮件协议
    vue-cli 脚手架项目简介(一)
    CSS3的transition和transform
    Spring配置文件<context:property-placeholder>标签使用漫谈
    使用Spring JDBCTemplate简化JDBC的操作
    技术探索不易
  • 原文地址:https://www.cnblogs.com/ruoniao/p/6802500.html
Copyright © 2020-2023  润新知