#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
#define MAXPROCESS 50
#define MAXRESOURCE 100
int available[MAXRESOURCE]; // 可利用资源向量:每类资源可利用数量,随着进程的分配和回收改变
int max[MAXPROCESS][MAXRESOURCE]; // 最大需求矩阵:每个进程对每个资源的最大需求量
int allocation[MAXPROCESS][MAXRESOURCE]; // 分配矩阵:每个进程已分配的各个资源数量
int need[MAXPROCESS][MAXRESOURCE]; // 需求矩阵:每个进程尚需的资源需求量 need = max - allocation
int security[MAXPROCESS]; // 进程执行序列
int work[MAXRESOURCE]; // 工作向量:初值available
int finish[MAXRESOURCE]; // 系统是否有足够资源分配给进程:初值false
int pindex;
int index; // 申请资源的进程索引
int request[MAXRESOURCE]; // 申请资源数组
int flag; // 申请资源是否合理的flag
int process_num, source_num; // process_num个进程,source_num个资源
QString name[26] = {"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
// 产生信息表按钮事件
void MainWindow::on_pushButton_clicked()
{
int i, j;
QTableWidgetItem* item;
QString txt;
process_num = ui->lineEdit->text().toInt();
source_num = ui->lineEdit_2->text().toInt();
ui->tableWidget->setRowCount(process_num); // 设置行数
ui->tableWidget->setColumnCount(source_num); // 设置列数
ui->tableWidget_2->setRowCount(process_num);
ui->tableWidget_2->setColumnCount(source_num);
ui->tableWidget_3->setRowCount(1);
ui->tableWidget_3->setColumnCount(source_num);
ui->tableWidget_3->setVerticalHeaderItem(0, new QTableWidgetItem("P"));
ui->tableWidget_4->setColumnCount(source_num);
ui->tableWidget_5->setRowCount(1);
ui->tableWidget_5->setColumnCount(source_num);
ui->tableWidget_5->setVerticalHeaderItem(0, new QTableWidgetItem("P"));
for (i = 0; i < source_num; i++) //改变单元格宽度
{
ui->tableWidget->setColumnWidth(i, 50);
ui->tableWidget_2->setColumnWidth(i, 50);
ui->tableWidget_3->setColumnWidth(i, 50);
ui->tableWidget_4->setColumnWidth(i, 50);
ui->tableWidget_5->setColumnWidth(i, 50);
}
for (i = 0; i < process_num; i++) //设置标题
{
item = new QTableWidgetItem;
txt = "P" + QString::number(i + 1, 10);
item->setText(txt);
QStringList header;
for(int i=0;i<source_num;i++)
header << name[i];
ui->tableWidget->setHorizontalHeaderLabels(header);
ui->tableWidget_2->setHorizontalHeaderLabels(header);
ui->tableWidget_3->setHorizontalHeaderLabels(header);
ui->tableWidget_4->setHorizontalHeaderLabels(header);
ui->tableWidget_5->setHorizontalHeaderLabels(header);
ui->tableWidget->setVerticalHeaderItem(i, item);
ui->tableWidget_2->setVerticalHeaderItem(i, item);
ui->tableWidget_4->setVerticalHeaderItem(i, item);
}
for (i = 0; i < process_num; i++) // 每次重新输入清零
for (j = 0; j < source_num; j++)
{
ui->tableWidget->setItem(i, j, new QTableWidgetItem(""));
ui->tableWidget_2->setItem(i, j, new QTableWidgetItem(""));
ui->tableWidget_4->setItem(i, j, new QTableWidgetItem(""));
}
for (i = 0; i < source_num; i++){ // 每次重新输入清零
ui->tableWidget_3->setItem(0, i, new QTableWidgetItem(""));
ui->tableWidget_5->setItem(0, i, new QTableWidgetItem(""));
}
ui->textBrowser->setPlainText("");
ui->comboBox->clear();
for(i = 0; i < process_num; i++) // 设置comboBox的下拉选项
ui->comboBox->addItem("P" + QString::number(i+1, 10));
}
void MainWindow::clear()
{
for (int l = 0; l < process_num; l++)
{
security[l] = 0;
}
}
void MainWindow::safe()
{
int i, j, k=0, m, apply;
for(j=0;j<source_num;j++)
work[j] = available[j];
for(i=0;i<process_num;i++)
finish[i] = false;
for(i=0;i<process_num;i++){
apply = 0;
for(j=0;j<source_num;j++){
if(finish[i] == false && need[i][j] <= work[j]){
apply++;
if(apply == source_num){
for(m=0;m<source_num;m++){
work[m] = work[m] + allocation[i][m];
}
finish[i] = true;
security[k++] = i;
if(i == (process_num - 1))
i = - 1;
}
}
}
}
for(pindex = 0; pindex < process_num; pindex++){
if(finish[pindex] == false)
break;
}
if(pindex == process_num){
for (j = 0; j < source_num; j++)
{
//必须先设置item,然后再获取,因为默认是空的
QTableWidgetItem *item0 = new QTableWidgetItem(QString::number(available[j]));
ui->tableWidget_3->setItem(0, j, item0);
}
ui->textBrowser->append(" 系统处于安全状态! ");
ui->textBrowser->append(" 建议安全执行序列为: ");
for (j = 0; j < process_num; j++)
{
ui->textBrowser->insertPlainText("P ");
ui->textBrowser->insertPlainText(QString::number(security[j] + 1));
if (j < (process_num - 1))
ui->textBrowser->insertPlainText(" ==> ");
}
}
else
ui->textBrowser->append(" 系统当前处于不安全状态! ");
clear();
}
// 尝试将资源分配给第i个进程
int test(int i)
{
for(int j = 0; j < source_num; j++){
available[j] = available[j] - request[j];
allocation[i][j] = allocation[i][j] + request[j];
need[i][j] = need[i][j] - request[j];
}
return true;
}
int retest(int i)
{
for(int j = 0; j < source_num; j++){
available[j] = available[j] + request[j];
allocation[i][j] = allocation[i][j] - request[j];
need[i][j] = need[i][j] + request[j];
}
return true;
}
void MainWindow::bank(){
int i, j;
flag = true;
index = ui->comboBox->currentIndex();
for(j = 0; j < source_num; j++)
request[j] = ui->tableWidget_5->item(0, j)->text().toInt();
for(j = 0; j < source_num; j++){
if(request[j] > need[index][j]){
flag = false;
ui->textBrowser->insertPlainText("\n");
ui->textBrowser->insertPlainText("进程申请的资源大于它所需要的资源!");
ui->textBrowser->insertPlainText("分配不合理,请重新分配!");
break;
}
else{
if(request[j] > available[j]){
flag = false;
ui->textBrowser->insertPlainText("\n");
ui->textBrowser->insertPlainText("进程申请的资源大于现在可利用的资源!");
ui->textBrowser->insertPlainText("分配不合理,请重新分配");
break;
}
}
}
if(flag){
test(index);
safe();
if(pindex != process_num)
retest(index);
for(j = 0; j < source_num; j++){
QTableWidgetItem *item0 = new QTableWidgetItem(QString::number(allocation[index][j]));
ui->tableWidget_2->setItem(index, j, item0);
}
for(i = 0; i < process_num; i++){
for(j = 0; j < source_num; j++){
QTableWidgetItem *item0 = new QTableWidgetItem(QString::number(need[index][j]));
ui->tableWidget_4->setItem(index, j, item0);
}
}
}
}
// 输入判断+安全性判断
void MainWindow::on_pushButton_2_clicked()
{
int i = 0, j = 0;
bool flag1 = 0, flag2 = 0, flag3 = 0;
int temp[source_num];
for(i = 0; i <source_nu
没有合适的资源?快使用搜索试试~ 我知道了~
操作系统实验:编程实现银行家算法(有界面 QT 可视化)
共6个文件
cpp:2个
h:1个
user:1个
需积分: 5 22 下载量 107 浏览量
2022-07-14
12:31:44
上传
评论 15
收藏 8KB ZIP 举报
温馨提示
编程实现银行家算法 1、实验目的:加深对于进程死锁避免的了解,掌握使用银行家算法实 现死锁避免的编程方法。 2、实验说明:设系统中有 3 种类型的资源(A,B,C)和 5 个进程 P1、 P2、P3、P4、P5,A 资源的数量为 17,B 资源的数量为 5,C 资源的 数量为 20。 编写一个图形界面程序,可以: 1、判断 T0时刻是否为安全状态?若是,请给出安全序列。 2、在 T0时刻,对进程 P2 请求资源(m,n,p),m、n、p 分别 是申请的 A、B、C 资源数(大于等于零的整型值,由程序提供接口, 让用户动态输入),程序可以判断是否能实施资源分配。
资源详情
资源评论
资源推荐
收起资源包目录
BankAlgorithm.zip (6个子文件)
BankAlgorithm
BankAlgorithm.pro 1021B
BankAlgorithm.pro.user 22KB
main.cpp 183B
mainwindow.ui 10KB
mainwindow.cpp 12KB
mainwindow.h 526B
共 6 条
- 1
EuphoriaTime
- 粉丝: 4
- 资源: 7
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0