操作系统实验——动态分区分配方式的模拟

    技术2024-03-11  91

    #include<iostream> #include <vector> #define MAX 640 using namespace std; struct work { int id; int size; }; struct memory { int front_number; //前一个的序列号 int number; //序号 int id; //占用程序的id 0为未占用 bool flag;//0为未被占用,可被回收 int size; //大小 }; work process1 = { 1,130 }; work process2 = { 2,60 }; work process3 = { 3,100 }; work process4 = { 4,200 }; work process5 = { 5,140 }; work process6 = { 6,60 }; work process7 = { 7,50 }; struct memory M[2] = { {0,0,0,1,0}, {0,MAX,0,0,MAX} };//{0,0,0,1,0}是为了凑数,存储的时候从M[1]开始存储,输出也从M[1]开始输出。因为数组是从0算起的,这样的话可以让数组从1算起,与id对应上,方便思考。flag设为1表示本区域不可被回收 vector<memory> M_queue; memory temp; int chose; void M_merge(int mer_id) //合并 { if ((mer_id < M_queue.size() - 1) && (M_queue[mer_id + 1].flag == 0))//本区为回收区,下面为空闲区 { M_queue[mer_id + 1].size += M_queue[mer_id].size; M_queue[mer_id + 1].front_number = M_queue[mer_id].front_number; M_queue.erase(M_queue.begin() + mer_id);//erase为根据位置删除元素 } if (M_queue[mer_id - 1].flag == 0)//本区为回收区,上面为空闲区 { M_queue[mer_id - 1].size += M_queue[mer_id].size; M_queue[mer_id - 1].number = M_queue[mer_id].number; M_queue.erase(M_queue.begin() + mer_id); } } void M_print() { cout << "-----------------------------------" << endl; cout << "前序号\t序号\t程序ID\t内存大小\t标志" << endl; for (int i = 1; i < M_queue.size(); i++) cout << M_queue[i].front_number << "\t" << M_queue[i].number << "\t" << M_queue[i].id << "\t" << M_queue[i].size << "\t\t" << M_queue[i].flag << endl; cout << "-----------------------------------" << endl; cout << endl << endl; } void alloc(work p1) { if (chose == 1) //首次适应算法 { for (int i = 1; i < M_queue.size(); i++) { if ((M_queue[i].flag == 0) && p1.size < M_queue[i].size) { temp.flag = 1; temp.id = p1.id; temp.size = p1.size; temp.front_number = M_queue[i].front_number; temp.number = temp.front_number + temp.size; M_queue[i].front_number = temp.number; M_queue[i].size -= temp.size; M_queue.insert(M_queue.begin() + i, temp);//insert为在指定位置插入元素 break; } } } else if (chose == 2) //最佳适应算法 { int best_num = MAX;//记录目标空闲区大小 int best_i;//记录目标空闲区编号 for (int i = 1; i < M_queue.size(); i++)//找到只比p1.size大一点的空闲区,即目标空闲区 { if ((M_queue[i].flag == 0) && (M_queue[i].size >= p1.size) && (M_queue[i].size <= best_num)) { best_num = M_queue[i].size; best_i = i; } } temp.flag = 1; temp.id = p1.id; temp.size = p1.size; temp.front_number = M_queue[best_i].front_number; temp.number = temp.front_number + temp.size; M_queue[best_i].front_number = temp.number; M_queue[best_i].size -= p1.size; M_queue.insert(M_queue.begin() + best_i, temp); } M_print(); } void free(work p2) { int id; for (int i = 0; i < M_queue.size(); i++) { if (p2.id == M_queue[i].id) { M_queue[i].flag = 0; M_queue[i].id = 0; id = i; break; } } M_merge(id); M_print(); } int main() { M_queue.push_back(M[0]); M_queue.push_back(M[1]); cout << "初始空闲区"<<endl; M_print(); cout << "1、首次适应算法\n2、最佳适应算法\n请输入:"; cin >> chose; if (chose != 1 && chose != 2) { cout << "error" << endl; return 0; } cout << "alloc(process[1])" << endl; alloc(process1); cout << "alloc(process[2])" << endl; alloc(process2); cout << "alloc(process[3])" << endl; alloc(process3); cout << "free(process[2])" << endl; free(process2); cout << "alloc(process[4])" << endl; alloc(process4); cout << "free(process[3])" << endl; free(process3); cout << "free(process[1])" << endl; free(process1); cout << "alloc(process[5])" << endl; alloc(process5); cout << "alloc(process[6])" << endl; alloc(process6); cout << "alloc(process[7])" << endl; alloc(process7); cout << "free(process[6])" << endl; free(process6); return 0; }

    首次适应算法

    最佳适应算法

    Processed: 0.094, SQL: 9