golang简单实现银行家算法

这周课程设计,以为会很好玩,实验书发下来,居然只是实现银行家算法,失望了……用了小半天时间(原谅我上过操作系统居然连银行家算法是什么都忘了,只能回去看书重来),用golang简单实现了银行家算法,一下是代码:

package main

import (
    "fmt"
    "log"
    "os"
)

var Available []int    //可以用资源向量
var Max [][]int        //最大需求矩阵
var Allocation [][]int //已分配矩阵
var Need [][]int       //需求矩阵
var Request []int      //请求向量
var Work []int         //工作向量
var Finish []bool      //Finish向量
var pid int            //请求资源进程号
var serial []int       //用于存储安全序列
var work [][]int

//初始化
func init() {

    //资源数量为10,5,7

    //资源数量为10,5,7

}

//银行家算法
func Bank() {
    for i := 0; i < len(Request); i++ {
        if Request[i] <= Need[pid][i] {
            continue
        } else {
            log.Fatalln("所需资源超过宣布最大值")
        }
    }

    for i := 0; i < len(Request); i++ {
        if Request[i] <= Available[i] {
            continue
        } else {
            log.Fatalln("尚无足够资源,需等待")
        }
    }

    for i := 0; i < len(Available); i++ {
        Available[i] = Available[i] - Request[i]
    }

    for i := 0; i < len(Allocation[0]); i++ {
        Allocation[pid][i] = Allocation[pid][i] + Request[i]
    }

    for i := 0; i < len(Need[0]); i++ {
        Need[pid][i] = Need[pid][i] - Request[i]
    }

    if Safe() {
        fmt.Println("完成分配")
    } else {
        fmt.Println("系统处于不安全状态,等待")
    }

    fmt.Println("Max:", Max)
    fmt.Println("Allocation:", Allocation)
    fmt.Println("Need:", Need)
    fmt.Println("Available:", Available)
    fmt.Println("Work:", work)
    fmt.Println("安全序列:", serial)
}

//安全性检查
func Safe() bool {
    Work = Available
    for i := 0; i < len(Max); i++ {
        Finish = append(Finish, false)
    }

    temp := 0
step2:
    for i := temp; i < len(Finish); i++ {
        if Finish[i] == false {
            for j := 0; j < len(Work); j++ {
                if Need[i][j] <= Work[j] {
                    if j == len(Work)-1 {
                        serial = append(serial, i)
                        work = append(work, Work)

                        for j := 0; j < len(Work); j++ {
                            Work[j] = Work[j] + Allocation[i][j]
                        }
                        Finish[i] = true
                        if i == len(Finish)-1 {
                            temp = 0
                        } else {
                            temp = i + 1
                        }
                        goto step2
                    }
                } else {
                    break
                }
            }
        } else {
            continue
        }

        if i == len(Finish)-1 {
            return false
        }
    }

    return true
}

func main() {
lable:
    var sel int
    fmt.Println("********************银行家算法********************")
    fmt.Println()
    fmt.Println("\t1、测试数据一")
    fmt.Println("\t2、测试数据二")
    fmt.Println("\t3、测试数据三")
    fmt.Println("\t4、退出")
    fmt.Println()
    fmt.Println("************************************************")
    fmt.Print("请做出你的选择:")
    fmt.Scanln(&sel)
    switch sel {
    //资源总数量为10,5,7
    case 1:
        //测试数据1
        Available = []int{3, 3, 2}
        Max = [][]int{{7, 5, 3}, {3, 2, 2}, {9, 0, 2}, {2, 2, 2}, {4, 3, 3}}
        Allocation = [][]int{{0, 1, 0}, {2, 0, 0}, {3, 0, 2}, {2, 1, 1}, {0, 0, 2}}
        Need = [][]int{{7, 4, 3}, {1, 2, 2}, {6, 0, 0}, {0, 1, 1}, {4, 3, 1}}
        Request = []int{1, 0, 2}
        pid = 1
    case 2:
        //测试数据2
        Available = []int{2, 3, 0}
        Max = [][]int{{7, 5, 3}, {3, 2, 2}, {9, 0, 2}, {2, 2, 2}, {4, 3, 3}}
        Allocation = [][]int{{0, 1, 0}, {3, 0, 2}, {3, 0, 2}, {2, 1, 1}, {0, 0, 2}}
        Need = [][]int{{7, 4, 3}, {0, 2, 0}, {6, 0, 0}, {0, 1, 1}, {4, 3, 1}}
        Request = []int{3, 3, 0}
        pid = 4
    case 3:
        //测试数据3
        Available = []int{2, 3, 0}
        Max = [][]int{{7, 5, 3}, {3, 2, 2}, {9, 0, 2}, {2, 2, 2}, {4, 3, 3}}
        Allocation = [][]int{{0, 1, 0}, {3, 0, 2}, {3, 0, 2}, {2, 1, 1}, {0, 0, 2}}
        Need = [][]int{{7, 4, 3}, {0, 2, 0}, {6, 0, 0}, {0, 1, 1}, {4, 3, 1}}
        Request = []int{0, 2, 0}
        pid = 0
    case 4:
        os.Exit(0)
    default:
        fmt.Println("没有此选项")
    }

    //执行银行家算法
    Bank()
    goto lable
}

很简陋,只测试了三组数据,如果发现bug,望斧正,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: PBFT(Practical Byzantine Fault Tolerance)共识算法是一种分布式系统中的共识算法,它用于在存在恶意节点的情况下达成一致。在Go语言中,可以使用Go的标准库以及第三方库来实现PBFT共识算法。 具体实现步骤如下: 1. 定义网络中的节点数量以及角色(例如:主节点,从节点)。 2. 实现请求阶段,即请求节点向其他节点发送请求消息。 3. 实现预备阶段,即其他节点对请求消息进行验证,如果足够多的节点同意,则进入下一个阶段。 4. 实现提交阶段,即同意请求的节点向其他节点发送提交消息。 5. 实现确认阶段,即其他节点对提交消息进行验证,如果足够多的节点同意,则完成共识。 实现PBFT共识算法需要对分布式系统和网络通信等方面有较深的了解,如果不熟悉可以先学习相关知识。 ### 回答2: Golang语言是一种由Google开发的开源编程语言,具有高效的并发性能和简单的语法。实现PBFT共识算法使用Golang语言可以提供良好的可读性和易于维护的代码。 PBFT(Practical Byzantine Fault Tolerance)共识算法是一种经典的拜占庭容错共识算法,用于在分布式系统中达成一致的决策。它可以容忍最多 f 个节点(其中 f 是拜占庭错误数),并确保所有正确节点在有限时间内达成一致。 在使用Golang实现PBFT共识算法时,我们可以使用Golang的并发机制,如goroutine和channel,来实现节点之间的消息传递和状态同步。 首先,我们需要定义一个PBFT节点的结构体,包含节点的标识符、状态、消息队列等信息。然后,我们可以使用goroutine创建多个节点,并通过channel进行通信。 在PBFT算法中,节点需要按照一定规则进行投票,并等待足够多的节点达成一致后才能继续执行下一步操作。我们可以使用Golang的select语句和channel来实现这一过程,通过select语句监听不同的channel,根据接收到的消息进行相应的操作。 在实现PBFT算法的消息传递过程中,我们可以使用Golang的网络编程库,如net包,来模拟节点之间的网络通信。节点之间可以通过TCP或UDP协议进行消息的传递和接收。 最后,我们需要编写一些测试用例来验证PBFT共识算法的正确性和性能。使用Golang的测试框架,例如testing包,可以方便地编写单元测试和性能测试。 总之,使用Golang语言实现PBFT共识算法可以充分发挥Golang的并发性能和简洁的语法特性。通过合理地利用Golang的并发机制和网络编程库,我们可以实现一个高效可靠的PBFT共识算法,并进行相关的测试和验证。 ### 回答3: Golang语言可以用于实现PBFT(Practical Byzantine Fault Tolerance)共识算法。PBFT是一种拜占庭容错的共识算法,适用于分布式系统中的节点之间存在可能故障和恶意行为的情况。 Golang语言有以下特点适合实现PBFT共识算法: 1. 并发性能强:Golang通过Goroutine和信道(Channel)实现了高效的并发,能够并行处理多个请求和节点之间的通信。这使得Golang非常适合处理PBFT算法中节点之间的消息传递和状态更新。 2. 跨平台支持广泛:Golang语言具有很好的跨平台支持,可以轻松部署在各种操作系统上。这对于实现一个可靠的共识算法来说非常重要,因为共识算法涉及到多个节点的交互和协同工作。 3. 内置网络库强大:Golang提供了内置的网络库,例如net包和http包,可以方便地实现节点之间的网络通信和消息传递。 4. 代码可读性好:Golang语言具有简洁的语法和良好的代码结构,使得代码易于阅读和理解。这对于共识算法这样复杂且关键的系统来说是至关重要的。 因此,使用Golang语言实现PBFT共识算法是非常可行的。开发者可以利用Golang的并发特性、跨平台支持和丰富的网络库进行快速而可靠的开发,以实现一个高性能和鲁棒的PBFT共识算法

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值