// 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�
没有合适的资源?快使用搜索试试~ 我知道了~
用c 语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()
共28个文件
tlog:6个
pdb:2个
h:2个
需积分: 43 104 下载量 53 浏览量
2018-07-16
00:47:04
上传
评论 16
收藏 3.26MB RAR 举报
温馨提示
请求指正建议,与君共勉: 用c 语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free(),其中,空闲分区通过空闲分区链来管理;在进行内存分配时,系统优先使用空闲区低端的空间。。。。 假设初始状态下,可用的内存空间为640KB,并有下列的请求序列: 作业1申请130KB 作业2申请60KB。。。。。
资源推荐
资源详情
资源评论
收起资源包目录
操作系统第二次实习——首次适应算法最佳适应算法实现进程申请释放.rar (28个子文件)
操作系统
.vs
操作系统
v15
Browse.VC.db 5.75MB
.suo 35KB
ipch
7e5256badbe58e7c.ipch 3.5MB
操作系统
stdafx.cpp 310B
stdafx.h 366B
targetver.h 370B
操作系统.vcxproj.user 165B
操作系统.vcxproj.filters 1KB
操作系统.cpp 12KB
Debug
stdafx.obj 6KB
操作系统.tlog
CL.write.1.tlog 646B
CL.read.1.tlog 20KB
CL.command.1.tlog 1KB
操作系统.lastbuildstate 198B
link.write.1.tlog 336B
link.command.1.tlog 1KB
link.read.1.tlog 4KB
操作系统.obj 353KB
vc141.idb 179KB
操作系统.pch 2.88MB
操作系统.log 209B
vc141.pdb 468KB
操作系统.vcxproj 8KB
操作系统.sln 1KB
Debug
操作系统.exe 118KB
操作系统.pdb 1.26MB
操作系统.ilk 1.28MB
191166魏踊澎.rar 758KB
共 28 条
- 1
资源评论
Ypbamboo
- 粉丝: 1
- 资源: 9
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 学校课程软件工程常见10道题目以及答案demo
- javaweb新手开发中常见的目录结构讲解
- 新手小白的git使用的手册入门学习demo
- 基于Java观察者模式的info-express多对多广播通信框架设计源码
- 利用python爬取豆瓣电影评分简单案例demo
- 机器人开发中常见的几道问题以及答案demo
- 基于SpringBoot和layuimini的简洁美观后台权限管理系统设计源码
- 实验报告五六代码.zip
- hdw-dubbo-ui基于vue、element-ui构建开发,实现后台管理前端功能.zip
- (Grafana + Zabbix + ASP.NET Core 2.1 + ECharts + Dapper + Swagger + layuiAdmin)基于角色授权的权限体系.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功