#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtGui>
#include <iostream>
#include <vector>
#include <algorithm>
#include <assert.h>
#include <cstdio>
#include <QDebug>
#include <stdlib.h>
#include <stdio.h>
MainWindow::MainWindow(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
init();
solve();
}
void MainWindow::on_pushButton_2_clicked()
{
// ui->lineEdit->setText("");
// ui->lineEdit_2->setText("");
// ui->lineEdit_3->setText("");
// ui->lineEdit_4->setText("");
// ui->lineEdit_5->setText("");
// ui->plainTextEdit->setPlainText("");
// ui->plainTextEdit_2->setPlainText("");
// ui->plainTextEdit_3->setPlainText("");
// ui->plainTextEdit_4->setPlainText("");
ui->lineEdit->clear();
ui->lineEdit_2->clear();
ui->lineEdit_3->clear();
ui->lineEdit_4->clear();
ui->lineEdit_5->clear();
ui->plainTextEdit->clear();
ui->plainTextEdit_2->clear();
ui->plainTextEdit_3->clear();
ui->plainTextEdit_4->clear();
//清空向量,这个很关键
Available.clear();
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
Allocation[i].clear();
}
}
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
Max[i].clear();
}
}
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
Need[i].clear();
}
}
Request.clear();//进程k的请求向量
n=0;
m=0;
k=0;
}
void MainWindow::dfs(int t,Vi &Work,Vi &Finish,vector<Vi> &ans,Vi q) {
//cout << "T:"<<t<<"\n";
if (t == n) {
ans.emplace_back(q);
return;
}
for (int i = 0; i < n; i++)
if (!Finish[i]) {
bool ok = true;
for (int j = 0; j < m; j++)
if (Need[i][j] > Work[j]) ok = false;
if (!ok) continue;
for (int j = 0; j < m; j++)
Work[j] += Allocation[i][j];
q.emplace_back(i);
Finish[i] = 1;
dfs(t+1,Work,Finish,ans,q);
Finish[i] = 0;
q.pop_back();
for (int j = 0; j < m; j++)
Work[j] -= Allocation[i][j];
}
}
bool MainWindow::solve() {
//为计算安全序列做准备
for (int i = 0; i < m; i++)
if (Request[i] > Max[k][i]) {
ui->plainTextEdit_4->insertPlainText("所需要的资源数已超过它所宣布的最大值");
return false;
}
for (int i = 0; i < m; i++)
if (Request[i] > Available[i]) {
ui->plainTextEdit_4->insertPlainText("表示尚无足够资源");
return false;
}
for (int i = 0; i < m; i++) {
Available[i] -= Request[i];
Allocation[k][i] += Request[i];
Need[k][i] -= Request[i];
}
//输出Need
string strforoutputint;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
ui->plainTextEdit_3->insertPlainText(QString::number(Need[i][j]));
ui->plainTextEdit_3->insertPlainText(" ");//int型输出到>plainTextEdit多行文本框
}
ui->plainTextEdit_3->insertPlainText("\n");
}
Vi Work(Available); //它表示系统可提供给进程继续运行所需的各类资源数目
Vi Finish(n,0); //它表示系统是否有足够的资源分配给进程,使之运行完成
vector<Vi> ans;//记录所有安全序列
dfs(0,Work,Finish,ans,Vi());//安全测试
//输出所有安全序列
if (ans.size()) {
ui->plainTextEdit_4->insertPlainText("安全!\n有");
ui->plainTextEdit_4->insertPlainText(QString::number(ans.size()));
ui->plainTextEdit_4->insertPlainText("个安全序列\n");
// printf("有%d个安全序列:\n",ans.size());
for (auto Vet : ans) {
for (int It : Vet)
ui->plainTextEdit_4->insertPlainText(QString::number(It+1));
ui->plainTextEdit_4->insertPlainText("\n");//int型输出到>plainTextEdit多行文本框
//cout << It+1 << " ";
//puts("");
}
return true;
}
ui->plainTextEdit_4->insertPlainText("不安全!");
return false;
}
void MainWindow::init() {
ui->plainTextEdit_3->clear();
ui->plainTextEdit_4->clear();
//清空向量,这个很关键
Available.clear();
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
Allocation[i].clear();
}
}
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
Max[i].clear();
}
}
for (int i = 0; i < n; i++){
for (int j = 0; j < m; j++){
Need[i].clear();
}
}
Request.clear();//进程k的请求向量
n=0;
m=0;
k=0;
n = ui->lineEdit->text().toInt();
m = ui->lineEdit_2->text().toInt();
//输入一行可利用资源向量
QString str;
str = ui->lineEdit_3->text();
QStringList strlist = str.split(" ");
qInfo() << strlist;
for (int i = 0; i < m; i++) {
Available.emplace_back(strlist[i].toInt());
}
//输入n*m分配矩阵
QStringList contlist = ui->plainTextEdit->toPlainText().split("\n",QString::SplitBehavior::SkipEmptyParts);
qInfo() << contlist;
for (int i = 0; i < n; i++){
strlist=contlist[i].split(" ",QString::SplitBehavior::SkipEmptyParts);
qInfo() << strlist;
for (int j = 0; j < m; j++){
Allocation[i].emplace_back(strlist[j].toInt());
}
}
//输入n*m最大需求矩阵
contlist = ui->plainTextEdit_2->toPlainText().split("\n",QString::SplitBehavior::SkipEmptyParts);
qInfo() << contlist;
for (int i = 0; i < n; i++){
strlist=contlist[i].split(" ",QString::SplitBehavior::SkipEmptyParts);
qInfo() << strlist;
for (int j = 0; j < m; j++) {
Max[i].emplace_back(strlist[j].toInt());
}
}
//计算需求矩阵
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
Need[i].emplace_back(Max[i][j]-Allocation[i][j]);
//输入要请求资源的进程号
k = ui->lineEdit_4->text().toInt();
k = k-1; // 本程序进程编号从0开始
//输入每种资源要请求的数量
str = ui->lineEdit_5->text();
strlist = str.split(" ");
qInfo() << strlist;
for (int i = 0; i < m; i++) {
Request.emplace_back(strlist[i].toInt());
}
// //输出Need
// string strforoutputint;
// for(int i=0;i<n;i++){
// for(int j=0;j<m;j++){
// ui->plainTextEdit_3->insertPlainText(QString::number(Need[i][j]));
// ui->plainTextEdit_3->insertPlainText(" ");//int型输出到>plainTextEdit多行文本框
// }
// ui->plainTextEdit_3->insertPlainText("\n");
// }
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
一、目的: 熟悉银行家算法,加深死锁有关概念的理解。 二、内容: 编制银行家算法通用程序,并检测思考题中所给状态的安全性。 三、要求: (1) 下列状态是否安全?(三个进程共享12个同类资源) 进程 已分配资源数 最大需求数 1 1 4 (状态a) 2 4 4 3 5 8 1 1 4 2 4 6 (状态b) 3 6 8 (2) 考虑下列系统状态 分配矩阵 最大需求矩阵 可用资源矩阵 0 0 1 2 0 0 1 2 1 5 2 0 1 0 0 0 1 7 5 0 1 3 5 4 2 3 5 6 0 6 3 2 0 6 5 2 0 0 1 4 0 6 5 6 问系统是否安全?若安全就
资源推荐
资源详情
资源评论
收起资源包目录
testQt5.zip (10个子文件)
testQt5
mainwindow.h 1017B
mainwindow.cpp 7KB
testQt5.pro.user 24KB
main.cpp 389B
mainwindow.ui 8KB
images.qrc 146B
images
background.jpg 85KB
picture2.jpeg 85KB
picture.jpeg 81KB
testQt5.pro 1KB
共 10 条
- 1
资源评论
琉LIUIL
- 粉丝: 8
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功