华南操作系统大作业

发布 2020-02-28 15:10:28 阅读 4618

“计算机操作系统”

目录。1 题目要求 1

2 设计思想 1

3 数据定义 2

4 处理流程 3

5 源程序 6

6 运行结果 15

7 设计体会 22

动态内存分区分配方式模拟。

假设初始态下,可用内存空间为640k,并有下列请求序列,请分别用首次适应算法和最佳适应算法为作业分配和**内存块,并显示出每次分配和**后的空闲分区链的情况来以及内存占用情况图。

作业1申请130k

作业2申请60k

作业3申请100k

作业2释放60k

作业4申请200k

作业3释放100k

作业1释放130k

作业5申请140k

作业6申请60k

作业7申请50k

作业6释放60k

根据题目要求,要用首次适应算法和最佳适应算法分别实现内存的动态分区,因此先介绍一下这两种算法的基本思想:

首次适应算法中,空闲分区链是按地址递增的次序链接的,当要分配内存空间时,就查表,在各空闲分区中查找满足大小要求的可用块,只要找到第一个足以满足要求的空间就停止查找,并把它分配出去,如果该空闲空间与所需空间大小一样,则将该分区的状态改为1,即已被分配,若还有剩余,则将剩余空间重新划为一个空闲分区,有新的起始地址,状态为0。

最佳适应算法的空闲链是按照空闲块的大小为序、按增量方式排列的,即小块在前,大块在后,它在满足需要的前提下,尽量分配最小的空闲块,这样每次查找分配时第一次找到的能满足要求的必然的最佳的,若空闲空间大小与要分配的大小相差不多时,可直接将其状态改为1即可,若有剩余,则将剩余空闲空间重新划分为一个空闲区,并根据空闲区的大小对链表进行重新排序。

首次适应算法的**过程相对简单,因为分区链是按照地址顺序链接的,因此释放内存时只需要判断要释放的分区前后是否也为空闲区,然后根据情况看是要跟前边或后边或前后都合并为一个大的空闲区,如果前后分区都已分配,则直接将该分区状态改为0即可。

最佳适应算法**时,因为它的分区链是按照空间大小排列的,因此不仅要看要释放分区前后是否为空闲,还要判断其地址是否前后相接,若地址不相接,则即使要释放分区前后均为空闲区,也不能进行合并,而且每次释放后要根据释放空间的大小对链表进行重新排序。

动态分区常用的数据结构有空闲分区表和空闲分区链,用来记录内存的使用情况,此题中我采用的是空闲分区链的结构,用链指针将所有的分区链接成一条链,每个分区的结构如下所示:

struct memory

struct memory *former; /前向指针。

int address;//分区起始地址

int num;//作业号

int size;//分配内存大小

int state;//状态字

struct memory *next; /后向指针。

前向指针和后向指针分别用于与当前分区的前后分区相链接,address用于说明当前分区的起始地址,状态字为0时表示当前分区空闲,为1时表示已分配,num为分配的作业号,size表示分配的内存大小。

详细流程图见图5.1.1,其中各个条件分别为:

p1: ptr->next==null

p2: ptr->size>=assign->size

p3: current!=null

p4: current->size>=assign->size&¤t->state==0

p5: ptr->size>=assign->size

p6: (ptr->next)->next!=null&&is_optimist==true

详细流程图见图5.1.2

若为首先适应算法**,则各条件分别为:

p1: current!=null

p2: current->state==1&¤t->num==i

p3: current==null

p4: current->next==null

p5: previous->state==0

p6: (current->next)->next==null

p7: previous->state==0&&(current->next)->state==0

p8: (current->next)->state==0

p9: is_optimist=true

若为最佳适应算法,则各条件分别为:

p1: current!=null

p2: current->state==1&¤t->num==i

p3: current==null

p4: current->next==null

p5: previous->state==0&&(previous->address+previous->size)==current->addr

ess)p6: (current->next)->next==null

p7: previous->state==0&&(current->next)->state==0&&(previous->address+pr

evious->size)==current->address)&¤t->size+current->address)==current->next)->address)

p8:(current->next)->state==0&&(current->size+current->address)==current->next)->address)

程序如下所示:

#include

#include <>

using namespace std;

struct memory

struct memory *former; /前向指针。

int address;//地址

int num;//作业号

int size;//分配内存大小

int state;//状态0表示空闲1表示已分配

struct memory *next; /后向指针。

typedef struct memory memory;

memory *mem;

const int size_min=10;//内存允许的最小空闲块的大小

bool is_optimist;//判断是否是最佳适应算法

void init();初始化内存块。

void exec();执行相应算法。

void f_f(int); 依次初始化每个作业,并根据相应算法对作业分配内存。

void alloc(memory *,memory *)分配内存算法(包括两种不同算法)

void free(memory *,int);/首次适应算法**内存。

void free_optimist(memory *,int); 最佳适应算法**内存。

void sort(memory *)对内存链进行排序

void insert(memory *,memory *)按空间大小将作业顺序插入到内存链。

void print(memory *)打印内存链

void main()

//主函数。

int i=0;

while(1)

if(i==2)

else if(i==0)

void init()

//初始化内存容量。

mem=new memory;

mem->size=640;

mem->former=0;

mem->next=0;

void exec()

//执行算法。

while(1)

else if(k==0)

//回滚到选择算法的步骤。

void f_f(int i)

//依次初始化每个作业,并根据相应算法对作业分配内存。

int work=作业序列,i从1开始(与作业号对应),因此从第一个开始存放作业值,第0个值为0,不是作业。

memory *running;

running=(memory *)malloc(sizeof(memory));

if(running!=null)

操作系统大作业a

一 填空 14分 1 在设备管理中,为了克服独占设备速度较慢 降低设备资源利用率的缺点,引入了虚拟分配技术即用共享设备模拟独占设备。2 常用的内存管理方法有和。3 动态存储分配时,要靠硬件地址变换机构实现重定位。4 在存储管理中常用虚拟存储器方式来摆脱主存容量的限制。5 在页式管理中,页式虚地址与内...

操作系统大作业a

一 填空 14分 1 在设备管理中,为了克服独占设备速度较慢 降低设备资源利用率的缺点,引入了即用共享设备模拟独占设备。2 常用的内存管理方法有和。3 动态存储分配时,要靠硬件地址变换机构实现。4 在存储管理中常用方式来摆脱主存容量的限制。5 在页式管理中,页式虚地址与内存物理地址的映射是由和完成的...

操作系统大作业

学号 091401223 姓名 高玉林 本次上机作业使用的软件是microsoft visual studio community 2017 rc,版本 15.0.26020.0,使用的语言是c 第一题 编写求f x 值的程序。f x f1 x f2 x f3 x f1 x 10 x f2 x 10...