首次适应算法(FF)和循环首次适应算法(NF)

首次适应算法(FF)和循环首次适应算法(NF)

FF和NF算法都是基于顺序搜索的动态分区分配算法,在内存中检索一块分区分配给作业。如果空间大小合适则分配,如果找不到空间则等待。

FF算法按地址递增从头扫描空闲分区,如果找到空闲分区大小>=作业大小则分配。如果扫描完空闲分区表都没有找到分区,则分配失败。

NF算法和FF算法类似,但是NF算法每次分配都会记录下位置,下次分配的时候从记录的位置开始,循环扫描一遍空闲分区。


注:回收分区的算法写的和书上不太一样,书上是分配过后把分区从空闲分区链中移除,我是直接分配然后状态为设置为false,所以可能不太一样。








[cpp]  view plain  copy
  1. //公共模块,负责定义结构体,初始化,显示结果,回收  
  2. //BlockJob.h  
  3. #ifndef BLOCKJOB_H_  
  4. #define BLOCKJOB_H_  
  5.   
  6. #include <vector>  
  7.   
  8. const int MINSIZE = 10;     //最小不可分割分区大小  
  9.   
  10.                             //空闲分区  
  11. typedef struct block  
  12. {  
  13.     int start;  //开始地址  
  14.     int size;   //大小  
  15.     bool state; //分区状态 true:空闲 false:占用  
  16. }block;  
  17.   
  18. //作业  
  19. typedef struct job  
  20. {  
  21.     int size;   //作业大小  
  22.     int start;  //分配的分区首址  
  23.     int BlockSize;  //分配空闲分区的大小(可能大于作业大小)  
  24. };  
  25.   
  26. //初始化空闲分区与作业  
  27. void init(std::vector<block> &BlockList, std::vector<job> &JobList);  
  28.   
  29. //显示结果  
  30. void show(std::vector<block> &BlockList, std::vector<job> &JobList);  
  31.   
  32. //回收分区  
  33. void recycle(std::vector<block> &BlockList, std::vector<job> &JobList);  
  34.   
  35. #endif  
  36.   
  37. //BlockJob.cpp  
  38. #include "BlockJob.h"  
  39. #include <iostream>  
  40. #include <iomanip>  
  41.   
  42. //初始化空闲分区与作业  
  43. void init(std::vector<block> &BlockList, std::vector<job> &JobList)  
  44. {  
  45.     std::cout << "输入空闲分区数: ";  
  46.     int num;  
  47.     std::cin >> num;  
  48.   
  49.     std::cout << "输入空闲分区的起始地址与大小: \n";  
  50.     block temp;  
  51.     for (int i = 0; i < num; ++i)  
  52.     {  
  53.         std::cin >> temp.start >> temp.size;  
  54.         temp.state = true;  
  55.         BlockList.push_back(temp);  
  56.     }  
  57.   
  58.     std::cout << "输入作业数: ";  
  59.     std::cin >> num;  
  60.     std::cout << "输入作业的大小: \n";  
  61.     job tempj;  
  62.     for (int i = 0; i < num; ++i)  
  63.     {  
  64.         std::cin >> tempj.size;  
  65.         tempj.BlockSize = 0;  
  66.         tempj.start = 0;  
  67.         JobList.push_back(tempj);  
  68.     }  
  69. }  
  70.   
  71. //显示结果  
  72. void show(std::vector<block> &BlockList, std::vector<job> &JobList)  
  73. {  
  74.     using std::setw;  
  75.     std::cout.setf(std::ios_base::left);  
  76.   
  77.     std::cout << "空闲分区表: \n";  
  78.     std::cout << setw(10) << "分区号" << setw(10) << "分区大小" << setw(10) << "分区始址" << setw(10) << "状态" << std::endl;  
  79.     int num = 0;  
  80.     for (std::vector<block>::iterator it = BlockList.begin(); it != BlockList.end(); ++it, ++num)  
  81.         std::cout << setw(10) << num << setw(10) << (*it).size << setw(10) << (*it).start << setw(10) << (((*it).state == true) ? "空闲" : "占用") << std::endl;  
  82.   
  83.     std::cout << "作业信息: \n";  
  84.     std::cout << setw(10) << "作业号" << setw(10) << "作业大小" << setw(10) << "分区大小" << setw(10) << "分区始址" << std::endl;  
  85.     num = 0;  
  86.     for (std::vector<job>::iterator it = JobList.begin(); it != JobList.end(); ++it, ++num)  
  87.         std::cout << setw(10) << num << setw(10) << (*it).size << setw(10) << (*it).BlockSize << setw(10) << (*it).start << std::endl;  
  88. }  
  89.   
  90. //回收分区  
  91. void recycle(std::vector<block> &BlockList, std::vector<job> &JobList)  
  92. {  
  93.     std::cout << "输入回收分区的首址: ";  
  94.     int start;  
  95.     std::cin >> start;  
  96.   
  97.     for (std::vector<block>::iterator it = BlockList.begin(); it != BlockList.end(); ++it)  
  98.     {  
  99.         //找到要回收的分区  
  100.         if (start == (*it).start)  
  101.         {  
  102.             //与前一个分区邻接  
  103.             if (it != BlockList.begin() && (*(it - 1)).start + (*(it - 1)).size == (*it).start)  
  104.             {  
  105.                 //与后一个分区邻接  
  106.                 if (it != BlockList.end() - 1 && (*it).start + (*it).size == (*(it + 1)).start)  
  107.                 {  
  108.                     //将前一块分区,要回收的分区,后一块分区合并  
  109.                     (*(it - 1)).size += (*it).size + (*(it + 1)).size;  
  110.                     (*(it - 1)).state = true;  
  111.                     BlockList.erase(it);  
  112.                     BlockList.erase(it);  
  113.                 }  
  114.                 else    //不与后一个分区邻接  
  115.                 {  
  116.                     //将此分区与前一个分区合并  
  117.                     (*(it - 1)).size += (*it).size;  
  118.                     (*(it - 1)).state = true;  
  119.                     BlockList.erase(it);  
  120.                 }  
  121.             }  
  122.             else if(it != BlockList.end()-1 && (*it).start +(*it).size == (*(it+1)).start)  //不与前一个分区邻接,与后一个分区邻接  
  123.             {  
  124.                 //将此分区与后一个分区合并  
  125.                 (*it).size += (*(it + 1)).size;  
  126.                 (*it).state = true;  
  127.                 BlockList.erase(it + 1);  
  128.             }  
  129.             else    //都不邻接  
  130.             {  
  131.                 (*it).state = true;  
  132.             }  
  133.             break;  
  134.         }  
  135.     }  
  136.   
  137.     for (std::vector<job>::iterator it = JobList.begin(); it != JobList.end(); ++it)  
  138.     {  
  139.         if ((*it).start == start)  
  140.         {  
  141.             (*it).BlockSize = (*it).start = 0;  
  142.             break;  
  143.         }  
  144.     }  
  145. }  


[cpp]  view plain  copy
  1. //FF.cpp  
  2. #include "BlockJob.h"  
  3.   
  4. //FF算法  
  5. void FF(std::vector<block> &BlockList, std::vector<job> &JobList);  
  6.   
  7. int main()  
  8. {  
  9.     std::vector<block> BlockList;  
  10.     std::vector<job> JobList;  
  11.   
  12.     //初始化空闲分区与作业  
  13.     init(BlockList, JobList);  
  14.   
  15.     //FF算法  
  16.     FF(BlockList, JobList);  
  17.   
  18.     //显示结果  
  19.     show(BlockList, JobList);  
  20.   
  21.     //回收分区  
  22.     recycle(BlockList, JobList);  
  23.   
  24.     //显示结果  
  25.     show(BlockList, JobList);  
  26.   
  27.     return 0;  
  28. }  
  29.   
  30. //FF算法  
  31. void FF(std::vector<block> &BlockList, std::vector<job> &JobList)  
  32. {  
  33.     for (std::vector<job>::iterator ItJob = JobList.begin(); ItJob != JobList.end(); ++ItJob)  
  34.     {  
  35.         for (std::vector<block>::iterator ItBlock = BlockList.begin(); ItBlock != BlockList.end(); ++ItBlock)  
  36.         {  
  37.             //分区未被使用且能够装下作业  
  38.             if ((*ItBlock).state && (*ItBlock).size >= (*ItJob).size)  
  39.             {  
  40.                 if ((*ItBlock).size - (*ItJob).size > MINSIZE)   //剩余空间还可以继续分配  
  41.                 {  
  42.                     (*ItBlock).state = false;  
  43.   
  44.                     //修改作业信息,分配空间  
  45.                     (*ItJob).start = (*ItBlock).start;  
  46.                     (*ItJob).BlockSize = (*ItJob).size;  
  47.   
  48.                     //添加新表项  
  49.                     block NewBlock;  
  50.                     NewBlock.start = (*ItBlock).start + (*ItJob).size;  
  51.                     NewBlock.size = (*ItBlock).size - (*ItJob).size;  
  52.                     NewBlock.state = true;  
  53.                     (*ItBlock).size = (*ItJob).size;  
  54.                     BlockList.insert(ItBlock + 1, NewBlock);  
  55.   
  56.                 }  
  57.                 else        //剩余空间不可分配,全部分配给此作业  
  58.                 {  
  59.                     (*ItBlock).state = false;  
  60.   
  61.                     //修改作业信息,分配空间  
  62.                     (*ItJob).start = (*ItBlock).start;  
  63.                     (*ItJob).BlockSize = (*ItBlock).size;  
  64.                 }  
  65.   
  66.                 break;  
  67.             }  
  68.         }  
  69.     }  
  70. }  


[cpp]  view plain  copy
  1. //NF.cpp  
  2. #include "BlockJob.h"  
  3.   
  4. //NF算法  
  5. void NF(std::vector<block> &BlockList, std::vector<job> &JobList);  
  6.   
  7. int main()  
  8. {  
  9.     std::vector<block> BlockList;  
  10.     std::vector<job> JobList;  
  11.   
  12.     //初始化空闲分区与作业  
  13.     init(BlockList, JobList);  
  14.   
  15.     //NF算法  
  16.     NF(BlockList, JobList);  
  17.   
  18.     //显示结果  
  19.     show(BlockList, JobList);  
  20.   
  21.     //回收分区  
  22.     recycle(BlockList, JobList);  
  23.   
  24.     //显示结果  
  25.     show(BlockList, JobList);  
  26.   
  27.     return 0;  
  28. }  
  29.   
  30. //NF算法  
  31. void NF(std::vector<block> &BlockList, std::vector<job> &JobList)  
  32. {  
  33.     int pos = 0;        //上一次查找的位置  
  34.   
  35.     for (std::vector<job>::iterator ItJob = JobList.begin(); ItJob != JobList.end(); ++ItJob)  
  36.     {  
  37.         std::vector<block>::iterator ItBlock = BlockList.begin() + pos;  
  38.         do {  
  39.             //分区未被使用且能够装下作业  
  40.             if ((*ItBlock).state && (*ItBlock).size >= (*ItJob).size)  
  41.             {  
  42.                 pos = &(*ItBlock) - &BlockList[0];  //记录此次分配位置  
  43.                 if ((*ItBlock).size - (*ItJob).size > MINSIZE)   //剩余空间还可以继续分配  
  44.                 {  
  45.                     (*ItBlock).state = false;  
  46.   
  47.                     //修改作业信息,分配空间  
  48.                     (*ItJob).start = (*ItBlock).start;  
  49.                     (*ItJob).BlockSize = (*ItJob).size;  
  50.   
  51.                     //添加新表项  
  52.                     block NewBlock;  
  53.                     NewBlock.start = (*ItBlock).start + (*ItJob).size;  
  54.                     NewBlock.size = (*ItBlock).size - (*ItJob).size;  
  55.                     NewBlock.state = true;  
  56.                     (*ItBlock).size = (*ItJob).size;  
  57.                     BlockList.insert(ItBlock + 1, NewBlock);  
  58.   
  59.                 }  
  60.                 else        //剩余空间不可分配,全部分配给此作业  
  61.                 {  
  62.                     (*ItBlock).state = false;  
  63.   
  64.                     //修改作业信息,分配空间  
  65.                     (*ItJob).start = (*ItBlock).start;  
  66.                     (*ItJob).BlockSize = (*ItBlock).size;  
  67.                 }  
  68.   
  69.                 break;  
  70.             }  
  71.   
  72.             ++ItBlock;  
  73.             if (ItBlock == BlockList.end())  
  74.                 ItBlock = BlockList.begin();  
  75.         } while (pos != &(*ItBlock) - &BlockList[0]);  
  76.     }  
  77. }  

  • 5
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值