// rd_manage.cpp: 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<string>
#include<vector>
using namespace std;
struct block //分区描述器
{
bool flag;
int size;
block *next;
block() { }
block(bool f, int s, block* n = nullptr) :flag(f), size(s), next(n) {}
};
struct Process { //进程
string name;
int begin;
int p_size;
Process(string n, int s, int b) :name(n), begin(b), p_size(s) {}
};
const int maxsize = 640;//m_rid主存资源信息块宏定义上限
block *first = new block(0, 40);
block *second = new block(0, 100);
block *third = new block(0, 200);
block *forth = new block(0, 300);
vector<Process> sequence;
void initiate() //初始化
{
first->next = second;
second->next = third;
third->next = forth;
}
void printmenu()
//输出菜单函数
{
cout << "*******************************" << endl;
cout << " 1.首次适应算法" << endl;
cout << " 2.最佳适应算法" << endl;
cout << " 3.退出 " << endl;
cout << "*******************************" << endl;
}
//首次适应算法
int first_time(string n, int s) {
block *b = first;
int addr = 0;
while (b != nullptr) { //寻找块
addr += (b->size + 1); //计算地址
if (b->flag == false) { //当前块未被占用
if (b->size > s) { //当前块的大小大于进程申请的大小
b->size -= (s + 1); //从当前块中减去进程申请的大小
block *bt = new block(true, s, b->next); //新建一个进程块
b->next = bt; //添加到当前块的后面
addr -= (s + 1); //重新计算当前块的地址
break;
}
else if (b->size == s) { //当前块的大小刚好够进程申请的大小
b->flag = true; //直接更改当前块的状态为已占用,不用分裂块
addr -= (s + 1); //重新计算地址
break;
}
else b = b->next; //当前块的大小不满足进程申请的大小,先后继续寻找。
}
else b = b->next; //当前块已被占用,先后继续寻找
}
if (b == nullptr) { //未找到符合条件的块,分配失败
return 0;
}
else { //找到符合条件的块,该进程存入lib进程库中
Process temp(n, s, addr);
sequence.push_back(temp);
return 1;
}
}
//最佳适应算法
int best(string n, int s) {
block *p = first, *q = nullptr;
int addr1 = 0, addr2 = 0;
int Error = maxsize;
while (p != nullptr) {
addr1 += (p->size + 1);
if (p->flag == false) { //当前块未被占用
if (p->size > s) { //当前块的大小满足进程请求的大小
if (p->size - s < Error) { //当前块更合适该进程
Error = p->size - s; //计算偏差
q = p; //保存当前块的地址
addr2 = addr1 - s - 1;
p = p->next; //指针后移
}
else p = p->next; //和之前的块相比,之前的块更合适该进程
}
else if (p->size == s) { //当前块的大小刚好等于进程申请的大小
q = p; //已找到最合适的块,保存当前块的信息并退出
addr2 = addr1 - s - 1;
Error = 0;
break;
}
else
p = p->next; //当前块的大小小于进程请求的大小,继续先后搜索
}
else
p = p->next; //当前块已经被占用,继续先后搜索
}
if (Error == maxsize) {
return 0;
}
else {
if (Error == 0)q->flag = true;
else {
q->size -= (s + 1); //从当前块中减去进程申请的大小
block* temp = new block(true, s, q->next); //新建一个进程块
q->next = temp; //添加到当前块的后面
}
Process temp(n, s, addr2);
sequence.push_back(temp);
return 1;
}
}
void alloc(int cho, int s, string n) {
int result;
if (1 == cho) {
cout << "=============首次适应算法=======================\n" << endl;
result = first_time(n, s);
}
else if (2 == cho) {
cout << "=============最佳适应算法=======================\n" << endl;
result = best(n, s);
}
if (!result) {
cout << "进程" << n << "无法得到" << s << "的主存资源!" << endl;
return;
}
else {
int addr;
for (int i = 0; i < sequence.size(); i++) {
if (n == sequence[i].name) {
addr = sequence[i].begin;
break;
}
}
cout << "进程" << n << "已申请到主存资源,起始地址为" << addr << endl;
return;
}
}
void free(string n) {
//在lib库中查找是否存在该进程
vector<Process>::iterator it = sequence.begin();
while (it != sequence.end()) {
if (it->name == n)
break;
else it++;
}
//该进程不存在,直接提示并退出函数
if (it == sequence.end()) {
c�
Ypbamboo
- 粉丝: 1
- 资源: 9
最新资源
- 14-【培训体系构建】-如何塑造一支高效的企业内训师队伍.doc.docx
- 15-【培训体系构建】-如何提高企业文化培训活动的实效性——5W2H.doc.docx
- 13-【培训体系构建】-如何进行企业文化培训评估.doc.docx
- 16-【激励体系构建】-员工满意度调查问卷.doc.docx
- 18-【激励体系构建】-如何有效实施企业文化考核?.doc.docx
- 20-【传播体系构建】-企业文化主题宣传计划表(不含活动).doc.docx
- 21-【传播体系构建】-企业文化传播载体分类清单.doc.docx
- 19-【激励体系构建】-企业文化激励方案设计表.doc.docx
- 22-【传播体系构建】-企业文化活动费用预算表.doc.docx
- 23-【传播体系构建】-联想的单向传播、双向传播与体验传播.doc.docx
- 24-【传播体系构建】-海尔企业文化的全方位传播.doc.docx
- 26-【融入体系构建】-以“八大体系”为核心的企业文化工作评估.doc.docx
- 25-【融入体系构建】-企业文化评估体系构建实践指导.doc.docx
- 27-【融入体系构建】-企业文化调查问卷.docx
- 28-【融入体系构建】-班组文化建设考核指标体系.doc.docx
- 30-【融入体系构建】-常用管理制度清单.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈