日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

操作系统实验 连续内存分配 首次适应(FF)算法

發布時間:2023/12/16 windows 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 操作系统实验 连续内存分配 首次适应(FF)算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.實驗要求

操作系統實驗——編程實現首次適應算法。已知作業名、作業大小、作業提交時間、內存容量、碎片大小,要求使用分區大小不等的內存分區方法和首次適應分配算法給每次到來的作業分配內存。輸出內存分區情況和分配情況。

2.算法描述

分區大小不等的內存分區法:
可把內存區劃分成含有多個較小的分區、適量的中等分區及少量的大分區。
首次適應算法(first fit):
在分配內存時,從鏈首開始順序查找,直至找到一個大小能滿足要求的空閑分區為止;如果分區大小-作業大小<=碎片,則直接分配,否則,按照作業的大小,從該分區中劃出一塊內存空間分配給請求者,余下的空閑分區仍留在空閑鏈中。若從鏈首直至鏈尾都不能找到一個能滿足要求的分區,則此次內存分配失敗,返回。

3.實驗源碼

#include<stdio.h> #include<iostream> #include<iomanip> using namespace std;//操作系統實驗 基于順序搜索的連續 動態分區分配算法 按地址遞增 首次適應算法 #define Free 0 // 空閑狀態 // #define Busy 1 // 已用狀態 // #define OK 1 // 完成 #define ERROR 0 // 出錯 #define MAX_length 640 // 最大內存空間為640KB #define Begin_address 0 // 初始地址從 0 開始 #define Size 10 // 不可分割的最小值 typedef int Status;typedef struct freearea // 定義一個空閑區說明表結構 {int ID;long size;long address;int state; }ElemType;typedef struct DuLNode // double linked list {ElemType data;struct DuLNode *prior; // 前趨指針struct DuLNode *next; // 后繼指針 }DuLNode, *DuLinkList;int n; DuLinkList block_first; // 頭結點 DuLinkList block_last; // 尾結點 //==============================================// void alloc(); // 內存分配 Status free2(int); // 內存回收 Status free1(int); // 作業回收 Status First_fit(int, int); // 首次適應算法 void show(); // 查看分配 Status Initblock(); // 開創空間表 Status Allocation(int, int); // 傳入分區名及大小//==============創建雙向鏈表=========================// Status Initblock() // 開創帶頭結點的內存空間鏈表 {block_first = (DuLinkList)malloc(sizeof(DuLNode));block_last = (DuLinkList)malloc(sizeof(DuLNode));block_first->prior = NULL;block_first->next = block_last;block_first->data.state = 3; // 便于 編程 block_last->prior = block_first;block_last->next = NULL;block_last->data.address = Begin_address;block_last->data.size = MAX_length;block_last->data.ID = 0;block_last->data.state = Free;return 1; }//============ 動態分區 ========================//Status Allocation(int ID, int request) // 傳入分區名及大小 {// 為申請作業開辟新空間且初始化DuLinkList temp = (DuLinkList)malloc(sizeof(DuLNode));temp->data.ID = ID;temp->data.size = request;temp->data.state = 1;DuLNode *p = block_first->next;while (p){if (p->data.ID == ID){p->data.size += request;DuLNode *r = p->next;while (p){p->data.address += request;p = p->next;}return 1;break;}if (p->data.state == Free && p->data.size == request){// 有大小恰好合適的空閑塊p->data.state = 1;p->data.ID = ID;return 1;break;}if (p->data.state == Free && p->data.size > request){// 有空閑塊能滿足需求且有剩余temp->prior = p->prior;temp->next = p;p->prior->next = temp;p->prior = temp;temp->data.address = p->data.address; // 地址 p->data.address = temp->data.address + temp->data.size;p->data.size = p->data.size - request;return 1;break;}p = p->next;}return ERROR; }//==================== 首次適應算法 =======//Status First_fit(int ID, int request) {// cout<<ID<<" "<<request;DuLinkList temp = (DuLinkList)malloc(sizeof(DuLNode));temp->data.ID = ID;temp->data.size = request;temp->data.state = 2;DuLNode *p = block_first->next;while (p){if ((p->data.state == 1) && (p->data.size - request >= 0) && (p->data.size - request <= Size)){// 有大小恰好合適的空閑塊 或所剩為碎片p->data.state = 2;p->data.ID = ID;return 1;break;}if ((p->data.state == 1) && (p->data.size - request > Size)){// 有空閑塊能滿足需求且有剩余temp->prior = p->prior;temp->next = p;p->prior->next = temp;p->prior = temp;temp->data.address = p->data.address; // 地址 p->data.address = temp->data.address + temp->data.size;p->data.size = p->data.size - temp->data.size;return 1;break;}p = p->next;}return ERROR; } //====================分區 =======================// void alloc() {int ID, request;cout << "請輸入分區號、需要分配的主存大小(單位:KB):";cin >> ID >> request;if (request < 0 || request == 0){cout << "分配大小不合適,請重試!" << endl;}if (Allocation(ID, request) == 1)cout << "分配成功!" << endl;elsecout << "內存不足,分配失敗!" << endl; }//================== 主存回收 ===================//Status free2(int ID) {DuLNode *p = block_first;while (p){if (p->data.ID == ID){if (p->data.state == 0)cout << "\n區間:" << ID << " 已回收!\n";elsecout << "\n分區:" << ID << " 回收成功!" << endl;p->data.state = 0;// 與前面的空閑塊相連if (p->prior->data.state == 0){p->prior->data.size += p->data.size;p->prior->next = p->next;p->next->prior = p->prior;p = p->prior; // 指針 前移 }// 與后面的空閑塊相連if (p->next->data.state == 0){p->data.size += p->next->data.size;if (p->next->next == NULL) { p->next = NULL; }else{p->next->next->prior = p;p->next = p->next->next;}}break;}p = p->next;}return 1; }//=========== 撤銷作業 ===================//Status free1(int ID) {int i = 1;DuLNode *p = block_first;while (p){if (p->data.ID == ID){if (p->data.state == 2)cout << "\n作業:" << ID << " 撤銷成功!" << endl;if (p->data.state == 1)cout << "\n作業:" << ID << " 已撤銷!" << endl;if (p->data.state == 0)cout << "\n區間:" << ID << " 未分配!" << endl;p->data.state = 1;// 與前面的空閑塊相連if (p->prior->data.state == 1){p->prior->data.size += p->data.size;p->prior->next = p->next;p->next->prior = p->prior;p = p->prior; // 指針 前移 }// 與后面的空閑塊相連if (p->next->data.state == 1){p->data.size += p->next->data.size;if (p->next->next == NULL) { p->next = NULL; }else{p->next->next->prior = p;p->next = p->next->next;}}break;}p = p->next;}return 1; }//==================== 顯示主存分配情況 ====//void show() {// cout<<"主存分配情況 : \n"; DuLNode *p = block_first->next;printf("\n\n分區(作業)號 起始地址 所占內存大小(KB) 狀態\n\n");while (p){if (p->data.ID == Free)cout << "Free";elseprintf("%4d", p->data.ID);printf("%17d", p->data.address);printf("%18d", p->data.size);if (p->data.state == Free)cout << setw(22) << "空閑\n";else if (p->data.state == 1)cout << setw(24) << "已分區\n";elsecout << setw(26) << "已分配作業\n";p = p->next;}cout << "\n====================================================="; }int main() {Initblock();int choice;int i;cout << endl;cout << " ++++++++++++++++++++++++++\n";cout << " ++++++++++++++ 動態分區分配方式的模擬+++\n";cout << " +++++++首次適應算法++++++++++++++++++++++++\n";for (i = 0; ; i++){show();cout << "\n\n 1: 分配內存\n";cout << " 2: 裝入作業\n";cout << " 3: 撤銷作業\n";cout << " 4: 回收內存\n";cout << " 0: 退出\n\n";cout << "請輸入您的操作: ";cin >> choice;if (choice == 1) // 分配內存alloc();else if (choice == 2){int a, b;cout << "請輸入作業號、大小: ";cin >> a >> b;if (First_fit(a, b) == 0){cout << "\n裝不下!沒有足夠大的區間\n";}}else if (choice == 3) // 撤銷作業{int ID;cout << "請輸入您要撤銷的作業號:";cin >> ID;free1(ID);}else if (choice == 4) // 內存回收{int ID;cout << "請輸入您要釋放的分區號:";cin >> ID;free2(ID);}else if (choice == 0) // 退出break;else {cout << "輸入有誤,請重試!" << endl;continue;}}return 0; }

總結

以上是生活随笔為你收集整理的操作系统实验 连续内存分配 首次适应(FF)算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。