[关闭]
@codejan 2018-11-13T12:53:02.000000Z 字数 1825 阅读 568

实验报告_银行家算法

操作系统


姓名:唐鉴恒 专业:数学与应用数学(基地) 学号:1507402086 日期:2017.11.1

实验内容

给定若干进程的资源占用情况,判断当前是否处于安全状态, 审核某个进程的请求是否可以被批准.
要求: 自行设计实验方案, 程序的输入和输出.

解决方案

对于每个进程的请求向量, 系统首先判断是否有足够的资源分配给, 如果没有, 先让等待, 并判断下个进程. 如果有足够的资源, 则正式把资源分配给该进程, 结束后, 系统回收这个进程占用的资源. 如此往复, 直到所有进程的请求都满足为止.
如果出现所有进程的请求都无法满足的情况, 则系统处于不安全状态, 向用户报错Error.

测试样例说明

第一行为资源种类数.
第二行一共个数, 代表系统每个资源持有数.
第三行为任务个数.
之后行, 每行有个数字, 前个数代表任务占有资源数, 后N个代表任务请求资源数.

运行结果

对于测试样例

  1. 3
  2. 3 3 2
  3. 5
  4. 0 1 0 7 4 3
  5. 2 0 0 1 2 2
  6. 3 0 2 6 0 0
  7. 2 1 1 0 1 1
  8. 0 0 2 4 3 1

运行结果为

  1. Duty 2 is finished.
  2. Current avaliable source:5 3 2
  3. Duty 4 is finished.
  4. Current avaliable source:7 4 3
  5. Duty 1 is finished.
  6. Current avaliable source:7 5 3
  7. Duty 3 is finished.
  8. Current avaliable source:10 5 5
  9. All duty is finished. Congratulations!

对于测试样例

  1. 4
  2. 5 5 5 5
  3. 3
  4. 1 5 5 3 4 6 6 4
  5. 1 0 0 1 0 0 0 1
  6. 2 3 2 4 4 6 6 5

运行结果为

  1. Duty 2 is finished.
  2. Current avaliable source:6 5 5 5
  3. Error: no enough source.

源码展示

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4. #define N 105
  5. int main(){
  6. int Source; //资源种类数
  7. int Available[N];//可利用资源向量
  8. int Duty; //进程数
  9. int Allocation[N][N]; //分配矩阵
  10. int Need[N][N]; //需求矩阵
  11. freopen("data.txt", "r", stdin);
  12. cin >> Source;
  13. for(int i = 1; i <= Source; i++) cin >> Available[i];
  14. cin >> Duty;
  15. for(int i = 1; i <= Duty; i++){
  16. for(int j = 1; j <= Source; j++){
  17. cin >> Allocation[i][j];
  18. }
  19. for(int j = 1; j <= Source; j++){
  20. cin >> Need[i][j];
  21. }
  22. }
  23. int cur = Duty+1;
  24. bool Finished[Duty];
  25. memset(Finished, 0, sizeof(Finished));
  26. while(cur--){
  27. if(cur == 0) {
  28. puts("All duty is finished. Congratulations!");
  29. break;
  30. }
  31. int flag = 0; //flag : if there is a satisfied duty.
  32. for(int i = 1; i <= Duty; i++){
  33. if(Finished[i]) continue;
  34. int flag_2 = 0; //flag_2 : if current duty is satisfied.
  35. for(int j = 1; j <= Source; j++){
  36. if(Need[i][j] > Available[j]) flag_2 = 1;
  37. }
  38. if(flag_2 == 0){
  39. flag = 1; //Successfully find a duty.
  40. Finished[i] = 1;
  41. for(int j = 1; j <= Duty; j++){
  42. Available[j] += Allocation[i][j];
  43. }
  44. cout<<"Duty "<<i<<" is finished."<<endl;
  45. cout<<"Current avaliable source:";
  46. for(int j = 1; j <= Source; j++){
  47. cout<<Available[j]<<" ";
  48. }
  49. cout<<endl;
  50. break;
  51. }
  52. }
  53. if(flag == 0) {
  54. puts("Error: no enough source.");
  55. getchar();
  56. exit(0);
  57. }
  58. }
  59. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注