操作系统实验之银行家算法模拟

骑猪看日落 2022-06-15 06:58 379阅读 0赞

操作系统实验之银行家算法模拟


  • 银行家算法中的数据结构
  1. * 可利用资源向量 Available
  2. Available\[i\] 表示第 i 种资源可利用的数目
  3. * 最大需求矩阵 Max
  4. Max\[i\]\[j\] 表示第 i 个进程最多需要的第 j 类资源的数目
  5. * 分配矩阵 Allocation
  6. Allocation\[i\]\[j\] 表示第 i 个进程已经占有的第 j 类资源的数目
  7. * 需求矩阵 Need
  8. Need\[i\]\[j\] 表示第 i 个进程还需要的第 j 类资源的数量
  • 详细介绍
  1. * [银行家算法详细介绍][Link 1]
  • 代码:

    include

    include

    include

    include

    using namespace std;

    const int MAX_RESOURCES_NUM = 100; //系统资源的最大种类
    const int MAX_PROCESS_NUM = 100; //进程的最大数量
    queue SecuritySequence; //保存安全序列的队列

    struct SYSTEM //定义系统状态,关系为:Need[i][j] = Max[i][j] - Allocation[i][j]
    {

    1. int Finish[MAX_PROCESS_NUM]; //标记进程是否被完成
    2. int Available[MAX_RESOURCES_NUM]; //可利用资源向量,第i种资源的数量为Available[i]
    3. int Max[MAX_PROCESS_NUM][MAX_RESOURCES_NUM]; //最大需求矩阵,第i个进程对第j个资源的最大需求为Max[i][j]
    4. int Allocation[MAX_PROCESS_NUM][MAX_RESOURCES_NUM]; //分配矩阵,第i个进程已获得第j个资源的数量为Allocation[i][j]
    5. int Need[MAX_PROCESS_NUM][MAX_RESOURCES_NUM]; //需求矩阵,第i个进程还需要第j个资源的数量为Need[i][j]

    };

    //安全性算法,判断系统是否存在安全序列。已决定是否分配资源给进程,传入参数为当前系统的状态。进程数,资源数
    int IsSafe(SYSTEM status,int process_num,int resources_num)
    {

    1. //由于需要不断循环的寻找可以分配资源的进程,需要找一个循环的最大圈数
    2. //分析:每一次循环都要找到一个可分配资源的进程,否则下一次循环也找不到可分配资源的进程
    3. //即最大的圈数为资源的种类数
    4. while(!SecuritySequence.empty()) //置空安全序列
    5. SecuritySequence.pop();
    6. for(int i = 0; i < process_num; i++)
    7. {
    8. int have_process = 0; //标记该趟是否可以找到可调度的进程。
    9. for(int j = 0; j < process_num; j++)
    10. {
    11. if(status.Finish[j] == 0) //进程程j未被完成
    12. {
    13. int success = 1; //由于标记系统可分配的各类资源是否满足进程j的需求
    14. for(int k = 0; k < resources_num; k++) //检查系统可分配的各类资源是否满足进程j的需求
    15. {
    16. if(status.Available[k] < status.Need[j][k]) //系统有一类资源不满足进程需求
    17. {
    18. success = 0;
    19. break;
    20. }
    21. }
    22. if(success == 1) //系统所有类资源都满足进程需求,调度进程 j ,运行完成 j ,并回收资源。
    23. {
    24. have_process = 1; //已找到可调度的进程
    25. status.Finish[j] = 1; //标记进程 j 已完成
    26. for(int l = 0; l < resources_num; l++) //回收各类资源
    27. {
    28. status.Available[l] += status.Allocation[j][l];
    29. }
    30. SecuritySequence.push(j); //进程 j 入队保存
    31. }
    32. }
    33. }
    34. if(have_process == 0) //没有可调度的进程跳出;
    35. {
    36. break;
    37. }
    38. }
    39. int is_safe = 1;
    40. for(int i = 0; i < process_num; i++) //判断所有进程是否以完成,如果已完成则存在安全序列,否则,不存在;
    41. {
    42. if(status.Finish[i] == 0) //有进程未被调度,所有不存在安全序列;
    43. is_safe = 0;
    44. }
    45. return is_safe;

    }

    //银行家算法
    int BankerAlgorithm(SYSTEM status,int process_num,int resources_num,int process,int Request[])
    {

    1. for(int i = 0; i < resources_num; i++) //判断需求资源是否大于最大需求
    2. {
    3. if(Request[i] > status.Need[process][i]) //需求资源大于最大需求,出错
    4. {
    5. printf("需求资源大于最大需求\n");
    6. return 0;
    7. }
    8. }
    9. for(int i = 0; i < resources_num; i++) //需求资源是否大于可分配资源
    10. {
    11. if(Request[i] > status.Available[i]) //需求资源大于可分配资源,无法调度
    12. {
    13. printf("需求资源大于可分配资源\n");
    14. return 0;
    15. }
    16. }
    17. //满足分配要求。试探性分配,并判断是否存在安全序列
    18. for(int i = 0; i < resources_num; i++)
    19. {
    20. //试探性分配
    21. status.Available[i] -= Request[i];
    22. status.Allocation[process][i] += Request[i];
    23. status.Need[process][i] -= Request[i];
    24. }
    25. //判断是否存在安全序列
    26. if(IsSafe(status,process_num,resources_num))
    27. {
    28. printf("存在安全序列:\n");
    29. while(!SecuritySequence.empty()) //输出安全序列
    30. {
    31. printf("%d ",SecuritySequence.front());
    32. SecuritySequence.pop();
    33. }
    34. return 1;
    35. }
    36. else //没有安全序列,试探性分配作废
    37. {
    38. printf("不存在安全序列,不分配资源\n");
    39. for(int i = 0; i < resources_num; i++)
    40. {
    41. status.Available[i] += Request[i];
    42. status.Allocation[process][i] -= Request[i];
    43. status.Need[process][i] += Request[i];
    44. return 0;
    45. }
    46. }

    }

    //输出系统状态
    void display(SYSTEM status,int process_num,int resources_num)
    {

    1. //系统状态Available
    2. printf("系统状态Available:\n");
    3. for(int i = 0; i < resources_num; i++)
    4. printf("%d ",status.Available[i]);
    5. putchar('\n');
    6. //系统状态最大需求矩阵Max
    7. printf("请初始化系统状态最大需求矩阵Max:\n");
    8. for(int i = 0; i < process_num; i++)
    9. {
    10. for(int j = 0; j < resources_num; j++)
    11. {
    12. printf("%d ",status.Max[i][j]);
    13. }
    14. putchar('\n');
    15. }
    16. //系统状态最大需求矩阵Allocation
    17. printf("可利用资源向量Allocation:\n");
    18. for(int i = 0; i < process_num; i++)
    19. {
    20. for(int j = 0; j < resources_num; j++)
    21. {
    22. printf("%d ",status.Allocation[i][j]);
    23. }
    24. putchar('\n');
    25. }
    26. //需求矩阵Need
    27. printf("需求矩阵Need\n");
    28. for(int i = 0; i < process_num; i++)
    29. {
    30. for(int j = 0; j < resources_num; j++)
    31. {
    32. printf("%d ",status.Need[i][j]);
    33. }
    34. putchar('\n');
    35. }

    }

    int main(int argc, char* argv[])
    {
    // //重定义输出输入流至文件
    // freopen(“data.in”,”r”,stdin);
    // freopen(“data.out”,”w”,stdout);

    1. SYSTEM status; //定义系统状态
    2. int resources_num,process_num; //定义资源数,进程数
    3. //始化进程数,和资源种数
    4. printf("请初始化进程数,和资源种数:\n");
    5. scanf("%d %d",&process_num,&resources_num);
    6. //始化系统状态Available
    7. printf("请初始化系统状态Available:\n");
    8. for(int i = 0; i < resources_num; i++)
    9. scanf("%d",&status.Available[i]);
    10. //始化系统状态最大需求矩阵Max
    11. printf("请初始化系统状态最大需求矩阵Max:\n");
    12. for(int i = 0; i < process_num; i++)
    13. {
    14. for(int j = 0; j < resources_num; j++)
    15. {
    16. scanf("%d",&status.Max[i][j]);
    17. }
    18. }
    19. //始化系统状态最大需求矩阵Allocation
    20. printf("请初始化可利用资源向量Allocation:\n");
    21. for(int i = 0; i < process_num; i++)
    22. {
    23. for(int j = 0; j < resources_num; j++)
    24. {
    25. scanf("%d",&status.Allocation[i][j]);
    26. }
    27. }
    28. //自动处理需求矩阵Need
    29. for(int i = 0; i < process_num; i++)
    30. {
    31. for(int j = 0; j < resources_num; j++)
    32. {
    33. status.Need[i][j] = status.Max[i][j] - status.Allocation[i][j];
    34. }
    35. }
    36. int process; //记录资源请求的进程的号
    37. int Request[MAX_RESOURCES_NUM]; //记录该进程对各资源请求的数量
    38. if(IsSafe(status,process_num,resources_num) == 0)
    39. {
    40. printf("初始状态不存在安全序列\n");
    41. return 0;
    42. }
    43. else
    44. {
    45. printf("初始状态安全\n");
    46. printf("存在安全序列:\n");
    47. while(!SecuritySequence.empty()) //输出安全序列
    48. {
    49. printf("%d ",SecuritySequence.front());
    50. SecuritySequence.pop();
    51. }
    52. putchar('\n');
    53. }
    54. while(1) //模拟系统运行
    55. {
    56. display(status,process_num,resources_num);
    57. printf("请输入资源请求:process\n");
    58. int process;
    59. int Request[MAX_RESOURCES_NUM];
    60. scanf("%d",&process);
    61. if(process == -1)
    62. break;
    63. printf("请输入资源请求:Request[](the length of the Request is that of resources_num)\n");
    64. for(int i = 0; i < resources_num; i++)
    65. {
    66. scanf("%d",&Request[i]);
    67. }
    68. if(BankerAlgorithm(status,process_num,resources_num,process,Request) == 1)
    69. {
    70. int process_end = 1; //判断进程是否执行完
    71. for(int i = 0; i < resources_num; i++)
    72. {
    73. status.Available[i] -= Request[i];
    74. status.Allocation[process][i] += Request[i];
    75. status.Need[process][i] -= Request[i];
    76. if(status.Need[process][i] != 0)
    77. process_end = 0;
    78. }
    79. printf("资源分配成功\n");
    80. //进程执行完,回收资源
    81. if(process_end)
    82. {
    83. printf("进程P%d执行完,释放资源\n",process);
    84. for(int i = 0; i < resources_num; i++)
    85. {
    86. status.Available[i] += status.Allocation[process][i];
    87. }
    88. }
    89. }
    90. }
    91. return 0;

    }

发表评论

表情:
评论列表 (有 0 条评论,379人围观)

还没有评论,来说两句吧...

相关阅读