ImageVerifierCode 换一换
格式:DOCX , 页数:25 ,大小:411.85KB ,
资源ID:23815792      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/23815792.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(空闲磁盘存储空间的管理OS课程设计.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

空闲磁盘存储空间的管理OS课程设计.docx

1、空闲磁盘存储空间的管理OS课程设计-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN空闲磁盘存储空间的管理-OS课程设计OS课程设计空闲磁盘存储空间的管理1、课程设计任务、要求、目的我们组选的题目是第17题:空闲磁盘存储空间的管理:简单方法。具体要求如下: 建立相应的数据结构; 磁盘上建立一个文件,文件长度设为10MB,用该文件来模拟一个磁盘,磁盘的物理块大小为512字节。 建立进程的数据结构; 时间的流逝可以用下面几种方法模拟:(a)按键盘,每按一次可认为过一个时间单位;(b) 响应WM_TIMER; 将一批进程对磁盘的请求的情况存磁盘文件,以后可以读出并重放; 使

2、用两种方式产生进程对磁盘的请求:(a) 自动产生 (b) 手工输入 显示每次磁盘的请求和空间释放后的相关数据结构的状态; 显示每次磁盘的请求和空间释放后状态; 支持的管理方法:空闲表法、空闲链表法、位示图法、UNIX成组链接法。该课程设计的目的:磁盘初始化时把磁盘存储空间分成许多块(扇区),这些空间可以被多个用户共享。用户作业在执行期间常常要在磁盘上建立文件或把已经建立在磁盘上的文件删去,这就涉及到磁盘存储空间的分配和回收。一个文件存放到磁盘上,可以组织成顺序文件(连续文件)、链接文件(串联文件)、索引文件等,因此,磁盘存储空间的分配有两种方式,一种是分配连续的存储空间,另一种是可以分配不连续

3、的存储空间。怎样有效地管理磁盘存储空间是操作系统应解决的一个重要问题,通过这个课程设计可以使我们更好地熟悉掌握磁盘存储管理的原理和分配与回收算法,进一步掌握软件开发方法并提高解决实际问题的能力。2、原理与算法描述我们组将题目中所给的方法分为连续存储空间法和链接存储空间法,并选取其中最具代表性的位示图法和UNIX成组链接法(连续存储与链接存储的结合)来进行代码的编写。位示图法原理: 位示图用来指出磁盘块的使用情况,位示图中各个元素的取值只有“0”和“1”两种,其中“1”状态表示相应的磁盘块已经被占用,“0”状态表示该磁盘块空闲。申请磁盘块时,分配函数查询第一个空闲块所属的位置,然后从该位置往后选

4、取对应数目的空闲块进行分配,将相应位置的位示图上相应元素置为“1”。为了编程方便,我们查阅资料,假设一个磁盘有8个柱面,每个柱面有2个磁道,每个磁道有4个物理记录。释放磁盘块时与分配磁盘块是相反的操作,由释放函数找到第一个空闲磁盘块,并从该位置往前一单位将被占用的相应数目的磁盘块释放,将位示图上相应元素置为“0”。成组链接法原理: 成组链接法常应用于UNIX系统中,其主要思想是将结合顺序表和链表进行择优组合,即定义组内为顺序表,最大值为MAXGROUP,大于MAXGROUP的磁盘块另行分组,构成新的顺序表;但是这些顺序表之间用链表的结构进行连接,相当于添加一个新的节点。3、开发环境由于我们只是

5、简单的对磁盘处理进行模拟,所以就在自己的个人PC上进行,用的IDE是DEV C+(Eclipse上JAVA写的界面被老师打回来了。)。4、重要算法和设计思路描述设计思路:对于位示图法,我们就是定义一个矩阵用来可视化磁盘空间的使用情况,出于对控制台界面的考虑,我们将条件简化为:假设一个磁盘有3个柱面,每个柱面有2个磁道,每个磁道有4个物理记录,将矩阵简化为8*3的规模。然后分别建立process顺序表数据结构,存储申请的物理块信息;bitmap位示图类来存储位示图的数据和相应的操作,这些操作包括位示图二维数组bitmapMN来存储位示图信息,Initbitmap()初始化位示图,spaceiso

6、k() 判断位示图是否合理,displaybitmap()用来打印位示图信息。对于成组链接法,我们定义组结构体group和进程结构体process,定义顺序表最大值MAXGROUP为20,大于MAXGROUP的磁盘块另行分组,构成新的顺序表;但是这些顺序表之间用链表的结构进行连接,相当于添加一个新的group节点。用distribute()函数分配内存块,用recycle()函数撤消进程 ,回收内存块 。用view()函数显示一些进程和数据结构的相应信息。5、程序实现数据结构我们组选的题目是第17题:空闲磁盘存储空间的管理:简单方法6、程序实现程序清单位示图法:#include #includ

7、e #include using namespace std;const int cylinder=3,track=2,sector=4;/柱面、磁道、物理块 号 #define SIZE 100/最大块数 const int M=cylinder,N=track*sector;struct process/process顺序表数据结构,存储申请的物理块信息 char name20; int cSIZE,tSIZE,sSIZE; int n;process processtableSIZE;/process格式表 int ppointer=-1;/process指针 class bitmap/

8、位示图 结构体 public: int bitmapMN; void Initbitmap();/初始化位示图 bool spaceisok(int n);/位示图符合判断 void displaybitmap();/打印 ;bitmap bm;/全局位示图,为所有进程共享 void bitmap:Initbitmap() int i,j; cout*n; cout 位示图初始化n; cout*n; for(i=0;iM;i+) for(j=0;jN;j+) bitmapij=0; / getchar(); displaybitmap();/初始化后位示图 getchar(); /system

9、(cls);bool bitmap:spaceisok(int n)/判断位示图空闲物理块是否足够 int count=0; for(int i=0;iM;i+) for(int j=0;jN;j+) if(bitmapij=0) count+; if(countn) return false; else return true;void bitmap:displaybitmap()/打印位示图 int i,j; coutn当前位示图信息如下:n; coutn*n; for(i=0;iM;i+) for(j=0;jN;j+) couttbitmapij; coutendl; coutn*n;

10、if(ppointer0) coutn尚未分配磁盘空间n; return; else coutn当前分配信息如下:n; coutn#; coutn进程名tt分配的物理块数n; / coutn进程名tt分配的物理块数tt物理块信息n; for(int i=0;i=ppointer;i+) if(processtablei.n=0) continue; else coutnprocesstablei.namett processtablei.n; /* for(j=0;jprocesstablei.n;j+) if(j=0) coutttt(processtablei.cj,processtabl

11、ei.tj,processtablei.sj)n; else coutttttt(processtablei.cj,processtablei.tj,processtablei.sj)n; */ coutn#n; void distribute(char name20,int n)/分配 int i,j; int count=0;/*计数器*/ for(i=0;i=ppointer;i+)/processtable中逐个搜索指定进程 if(!strcmp(processtablei.name,name) coutn进程名重复,请检查后命名。n; goto end; if(!bm.spaceis

12、ok(n) cout空间不足,找不到n块物理块,分配失败!; return; ppointer+; strcpy(processtableppointer.name,name);/分配的物理块赋予名字 processtableppointer.n=n;/物理块数 for(i=0;iM;i+)/二维数组逐个搜索空闲物理块 for(j=0;jN;j+) if(bm.bitmapij=0) processtableppointer.ccount=i;/*柱面号*/ processtableppointer.tcount=j/4;/*磁道号*/ processtableppointer.scount=

13、j%4;/*物理记录号*/ bm.bitmapij=1; / cout666666endl; count+; if(count=n) return; end: return;void recycle(char name20)/回收内存 int i,j,flag=0; for(i=0;i=ppointer;i+)/processtable中逐个搜索指定进程 if(!strcmp(processtablei.name,name) for(j=0;jprocesstablei.n;j+) bm.bitmapprocesstablei.cj4*processtablei.tj+processtable

14、i.sj=0;/位示图相应置零 for(int k=i;k=ppointer-i;k+)/process表项移动 strcpy(processtablek.name,processtablek+1.name);/删除,前移 processtablek.n=processtablek+1.n; for(int l=0;lprocesstablek.n;l+) processtablek.cl=processtablek+1.cl; processtablek.tl=processtablek+1.tl; processtablek.sl=processtablek+1.sl; ppointer-

15、; flag=1; /delay(); coutn找到进程,回收完毕。n; if(flag=0) coutn未找到进程名为name的进程!可能尚未此进程分配物理块n;int main() int choice,n;char name20; bm.Initbitmap(); while(1) getch(); / system(cls); coutn请输入选择:; coutchoice; switch(choice) case 1: coutnamen; distribute(name,n); break; case 2: coutname; recycle(name); break; case

16、 3: bm.displaybitmap(); break; case 0: exit(0); default: cout选择错误!; break; return 0; 位示图结果截图如下:成组链接法:#include #include #include #include using namespace std;const int MAXGROUP=20;/定义组的大小为20const int MAXPROCESS=100;/定义一个进程最大能申请的块数 /组结构体typedef struct node int num_gp;/组中元素计数 int cellMAXGROUP; /组中元素存放的

17、数组 struct node *next;/指向链表下一节点的指针 group;group *g_GroupHead;/全局组链表头,为所有进程共享/进程结构体 typedef struct node1 char name20;/进程名 int num_ps;/进程个数 int cellMAXPROCESS;/进程号数组 struct node1 *next;process; process *g_processHead;/定义进程链表头,为全局变量int idletotal;/当前剩余总空闲块数/初始化组函数group *initial_group() int i; coutn*n; cou

18、tnum_gp=0; p-next=NULL; for(i=0;icelli=-1; / cout*n; return p; /初始化进程函数process *initial_process() int i; cout*n; cout 进程初始化n; coutname,); p-num_ps=0; p-next=NULL; for(i=0;icelli=-1; return p; /读入空闲块文件并组织成成组链表 void readData() FILE *fp; char fname20 = Test.txt; int temp; group *p; while( (fp=fopen(fna

19、me,r) = NULL ) /打开默认的文件TestUnix.txt /fp=fopen(TestUnix.txt,r); if (NULL = fp) cout错误,文件 fname 打不开endl; /打开成功后就不要输入文件名了直接返回 else break; /如果默认的文件打不开,手动输入文件名打开 coutfname; cout*endl; cout从文件 fname num_gpcellg_GroupHead-num_gp=temp; g_GroupHead-num_gp+; else/所存储的空闲块号大于MAXGROUP时需要另申请节点 p=initial_group();

20、/* p- -head-a-b-c-. */ p-next=g_GroupHead; /将申请的p节点插入到链首 g_GroupHead=p; p-cellp-num_gp=temp; p-num_gp+; if (0 = idletotal+%20 )/一组20一行 cout endl; /输出初始数据 printf(%04d ,temp); /couttemp ; coutendl当前总空闲块数:idletotalendl; void init() /初始化组链表 g_GroupHead=initial_group(); /初始化计数器 idletotal=0; /初始化作业链表 g_pr

21、ocessHead=initial_process(); /从文件读取数据 readData(); /分配内存块 void distribute() char processname20; int number; int i; process *p; cout*endl; coutprocessname; coutnumber; if(number idletotal) cout所需内存块数大于当前空闲块数,分配失败!name,processname); /* 将节点p插入链表 */ p-next=g_processHead-next; g_processHead-next=p; p-num_

22、ps=number; cout申请成功,所申请到的空闲块号依次为:; for(i=0;inum_gp 1) coutcellg_GroupHead-num_gp-1num_gp-; p-celli=g_GroupHead-cellg_GroupHead-num_gp-1; else coutcell0celli=g_GroupHead-cellg_GroupHead-num_gp-1; g_GroupHead-num_gp-; if(g_GroupHead-next!=NULL) g_GroupHead=g_GroupHead-next; idletotal-; coutendl; /撤消进程 ,回收内存块 void recycle() char processname20; int i; proces

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1