动态异长分区地存储分配与回收算法

合集下载

存储管理动态分区分配及回收算法

存储管理动态分区分配及回收算法

存储管理动态分区分配及回收算法存储管理是计算机系统中的重要组成部分,它负责管理和分配计算机中的物理内存资源。

在计算机系统中,通过动态分区分配和回收算法来实现对这些资源的有效利用。

本文将介绍动态分区分配和回收算法的原理、主要算法以及优缺点。

动态分区分配是一种灵活、动态的内存分配方式,它根据进程的需求动态地分配内存空间。

动态分区分配算法有多种,其中最常用的有首次适应算法、最佳适应算法和最坏适应算法。

首次适应算法(First Fit)是最常用的分配算法之一、它从低地址开始寻找第一个满足要求的空闲分区来分配进程。

这种算法的优点是简单、高效,但是可能会产生大量的碎片空间,降低内存的利用率。

最佳适应算法(Best Fit)是在所有空闲分区中找到一个大小最适合进程的分区来分配。

它的主要思想是选择一个更接近进程大小的空闲分区,以减少碎片空间的产生。

然而,这种算法的缺点是需要遍历整个空闲分区链表,因此效率相对较低。

最坏适应算法(Worst Fit)与最佳适应算法相反,它选择一个大小最大的空闲分区来分配进程。

这种算法的好处是可以尽可能地保留大块的碎片空间,以便后续分配使用。

但是,它也会导致更多的碎片空间浪费。

动态分区的回收算法是用于回收被释放的内存空间并合并相邻的空闲分区,以尽量减少碎片空间的产生。

常见的回收算法有合并相邻空闲分区算法和快速回收算法。

合并相邻空闲分区算法会在每次有分区被回收时,检查是否有相邻的空闲分区可以合并。

如果有,就将它们合并为一个大的空闲分区。

这样可以最大程度地减少碎片空间,提高内存的利用效率。

快速回收算法是一种将被释放的分区插入到一个空闲分区链表的头部,而不是按照地址顺序进行插入的算法。

这样可以减少对整个空闲分区链表的遍历时间,提高回收的效率。

总结起来,动态分区分配和回收算法在存储管理中起着重要的作用。

首次适应算法、最佳适应算法和最坏适应算法是常用的动态分区分配算法,它们各自有着不同的优缺点。

动态分区存储管理方式的主存分配回收

动态分区存储管理方式的主存分配回收

动态分区存储管理方式的主存分配回收一、实验目的深入了解动态分区存储管理方式主存分配回收的实现。

二、实验要求编写程序完成动态分区存储管理方式的主存分配回收的实现。

实验具体包括:首先确定主存空间分配表;然后采用最优适应算法完成主存空间的分配和回收;最后编写主函数对所做工作进行测试。

三、实验步骤实现动态分区的分配和回收,主要考虑的问题有三个:第一,设计记录主存使用情况的数据表格,用来记录空闲区和作业占用的区域;第二,在设计的数据表格基础上设计主存分配算法:第三,在设计的数据表格基础上设计主存回收算法。

首先,考虑第—个问题:设计记录主存使用情况的数据表格,用来记录空闲区和作业占用的区域。

由于动态分区的大小是由作业需求量决定的,故分区的长度是预先不固定的,且分区的个数也随主存分配和回收变动。

总之,所有分区情况随时可能发生变化,数据表格的设计必须和这个特点相适应。

由于分区长度不同,因此设计的表格应该包括分区在主存中的起始地址和长度。

由于分配时空闲区有时会变成两个分区:空闲区和已分分区,回收主存分区时,可能会合并空闲分区,这样如果整个主存采用一张表格记录已分分区和空闲区,就会使表格操作繁琐。

主存分配时查找空闲区进行分配,然后填写已分配区表,主要操作在空闲区;某个作业执行完后,将该分区变成空闲区,并将其与相邻的空闲区合并,主要操作也在空闲区。

由此可见,主存的分配和回收主要是对空闲区的操作。

这样为了便于对主存空间的分配和回收,就建立两张分区表记录主存使用情况.一张表格记录作业占用分区的“已分配区表”一张是记录空闲区的“空闲区表”。

这两张表的实现方法一般有两种,一种是链表形式,一种是顺序表形式。

在试验中,采用顺序表形式,用数组模拟。

由于顺序表的长度必须是提前固定,所以无论是“已分配区表”还是“空闲区表”都必须事先确定长度。

他们的长度必须是系统可能的最大项数,系统运行过程中才不会出错,因而在多数情况下,无论是“已分配区表”还是“空闲区表”都有空闲栏目。

存储管理动态分区分配及回收算法

存储管理动态分区分配及回收算法
before->next=after->next; after->size+=back2->size; back2=after; after=before->next; } else { before=before->next; after=after->next; } }
before=head2; after=head2->next; while(after) { if(after->adr==back2->adr+back2->size) {//和后边空闲区合并
void print(char choice)//输出空闲区队列信息
-9-
{ Node *p;
if(choice=='f'||choice=='F') p=head1->next;
else p=head2->next;
if(p) { printf("\n空闲区队列的情况为:\n");
-4-
if(back1->adr==before->adr+before->size) {//和前边分区合并 before->size+=back1->size; before->next=back1->next; free(back1); } else if(after&&back1->adr+back1->size==after->adr) {//和后边分区合并 back1->size+=after->size; back1->next=after->next; back1->id=after->id; free(after); after=back1; } printf("\t首先分配算法回收内存成功!!!\n"); } else printf("\t首先分配算法回收内存失败!!!\n");

操作系统存储管理动态分区分配及回收算法附源码

操作系统存储管理动态分区分配及回收算法附源码

存储管理动态分区分配及回收算法课程名称:计算机操作系统班级:信1501-2实验者姓名:李琛实验日期:2018年5月20日评分: 教师签名:一、实验目的分区管理就是应用较广泛的一种存储管理技术。

本实验要求用一种结构化高级语言构造分区描述器,编制动态分区分配算法与回收算法模拟程序,并讨论不同分配算法的特点。

二、实验要求1、编写:First Fit Algorithm2、编写:Best Fit Algorithm3、编写:空闲区回收算法三、实验过程(一)主程序1、定义分区描述器node,包括3 个元素:(1)adr——分区首地址(2)size——分区大小(3)next——指向下一个分区的指针2、定义3 个指向node 结构的指针变量:(1)head1——空闲区队列首指针(2)back1——指向释放区node 结构的指针(3)assign——指向申请的内存分区node 结构的指针3、定义1 个整形变量:free——用户申请存储区的大小(由用户键入)(二)过程1、定义check 过程,用于检查指定的释放块(由用户键入)的合法性2、定义assignment1 过程,实现First Fit Algorithm3、定义assignment2 过程,实现Best Fit Algorithm4、定义acceptment1 过程,实现First Fit Algorithm 的回收算法5、定义acceptment2 过程,实现Best Fit Algorithm 的回收算法6、定义print 过程,打印空闲区队列(三)执行程序首先申请一整块空闲区,其首址为0,大小为32767;然后,提示用户使用哪种分配算法,再提示就是分配还就是回收;分配时要求输入申请区的大小,回收时要求输入释放区的首址与大小。

实验代码Main、cpp#include<stdio、h>#include<stdlib、h>#include<string、h>#include<iostream>using namespace std;#define MAX_SIZE 32767typedef struct node{int id;int adr;int size;struct node *next;}Node;Node *head1, *head2, *back1, *back2, *assign;int request;int check(int add, int siz, char c){Node *p, *head;int check = 1;if (add<0 || siz<0)check = 0;/*地址与大小不能为负*/if (c == 'f' || c == 'F')head = head1;elsehead = head2;p = head->next;while ((p != NULL) && check)if (((add<p->adr) && (add + siz>p->adr)) || ((add >= p->adr) && (add<p->adr + p->size))) check = 0;elsep = p->next;if (check == 0)printf("\t输入释放区地址或大小有错误!!!\n");return check;}void init(){Node *p;head1 = (Node*)malloc(sizeof(Node));head2 = (Node*)malloc(sizeof(Node));p = (Node*)malloc(sizeof(Node));head1->next = p;head2->next = p;p->size = MAX_SIZE;p->adr = 0;p->next = NULL;p->id = 0;}Node* assignment1(int num, int req){Node *before, *after, *ass;ass = (Node*)malloc(sizeof(Node));before = head1;after = head1->next;ass->id = num;ass->size = req;while (after->size<req){before = before->next;after = after->next;}if (after == NULL){ass->adr = -1;}else{if (after->size == req){before->next = after->next;ass->adr = after->adr;}else{after->size -= req;ass->adr = after->adr;after->adr += req;}}return ass;}void acceptment1(int address, int siz, int rd) {Node *before, *after;int insert = 0;back1 = (Node*)malloc(sizeof(Node));before = head1;after = head1->next;back1->adr = address;back1->size = siz;back1->id = rd;back1->next = NULL;while (!insert&&after){//将要被回收的分区插入空闲区(按首址大小从小到大插入)if ((after == NULL) || ((back1->adr <= after->adr) && (back1->adr >= before->adr))){before->next = back1;back1->next = after;insert = 1;}else{before = before->next;after = after->next;}}if (insert){if (back1->adr == before->adr + before->size){//与前边分区合并before->size += back1->size;before->next = back1->next;free(back1);}else if (after&&back1->adr + back1->size == after->adr){//与后边分区合并back1->size += after->size;back1->next = after->next;back1->id = after->id;free(after);after = back1;}printf("\t首先分配算法回收内存成功!\n");}elseprintf("\t首先分配算法回收内存失败!\n");}Node* assignment2(int num, int req){Node *before, *after, *ass, *q;ass = (Node*)malloc(sizeof(Node));q = (Node*)malloc(sizeof(Node));before = head2;after = head2->next;ass->id = num;ass->size = req;while (after->size<req){before = before->next;after = after->next;}if (after == NULL){ass->adr = -1;}else{if (after->size == req){before->next = after->next;ass->adr = after->adr;}else{q = after;before->next = after->next;ass->adr = q->adr;q->size -= req;q->adr += req;before = head2;after = head2->next;if (after == NULL){before->next = q;q->next = NULL;}else{while ((after->size)<(q->size)){before = before->next;after = after->next;}before->next = q;q->next = after;}}}return (ass);}void acceptment2(int address, int siz, int rd){Node *before, *after;int insert = 0;back2 = (Node*)malloc(sizeof(Node));before = head2;after = head2->next;back2->adr = address;back2->size = siz;back2->id = rd;back2->next = NULL;if (head2->next == NULL){//空闲队列为空head2->next = back2;head2->size = back2->size;}else{//空闲队列不为空while (after){if (back2->adr == after->adr + after->size){//与前边空闲分区合并before->next = after->next;after->size += back2->size;back2 = after;}else{before = before->next;after = after->next;}}before = head2;after = head2->next;while (after){if (after->adr == back2->adr + back2->size){//与后边空闲区合并before->next = after->next;back2->size += after->size;}else{before = before->next;after = after->next;}}before = head2;after = head2->next;while (!insert){//将被回收的块插入到恰当的位置(按分区大小从小到大)if (after == NULL || ((after->size>back2->size) && (before->size<back2->size))){before->next = back2;back2->next = after;insert = 1;break;}else{before = before->next;after = after->next;}}}if (insert)printf("\t最佳适应算法回收内存成功!\n");elseprintf("\t最佳适应算法回收内存失败!!\n");}void print(char choice)//输出空闲区队列信息{Node *p;if (choice == 'f' || choice == 'F')p = head1->next;elsep = head2->next;if (p){printf("\n空闲区队列的情况为:\n");printf("\t编号\t首址\t终址\t大小\n");while (p){printf("\t%d\t%d\t%d\t%d\n", p->id, p->adr, p->adr + p->size - 1, p->size);p = p->next;}}}void menu()//菜单及主要过程{char chose;int ch, num=0, r, add, rd;while (1){system("cls");printf("-------存储管理动态分区分配及回收算法-------\n");printf(" F 最先适应算法\n");printf(" B 最佳适应算法\n");printf(" E 退出程序\n");printf("----------------------------------------------\n");printf("请选择算法:");cin >> chose;//scanf("%c", &chose);if (chose == 'e' || chose == 'E')exit(0);else{system("cls");while (1){if (chose == 'f' || chose == 'F')printf("最先适应算法:\n");if (chose == 'b' || chose == 'B')printf("最佳适应算法:\n");printf("----------------------------------------------\n");printf(" 1 分配内存\n");printf(" 2 回收内存\n");printf(" 3 查瞧内存\n");printf(" 4 返回\n");printf("----------------------------------------------\n\n");printf("请选择:");scanf("%d", &ch);fflush(stdin);switch (ch){case 1:printf("输入申请的分区大小:"); scanf("%d", &r);if (chose == 'f' || chose == 'F')assign = assignment1(num, r);elseassign = assignment2(num, r);if (assign->adr == -1){printf("分配内存失败!\n");}elseprintf("分配成功!分配的内存的首址为:%d\n", assign->adr);break;case 2:printf("输入释放的内存的首址:"); scanf("%d", &add);printf("输入释放的内存的大小:"); scanf("%d", &r);printf("输入释放的内存的编号:"); scanf("%d", &rd);if (check(add, r, chose)){if (chose == 'f' || chose == 'F')acceptment1(add, r, rd);elseacceptment2(add, r, rd);}break;case 3:print(chose); break;case 4:menu(); break;}}}}}void main()//主函数{init();menu();}四、实验结果操作系统存储管理动态分区分配及回收算法附源码五、实验总结通过这次实验我练习了存储管理动态分区分配及回收算法,对操作系统中动态可变分区存储管理有了更深刻的了解。

存储器管理——动态分区的分配与回收

存储器管理——动态分区的分配与回收

计算机与信息工程系实验报告
班级计算机
1001
姓名李双贺时间2011.11.09 地点A504
实验名称存储器管理——动态分区的分配与回收
实验目的
目的是在学习操作系统理论知识的基础上,对操作系统整体的一个模拟。

研究计算机操作系统的基本原理和算法,掌握操作系统的存储器管理的首次适应算法、循环首次适应算法、最佳适应算法的基本原理和算法。

提高运用操作系统知识和解决实际问题的能力;并且锻炼自己的编程能力、创新能力以及开发软件的能力。

使学生掌握基本的原理和方法,最后达到对完整系统的理解。

实验内容
内存调度策略可采用首次适应算法、循环首次适应算法和最佳适应法等,并对各种算法进行性能比较。

为了实现分区分配,系统中必须配置相应的数据结构,用来描述空闲区和已分配区的情况,为分配提供依据。

常用的数据结构有两种形式:空闲分区表和空闲分区链。

为把一个新作业装入内存,须按照一定的算法,从空闲分区表或空闲分区链中选出一个分区分配给该作业。

实验结果。

操作系统实验二存储管理动态分区分配及回收算法

操作系统实验二存储管理动态分区分配及回收算法

实验二存储管理动态分区分配及回收算法一、实验目的通过分区管理实验,了解操作系统的基本概念,理解计算机系统的资源如何组织,操作系统如何有效地管理这些系统资源,用户如何通过操作系统与计算机系统打交道。

通过课程设计,我们可以进一步理解在计算机系统上运行的其它各类操作系统,并懂得在操作系统的支持下建立自己的应用系统。

二、实验要求本实验要求用一种结构化高级语言构造分区描述器,编制动态分区分配算法和回收算法模拟程序,并掌握分配算法的特点,提高编程技巧和对算法的理解和掌握。

三、实验过程1.准备(一)主程序1、定义分区描述器node,包括 3个元素:(1)adr——分区首地址(2)size——分区大小(3)next——指向下一个分区的指针2、定义 3个指向node结构的指针变量:(1)head1——空闲区队列首指针(2)back1——指向释放区node结构的指针(3)assign——指向申请的内存分区node结构的指针3、定义 1个整形变量:free——用户申请存储区的大小(由用户键入)(二)过程1、定义check过程,用于检查指定的释放块(由用户键入)的合法性2、定义assignment1过程,实现First Fit Algorithm3、定义assignment2过程,实现Best Fit Algorithm4、定义acceptment1过程,实现First Fit Algorithm的回收算法5、定义acceptment2过程,实现Best Fit Algorithm的回收算法6、定义print过程,打印空闲区队列(三)执行程序首先申请一整块空闲区,其首址为0,大小为32767;然后,提示用户使用哪种分配算法,再提示是分配还是回收;分配时要求输入申请区的大小,回收时要求输入释放区的首址和大小。

(四)输出要求每执行一次,输出一次空闲区队列情况,内容包括:编号首址终址大小2.主要流程和源代码实验二源代码#include<stdio.h>#include<stdlib.h>#include<string.h>#define MAX_SIZE 32767typedef struct node {int id;int adr;int size;struct node *next;}Node;Node *head1,*head2,*back1,*back2,*assign;int request;int check(int add,int siz,char c){Node *p,*head;int check=1;if(add<0||siz<0)check=0;/*地址和大小不能为负*/if(c=='f'||c=='F')head=head1;elsehead=head2;p=head->next;while((p!=NULL)&&check)if(((add<p->adr)&&(add+siz>p->adr))||((add>=p->adr)&&(add<p->adr+p->size))) check=0;elsep=p->next;if(check==0)printf("\t输入释放区地址或大小有错误!!!\n");return check;}void init(){Node *p;head1=(Node*)malloc(sizeof(Node));head2=(Node*)malloc(sizeof(Node));p=(Node*)malloc(sizeof(Node));head1->next=p;head2->next=p;p->size=MAX_SIZE;p->adr=0;p->next=NULL;p->id=0;}Node* assignment1(int num,int req){Node *before,*after,*ass;ass=(Node*)malloc(sizeof(Node));before=head1;after=head1->next;ass->id=num;ass->size=req;while(after->size<req){before=before->next;after=after->next;}if(after==NULL){ass->adr=-1; }else{if(after->size==req){before->next=after->next;ass->adr=after->adr;}else{after->size-=req;ass->adr=after->adr;after->adr+=req;}}return ass;}void acceptment1(int address,int siz,int rd){Node *before,*after;int insert=0;back1=(Node*)malloc(sizeof(Node));before=head1;after=head1->next;back1->adr=address;back1->size=siz;back1->id=rd;back1->next=NULL;while(!insert&&after){//将要被回收的分区插入空闲区(按首址大小从小到大插入)if((after==NULL)||((back1->adr<=after->adr)&&(back1->adr>=before->adr))) {before->next=back1;back1->next=after;insert=1;}else{before=before->next;after=after->next;}}if(insert){if(back1->adr==before->adr+before->size){//和前边分区合并before->size+=back1->size;before->next=back1->next;free(back1);}else if(after&&back1->adr+back1->size==after->adr){//和后边分区合并back1->size+=after->size;back1->next=after->next;back1->id=after->id;free(after);after=back1;}printf("\t首先分配算法回收内存成功!\n");}elseprintf("\t首先分配算法回收内存失败!\n");}Node* assignment2(int num,int req){Node *before,*after,*ass,*q;ass=(Node*)malloc(sizeof(Node));q=(Node*)malloc(sizeof(Node));before=head2;after=head2->next;ass->id=num;ass->size=req;while(after->size<req){before=before->next;after=after->next;}if(after==NULL){ass->adr=-1;}else{if(after->size==req){before->next=after->next;ass->adr=after->adr;}else{q=after;before->next=after->next;ass->adr=q->adr;q->size-=req;q->adr+=req;before=head2;after=head2->next;if(after==NULL){before->next=q;q->next=NULL;}else{while((after->size)<(q->size)){before=before->next;after=after->next;}before->next=q;q->next=after;}}}return (ass);}void acceptment2(int address,int siz,int rd) {Node *before,*after;int insert=0;back2=(Node*)malloc(sizeof(Node)); before=head2;after=head2->next;back2->adr=address;back2->size=siz;back2->id=rd;back2->next=NULL;if(head2->next==NULL){//空闲队列为空head2->next=back2;head2->size=back2->size;}else{//空闲队列不为空while(after){if(back2->adr==after->adr+after->size) {//和前边空闲分区合并before->next=after->next;after->size+=back2->size;back2=after;}else{before=before->next;after=after->next;}}before=head2;after=head2->next;while(after){if(after->adr==back2->adr+back2->size) {//和后边空闲区合并before->next=after->next;back2->size+=after->size;}else{before=before->next;after=after->next;}}before=head2;after=head2->next;while(!insert){//将被回收的块插入到恰当的位置(按分区大小从小到大)if(after==NULL||((after->size>back2->size)&&(before->size<back2->size))) {before->next=back2;back2->next=after;insert=1;break;}else{before=before->next;after=after->next;}}}if(insert)printf("\t最佳适应算法回收内存成功!\n");elseprintf("\t最佳适应算法回收内存失败!!\n");}void print(char choice)//输出空闲区队列信息{Node *p;if(choice=='f'||choice=='F')p=head1->next;elsep=head2->next;if(p){printf("\n空闲区队列的情况为:\n");printf("\t编号\t首址\t终址\t大小\n");while(p){printf("\t%d\t%d\t%d\t%d\n",p->id,p->adr,p->adr+p->size-1,p->size);p=p->next;}}}void menu()//菜单及主要过程{char chose;int ch,num,r,add,rd;while(1){system("cls");printf("选择最先适应算法请输入F,选择最佳适应算法请输入B,退出程序请输入E\n\n"); printf("请输入你的选择:");scanf("%c",&chose);if(chose=='e'||chose=='E')exit(0);else{system("cls");while(1){if(chose=='f'||chose=='F')printf("最先适应算法(First-Fit)模拟:\n");if(chose=='b'||chose=='B')printf("最佳适应算法(Best-Fit)模拟:\n");printf("1.分配内存,2.回收内存,3.查看内存,4.返回\n\n");printf("请输入你的选择:");scanf("%d",&ch);fflush(stdin);switch(ch){case 1:printf("输入申请的分区大小:");scanf("%d",&r);if(chose=='f'||chose=='F')assign=assignment1(num,r);elseassign=assignment2(num,r);if(assign->adr==-1){printf("分配内存失败!\n");}elseprintf("分配成功!分配的内存的首址为:%d\n",assign->adr);break;case 2:printf("输入释放的内存的首址:");scanf("%d",&add);printf("输入释放的内存的大小:");scanf("%d",&r);printf("输入释放的内存的编号:");scanf("%d",&rd);if(check(add,r,chose)) {if(chose=='f'||chose=='F') acceptment1(add,r,rd); elseacceptment2(add,r,rd);}break;case 3:print(chose);break;case 4:menu();break;}}}}}void main()//主函数{init();menu();}四、实验结果五、实验总结通过这次课程设计我练习了用C语言写系统软件,对操作系统中可变分区存储管理有了更深刻的了解。

存储管理动态分区分配及回收算法

存储管理动态分区分配及回收算法

存储管理动态分区分配及回收算法存储管理是操作系统中非常重要的一部分,它负责对计算机系统的内存进行有效的分配和回收。

动态分区分配及回收算法是其中的一种方法,本文将详细介绍该算法的原理和实现。

动态分区分配及回收算法是一种将内存空间划分为若干个动态分区的算法。

当新的作业请求空间时,系统会根据作业的大小来分配一个合适大小的分区,使得作业可以存储在其中。

当作业执行完毕后,该分区又可以被回收,用于存储新的作业。

动态分区分配及回收算法包括以下几个步骤:1.初始分配:当系统启动时,将整个内存空间划分为一个初始分区,该分区可以容纳整个作业。

这个分区是一个连续的内存块,其大小与初始内存大小相同。

2.漏洞表管理:系统会维护一个漏洞表,用于记录所有的可用分区的大小和位置。

当一个分区被占用时,会从漏洞表中删除该分区,并将剩余的空间标记为可用。

3.分区分配:当一个作业请求空间时,系统会根据作业的大小,在漏洞表中查找一个合适大小的分区。

通常有以下几种分配策略:- 首次适应(First Fit): 从漏洞表中找到第一个满足作业大小的分区。

这种策略简单快速,但可能会导致内存碎片的产生。

- 最佳适应(Best Fit): 从漏洞表中找到最小的满足作业大小的分区。

这种策略可以尽量减少内存碎片,但是分配速度相对较慢。

- 最差适应(Worst Fit): 从漏洞表中找到最大的满足作业大小的分区。

这种策略可以尽量减少内存碎片,但是分配速度相对较慢。

4.分区回收:当一个作业执行完毕后,系统会将该分区标记为可用,并更新漏洞表。

如果相邻的可用分区也是可合并的,系统会将它们合并成一个更大的分区。

总结来说,动态分区分配及回收算法是一种对计算机系统内存进行有效分配和回收的方法。

通过合理的分配策略和回收机制,可以充分利用内存资源,提高系统性能。

然而,如何处理内存碎片问题以及选择合适的分配策略是需要仔细考虑的问题。

动态异长分区的存储分配与回收算法

动态异长分区的存储分配与回收算法

真验5 动背同少分区的保存调配与回支算法之阳早格格创做5.1 真验手段明白保存管制的功能,掌握动背同少分区的保存调配与回支算法.保存器是估计机系统中的闭键资材,保存管制背去是支配系统的最主要功能之一.保存管制既包罗内存资材管制,也包罗用于真止分级保存体系的中存资材的管制.常常,内存与中存可采与相共或者相似的管制技能,如内存采与段式保存管制,则中存也采与段式保存管制.保存管制需要完毕如下功能:保存调配、保存共享、保存呵护、保存扩充、天面映射.当一个做业加进内存时,由支配系统将其形成进程,并为进程调配保存空间.进程运止中断时, 由支配系统将其所占用的保存空间支回.分歧的支配系统对付内存空间的区分与调配要领是分歧的,常常分为二类:固态等少分区的调配战动背同少分区的调配.固态等少分区时常使用于页式保存管制办法与段页式保存管制办法,保存空间被固态天区分为若搞个少度相等的天区,每个天区被称做一个页里. 动背同少分区时常使用于界天面保存管制办法与段式保存管制办法,保存空间主动背天区分为若搞个少度不等的天区.5.2 真验央供本真验央供模拟动背同少分区的调配算法、回支算法战碎片整治算法.5.3 真验步调数据结构分解为了真止保存资材的调配战回支,支配系统需要记录内存资材使用情况,即哪些天区尚已调配,哪些天区已经调配以及调配给哪些进程等.为此普遍需要二个表,一个为调配表, 其余一个为空忙天区表.前者记录已经调配的天区, 后者记录着所有目前已被进程占用的空忙天区, 如图51所示.隐然, 不记录于表中的天区即为已被进程所占用的非空忙天区,正在本质的支配系统中,那些天区备案正在进程的PCB 中.而PCB 中除了闭于内存资材的疑息中,另有其余洪量疑息.由于本真验是对付保存管制算法的模拟,所以用一个线程去代表一个进程,用线程驻留天区表去形貌线程占用的内存空间,如图52所示.图51 空忙天区表共时,需要一弛表去记录各个线程对付内存的哀供疑息,如图53所示.算法分解时常使用的动背同少分区的调配算法有:最先符合算法、最好符合算法战最坏符合算法.1. 最先符合算法(First Fit,FF)对付于保存申请下令, 采用谦脚申请少度央供且起初天面最小的空忙天区.正在真止时, 可将系统中所有的空忙天区依照起初天面由小到大的序次依次记录于空忙天区表中.当进程申请保存空间时, 系统由表的头部启初查找, 与第一个谦脚央供的表目.如果该表目所对付应的天区少度恰好与所申请的天区少度相共, 则将该天区局部调配给申请者.可则将该天区分隔为二部分, 一部分的少度与所申请的少度相共, 将其调配给申请者;另一部分的少度为本少度与调配少度之好, 将其仍记录于空忙天区表中.回支时,按回支区的尾天面查询空忙区表,若有与回支区相临的空忙区,则将其合并到相临区中,可则,把回支区依照天面从矮到下的程序拔出到空忙天区表的适合位子.2. 最好符合算法(Best Fit,BF)调配时与谦脚申请央供且少度最小的空忙天区.正在真止时, 可将系统中所有的空忙天区依照少度由小到大的序次依次记录于空忙天区表中.与最先符合算法相类似, 当进程申请保存空间时, 系统由表的头部启初查找, 与第一个谦脚央供的表目.如果该表目所对付应的天区少度恰好与所申请的天区少度相共, 则将该天区局部调配给申请者.可则将该天区分隔为二部分, 一部分的少度与所申请的少度相共, 将其调配给申请者;另一部分即结余部分的少度为本少度与调配少度之好, 由于结余部分的少度已经改变,所以应沉新将其按少度从小到大的程序拔出到空忙天区表中.回支时,不但是要按回支区的尾天面查询空忙区表,找到与回支区相临的空忙区,将其合并到相临区中,而且要把合并后的回支区依照少度递加的程序拔出到空忙天区表的适合位子.3. 最坏符合算法(Worst Fit,WF)调配时与谦脚申请央供且少度最大的空忙天区.正在真止时, 可将系统中所有的空忙天区依照少度由大到小的序次依次记录于空忙天区表中.当进程申请保存空间时, 与第一个表目.如果该表目所对付应的天区少度恰好与所申请的天区少度相共, 则将该天区局部调配给申请者.可则将该天区分隔为二部分, 一部分的少度与所申请的少度相共, 将其调配给申请者;另一部分即结余部分的少度为本少度与调配少度之好, 由于结余部分的少度已经改变,所以应沉新将其按少度递减的程序拔出到空忙天区表中.回支时,不但是要按回支区的尾天面查询空忙区表,找到与回支区相临的空忙区,将其合并到相临区中,而且要把合并后的回支区依照少度递减的程序拔出到空忙天区表的适合位子.安排并分解尝试数据假设初初内存筹备如图54,图中的起初天面以及大小皆以KB去衡量.占用者大小图54初初内存筹备由图54可睹,初初时公有五个线程驻留正在内存,它们是a,b,c,d,e,线程驻留区表如图55;另有五个空忙区,空忙天区表如图56.假设目前有三个线程提出内存申请,申请情况睹图57.通太过解咱们得到正在每种调配算法下那三个线程所申请到的内存情况.图58是最先符合算法调配情况,图59是最好符合算法调配情况,图510是最坏符合算法调配情况.另一个是源步调文献variable_partition.cpp.正在头文献中定义了宏、数据结构、局部变量、函数声明,源步调中含有各个函数的真止.正在头文献中,结构体FREEAREA、REQUIRE_MEMO RY、THREAD_RESIDENCE_MEMORY分别对付应于图5 1、图52、图53中的一止,分歧之处是为了形成链表正在三个结构体中皆有前背指针.数组init_free_area_table对付应于图56,数组init_thread_require_memory_table对付应于图55,数组init_thread_residence_memory_table对付应于图5 7,为了真止动背调配与释搁,用链表沉新构造空忙天区表、线程驻留区表战内存申请表,局部变量p_free_area_list 是空忙区链尾,p_thread_require_memory_queue是内存申请行列的队尾,p_thread_residence_memory_list是线程驻留区链尾,tail_thread_residence_memory_list是线程驻留区链尾,由于线程驻留区链表被内存调配函数战内存释搁函数共享,故用临界区变量CS_THREAD_MEMORY_LIST去呵护,共理,屏幕是所有线程共享的,所以用临界区变量CS _SCREEN去呵护,空忙区链表被内存调配函数战内存释搁函数共享,故用临界区变量CS_FREEAREA_LIST去呵护.h_t hread是线程句柄数组,用去存搁各个线程的句柄.步调共包罗25个函数,依照效率不妨将它们分成五组.第一组是主函数main(),其效率是隐现主菜单并根据用户的采用真止相映功能;第二组包罗函数print_space()战函数display_thread_residence_memory(),前者用去隐现若搞个空格,后者用去隐现线程驻留区表;第三组共十个函数,用去真止最先符合调配法,它们的称呼及功能如图511.第四组共六个函数,用去真止最好符合调配法,它们的称呼及功能如图512.第五组共六个函数,用去真止最坏符合调配法,它们的称呼及功能如图513.参照源代码.1 windows下的参照源步调底下是完备的步调浑单.头文献 variable_partition.h 的浑单#include <windows.h>#include <conio.h>#include <stdlib.h>#include <stdio.h>#include <io.h>#include <string.h>#define MAX_THREAD 3#define BF_initialize_require_memory_list FF_initialize_require_memory_list#define WF_initialize_require_memory_list FF_initialize_require_memory_list#define BF_initialize_thread_residence_memory_list FF_initialize_thread_residence_memory_list#define WF_initialize_thread_residence_memory_list FF_initialize_thread_residence_memory_list#define WF_delete_freearea_list FF_delete_freearea_list#define BF_delete_freearea_list FF_delete_freearea_list#define WF_delete_require_memory_list FF_delete_require_memory_list#define BF_delete_require_memory_list FF_delete_require_memory_list#define WF_delete_thread_residence_memory_list FF_delete_thread_residence_memory_list#define BF_delete_thread_residence_memory_list FF_delete_thread_residence_memory_listtypedef struct freearea{//表示空忙天区的数据结构struct freearea *next; //指背下一个结面的指针int start_address; //空忙区起初天面int size; //空忙区大小}FREEAREA;typedef struct require_memory{//记录线程申请内存的数据结构struct require_memory *next;//指背下一个结面的指针char thread_name[10]; //线程名int size; //申请内存大小(以KB为单位)int duration; //正在内存的驻留时间(以秒为单位)}REQUIRE_MEMORY;typedef struct thread_residence_memory{//形貌线程驻留区的数据结构struct thread_residence_memory *next; //指背下一个结面的指针char thread_name[10]; //线程名int start_address; //驻留区起初天面int size; //驻留区大小}THREAD_RESIDENCE_MEMORY;FREEAREA init_free_area_table[5]={//尝试数据:初初空忙区表{NULL,10,10},{NULL,40,30},{NULL,80,5},{NULL,145,15},{NULL,180,20}};REQUIRE_MEMORYinit_thread_require_memory_table[3]={//尝试数据:初初内存申请表{NULL,"thread_1",20,4},{NULL,"thread_2",10,5},{NULL,"thread_3",5,6}};/ /尝试数据:初初线程驻留区表THREAD_RESIDENCE_MEMORYinit_thread_residence_memory_table[5]={{NULL,"a",0,10},{NULL,"b",20,20},{NULL,"c",70,10},{NULL,"d",85,60},{NULL,"e",160,20}};FREEAREA *p_free_area_list=NULL;//空忙区链尾REQUIRE_MEMORY*p_thread_require_memory_queue=NULL;//内存申请行列队尾THREAD_RESIDENCE_MEMORY*p_thread_residence_memory_list=NULL;//线程驻留区链尾THREAD_RESIDENCE_MEMORY*tail_thread_residence_memory_list=NULL;//线程驻留区链尾CRITICAL_SECTION CS_THREAD_MEMORY_LIST;//呵护线程驻留区链表的临界区CRITICAL_SECTION CS_SCREEN; //呵护屏幕的临界区CRITICAL_SECTION CS_FREEAREA_LIST;//呵护空忙区链表的临界区HANDLE h_thread[MAX_THREAD];//线程句柄数组void print_space(int num); //输出若搞个空格void display_thread_residence_memory_list(); //隐现线程驻留区表//最先符合调配法的函数FREEAREA *FF_initialize_freearea_list(FREEAREA*init_table,int num); //初初化空忙区链表void FF_delete_freearea_list(); //简略空忙区链表REQUIRE_MEMORY *FF_initialize_require_memory_list(REQUIRE_MEMORY *init_table,int num);/初初化内存申请链表void FF_delete_require_memory_list();//简略内存申请链表THREAD_RESIDENCE_MEMORY*FF_initialize_thread_residence_memory_list(THREAD_RESIDENCE_MEMORY *init_table,int num);//初初化线程驻留区链表void FF_delete_thread_residence_memory_list();//简略线程驻留区链表void FF_thread(void *data);//线程函数int FF_require_memory(int size);//内存申请函数void FF_release_memory(int start_address,int size);//内存释搁函数void FF();//最先符合调配算法的初初化函数//最好符合调配算法的函数void BF_thread(void *data);//线程函数int BF_require_memory(int size);//内存申请函数void BF_release_memory(int start_address,int size);//内存释搁函数void BF_insert_freearea(FREEAREA *free_node); //空忙区结面拔出函数void BF();//初初化步调void BF_initialize_freearea_list(FREEAREA *init_table,intnum);//初初化空忙区链表//最坏符合调配算法的函数void WF_thread(void *data);//线程函数void WF_insert_freearea(FREEAREA *free_node);//空忙区结面拔出函数void WF_initialize_freearea_list(FREEAREA *init_table,intnum);//初初化空忙区链表int WF_require_memory(int size);//内存申请函数void WF_release_memory(int start_address,int size);//内存释搁函数void WF();//初初化步调源步调文献 variable_partition.cpp 的浑单#include "variable_partition.h"int main(int argc,char *argv[]){char select;while(1){printf("||\n");printf("| 1:first fit allocation |\n");printf("| 2:best fit allocation |\n");printf("| 3:worst fit allocation |\n");printf("| 4:exit |\n");printf("||\n");printf("select a function(1~4):");do{select=(char)getch();}while(select!='1'&&select!='2'&&select!='3'&&select!='4');system("cls");switch(select){case '1':FF();break;case '2':BF();break;case '3':WF();break;case '4':return 0;}printf("\nPress any key to return to main menu.");getch();system("cls");}return 0;}void print_space(int num){//隐现若搞个空格int i;for(i=0;i<num;i++){printf(" ");}}void display_thread_residence_memory_list(){//隐现驻留线程链表THREAD_RESIDENCE_MEMORY *p;char buffer[20];p=p_thread_residence_memory_list;printf("||||\n");printf("| thread_name | start_address(kB) | size(KB) |\n");printf("||||\n");while(p!=NULL){printf("| %s",p>thread_name);print_space(18strlen(p>thread_name));printf("| %d",p>start_address);itoa( p>start_address, buffer, 10 );print_space(19strlen(buffer));printf("| %d",p>size);itoa(p>size, buffer, 10 );print_space(17strlen(buffer));printf("|\n");p=p>next;};printf("||||\n\n");}//最先符合调配法:初初化空忙区链表FREEAREA *FF_initialize_freearea_list(FREEAREA *init_table,int num){FREEAREA *temp;FREEAREA *head=NULL;FREEAREA *tail=NULL;int i;for(i=0;i<num;i++){temp=(FREEAREA *)malloc(sizeof(FREEAREA));temp>start_address=init_table[i].start_address;temp>size=init_table[i].size;temp>next=NULL;if(head==NULL)head=tail=temp;else{tail>next=temp;tail=tail>next;}};return head;}//最先符合调配法:简略空忙区链表void FF_delete_freearea_list(){FREEAREA *temp;temp=p_free_area_list;while(temp!=NULL){temp=p_free_area_list>next;free(p_free_area_list);p_free_area_list=temp;}p_free_area_list=NULL;}//最先符合调配法:初初化内存申请链表REQUIRE_MEMORY*FF_initialize_require_memory_list(REQUIRE_MEMORY*init_table,int num){REQUIRE_MEMORY *temp;REQUIRE_MEMORY *head=NULL;REQUIRE_MEMORY *tail=NULL;int i;for(i=0;i<num;i++){temp=(REQUIRE_MEMORY*)malloc(sizeof(REQUIRE_MEMORY));strcpy(temp>thread_name,init_table[i].thread_name);temp>size=init_table[i].size;temp>duration=init_table[i].duration;temp>next=NULL;if(head==NULL)head=tail=temp;else{tail>next=temp;tail=tail>next;}};return head;}//最先符合调配法:简略内存申请链表void FF_delete_require_memory_list(){REQUIRE_MEMORY *temp;temp=p_thread_require_memory_queue;while(temp!=NULL){temp=p_thread_require_memory_queue>next;free(p_thread_require_memory_queue);p_thread_require_memory_queue=temp;}p_thread_require_memory_queue=NULL;}//最先符合调配法:初初化线程驻留区链表THREAD_RESIDENCE_MEMORY*FF_initialize_thread_residence_memory_list(THREAD_RESI DENCE_MEMORY *init_table,int num){THREAD_RESIDENCE_MEMORY *temp;THREAD_RESIDENCE_MEMORY *head=NULL;THREAD_RESIDENCE_MEMORY *tail=NULL;int i;for(i=0;i<num;i++){temp=(THREAD_RESIDENCE_MEMORY*)malloc(sizeof(THREAD_RESIDENCE_MEMORY));strcpy(temp>thread_name,init_table[i].thread_name);temp>start_address=init_table[i].start_address;temp>size=init_table[i].size;temp>next=NULL;if(head==NULL)head=tail=temp;else{tail>next=temp;tail=tail>next;}};tail_thread_residence_memory_list=tail;return head;}//最先符合调配法:简略线程驻留区链表void FF_delete_thread_residence_memory_list(){THREAD_RESIDENCE_MEMORY*temp=p_thread_residence_memory_list;temp=p_thread_residence_memory_list;while(temp!=NULL){temp=p_thread_residence_memory_list>next;free(p_thread_residence_memory_list);p_thread_residence_memory_list=temp;}p_thread_residence_memory_list=NULL;}//线程:申请内存,驻留一段时间,释搁内存void FF_thread(void *data){int start_address=1;THREAD_RESIDENCE_MEMORY *temp;EnterCriticalSection(&CS_SCREEN);printf("create thread:%s\n",((REQUIRE_MEMORY *)(data))>thread_name);LeaveCriticalSection(&CS_SCREEN);while(1){//申请内存start_address=FF_require_memory(((REQUIRE_MEMOR Y *)(data))>size);if(start_address>=0)break;elseSleep(1000);}temp=(THREAD_RESIDENCE_MEMORY*)malloc(sizeof(THREAD_RESIDENCE_MEMORY));strcpy(temp>thread_name,((REQUIRE_MEMORY*)(data))>thread_name);temp>start_address=start_address;temp>size=((REQUIRE_MEMORY *)(data))>size;temp>next=NULL;EnterCriticalSection(&CS_THREAD_MEMORY_LIST); //加进线程驻留区链表tail_thread_residence_memory_list>next=temp;tail_thread_residence_memory_list=tail_thread_residence _memory_list>next;LeaveCriticalSection(&CS_THREAD_MEMORY_LIST);//隐现线程驻留区链表EnterCriticalSection(&CS_SCREEN);printf("after %s %s\n",((REQUIRE_MEMORY *)(data))>thread_name,"get memory:");display_thread_residence_memory_list();LeaveCriticalSection(&CS_SCREEN);Sleep(((REQUIRE_MEMORY *)(data))>duration);//释搁内存FF_release_memory(start_address,((REQUIRE_MEMOR Y *)(data))>size);}//最先符合调配法:内存申请函数int FF_require_memory(int size){int start_address=1;FREEAREA *p;FREEAREA *p_next;EnterCriticalSection(&CS_FREEAREA_LIST);p=p_next=p_free_area_list;while(p_next!=NULL){if(size==p_next>size){//刚刚好谦脚央供,简略空忙区结面start_address=p_next>start_address;if(p_next==p_free_area_list)p_free_area_list=p_next>next;elsep>next=p_next>next;free(p_next);break;}elseif(size<p_next>size){//分隔空忙区结面start_address=p_next>start_address;p_next>start_address+=size;p_next>size=size;break;}else{p=p_next;p_next=p_next>next;}}LeaveCriticalSection(&CS_FREEAREA_LIST);return start_address;}//最先符合调配法:内存释搁函数void FF_release_memory(int start_address,int size){EnterCriticalSection(&CS_FREEAREA_LIST);//请读者自己真止那段代码LeaveCriticalSection(&CS_FREEAREA_LIST);}//最先符合调配算法的初初化步调void FF(){int i=0;REQUIRE_MEMORY *p;HANDLE h_thread[MAX_THREAD];InitializeCriticalSection(&CS_THREAD_MEMORY_LIS T);InitializeCriticalSection(&CS_FREEAREA_LIST);InitializeCriticalSection(&CS_SCREEN);printf("最先符合调配算法\n");p_free_area_list=FF_initialize_freearea_list(init_free_area_table ,5);p_thread_require_memory_queue=FF_initialize_require_me mory_list(init_thread_require_memory_table,3);p_thread_residence_memory_list=FF_initialize_thread_resid ence_memory_list(init_thread_residence_memory_table,5); p=p_thread_require_memory_queue;while(p!=NULL){h_thread[i]=CreateThread(NULL,0,(LPTHREAD_START_RO UTINE)(FF_thread),p,0,NULL);i++;p=p>next;};WaitForMultipleObjects(MAX_THREAD,h_thread,TRUE,1);//等待所有线程中断EnterCriticalSection(&CS_SCREEN);printf("after all threads have finished:\n");display_thread_residence_memory_list();//隐现驻留线程链表LeaveCriticalSection(&CS_SCREEN);//简略百般链表FF_delete_freearea_list();FF_delete_require_memory_list();FF_delete_thread_residence_memory_list();getch();printf("\n");}//最好符合调配算法的线程:申请内存,驻留一段时间,释搁内存void BF_thread(void *data){int start_address=1;THREAD_RESIDENCE_MEMORY *temp;EnterCriticalSection(&CS_SCREEN);printf("create thread:%s\n",((REQUIRE_MEMORY *)(data))>thread_name);LeaveCriticalSection(&CS_SCREEN);//申请内存while(1){start_address=BF_require_memory(((REQUIRE_MEMO RY *)(data))>size);if(start_address>=0)break;elseSleep(1000);}temp=(THREAD_RESIDENCE_MEMORY*)malloc(sizeof(THREAD_RESIDENCE_MEMORY));strcpy(temp>thread_name,((REQUIRE_MEMORY*)(data))>thread_name);temp>start_address=start_address;temp>size=((REQUIRE_MEMORY *)(data))>size;temp>next=NULL;EnterCriticalSection(&CS_THREAD_MEMORY_LIST);//加进线程内存驻留区链表tail_thread_residence_memory_list>next=temp;tail_thread_residence_memory_list=tail_thread_residence _memory_list>next;LeaveCriticalSection(&CS_THREAD_MEMORY_LIST);//隐现线程内存驻留区链表EnterCriticalSection(&CS_SCREEN);printf("after %s %s\n",((REQUIRE_MEMORY *)(data))>thread_name,"get memory:");display_thread_residence_memory_list();LeaveCriticalSection(&CS_SCREEN);Sleep(((REQUIRE_MEMORY *)(data))>duration);//释搁内存BF_release_memory(start_address,((REQUIRE_MEMOR Y *)(data))>size);}//最好符合调配算法的内存申请函数int BF_require_memory(int size){int start_address=1;FREEAREA *p;FREEAREA *p_next;EnterCriticalSection(&CS_FREEAREA_LIST);p=p_next=p_free_area_list;while(p_next!=NULL){if(size==p_next>size){//刚刚好谦脚央供,简略空忙区结面start_address=p_next>start_address;if(p_next==p_free_area_list)p_free_area_list=p_next>next;elsep>next=p_next>next;free(p_next);break;}elseif(size<p_next>size){//分隔空忙区结面start_address=p_next>start_address;p_next>start_address+=size;p_next>size=size;p>next=p_next>next;BF_insert_freearea(p_next);break;}else{p=p_next;p_next=p_next>next;}}LeaveCriticalSection(&CS_FREEAREA_LIST);return start_address;}//最好符合调配算法的内存释搁函数void BF_release_memory(int start_address,int size){//请读者自己真止那段代码}//最好调配算法的空忙区结面拔出函数void BF_insert_freearea(FREEAREA *free_node){FREEAREA *p;FREEAREA *p_next;if(p_free_area_list==NULL)p_free_area_list=free_node;else{p_next=p=p_free_area_list;while(p_next!=NULL&&p_next>size<free_node>size){ p=p_next;p_next=p_next>next;}if(p_next==NULL) //应拔出到尾部p>next=free_node;elseif(p==p_next){ //应拔出到头部free_node>next=p;p_free_area_list=free_node;}else{ //应拔出到p与p_next之间free_node>next=p_next;p>next=free_node;}}}//最好符合调配法:初初化空忙区链表void BF_initialize_freearea_list(FREEAREA *init_table,int num){FREEAREA *temp;int i;for(i=0;i<num;i++){temp=(FREEAREA *)malloc(sizeof(FREEAREA));temp>start_address=init_table[i].start_address;temp>size=init_table[i].size;temp>next=NULL;BF_insert_freearea(temp);}}//最好调配算法的初初化步调void BF(){int i=0;REQUIRE_MEMORY *p;HANDLE h_thread[MAX_THREAD];InitializeCriticalSection(&CS_THREAD_MEMORY_LIS T);InitializeCriticalSection(&CS_FREEAREA_LIST);InitializeCriticalSection(&CS_SCREEN);printf("最好符合调配算法\n");BF_initialize_freearea_list(init_free_area_table,5);p_thread_require_memory_queue=BF_initialize_require_m emory_list(init_thread_require_memory_table,3);p_thread_residence_memory_list=BF_initialize_thread_res idence_memory_list(init_thread_residence_memory_table,5);p=p_thread_require_memory_queue;while(p!=NULL){h_thread[i]=CreateThread(NULL,0,(LPTHREAD_START_RO UTINE)(BF_thread),p,0,NULL);i++;p=p>next;};//等待所有线程中断WaitForMultipleObjects(MAX_THREAD,h_thread,TRUE,1);//隐现驻留线程链表EnterCriticalSection(&CS_SCREEN);printf("after all threads have finished:\n");display_thread_residence_memory_list();LeaveCriticalSection(&CS_SCREEN);//简略百般链表FF_delete_freearea_list();FF_delete_require_memory_list();FF_delete_thread_residence_memory_list();getch();printf("\n");}//最坏符合调配算法的线程:申请内存,驻留一段时间,释搁内存void WF_thread(void *data){int start_address=1;THREAD_RESIDENCE_MEMORY *temp;EnterCriticalSection(&CS_SCREEN);printf("create thread:%s\n",((REQUIRE_MEMORY *)(data))>thread_name);LeaveCriticalSection(&CS_SCREEN);//申请内存while(1){start_address=WF_require_memory(((REQUIRE_MEMO RY *)(data))>size);if(start_address>=0)break;elseSleep(1000);}temp=(THREAD_RESIDENCE_MEMORY*)malloc(sizeof(THREAD_RESIDENCE_MEMORY));strcpy(temp>thread_name,((REQUIRE_MEMORY*)(data))>thread_name);temp>start_address=start_address;temp>size=((REQUIRE_MEMORY *)(data))>size;temp>next=NULL;EnterCriticalSection(&CS_THREAD_MEMORY_LIST);//加进线程内存驻留区链表tail_thread_residence_memory_list>next=temp;tail_thread_residence_memory_list=tail_thread_residence _memory_list>next;LeaveCriticalSection(&CS_THREAD_MEMORY_LIST);//隐现线程内存驻留区链表EnterCriticalSection(&CS_SCREEN);printf("after %s %s\n",((REQUIRE_MEMORY *)(data))>thread_name,"get memory:");display_thread_residence_memory_list();LeaveCriticalSection(&CS_SCREEN);Sleep(((REQUIRE_MEMORY *)(data))>duration);//释搁内存WF_release_memory(start_address,((REQUIRE_MEMOR Y *)(data))>size);}//最坏调配算法的空忙区结面拔出函数void WF_insert_freearea(FREEAREA *free_node){FREEAREA *p;FREEAREA *p_next;if(p_free_area_list==NULL)p_free_area_list=free_node;else{p=p_next=p_free_area_list;while(p_next!=NULL&&free_node>size<p_next>size){ p=p_next;p_next=p_next>next;}if(p_next==NULL) //应拔出到尾部p>next=free_node;elseif(p==p_next){ //应拔出到头部free_node>next=p;p_free_area_list=free_node;}else{ //应拔出到p与p_next之间free_node>next=p_next;p>next=free_node;}}}//最坏符合调配法:初初化空忙区链表void WF_initialize_freearea_list(FREEAREA *init_table,int num){FREEAREA *temp;int i;for(i=0;i<num;i++){temp=(FREEAREA *)malloc(sizeof(FREEAREA));temp>start_address=init_table[i].start_address;temp>size=init_table[i].size;temp>next=NULL;WF_insert_freearea(temp);}}//最坏符合调配算法的内存申请函数int WF_require_memory(int size){int start_address=1;FREEAREA *p_next;EnterCriticalSection(&CS_FREEAREA_LIST);p_next=p_free_area_list;if(size==p_free_area_list>size){//刚刚好谦脚央供,简略空忙区结面start_address=p_next>start_address;p_free_area_list=p_free_area_list>next;free(p_next);}elseif(size<p_next>size){//分隔空忙区结面start_address=p_next>start_address;p_next>start_address+=size;p_next>size=size;p_free_area_list=p_free_area_list>next;WF_insert_freearea(p_next);}LeaveCriticalSection(&CS_FREEAREA_LIST);return start_address;}//最坏符合调配算法:内存释搁函数void WF_release_memory(int start_address,int size){//请读者自己真止那段代码}//最坏符合调配算法的初初化步调void WF(){int i=0;REQUIRE_MEMORY *p;HANDLE h_thread[MAX_THREAD];InitializeCriticalSection(&CS_THREAD_MEMORY_LIS T);InitializeCriticalSection(&CS_FREEAREA_LIST);InitializeCriticalSection(&CS_SCREEN);printf("最坏符合调配算法\n");WF_initialize_freearea_list(init_free_area_table,5);p_thread_require_memory_queue=WF_initialize_require_ memory_list(init_thread_require_memory_table,3);p_thread_residence_memory_list=WF_initialize_thread_re sidence_memory_list(init_thread_residence_memory_table,5); p=p_thread_require_memory_queue;while(p!=NULL){h_thread[i]=CreateThread(NULL,0,(LPTHREAD_START_RO UTINE)(WF_thread),p,0,NULL);i++;p=p>next;};//等待所有线程中断WaitForMultipleObjects(MAX_THREAD,h_thread,TRUE,1);//隐现驻留线程链表EnterCriticalSection(&CS_SCREEN);printf("after all threads have finished:\n");display_thread_residence_memory_list();LeaveCriticalSection(&CS_SCREEN);//简略百般链表FF_delete_freearea_list();FF_delete_require_memory_list();FF_delete_thread_residence_memory_list();getch();printf("\n");}.2linux下的参照源步调○1编译下令gcc variable_partition .cpp –o variable_partition.o –lcurses –lpthread○2步调浑单#include <unistd.h>#include <curses.h>#include <stdlib.h>#include <pthread.h>#include <time.h>#include <string.h>#include <semaphore.h>#define MAX_THREAD 3#define BF_initialize_require_memory_listFF_initialize_require_memory_list#define WF_initialize_require_memory_listFF_initialize_require_memory_list#define BF_initialize_thread_residence_memory_listFF_initialize_thread_residence_memory_list#define WF_initialize_thread_residence_memory_listFF_initialize_thread_residence_memory_list#define WF_delete_freearea_list FF_delete_freearea_list#define BF_delete_freearea_list FF_delete_freearea_list#define WF_delete_require_memory_listFF_delete_require_memory_list#define BF_delete_require_memory_listFF_delete_require_memory_list#define WF_delete_thread_residence_memory_listFF_delete_thread_residence_memory_list#define BF_delete_thread_residence_memory_listFF_delete_thread_residence_memory_listtypedef struct freearea{struct freearea *next;int start_address;int size;}FREEAREA;typedef struct require_memory{struct require_memory *next;char thread_name[10];int size;int duration;}REQUIRE_MEMORY;typedef struct thread_residence_memory{struct thread_residence_memory *next;char thread_name[10];int start_address;int size;}THREAD_RESIDENCE_MEMORY;FREEAREA init_free_area_table[5]={{NULL,10,10},{NULL,40,30},{NULL,80,5},{NULL,145,15},{NULL,180,20}};REQUIRE_MEMORY init_thread_require_memory_table[3]={ {NULL,"thread_1",20,4},{NULL,"thread_2",10,5},{NULL,"thread_3",5,6}};THREAD_RESIDENCE_MEMORYinit_thread_residence_memory_table[5]={{NULL,"a",0,10},{NULL,"b",20,20},{NULL,"c",70,10},{NULL,"d",85,60},{NULL,"e",160,20}};FREEAREA *p_free_area_list=NULL;REQUIRE_MEMORY*p_thread_require_memory_queue=NULL;THREAD_RESIDENCE_MEMORY*p_thread_residence_memory_list=NULL;THREAD_RESIDENCE_MEMORY*tail_thread_residence_memory_list=NULL;pthread_mutex_t CS_THREAD_MEMORY_LIST;pthread_mutex_t CS_SCREEN;pthread_mutex_t CS_FREEAREA_LIST;pthread_t h_thread[MAX_THREAD];sem_t thread_end[MAX_THREAD];void display_thread_residence_memory_list();FREEAREA *FF_initialize_freearea_list(FREEAREA*init_table,int num);void FF_delete_freearea_list();REQUIRE_MEMORY*FF_initialize_require_memory_list(REQUIRE_MEMORY*init_table,in t num);void FF_delete_require_memory_list();THREAD_RESIDENCE_MEMORY*FF_initialize_thread_residence_memory_list(THREAD_RESIDENCE_ MEMORY *init_table,int num);void FF_delete_thread_residence_memory_list();void* FF_thread(void *data);int FF_require_memory(int size);void FF_release_memory(int start_address,int size);void FF();void* BF_thread(void *data);int BF_require_memory(int size);void BF_release_memory(int start_address,int size);void BF_insert_freearea(FREEAREA *free_node);void BF();void BF_initialize_freearea_list(FREEAREA *init_table,int num);void* WF_thread(void *data);void WF_insert_freearea(FREEAREA *free_node);void WF_initialize_freearea_list(FREEAREA *init_table,int num);int WF_require_memory(int size);void WF_release_memory(int start_address,int size);void WF();#include "variable_partition.h"int main(int argc,char *argv[]){char select;bool end=false;initscr();while(!end){clear();refresh();printw("||\n");printw("| 1:first fit allocation |\n");printw("| 2:best fit allocation |\n");printw("| 3:worst fit allocation |\n");printw("| 4:exit |\n");printw("||\n");printw("select a function(1~4):");do{select=(char)getch();}while(select!='1'&&select!='2'&&select!='3'&&select!='4 ');clear();refresh();switch(select){case '1':FF();break;case '2':BF();break;case '3':WF();break;case '4':end=true;}printw("\nPress any key to return to main menu.");refresh();getch();}endwin();return 0;}void display_thread_residence_memory_list(){THREAD_RESIDENCE_MEMORY *p;p=p_thread_residence_memory_list;int i=13;move(10,0);printw("||||\n");printw("| thread_name | start_address(kB) | size(KB) |\n");printw("||||\n");while(p!=NULL){move(i,0);printw("| %s",p>thread_name);move(i,20);printw("| %d",p>start_address);move(i,41);printw("| %d",p>size);move(i,60);printw("|\n");。

操作系统课程设计动态异长分区的存储分配与回收算法

操作系统课程设计动态异长分区的存储分配与回收算法

操作系统课程设计——动态异长分区的存储分配与回收算法//该文件所含代码是课设需要学生自己写的代码和补充的代码,包含部分需要修改的课程设计指导书中的代码,不包含不需修改的代码//1.显示空闲区表void display_freearea_list(){FREEAREA *p;char buffer[20];p=p_free_area_list;printf("|--------------------|------------------|\n");printf("| start_address(kB) | size(KB) |\n");printf("|--------------------|------------------|\n");while(p!=NULL){printf("| %d",p->start_address);itoa( p->start_address, buffer, 10 );print_space(19-strlen(buffer));printf("| %d",p->size);itoa(p->size, buffer, 10 );print_space(17-strlen(buffer));printf("|\n");p=p->next;};printf("|--------------------|------------------|\n\n");}//2.最先适应分配法:内存释放函数void FF_release_memory(int start_address,int size){EnterCriticalSection(&CS_FREEAREA_LIST);__int64 t1, t2; //记录该算法起止时间t1 = GetCycleCount(); //记录起始时间FREEAREA *temp,*p,*pp;//将空闲区按start_address由小到大排序,以便整合相邻空闲区while(1){int change = 0;p = p_free_area_list;if(p->next != NULL){if(p->start_address > p->next->start_address){pp = p->next;p->next = pp->next;pp->next = p;操作系统课程设计——动态异长分区的存储分配与回收算法p_free_area_list = pp;change = 1;}}if(p->next != NULL){while(p->next->next != NULL){if(p->next->start_address > p->next->next->start_address ){pp = p->next->next;p->next->next = pp->next;pp->next = p->next;p->next = pp;change = 1;}p = p->next ;}}if(change == 0){break;}}//插入空闲区temp = new FREEAREA;p = new FREEAREA;temp->start_address = start_address;temp->size = size;temp->next = NULL;p->next = p_free_area_list;while(p->next != NULL){if(p->next->start_address > temp->start_address){temp->next = p->next ;p->next = temp;break;}else{p = p->next ;}}if(p->next == NULL){p->next = temp;}else if(temp->next == p_free_area_list){p_free_area_list = temp;}//整合碎片while(1){int change = 0;p = p_free_area_list;if(p == NULL){break;}while(p->next != NULL){if((p->start_address + p->size) == (p->next->start_address)){p->size = p->next->size + p->size;change = 1;if(p->next->next == NULL){free(p->next);p->next = NULL;}else{p->next = p->next->next;}}if(p->next == NULL){break;}else{p = p->next ;}}if(change == 0){break;}}//整理线程结束后的驻留链表THREAD_RESIDENCE_MEMORY *q;q = p_thread_residence_memory_list;if(q->start_address == start_address){p_thread_residence_memory_list = p_thread_residence_memory_list->next ; }else{while(q->next != NULL){if(q->next->start_address == start_address){if(q->next == tail_thread_residence_memory_list){tail_thread_residence_memory_list = q;}q->next = q->next->next ;break;}q = q->next;}}//记录结束时间,并将运行时间存入对应数组t2 = GetCycleCount();if(time[0][0] > t2 - t1){time[0][0] = t2 - t1;}if(time[0][1] < t2 - t1){time[0][1] = t2 - t1;}LeaveCriticalSection(&CS_FREEAREA_LIST);}//3.最佳适应分配算法的内存释放函数void BF_release_memory(int start_address,int size){EnterCriticalSection(&CS_FREEAREA_LIST);__int64 t1, t2; //记录该算法起止时间t1 = GetCycleCount(); //记录起始时间FREEAREA *temp,*p,*pp;//将空闲区按start_address由小到大排序,以便整合相邻空闲区while(1){int change = 0;p = p_free_area_list;if(p->next != NULL){if(p->start_address > p->next->start_address){pp = p->next;p->next = pp->next;pp->next = p;p_free_area_list = pp;change = 1;}}if(p->next != NULL){while(p->next->next != NULL){if(p->next->start_address > p->next->next->start_address ){pp = p->next->next;p->next->next = pp->next;pp->next = p->next;p->next = pp;change = 1;}p = p->next ;}}if(change == 0){操作系统课程设计——动态异长分区的存储分配与回收算法break;}}//插入空闲区temp = new FREEAREA;p = new FREEAREA;temp->start_address = start_address;temp->size = size;temp->next = NULL;p->next = p_free_area_list;while(p->next != NULL){if(p->next->start_address > temp->start_address){temp->next = p->next ;p->next = temp;break;}else{p = p->next ;}}if(p->next == NULL){p->next = temp;}else if(temp->next == p_free_area_list){p_free_area_list = temp;}//整合碎片while(1){int change = 0;p = p_free_area_list;if(p == NULL){break;}while(p->next != NULL){if((p->start_address + p->size) == (p->next->start_address)){p->size = p->next->size + p->size;change = 1;if(p->next->next == NULL){free(p->next);p->next = NULL;}else{p->next = p->next->next;}操作系统课程设计——动态异长分区的存储分配与回收算法}if(p->next == NULL){break;}else{p = p->next ;}}if(change == 0){break;}}//将空闲区按SIZE由小到大排序,以便符合BF算法while(1){int change = 0;p = p_free_area_list;if(p->size > p->next->size){pp = p->next;p->next = pp->next;pp->next = p;p_free_area_list = pp;change = 1;}while(p->next->next != NULL){if(p->next->size > p->next->next->size ){pp = p->next->next;p->next->next = pp->next;pp->next = p->next;p->next = pp;change = 1;}p = p->next ;}if(change == 0){break;}}//整理线程结束后的驻留链表THREAD_RESIDENCE_MEMORY *q;q = p_thread_residence_memory_list;if(q->start_address == start_address){p_thread_residence_memory_list = p_thread_residence_memory_list->next ; }else{操作系统课程设计——动态异长分区的存储分配与回收算法while(q->next != NULL){if(q->next->start_address == start_address){if(q->next == tail_thread_residence_memory_list){tail_thread_residence_memory_list = q;}q->next = q->next->next ;break;}q = q->next;}}//记录结束时间,并将运行时间存入对应数组t2 = GetCycleCount();if(time[1][0] > t2 - t1){time[1][0] = t2 - t1;}if(time[1][1] < t2 - t1){time[1][1] = t2 - t1;}LeaveCriticalSection(&CS_FREEAREA_LIST);}//4.最坏适应分配算法:内存释放函数void WF_release_memory(int start_address,int size){EnterCriticalSection(&CS_FREEAREA_LIST);__int64 t1, t2; //记录该算法起止时间t1 = GetCycleCount(); //记录起始时间FREEAREA *temp,*p,*pp;//将空闲区按start_address由小到大排序,以便整合相邻空闲区while(1){int change = 0;p = p_free_area_list;if(p->next != NULL){if(p->start_address > p->next->start_address){pp = p->next;p->next = pp->next;pp->next = p;p_free_area_list = pp;change = 1;}}if(p->next != NULL){操作系统课程设计——动态异长分区的存储分配与回收算法while(p->next->next != NULL){if(p->next->start_address > p->next->next->start_address ){pp = p->next->next;p->next->next = pp->next;pp->next = p->next;p->next = pp;change = 1;}p = p->next ;}}if(change == 0){break;}}//插入空闲区temp = new FREEAREA;temp->start_address = start_address;temp->size = size;temp->next = NULL;p = new FREEAREA;p->next = p_free_area_list;while(p->next != NULL){if(p->next->start_address > temp->start_address){temp->next = p->next ;p->next = temp;break;}else{p = p->next ;}}if(p->next == NULL){p->next = temp;}else if(temp->next == p_free_area_list){p_free_area_list = temp;}//整合碎片while(1){int change = 0;p = p_free_area_list;if(p == NULL){break;操作系统课程设计——动态异长分区的存储分配与回收算法}while(p->next != NULL){if((p->start_address + p->size) == (p->next->start_address)){p->size = p->next->size + p->size;change = 1;if(p->next->next == NULL){free(p->next);p->next = NULL;}else{p->next = p->next->next;}}if(p->next == NULL){break;}else{p = p->next ;}}if(change == 0){break;}}//将空闲区按SIZE由大到小排序,以便符合WF算法while(1){int change = 0;p = p_free_area_list;if(p->size < p->next->size){pp = p->next;p->next = pp->next;pp->next = p;p_free_area_list = pp;change = 1;}while(p->next->next != NULL){if(p->next->size < p->next->next->size ){pp = p->next->next;p->next->next = pp->next;pp->next = p->next;p->next = pp;change = 1;}p = p->next ;}操作系统课程设计——动态异长分区的存储分配与回收算法if(change == 0){break;}}//整理线程结束后的驻留链表THREAD_RESIDENCE_MEMORY *q;q = p_thread_residence_memory_list;if(q->start_address == start_address){p_thread_residence_memory_list = p_thread_residence_memory_list->next ;}else{while(q->next != NULL){if(q->next->start_address == start_address){if(q->next == tail_thread_residence_memory_list){tail_thread_residence_memory_list = q;}q->next = q->next->next ;break;}q = q->next;}}//记录结束时间,并将运行时间存入对应数组t2 = GetCycleCount();if(time[2][0] > t2 - t1){time[2][0] = t2 - t1;}if(time[2][1] < t2 - t1){time[2][1] = t2 - t1;}LeaveCriticalSection(&CS_FREEAREA_LIST);}//5.二维数组,用于存放各种算法所需的最长时间和最短时间__int64 time[3][2] = {{99999999,0},{99999999,0},{99999999,0}};//6.显示程序运行时间void display_time(int n){EnterCriticalSection(&CS_SCREEN);printf("最短时间:%ld纳秒\n",time[n][0]);操作系统课程设计——动态异长分区的存储分配与回收算法printf("最长时间:%ld纳秒\n",time[n][1]);LeaveCriticalSection(&CS_SCREEN);}//7.在FF()、BF()、WF()中的删除各链表操作前加入以下代码void FF(){………………//显示线程结束后的空闲区EnterCriticalSection(&CS_SCREEN);printf("空闲区:\n");display_freearea_list();LeaveCriticalSection(&CS_SCREEN);//显示该算法所需时间display_time(0);//删除各种链表………………}void BF(){………………//显示线程结束后的空闲区EnterCriticalSection(&CS_SCREEN);printf("空闲区:\n");display_freearea_list();LeaveCriticalSection(&CS_SCREEN);//显示该算法所需时间display_time(1);//删除各种链表………………}void WF(){………………//显示线程结束后的空闲区操作系统课程设计——动态异长分区的存储分配与回收算法EnterCriticalSection(&CS_SCREEN);printf("空闲区:\n");display_freearea_list();LeaveCriticalSection(&CS_SCREEN);//显示该算法所需时间display_time(2);//删除各种链表………………}//8.设置计算时间的函数RDTSC方法__inline unsigned __int64 GetCycleCount(){__asm _emit 0x0F__asm _emit 0x31}//9.获取当前时间t = GetCycleCount();主界面:FF的运行结果BF的运行结果WF的运行结果。

存储管理动态分区分配及回收算法python

存储管理动态分区分配及回收算法python

存储管理动态分区分配及回收算法python一、概述存储管理是操作系统中的一个重要组成部分,它负责管理计算机系统中的存储器。

其中,动态分区分配及回收算法是一种常见的存储管理方式。

Python是一种高级编程语言,它具有简洁易读、易学易用等特点,因此被广泛应用于各种领域。

在存储管理中,Python可以作为一种编程语言来实现动态分区分配及回收算法。

二、动态分区分配1. 动态分区概述动态分区是指在计算机系统中,将内存空间按照需要进行划分,并在程序运行时根据需要进行动态调整。

通常情况下,动态分区的大小不固定,可以根据程序的需求进行调整。

2. 动态分区算法(1)首次适应算法(First Fit)首次适应算法是指从内存起始位置开始查找可用空间,并选择第一个符合要求的空闲块进行使用。

该算法简单易实现,但会产生大量碎片。

(2)循环首次适应算法(Next Fit)循环首次适应算法和首次适应算法类似,不同之处在于它从上一次查找结束位置开始查找可用空间。

该算法可以减少外部碎片,但会产生内部碎片。

(3)最佳适应算法(Best Fit)最佳适应算法是指从所有可用空间中选择大小最接近所需空间的空闲块进行使用。

该算法可以减少外部碎片,但会增加搜索时间和复杂度。

(4)最坏适应算法(Worst Fit)最坏适应算法是指从所有可用空间中选择大小最大的空闲块进行使用。

该算法可以减少内部碎片,但会增加搜索时间和复杂度。

3. 动态分区实现Python可以通过列表来模拟内存空间,并通过字典来记录每个进程的起始地址、结束地址和进程ID等信息。

具体实现过程如下:1)初始化内存列表memory = [{'start': 0, 'end': 1023, 'state': 'free'}]2)定义分配函数def allocate(size, pid):for i in range(len(memory)):if memory[i]['state'] == 'free' and memory[i]['end'] - memory[i]['start'] >= size:start = memory[i]['start']end = start + size - 1memory.insert(i, {'start': start, 'end': end, 'pid': pid, 'state': 'used'})if end < memory[i+1]['start']:memory.insert(i+1, {'start': end+1, 'end':memory[i+1]['end'], 'state': 'free'})memory[i+2]['start'] = end + 1else:memory[i+1]['start'] = end + 1return Truereturn False3)定义回收函数def release(pid):for i in range(len(memory)):if memory[i]['pid'] == pid:memory[i]['state'] = 'free'if i > 0 and memory[i-1]['state'] == 'free':memory[i-1]['end'] = memory[i]['end']del memory[i]if i < len(memory) and memory[i]['state'] == 'free':memory[i-1]['end'] = memory[i]['end']del memory[i]elif i < len(memory)-1 and memory[i+1]['state'] == 'free': memory[i+1]['start'] = memory[i]['start']del memory[i]if i < len(memory)-1 and memory[i+1]['state'] =='free':memory[i+1]['start'] = memory[i]['start']del memory[i]4)定义输出函数def print_memory():for i in range(len(memory)):print('Start:',memory[i]['start'],'End:',memory['i']['end'],'State:',me mory['i']['state'])三、动态分区回收动态分区回收是指在程序运行结束后,将已使用的内存空间释放,并将其归还给系统。

存储管理动态分区分配及回收算法

存储管理动态分区分配及回收算法

存储管理动态分区分配及回收算法介绍存储管理是操作系统中一个重要的功能模块,负责管理计算机的内存资源。

本文将详细探讨存储管理中的动态分区分配及回收算法。

动态分区分配动态分区分配算法是指根据进程的内存需求,在内存中动态地创建分区,并将进程加载到相应的分区中。

下面是几种常见的动态分区分配算法。

1. 首次适应算法首次适应算法是最简单、最直观的动态分区分配算法。

它从内存的起始位置开始搜索,找到第一个能满足进程需求的分区即可。

具体步骤如下:1.初始化内存的空闲分区表,记录内存中每个空闲分区的起始地址和长度。

2.当一个进程需要分配内存时,遍历空闲分区表,找到第一个大小能满足进程需求的分区。

3.如果找到了合适的分区,将进程加载到该分区,并更新空闲分区表。

4.如果没有找到合适的分区,则提示内存不足。

首次适应算法的优点是简单、快速,但可能会导致碎片问题。

2. 最佳适应算法最佳适应算法是指选择与进程需求最接近的、且大小大于等于进程需求的分区。

具体步骤如下:1.初始化内存的空闲分区表。

2.当一个进程需要分配内存时,遍历空闲分区表,找到满足进程需求的最小分区。

3.如果找到了合适的分区,将进程加载到该分区,并更新空闲分区表。

4.如果没有找到合适的分区,则提示内存不足。

最佳适应算法能最大程度地减少碎片问题,但执行效率较低。

3. 最差适应算法最差适应算法是指选择与进程需求最接近的、且大小大于等于进程需求的最大分区。

具体步骤如下:1.初始化内存的空闲分区表。

2.当一个进程需要分配内存时,遍历空闲分区表,找到满足进程需求的最大分区。

3.如果找到了合适的分区,将进程加载到该分区,并更新空闲分区表。

4.如果没有找到合适的分区,则提示内存不足。

最差适应算法能最大程度地降低内存碎片,但执行效率相对较低。

4. 快速适应算法快速适应算法是一种基于空闲分区表大小的快速搜索算法。

具体步骤如下:1.初始化内存的空闲分区表。

2.当一个进程需要分配内存时,根据进程需求的大小,在空闲分区表中选择一个合适的分区。

计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告(DOC)

计算机操作系统动态分区存储管理方式下的内存空间的分配与回收实验报告(DOC)

计算机操作系统实验报告实验二实验题目:存储器管理系别:计算机科学与技术系班级:姓名:学号:2一、实验目的深入理解动态分区存储管理方式下的内存空间的分配与回收。

二、实验内容编写程序完成动态分区存储管理方式下的内存分配和回收的实现。

具体内容包括:确定用来管理内存当前使用情况的数据结构;采用首次适应算法完成内存空间的分配;分情况对作业进行回收;编写主函数对所做工作进行测试。

三、实验原理分配:动态分区存储管理方式把内存除OS占用区域外的空间看作一个大的空闲区。

当作业要求装入内存时,根据作业需要内存空间的大小查询内存中各个空闲区,当从内存中找到一个大于或等于该作业大小的内存空闲区时,选择其中一个空闲区,按作业要求划出一个分区装入该作业。

回收:作业执行完后,它所占用的内存空间被收回,成为一个空闲区。

如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。

四、实验方法实现动态分区的分配与回收,主要考虑三个问题:第一、设计记录内存使用情况的数据表格,用来记录空闲区和作业占用的区域(利用结构体类型数组来保存数据);第二、在设计的数据表格基础上设计内存分配算法(采用首次适应算法找合适的分区(对空闲分区表进行排序),分配时要考虑碎片问题);第三、在设计的数据表格基础上设计内存回收算法(分四种情况进行回收(上邻、下邻、上下邻和无相邻分区)。

五、实验步骤第一,设计记录内存使用情况的数据表格●已分配分区表:起始地址、长度、标志(0表示“空表项”,1表示“已分配”)●空闲分区表:起始地址、长度、标志(0表示“空表项”,1表示“未分配”)struct used_table {float address; //已分分区起始地址float length; //已分分区长度,单位为字节int flag; //已分配表区登记栏标志,用0表示空栏目,char zuoyename;}; //已分配区表Struct free_table[ {float address; //空闲分区起始地址float length; //空闲分区长度,单位为字节int flag; //空闲分区表登记栏目用0表示空栏目,1表示未配}; //空闲分区表第二,在设计的表格上进行内存分配●首次适应算法:为作业分配内存,要求每次找到一个起始地址最小的适合作业的分区(按起始地址递增排序)。

动态分区分配与回收算法实验报告材料

动态分区分配与回收算法实验报告材料

实验报告实验二动态分区分配与回收算法一、实验目的了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。

二、实验原理算法思想:1.分区的个数和大小不是固定不变的,而是可变的,随装入的作业动态划分,且不会产生内部碎片。

2.外部碎片:若存储块长度为N,在该系统所采用的调度算法下较长时间内无法选出一道长度不超过该块的进程,则称该块为外部碎片。

3.首次适应算法(FF):FF算法要求空闲分区链以地址递增的次序链接。

在分配内存时,从链首开始顺序查找,直到找到一个大小能满足要求的空闲分区为止。

该算法倾向于优先利用内存中低址部分的空闲分区,从而保留了高址部分的大空闲区,这为以后到达的大作业分配大的内存空间创造了条件。

4.最佳适应算法(BF):每次为作业分配内存时,BF总是把能满足要求、又是最小的空闲分区分配给作业,避免大材小用。

为了加速寻找,该算法要求将所有的空闲分区按其容量从大到小的顺序形成一空闲分区链,自表头开始查找到第一个满足要求的自由分区分配。

该算法保留大的空闲区,但造成许多小的空闲区。

分区分配中的内存回收有四种情况:(1)回收区与插入点的前一个空闲分区相邻接。

(2)回收区与插入点的后一空闲分区相邻接。

(3)回收区同时与插入点的前、后两个空闲分区邻接。

(4)回收分区既不与前一个分区邻接,也不与后一个分区邻接。

另外,最佳适应算法不需要考虑多个进程,而首次适应算法需要考虑多道程序的大小,所以前两个程序只需要输入一个进程的信息,后者因为考虑多个程序的原因,所以需要输入两个进程的信息。

三、实验步骤、数据记录及处理1、算法流程抽象数据类型的定义:空闲分区结构体类型和结构体链表typedef struct freespace{int num; //分区号int size; //分区大小int address; //分区首地址status state; //分区状态,FREE和BUSY};typedef struct node{freespace data;node *head;node *next;}*Linklist;主程序的流程以及各程序模块之间的层次(调用)关系:主函数中先调用初始化函数,再调用菜单函数引导用户选择操作和相应的算法,用switch多选择结构来判断调用firstAlloc(),bestAlloc(),display()还是recycle()。

存储管理—动态异长存储资源分配算法

存储管理—动态异长存储资源分配算法

存储管理—动态异长存储资源分配算法动态异长存储资源分配算法是一种用于管理及分配动态异长存储资源的算法。

在计算机系统中,存储资源是非常重要的,它需要被合理地管理和分配给不同的任务或进程。

动态异长存储资源分配算法可以根据进程的要求和系统的现有资源情况,动态调整存储资源的分配,以满足不同进程的需求。

动态异长存储资源分配算法有多种实现方式,下面将介绍其中两种常见的算法:最佳适应算法和首次适应算法。

最佳适应算法是一种基于最佳适应原则的分配算法。

该算法将存储资源按照大小进行排序,并在分配时选择最合适的空闲区域进行分配。

这种算法的优点是能够最大限度地减少存储资源的碎片化,但缺点是分配效率相对较低,因为每次都需要整个存储资源链表。

首次适应算法是一种基于首次适应原则的分配算法。

该算法将空闲区域按照地址顺序排序,并在分配时选择第一个满足要求的空闲区域进行分配。

这种算法的优点是分配速度相对较快,但缺点是容易产生较多的存储碎片。

动态异长存储资源分配算法还可以结合使用多种算法,以达到更好的分配效果。

例如,可以将最佳适应算法和首次适应算法结合使用,先使用首次适应算法找到一个满足要求的空闲区域,然后使用最佳适应算法进行更详细的查找,以进一步减少碎片。

除了最佳适应算法和首次适应算法之外,还有其他一些动态异长存储资源分配算法,例如最坏适应算法、循环首次适应算法等。

这些算法在分配效率、碎片程度以及实现复杂度等方面都有所不同,具体选择哪种算法要根据具体的系统需求和实际情况来决定。

总之,动态异长存储资源分配算法是一种用于管理和分配动态异长存储资源的算法,在计算机系统中起着不可或缺的作用。

不同的算法有不同的特点和优缺点,选择合适的算法有助于提高存储资源的利用效率和系统的性能。

在设计和实现这些算法时,需要综合考虑系统的需求、存储资源的特性以及算法的复杂度等因素,以达到最优的资源管理和分配效果。

简述采用动态分区分配的内存管理方式时内存回收的流程(一)

简述采用动态分区分配的内存管理方式时内存回收的流程(一)

简述采用动态分区分配的内存管理方式时内存回收的流程(一)动态分区分配的内存管理方式下的内存回收引言动态分区分配是一种常见的内存管理方式,它将内存划分为多个大小不等的分区,以满足不同程序的内存需求。

然而,为了保证内存的高效利用,我们需要定期回收已经不再使用的内存。

本文将详细介绍采用动态分区分配的内存管理方式时的内存回收过程。

内存回收的流程1.标记不再使用的内存:在进行内存回收之前,首先需要标记哪些内存块已经不再被程序使用。

通常,我们可以使用垃圾回收算法来识别不再使用的内存块。

这些算法通常会遍历整个内存空间,并标记那些没有被任何指针引用的内存块。

2.整理内存空间:一旦我们标记了不再使用的内存块,下一步就是整理内存空间,以便将被回收的内存块合并成更大的块。

这可以通过移动内存块来实现,从而在内存中创建连续的空间。

3.更新内存分区表:在整理内存空间之后,我们需要更新内存分区表,以反映已经回收的内存块。

内存分区表记录了每个分区的状态、大小和起始地址等信息,以便有效地进行内存分配。

通过更新内存分区表,我们可以确保回收后的内存块能够再次被分配和使用。

4.返回空闲内存:回收后的内存块现在已经可以被重新分配给其他程序使用。

通过将空闲内存块添加到内存分配器的空闲列表中,我们可以轻松地为新的程序请求提供可用的内存。

结论采用动态分区分配的内存管理方式时,内存回收是确保内存高效利用的关键步骤。

通过标记不再使用的内存、整理内存空间、更新内存分区表和返回空闲内存,我们可以有效地重新利用已经回收的内存块,提高内存的利用率。

这一过程是动态分区分配内存管理方式中不可或缺的一部分。

希望本文能为读者对于动态分区分配的内存管理方式下的内存回收提供一个清晰的介绍和理解。

动态分区分配内存管理方式下的内存回收流程详解1. 标记不再使用的内存在进行内存回收之前,首先需要标记哪些内存块已经不再被程序使用。

这是通过垃圾回收算法来实现的,主要有以下两种常见的算法:•引用计数算法:该算法通过为每个内存块维护一个引用计数,记录指向该内存块的指针数量。

内存分配和内存回收的算法

内存分配和内存回收的算法

内存分配和内存回收的算法内存分配和内存回收是计算机科学中非常重要的话题,它们是操作系统和编程语言中的核心概念。

在本文中,我们将深入探讨内存分配和内存回收的算法,以及它们在实际应用中的一些常见方法和技术。

第一部分:内存分配内存分配是将计算机系统中的可用内存空间分配给程序和进程使用的过程。

在常规操作系统中,内存分配包括两种主要方法:静态分配和动态分配。

1. 静态分配:静态分配是在编译时为程序分配固定大小的内存空间。

这种方法的一个明显优点是速度较快,因为内存分配是在程序加载时完成的,无需额外的运行时开销。

然而,缺点是在程序运行时无法根据需要调整内存大小,并且可能导致内存浪费或不足的问题。

2. 动态分配:动态分配是在程序运行时根据需要分配和释放内存空间。

这种方法基于一种称为“堆”的数据结构,其中包含系统中未使用的内存块。

常见的动态分配算法包括:a. 首次适应算法:该算法从堆的起始位置开始查找第一个足够大的空闲内存块,并在找到后分配给程序。

这种算法的优点是分配速度比较快,但后续的内存分配可能会导致碎片化。

b. 最佳适应算法:该算法搜索堆中最小的足够大的内存块并进行分配。

这种方法可以最大限度地减少碎片化,但可能导致内存分配速度较慢。

c. 最差适应算法:该算法搜索堆中最大的足够大的内存块并进行分配。

与最佳适应算法相反,这种方法可以最大限度地减少外部碎片,但可能导致内存分配速度较慢。

d. 快速适应算法:该算法使用一个包含不同大小的内存块的链表,以便根据需要选择最合适的内存块进行分配。

这种方法在分配速度和内存利用率方面都具有较好的平衡。

除了以上算法之外,还有其他一些更高级的动态内存分配算法,例如分区适应算法和伙伴系统分配算法,它们都试图解决内存碎片化的问题,以提高内存利用率和分配效率。

第二部分:内存回收内存回收是将不再使用的内存空间归还给操作系统或编程语言的过程。

在动态分配的环境中,内存回收非常重要,以免出现内存泄漏和内存溢出等问题。

动态异长分区的存储分配与回收算法

动态异长分区的存储分配与回收算法
实验5 动态异长分区的存储分配与回收算法之杨若古兰创作
5.1 实验目的
理解存储管理的功能,把握动态异长分区的存储分配与回收算法.
存储器是计算机零碎中的关键资本,存储管理不断是操纵零碎的最次要功能之一.存储管理既包含内存资本管理,也包含用于实现分级存储体系的外存资本的管理.通常, 内存与外存可采取不异或类似的管理技术,如内存采取段式存储管理,则外存也采取段式存储管理.存储管理须要完成如下功能: 存储分配、存储共享、存储呵护、存储扩充、地址映照.
c
d
e
大小
10
10
20
30
10
5
60
15
20
20
图54初始内存规划
由图54可见,初始时共有五个线程驻留在内存,它们是a,b,c,d,e,线程驻留区表如图55;还有五个空闲区,空闲区域表如图56.
假设此刻有三个线程提出内存申请,申请情况见图57.经过分析我们得到在每种分配算法下这三个线程所申请到的内存情况.图58是最早适应算法分配情况,图59是最好适应算法分配情况,图510是最坏适应算法分配情况.
#define WF_initialize_thread_residence_memory_list FF_initialize_thread_residence_memory_list
#define WF_delete_freearea_list FF_delete_freearea_list
#define BF_delete_freearea_list FF_delete_freearea_list
明显, 没有记录于表中的区域即为已被进程所占用的非空闲区域,在实际的操纵零碎中,这些区域登记在进程的PCB中.而PCB中除了关于内存资本的信息外,还有其它大量信息.
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验5 动态异长分区的存储分配与回收算法5.1 实验目的理解存储管理的功能,掌握动态异长分区的存储分配与回收算法。

存储器是计算机系统中的关键资源,存储管理一直是操作系统的最主要功能之一。

存储管理既包括存资源管理,也包括用于实现分级存储体系的外存资源的管理。

通常,存与外存可采用相同或相似的管理技术,如存采用段式存储管理,则外存也采用段式存储管理。

存储管理需要完成如下功能:存储分配、存储共享、存储保护、存储扩充、地址映射。

当一个作业进入存时,由操作系统将其变为进程,并为进程分配存储空间。

进程运行结束时, 由操作系统将其所占用的存储空间收回。

不同的操作系统对存空间的划分与分配方法是不同的,通常分为两类:静态等长分区的分配和动态异长分区的分配。

静态等长分区常用于页式存储管理方式与段页式存储管理方式,存储空间被静态地划分为若干个长度相等的区域,每个区域被称作一个页面。

动态异长分区常用于界地址存储管理方式与段式存储管理方式,存储空间被动态地划分为若干个长度不等的区域。

5.2 实验要求本实验要求模拟动态异长分区的分配算法、回收算法和碎片整理算法。

5.3 实验步骤5.3.1 数据结构分析为了实现存储资源的分配和回收,操作系统需Array要记录存资源使用情况,即哪些区域尚未分配,哪些区域已经分配以及分配给哪些进程等。

为此一般需要两个表,一个为分配表, 另外一个为空闲区域表。

前者记录已经分配的区域, 后者记录着所有当前未被进程占用的空闲区域, 如图5-1所示。

图5-1 空闲区域表显然, 没有记录于表中的区域即为已被进程所占用的非空闲区域,在实际的操作系统中,这些区域登记在进程的PCB中。

而PCB中除了关于存资源的信息外,还有其它大量信息。

由于本实验是对存储管理算法的模拟,所以用一个线程来代表一个进程,用线程驻留区图5-2 线程驻留区表图5-3 存申请表5.3.2 算法分析常用的动态异长分区的分配算法有:最先适应算法、最佳适应算法和最坏适应算法。

1. 最先适应算法(First Fit,FF)对于存储申请命令, 选取满足申请长度要求且起始地址最小的空闲区域。

在实现时, 可将系统中所有的空闲区域按照起始地址由小到大的次序依次记录于空闲区域表中。

当进程申请存储空间时, 系统由表的头部开始查找, 取第一个满足要求的表目。

如果该表目所对应的区域长度恰好与所申请的区域长度相同, 则将该区域全部分配给申请者。

否则将该区域分割为两部分, 一部分的长度与所申请的长度相同, 将其分配给申请者;另一部分的长度为原长度与分配长度之差, 将其仍记录于空闲区域表中。

回收时,按回收区的首地址查询空闲区表,若有与回收区相临的空闲区,则将其合并到相临区中,否则,把回收区按照地址从低到高的顺序插入到空闲区域表的适当位置。

2. 最佳适应算法(Best Fit,BF)分配时取满足申请要求且长度最小的空闲区域。

在实现时, 可将系统中所有的空闲区域按照长度由小到大的次序依次记录于空闲区域表中。

与最先适应算法相类似, 当进程申请存储空间时, 系统由表的头部开始查找, 取第一个满足要求的表目。

如果该表目所对应的区域长度恰好与所申请的区域长度相同, 则将该区域全部分配给申请者。

否则将该区域分割为两部分, 一部分的长度与所申请的长度相同, 将其分配给申请者;另一部分即剩余部分的长度为原长度与分配长度之差, 由于剩余部分的长度已经改变,所以应重新将其按长度从小到大的顺序插入到空闲区域表中。

回收时,不仅要按回收区的首地址查询空闲区表,找到与回收区相临的空闲区,将其合并到相临区中,而且要把合并后的回收区按照长度递增的顺序插入到空闲区域表的适当位置。

3. 最坏适应算法(Worst Fit,WF)分配时取满足申请要求且长度最大的空闲区域。

在实现时, 可将系统中所有的空闲区域按照长度由大到小的次序依次记录于空闲区域表中。

当进程申请存储空间时, 取第一个表目。

如果该表目所对应的区域长度恰好与所申请的区域长度相同, 则将该区域全部分配给申请者。

否则将该区域分割为两部分, 一部分的长度与所申请的长度相同, 将其分配给申请者;另一部分即剩余部分的长度为原长度与分配长度之差, 由于剩余部分的长度已经改变,所以应重新将其按长度递减的顺序插入到空闲区域表中。

回收时,不仅要按回收区的首地址查询空闲区表,找到与回收区相临的空闲区,将其合并到相临区中,而且要把合并后的回收区按照长度递减的顺序插入到空闲区域表的适当位置。

5.3.3 设计并分析测试数据假设初始存布局如图5-4,图中的起始地址以及大小都以KB来衡量。

起始地址0 10 20 40 70 80 85 145 160 180占用者大小10 10 20 30 10 5 60 15 20 20图5-4初始存布局由图5-4可见,初始时共有五个线程驻留在存,它们是a,b,c,d,e,线程驻留区表如图5-5;还有五个空闲区,空闲区域表如图5-6。

假设现在有三个线程提出存申请,申请情况见图5-7。

经过分析我们得到在每种分配算法下这三个线程所申请到的存情况。

图5-8是最先适应算法分配情况,图5-9是最佳适应算法分配情况,图5-10是最坏适应算法分配情况。

5.3.4 程序设计程序包含两个文件,一个是头文件variable_partition.h ,另一个是源程序文件variable_partition.cpp 。

在头文件中定义了宏、数据结构、全局变量、函数声明,源程序中含有各个函数的实现。

在头文件中,结构体FREEAREA 、REQUIRE_MEMORY 、THREAD_RESIDENCE_MEMORY 分别对应于图5-1、图5-2、图5-3中的一行,不同之处是为了构成链表在三个结构体中都有前向指针。

数组init_free_area_table 对应于图5-6,数组init_thread_require_memory_table 对应于图5-5,数组init_thread_residence_memory_table 对应于图5-7,为了实现动态分配与释放,用链表重新组织空闲区域表、线程驻留区表和存申请表,全局变量p_free_area _list 是空闲区链首,p_thread_require_memory_queue 是存申请队列的队首,p_thread_r esidence_memory_list 是线程驻留区链首,tail_thread_residence_memory_list 是线程驻留区链尾,由于线程驻留区链表被存分配函数和存释放函数共享,故用临界区变量CS_THREAD_MEMORY_LIST来保护,同理,屏幕是所有线程共享的,所以用临界区变量CS_SCREEN来保护,空闲区链表被存分配函数和存释放函数共享,故用临界区变量CS_FREEAREA_LIST来保护。

h_thread是线程句柄数组,用来存放各个线程的句柄。

程序共包含25个函数,按照作用可以将它们分成五组。

第一组是主函数main(),其作用是显示主菜单并根据用户的选择执行相应功能;第二组包括函数print_space()和函数display_thread_residence_memory(),前者用来显示若干个空格,后者用来显示线程驻留区表;图5-11 最先适应分配法的函数及其功能第四组共六个函数,用来实现最佳适应分配法,它们的名称及功能如图5-12。

图5-12 最佳适应分配法的函数及其功能第五组共六个函数,用来实现最坏适应分配法,它们的名称及功能如图5-13。

图5-13 最坏适应分配法的函数及其功能5.3.5 参考源代码5.3.5.1 windows下的参考源程序下面是完整的程序清单。

头文件 variable_partition.h 的清单#include <windows.h>#include <conio.h>#include <stdlib.h>#include <stdio.h>#include <io.h>#include <string.h>#define MAX_THREAD 3#define BF_initialize_require_memory_list FF_initialize_require_memory_list#define WF_initialize_require_memory_list FF_initialize_require_memory_list#define BF_initialize_thread_residence_memory_list FF_initialize_thread_residence_memory_list#define WF_initialize_thread_residence_memory_list FF_initialize_thread_residence_memory_list#define WF_delete_freearea_list FF_delete_freearea_list#define BF_delete_freearea_list FF_delete_freearea_list#define WF_delete_require_memory_list FF_delete_require_memory_list#define BF_delete_require_memory_list FF_delete_require_memory_list#define WF_delete_thread_residence_memory_list FF_delete_thread_residence_memory_list #define BF_delete_thread_residence_memory_list FF_delete_thread_residence_memory_list typedef struct freearea{ //表示空闲区域的数据结构struct freearea *next; //指向下一个结点的指针int start_address; //空闲区起始地址int size; //空闲区大小}FREEAREA;typedef struct require_memory{ //记录线程申请存的数据结构struct require_memory *next; //指向下一个结点的指针char thread_name[10]; //线程名int size; //申请存大小(以KB为单位)int duration; //在存的驻留时间(以秒为单位)}REQUIRE_MEMORY;typedef struct thread_residence_memory{ //描述线程驻留区的数据结构struct thread_residence_memory *next; //指向下一个结点的指针char thread_name[10]; //线程名int start_address; //驻留区起始地址int size; //驻留区大小}THREAD_RESIDENCE_MEMORY;FREEAREA init_free_area_table[5]={ //测试数据:初始空闲区表{NULL,10,10},{NULL,40,30},{NULL,80,5},{NULL,145,15},{NULL,180,20}};REQUIRE_MEMORY init_thread_require_memory_table[3]={ //测试数据:初始存申请表{NULL,"thread_1",20,4},{NULL,"thread_2",10,5},{NULL,"thread_3",5,6}};//测试数据:初始线程驻留区表THREAD_RESIDENCE_MEMORY init_thread_residence_memory_table[5]={{NULL,"a",0,10},{NULL,"b",20,20},{NULL,"c",70,10},{NULL,"d",85,60},{NULL,"e",160,20}};FREEAREA *p_free_area_list=NULL; //空闲区链首REQUIRE_MEMORY *p_thread_require_memory_queue=NULL; //存申请队列队首THREAD_RESIDENCE_MEMORY *p_thread_residence_memory_list=NULL; //线程驻留区链首THREAD_RESIDENCE_MEMORY *tail_thread_residence_memory_list=NULL; //线程驻留区链尾CRITICAL_SECTION CS_THREAD_MEMORY_LIST; //保护线程驻留区链表的临界区CRITICAL_SECTION CS_SCREEN; //保护屏幕的临界区CRITICAL_SECTION CS_FREEAREA_LIST; //保护空闲区链表的临界区HANDLE h_thread[MAX_THREAD]; //线程句柄数组void print_space(int num); //输出若干个空格void display_thread_residence_memory_list(); //显示线程驻留区表//最先适应分配法的函数FREEAREA *FF_initialize_freearea_list(FREEAREA *init_table,int num); //初始化空闲区链表void FF_delete_freearea_list(); //删除空闲区链表REQUIRE_MEMORY *FF_initialize_require_memory_list(REQUIRE_MEMORY *init_table,int num);//初始化存申请链表void FF_delete_require_memory_list(); //删除存申请链表THREAD_RESIDENCE_MEMORY *FF_initialize_thread_residence_memory_list(THREAD_RESIDENCE_MEMORY *init_table,int num); //初始化线程驻留区链表void FF_delete_thread_residence_memory_list(); //删除线程驻留区链表void FF_thread(void *data); //线程函数int FF_require_memory(int size); //存申请函数void FF_release_memory(int start_address,int size); //存释放函数void FF(); //最先适应分配算法的初始化函数//最佳适应分配算法的函数void BF_thread(void *data); //线程函数int BF_require_memory(int size); //存申请函数void BF_release_memory(int start_address,int size); //存释放函数void BF_insert_freearea(FREEAREA *free_node); //空闲区结点插入函数void BF(); //初始化程序void BF_initialize_freearea_list(FREEAREA *init_table,int num); //初始化空闲区链表//最坏适应分配算法的函数void WF_thread(void *data); //线程函数void WF_insert_freearea(FREEAREA *free_node); //空闲区结点插入函数void WF_initialize_freearea_list(FREEAREA *init_table,int num); //初始化空闲区链表int WF_require_memory(int size); //存申请函数void WF_release_memory(int start_address,int size); //存释放函数void WF(); //初始化程序源程序文件 variable_partition.cpp 的清单#include "variable_partition.h"int main(int argc,char *argv[]){char select;while(1){printf("|-----------------------------------|\n");printf("| 1:first fit allocation |\n");printf("| 2:best fit allocation |\n");printf("| 3:worst fit allocation |\n");printf("| 4:exit |\n");printf("|-----------------------------------|\n");printf("select a function(1~4):");do{select=(char)getch();}while(select!='1'&&select!='2'&&select!='3'&&select!='4');system("cls");switch(select){case '1':FF();break;case '2':BF();break;case '3':WF();break;case '4':return 0;}printf("\nPress any key to return to main menu.");getch();system("cls");}return 0;}void print_space(int num){ //显示若干个空格int i;for(i=0;i<num;i++){printf(" ");}}void display_thread_residence_memory_list(){ //显示驻留线程链表THREAD_RESIDENCE_MEMORY *p;char buffer[20];p=p_thread_residence_memory_list;printf("|-------------------|--------------------|------------------|\n");printf("| thread_name | start_address(kB) | size(KB) |\n");printf("|-------------------|--------------------|------------------|\n");while(p!=NULL){printf("| %s",p->thread_name);print_space(18-strlen(p->thread_name));printf("| %d",p->start_address);itoa( p->start_address, buffer, 10 );print_space(19-strlen(buffer));printf("| %d",p->size);itoa(p->size, buffer, 10 );print_space(17-strlen(buffer));printf("|\n");p=p->next;};printf("|-------------------|--------------------|------------------|\n\n");}//最先适应分配法:初始化空闲区链表FREEAREA *FF_initialize_freearea_list(FREEAREA *init_table,int num){FREEAREA *temp;FREEAREA *head=NULL;FREEAREA *tail=NULL;int i;for(i=0;i<num;i++){temp=(FREEAREA *)malloc(sizeof(FREEAREA));temp->start_address=init_table[i].start_address;temp->size=init_table[i].size;temp->next=NULL;if(head==NULL)head=tail=temp;else{tail->next=temp;tail=tail->next;}};return head;}//最先适应分配法:删除空闲区链表void FF_delete_freearea_list(){FREEAREA *temp;temp=p_free_area_list;while(temp!=NULL){temp=p_free_area_list->next;free(p_free_area_list);p_free_area_list=temp;}p_free_area_list=NULL;}//最先适应分配法:初始化存申请链表REQUIRE_MEMORY *FF_initialize_require_memory_list(REQUIRE_MEMORY *init_table,int num){ REQUIRE_MEMORY *temp;REQUIRE_MEMORY *head=NULL;REQUIRE_MEMORY *tail=NULL;int i;for(i=0;i<num;i++){temp=(REQUIRE_MEMORY *)malloc(sizeof(REQUIRE_MEMORY));strcpy(temp->thread_name,init_table[i].thread_name);temp->size=init_table[i].size;temp->duration=init_table[i].duration;temp->next=NULL;if(head==NULL)head=tail=temp;else{tail->next=temp;tail=tail->next;}};return head;}//最先适应分配法:删除存申请链表void FF_delete_require_memory_list(){REQUIRE_MEMORY *temp;temp=p_thread_require_memory_queue;while(temp!=NULL){temp=p_thread_require_memory_queue->next;free(p_thread_require_memory_queue);p_thread_require_memory_queue=temp;}p_thread_require_memory_queue=NULL;}//最先适应分配法:初始化线程驻留区链表THREAD_RESIDENCE_MEMORY *FF_initialize_thread_residence_memory_list(THREAD_RESIDENCE_MEMORY *init_table,int num){THREAD_RESIDENCE_MEMORY *temp;THREAD_RESIDENCE_MEMORY *head=NULL;THREAD_RESIDENCE_MEMORY *tail=NULL;int i;for(i=0;i<num;i++){temp=(THREAD_RESIDENCE_MEMORY *)malloc(sizeof(THREAD_RESIDENCE_MEMORY));strcpy(temp->thread_name,init_table[i].thread_name);temp->start_address=init_table[i].start_address;temp->size=init_table[i].size;temp->next=NULL;if(head==NULL)head=tail=temp;else{tail->next=temp;tail=tail->next;}};tail_thread_residence_memory_list=tail;return head;}//最先适应分配法:删除线程驻留区链表void FF_delete_thread_residence_memory_list(){THREAD_RESIDENCE_MEMORY *temp=p_thread_residence_memory_list;temp=p_thread_residence_memory_list;while(temp!=NULL){temp=p_thread_residence_memory_list->next;free(p_thread_residence_memory_list);p_thread_residence_memory_list=temp;}p_thread_residence_memory_list=NULL;}//线程:申请存,驻留一段时间,释放存void FF_thread(void *data){int start_address=-1;THREAD_RESIDENCE_MEMORY *temp;EnterCriticalSection(&CS_SCREEN);printf("create thread:%s\n",((REQUIRE_MEMORY *)(data))->thread_name);LeaveCriticalSection(&CS_SCREEN);while(1){ //申请存start_address=FF_require_memory(((REQUIRE_MEMORY *)(data))->size);if(start_address>=0)break;elseSleep(1000);}temp=(THREAD_RESIDENCE_MEMORY *)malloc(sizeof(THREAD_RESIDENCE_MEMORY));strcpy(temp->thread_name,((REQUIRE_MEMORY *)(data))->thread_name);temp->start_address=start_address;temp->size=((REQUIRE_MEMORY *)(data))->size;temp->next=NULL;EnterCriticalSection(&CS_THREAD_MEMORY_LIST);//加入线程驻留区链表tail_thread_residence_memory_list->next=temp;tail_thread_residence_memory_list=tail_thread_residence_memory_list->next;LeaveCriticalSection(&CS_THREAD_MEMORY_LIST);//显示线程驻留区链表EnterCriticalSection(&CS_SCREEN);printf("after %s %s\n",((REQUIRE_MEMORY *)(data))->thread_name,"get memory:");display_thread_residence_memory_list();LeaveCriticalSection(&CS_SCREEN);Sleep(((REQUIRE_MEMORY *)(data))->duration);//释放存FF_release_memory(start_address,((REQUIRE_MEMORY *)(data))->size);}//最先适应分配法:存申请函数int FF_require_memory(int size){int start_address=-1;FREEAREA *p;FREEAREA *p_next;EnterCriticalSection(&CS_FREEAREA_LIST);p=p_next=p_free_area_list;while(p_next!=NULL){if(size==p_next->size){ //刚好满足要求,删除空闲区结点start_address=p_next->start_address;if(p_next==p_free_area_list)p_free_area_list=p_next->next;elsep->next=p_next->next;free(p_next);break;}elseif(size<p_next->size){ //分割空闲区结点start_address=p_next->start_address;p_next->start_address+=size;p_next->size-=size;break;}else{p=p_next;p_next=p_next->next;}}LeaveCriticalSection(&CS_FREEAREA_LIST);return start_address;}//最先适应分配法:存释放函数void FF_release_memory(int start_address,int size){EnterCriticalSection(&CS_FREEAREA_LIST);//请读者自己实现这段代码LeaveCriticalSection(&CS_FREEAREA_LIST);}//最先适应分配算法的初始化程序void FF(){int i=0;REQUIRE_MEMORY *p;HANDLE h_thread[MAX_THREAD];InitializeCriticalSection(&CS_THREAD_MEMORY_LIST);InitializeCriticalSection(&CS_FREEAREA_LIST);InitializeCriticalSection(&CS_SCREEN);printf("最先适应分配算法\n");p_free_area_list=FF_initialize_freearea_list(init_free_area_table,5);p_thread_require_memory_queue=FF_initialize_require_memory_list(init_thread_require_memo ry_table,3);p_thread_residence_memory_list=FF_initialize_thread_residence_memory_list(init_thread_re sidence_memory_table,5);p=p_thread_require_memory_queue;while(p!=NULL){h_thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(FF_thread),p,0,NULL);i++;p=p->next;};WaitForMultipleObjects(MAX_THREAD,h_thread,TRUE,-1); //等待所有线程结束EnterCriticalSection(&CS_SCREEN);printf("after all threads have finished:\n");display_thread_residence_memory_list(); //显示驻留线程链表LeaveCriticalSection(&CS_SCREEN);//删除各种链表FF_delete_freearea_list();FF_delete_require_memory_list();FF_delete_thread_residence_memory_list();getch();printf("\n");}//最佳适应分配算法的线程:申请存,驻留一段时间,释放存void BF_thread(void *data){int start_address=-1;THREAD_RESIDENCE_MEMORY *temp;EnterCriticalSection(&CS_SCREEN);printf("create thread:%s\n",((REQUIRE_MEMORY *)(data))->thread_name);LeaveCriticalSection(&CS_SCREEN);//申请存while(1){start_address=BF_require_memory(((REQUIRE_MEMORY *)(data))->size);if(start_address>=0)break;elseSleep(1000);}temp=(THREAD_RESIDENCE_MEMORY *)malloc(sizeof(THREAD_RESIDENCE_MEMORY));strcpy(temp->thread_name,((REQUIRE_MEMORY *)(data))->thread_name);temp->start_address=start_address;temp->size=((REQUIRE_MEMORY *)(data))->size;temp->next=NULL;EnterCriticalSection(&CS_THREAD_MEMORY_LIST);//加入线程存驻留区链表tail_thread_residence_memory_list->next=temp;tail_thread_residence_memory_list=tail_thread_residence_memory_list->next;LeaveCriticalSection(&CS_THREAD_MEMORY_LIST);//显示线程存驻留区链表EnterCriticalSection(&CS_SCREEN);printf("after %s %s\n",((REQUIRE_MEMORY *)(data))->thread_name,"get memory:");display_thread_residence_memory_list();LeaveCriticalSection(&CS_SCREEN);Sleep(((REQUIRE_MEMORY *)(data))->duration);//释放存BF_release_memory(start_address,((REQUIRE_MEMORY *)(data))->size);}//最佳适应分配算法的存申请函数int BF_require_memory(int size){int start_address=-1;FREEAREA *p;FREEAREA *p_next;EnterCriticalSection(&CS_FREEAREA_LIST);p=p_next=p_free_area_list;while(p_next!=NULL){if(size==p_next->size){//刚好满足要求,删除空闲区结点start_address=p_next->start_address;if(p_next==p_free_area_list)p_free_area_list=p_next->next;elsep->next=p_next->next;free(p_next);break;}elseif(size<p_next->size){//分割空闲区结点start_address=p_next->start_address;p_next->start_address+=size;p_next->size-=size;p->next=p_next->next;BF_insert_freearea(p_next);break;}else{p=p_next;p_next=p_next->next;}}LeaveCriticalSection(&CS_FREEAREA_LIST);return start_address;}//最佳适应分配算法的存释放函数void BF_release_memory(int start_address,int size){//请读者自己实现这段代码}//最佳分配算法的空闲区结点插入函数void BF_insert_freearea(FREEAREA *free_node){FREEAREA *p;FREEAREA *p_next;if(p_free_area_list==NULL)p_free_area_list=free_node;else{p_next=p=p_free_area_list;while(p_next!=NULL&&p_next->size<free_node->size){p=p_next;p_next=p_next->next;}if(p_next==NULL) //应插入到尾部p->next=free_node;elseif(p==p_next){ //应插入到头部free_node->next=p;p_free_area_list=free_node;}else{ //应插入到p与p_next之间free_node->next=p_next;p->next=free_node;}}}//最佳适应分配法:初始化空闲区链表void BF_initialize_freearea_list(FREEAREA *init_table,int num){FREEAREA *temp;int i;for(i=0;i<num;i++){temp=(FREEAREA *)malloc(sizeof(FREEAREA));temp->start_address=init_table[i].start_address;temp->size=init_table[i].size;temp->next=NULL;BF_insert_freearea(temp);}}//最佳分配算法的初始化程序void BF(){int i=0;REQUIRE_MEMORY *p;HANDLE h_thread[MAX_THREAD];InitializeCriticalSection(&CS_THREAD_MEMORY_LIST);InitializeCriticalSection(&CS_FREEAREA_LIST);InitializeCriticalSection(&CS_SCREEN);printf("最佳适应分配算法\n");BF_initialize_freearea_list(init_free_area_table,5);p_thread_require_memory_queue=BF_initialize_require_memory_list(init_thread_require_memo ry_table,3);p_thread_residence_memory_list=BF_initialize_thread_residence_memory_list(init_thread_re sidence_memory_table,5);p=p_thread_require_memory_queue;while(p!=NULL){h_thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(BF_thread),p,0,NULL);i++;p=p->next;};//等待所有线程结束WaitForMultipleObjects(MAX_THREAD,h_thread,TRUE,-1);//显示驻留线程链表EnterCriticalSection(&CS_SCREEN);printf("after all threads have finished:\n");display_thread_residence_memory_list();LeaveCriticalSection(&CS_SCREEN);//删除各种链表FF_delete_freearea_list();FF_delete_require_memory_list();FF_delete_thread_residence_memory_list();getch();printf("\n");}//最坏适应分配算法的线程:申请存,驻留一段时间,释放存void WF_thread(void *data){int start_address=-1;THREAD_RESIDENCE_MEMORY *temp;EnterCriticalSection(&CS_SCREEN);printf("create thread:%s\n",((REQUIRE_MEMORY *)(data))->thread_name);LeaveCriticalSection(&CS_SCREEN);//申请存while(1){start_address=WF_require_memory(((REQUIRE_MEMORY *)(data))->size);if(start_address>=0)break;elseSleep(1000);}temp=(THREAD_RESIDENCE_MEMORY *)malloc(sizeof(THREAD_RESIDENCE_MEMORY));strcpy(temp->thread_name,((REQUIRE_MEMORY *)(data))->thread_name);temp->start_address=start_address;temp->size=((REQUIRE_MEMORY *)(data))->size;temp->next=NULL;EnterCriticalSection(&CS_THREAD_MEMORY_LIST);//加入线程存驻留区链表tail_thread_residence_memory_list->next=temp;tail_thread_residence_memory_list=tail_thread_residence_memory_list->next;LeaveCriticalSection(&CS_THREAD_MEMORY_LIST);//显示线程存驻留区链表EnterCriticalSection(&CS_SCREEN);printf("after %s %s\n",((REQUIRE_MEMORY *)(data))->thread_name,"get memory:");display_thread_residence_memory_list();LeaveCriticalSection(&CS_SCREEN);Sleep(((REQUIRE_MEMORY *)(data))->duration);//释放存WF_release_memory(start_address,((REQUIRE_MEMORY *)(data))->size);}//最坏分配算法的空闲区结点插入函数void WF_insert_freearea(FREEAREA *free_node){FREEAREA *p;FREEAREA *p_next;if(p_free_area_list==NULL)p_free_area_list=free_node;else{p=p_next=p_free_area_list;while(p_next!=NULL&&free_node->size<p_next->size){p=p_next;p_next=p_next->next;}if(p_next==NULL) //应插入到尾部p->next=free_node;elseif(p==p_next){ //应插入到头部free_node->next=p;p_free_area_list=free_node;}else{ //应插入到p与p_next之间free_node->next=p_next;p->next=free_node;}}}//最坏适应分配法:初始化空闲区链表void WF_initialize_freearea_list(FREEAREA *init_table,int num){FREEAREA *temp;int i;for(i=0;i<num;i++){temp=(FREEAREA *)malloc(sizeof(FREEAREA));temp->start_address=init_table[i].start_address;temp->size=init_table[i].size;temp->next=NULL;WF_insert_freearea(temp);}}//最坏适应分配算法的存申请函数int WF_require_memory(int size){int start_address=-1;FREEAREA *p_next;EnterCriticalSection(&CS_FREEAREA_LIST);p_next=p_free_area_list;if(size==p_free_area_list->size){//刚好满足要求,删除空闲区结点start_address=p_next->start_address;p_free_area_list=p_free_area_list->next;free(p_next);}elseif(size<p_next->size){//分割空闲区结点start_address=p_next->start_address;p_next->start_address+=size;p_next->size-=size;p_free_area_list=p_free_area_list->next;WF_insert_freearea(p_next);}LeaveCriticalSection(&CS_FREEAREA_LIST);return start_address;}//最坏适应分配算法:存释放函数void WF_release_memory(int start_address,int size){//请读者自己实现这段代码}//最坏适应分配算法的初始化程序void WF(){int i=0;REQUIRE_MEMORY *p;HANDLE h_thread[MAX_THREAD];InitializeCriticalSection(&CS_THREAD_MEMORY_LIST);InitializeCriticalSection(&CS_FREEAREA_LIST);InitializeCriticalSection(&CS_SCREEN);printf("最坏适应分配算法\n");WF_initialize_freearea_list(init_free_area_table,5);p_thread_require_memory_queue=WF_initialize_require_memory_list(init_thread_require_memo ry_table,3);p_thread_residence_memory_list=WF_initialize_thread_residence_memory_list(init_thread_re sidence_memory_table,5);p=p_thread_require_memory_queue;while(p!=NULL){h_thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(WF_thread),p,0,NULL); i++;p=p->next;};//等待所有线程结束WaitForMultipleObjects(MAX_THREAD,h_thread,TRUE,-1);//显示驻留线程链表EnterCriticalSection(&CS_SCREEN);printf("after all threads have finished:\n");display_thread_residence_memory_list();LeaveCriticalSection(&CS_SCREEN);//删除各种链表FF_delete_freearea_list();FF_delete_require_memory_list();FF_delete_thread_residence_memory_list();getch();printf("\n");}5.3.5.2 linux下的参考源程序○1编译命令gcc variable_partition .cpp –o variable_partition.o –lcurses –lpthread ○2程序清单头文件variable_partition.h#include <unistd.h>#include <curses.h>#include <stdlib.h>#include <pthread.h>#include <time.h>#include <string.h>#include <semaphore.h>#define MAX_THREAD 3#define BF_initialize_require_memory_list FF_initialize_require_memory_list #define WF_initialize_require_memory_list FF_initialize_require_memory_list #define BF_initialize_thread_residence_memory_listFF_initialize_thread_residence_memory_list#define WF_initialize_thread_residence_memory_listFF_initialize_thread_residence_memory_list#define WF_delete_freearea_list FF_delete_freearea_list#define BF_delete_freearea_list FF_delete_freearea_list#define WF_delete_require_memory_list FF_delete_require_memory_list#define BF_delete_require_memory_list FF_delete_require_memory_list#define WF_delete_thread_residence_memory_listFF_delete_thread_residence_memory_list#define BF_delete_thread_residence_memory_listFF_delete_thread_residence_memory_listtypedef struct freearea{struct freearea *next;int start_address;int size;}FREEAREA;typedef struct require_memory{struct require_memory *next;char thread_name[10];int size;int duration;}REQUIRE_MEMORY;typedef struct thread_residence_memory{struct thread_residence_memory *next;char thread_name[10];int start_address;int size;}THREAD_RESIDENCE_MEMORY;FREEAREA init_free_area_table[5]={{NULL,10,10},{NULL,40,30},{NULL,80,5},{NULL,145,15},{NULL,180,20}};REQUIRE_MEMORY init_thread_require_memory_table[3]={{NULL,"thread_1",20,4},{NULL,"thread_2",10,5},{NULL,"thread_3",5,6}};THREAD_RESIDENCE_MEMORY init_thread_residence_memory_table[5]={ {NULL,"a",0,10},{NULL,"b",20,20},{NULL,"c",70,10},{NULL,"d",85,60},{NULL,"e",160,20}};FREEAREA *p_free_area_list=NULL;REQUIRE_MEMORY *p_thread_require_memory_queue=NULL;THREAD_RESIDENCE_MEMORY *p_thread_residence_memory_list=NULL;THREAD_RESIDENCE_MEMORY *tail_thread_residence_memory_list=NULL;pthread_mutex_t CS_THREAD_MEMORY_LIST;pthread_mutex_t CS_SCREEN;pthread_mutex_t CS_FREEAREA_LIST;pthread_t h_thread[MAX_THREAD];sem_t thread_end[MAX_THREAD];void display_thread_residence_memory_list();FREEAREA *FF_initialize_freearea_list(FREEAREA *init_table,int num);void FF_delete_freearea_list();REQUIRE_MEMORY *FF_initialize_require_memory_list(REQUIRE_MEMORY *init_table,int num);void FF_delete_require_memory_list();THREAD_RESIDENCE_MEMORY *FF_initialize_thread_residence_memory_list(THREAD_RESIDENCE_MEMORY *init_table,int num);void FF_delete_thread_residence_memory_list();void* FF_thread(void *data);int FF_require_memory(int size);void FF_release_memory(int start_address,int size);void FF();void* BF_thread(void *data);int BF_require_memory(int size);void BF_release_memory(int start_address,int size);void BF_insert_freearea(FREEAREA *free_node);void BF();void BF_initialize_freearea_list(FREEAREA *init_table,int num); void* WF_thread(void *data);void WF_insert_freearea(FREEAREA *free_node);void WF_initialize_freearea_list(FREEAREA *init_table,int num);int WF_require_memory(int size);void WF_release_memory(int start_address,int size);void WF();源文件variable_partition.cpp#include "variable_partition.h"int main(int argc,char *argv[]){char select;bool end=false;initscr();while(!end){clear();refresh();printw("|-----------------------------------|\n");printw("| 1:first fit allocation |\n");printw("| 2:best fit allocation |\n");printw("| 3:worst fit allocation |\n");printw("| 4:exit |\n");printw("|-----------------------------------|\n");printw("select a function(1~4):");do{select=(char)getch();}while(select!='1'&&select!='2'&&select!='3'&&select!='4');clear();refresh();switch(select){case '1':FF();break;case '2':BF();break;case '3':WF();break;case '4':end=true;。

相关文档
最新文档