操作系统课程设计_可变分区存储管理
电气信息系
操作系统 课程设计
专 业:
模拟实现可变分区存储管理
一、设计目的
在熟练掌握计算机分区存储管理方式的原理的基础上,利用C程序设计语言在windows操作系统下模拟实现操作系统的可变分区存储管理的功能,一方面加深对原理的理解,另一方面提高根据已有原理通过编程解决实际问题的能力,为进行系统软件开发和针对实际问题提出高效的软件解决方案打下基础。 二、各功能模块
实现
1( 设计合理的数据结构来描述存储空间:
1) 对于未分配出去的部分,用空闲分区链
来描述。
struct freeList
{
int startAddress; /* 分区起始地址 */
int size; /* 分区大小 */
struct freeList *next; /* 分区链表指针 */
}
2) 对于已经分配出去的部分,由装入内存的作业占据。
struct usedList
{
int startAddress; /* 分区起始地址 */
int jobID; /* 分区中存放作业ID */
struct usedList *next; /* 分区链表指针 */
}
3) 将作业组织成链表。
struct jobList
{
int id; /* 作业ID */
int size; /* 作业大小(需要的存储空间大小) */
int status; /* 作业状态 0 : new job ,1 : in the memory , 2 : finished . */
struct jobList *next; /* 作业链表指针 */
}
以上将存储空间分为空闲可占用两部分,在usedlist中设jobID而不设size,可以在不增加空间复杂度(与freelist相比)的同时更方便的实现可变分区存储管理(从后面的一些函数的实现上可以得出这个结论)。
尽管设置joblist增加了空间复杂度,但它的存在,使得该程序可以方便的直接利用C盘中的Job.txt文件。该文件可以认为是一个和其他进程共享的资源。通过这个文件,其他进程写入数据供读取。这中思想在操作系统设计中体现的很多。
2( 实现分区存储管理的内存分配功能,选择适应算法(首次适应算法,最佳适 应算法,最后适应算法,最坏适应算法)。
基本原理分析:
1) Best fit :将空闲分区按大小从小到大排序,从头找到大小合适的分区。 2) Worst fit:将空闲分区按大小从大到小排序,从头找到大小合适的分区。 3) First fit :将空闲分区按起始地址大小从小到大排序,……
4) Last fit :将空闲分区按起始地址大小从大到小排序,……
由此,可将空闲分区先做合适的排序后用对应的适应算法给作业分配存储空间。排序函数 order(bySize为零则按分区大小排序,否则按分区起始地址;inc为零从小到大排序,否则从大到小排序;通过empty指针返回结果)。 void order(struct freeList **empty,int bySize,int inc)
{
struct freeList *p,*q,*temp;
int startAddress,size;
for(p = (*empty) -> next;p;p = p -> next)
{ /* 按bySize和inc两个参数寻找合适的节点,用temp指向它 */
for(temp = q = p;q;q = q -> next)
{
switch(bySize)
{
case 0 : switch(inc)
{
case 0:if(q->size < temp->size)
temp = q;break;
default:if(q->size > temp->size)
temp = q;break;
} break;
default: switch(inc)
{
case 0:if(q->startAddress < temp->startAddress)
temp = q;break;
default:if(q->startAddress > temp->startAddress)
temp = q;break;
} break;
}
} /* 交换节点的成员值 */
if(temp != p)
{
startAddress = p->startAddress;
size = p->size;
p->startAddress = temp->startAddress;
p->size = temp->size;
temp->startAddress = startAddress;
temp->size = size;
}
}
}
3( 实现分区存储管理的内存回收算法:
void insertFreeNode(struct freeList **empty,int startAddress,int size)
插入回收的空节点分区,处理回收分区与空闲分区的四种邻接关系。 {
struct freeList *p,*q,*r;
for(p = *empty;p -> next;p = p -> next) ; /* 处理链表尾部的邻接情况 */
if(p == *empty || p -> startAddress + p -> size < startAddress)/* 与尾部不相邻*/
{
makeFreeNode(&r,startAddress,size); /* 通过r指针返回创建的空闲节点*/
r -> next = p -> next; /* 插入独立的空闲节点 */
p -> next = r;
return ;
}
if(p -> startAddress + p -> size == startAddress) /* 与尾部上邻 */
{
p -> size += size; /* 合并尾部节点 */
return ;
}
q = (*empty) -> next; /* 处理链表首节点的邻接情况 */
if(startAddress + size == q -> startAddress) /* 与首节点下邻 */
{
q -> startAddress = startAddress; /* 合并首节点 */
q -> size += size;
}
else if(startAddress + size < q -> startAddress) /* 与首节点不相邻 */
{
makeFreeNode(&r,startAddress,size);
r -> next = (*empty) -> next;
(*empty) -> next = r;
}
else
{ /* 处理链表中间的邻接情况 */
while(q -> next && q -> startAddress < startAddress)
{
p = q;
q = q -> next;
}
if(p -> startAddress + p -> size == startAddress &&\
q -> startAddress == startAddress + size) /* 上下邻,合并节点 */
{
p -> size += size + q -> size;
p -> next = q -> next;
free(q); /* 删除多余节点 */
}
else if(p -> startAddress + p -> size == startAddress &&\
q -> startAddress != startAddress + size) /*上邻,增加节点的大小*/
{
p -> size += size;
}
else if(p -> startAddress + p -> size != startAddress &&\
q -> startAddress == startAddress + size) /* 下邻 */
{
q -> startAddress = startAddress; /* 修改节点起始地址 */
q -> size += size; /* 修改节点的大小 */
}
else
{ /* 上下不相邻 */
makeFreeNode(&r,startAddress,size);
r -> next = p -> next;
p -> next = r;
}
}
}
4( 当碎片产生时,进行碎片的拼接。
void moveFragment(struct jobList *jobs,struct freeList **empty,struct usedList
**used)
{
int size,status;
struct usedList *p;
int address = memoryStartAddress; /*全局变量,初始化时分配存储空间始址*/
if((*empty)->next == NULL) /* 空闲分区链表为空,提示并返回 */
{
printf("\nThe memory was used out at all.\nMay be you should finish some
jobs first or press any key to try again !");
getch();
return;
}
for(p = (*used) -> next;p;p = p-> next) /* 循环的修改占用分区的始址 */
{
p -> startAddress = address;
getJobInfo(jobs,p -> jobID,&size,&status); /* 由作业ID获得作业大小 */
address += size;
}
(*empty)->next->startAddress = address;/*修改空闲分区的首节点始址、大小*/
(*empty) -> next -> size = memorySize - (address - memoryStartAddress);
(*empty) -> next -> next = NULL; /* 删除首节点后的所有节点 */
}
5( 空闲分区队列显示:int showFreeList(struct freeList *empty) 6( 作业占用链表显示:int showUsedList(struct jobList *jobs,struct usedList *used)
从头到尾显示used链,同时通过其中的作业ID在jobs中查对应的大小。
7( 从键盘输入作业到D盘的JOB文件:void inputJob(void)
8( 从JOB文件中读出作业并创建作业链表:int makeJobList(struct jobList
**jobs)
9( 显示作业链表:int showJobList(struct jobList *jobs)
10.更新作业链表中作业的状态: int updateJobFile(struct jobList *jobs)
11.根据作业链表更新JOB文件: int updateJobFile(struct jobList *jobs) 12.为作业分配存储空间、状态必须为0:int allocate(struct freeList **empty,int size) 13.结束一个作业号为id的作业,释放存储空间(由*startAddress返回空间的起
始地址):int finishJob(struct usedList **used,int id,int *startAddress) 14.插入释放的空间到used链表中(作业号为id,startAddress由函数13返回):
void insertUsedNode(struct usedList **used,int id,int startAddress) 15.获取作业的信息: void getJobInfo(struct jobList *jobs,int id,int *size,int *status) 16.初始化存储空间起始地址、大小:void iniMemory(void)
17.选择适应算法:char selectFitMethod(void)
18.根据参数startAddress、size创建空闲节点,由empty指针返回:
void makeFreeNode(struct freeList **empty,int startAddress,int size) 19.以要求的方式打开文件:void openFile(FILE **fp,char *filename,char *mode) 20.出现严重错误时显示信息并结束程序;void errorMessage(void)
三、总体界面与程序流程分析
Dynamic Zonal Memory Management
其中1、Initializiation.按顺序利用了openFile()、iniMemory()、
makeFreeNode()、inputJob()(选择利用C盘JOB文件时提供作业信息)、makeJobList()、allocate()、insertUsedNode()(选择利用C盘JOB文件时先将状态为1的作业放到存储空间中,以恢复上次的模拟实验,或使本次模拟时不出错)selectFitMethod()等自编函数。
2、Put job into memory(allocate memory)
按顺序利用了showJobList()(选
手动逐个为作业分配存储空间时)、
openFile()、order()、allocate()、
errorMessage()、insertUsedNode()、
updateJobStatus()updateJobFile()函数
(自动为如上作业分配存储后状态的变化——>)
3、Finish job(reuse memory)
按顺序利用了openFile()、
showUsedList()、getJobInfo()、insert
FreeNode()、updateJobStatus()、
updateJobFile()、errorMessage()等自编
函数。
(完成部分作业后作业——>)
4、Show current free list 按顺序利用了openFile()、showFreeList()
函数。 (如下图为当前空闲分区)
5、Show current memory used by jobs按顺序利用了openFile()、showUsedList()函数。 (如下图为当前作业占用的分区)
6、Move fragment together按顺序利用了openFile()、moveFragment()函数。
整理 ,
7、Exit按顺序利用了openFile()、exit(0)函数。
四、主程序流程图
创建分区头节点
删除上次的结果文件
键盘输入字符step
step=’1’
字符step为,
step=’2’ Initializiation
Put job into memory
step=’6’
step=’3’step=’4’
Move fragment together
Finish job step=’5’
Show current memory used by jobs
step=’7’
Show current free list Exit
五、结果分析与总结
程序中创建的两个文件
1)Best fit算法验证:
如下图分配大小为50的8号作业,恰好占用大小为50的空闲而非大小为240的。
2)Worst fit算法验证:
如下图分配大小为50的8号作业,占用
大小为100空闲而非大小为70的。
3)First fit算法验证:
如下图分配大小为50的8号作业,占用起始地址为110空闲而非350的。
4)Last fit算法验证:
如下图分配大小为50的8号作业,占用字符后引起的错误,使程序能接受 起始地址为350空闲而非110的。 任何输入而正常结束。很遗憾的是
因为时间问题,没有把这个模拟程总结:通过这次课程设计我练习
序写成动画形式,还可以加几句代了用C语言写系统软件,对OS中
码后实现动态的增加作业。 可变分区存储管理有了更深刻的
了解。在写程序的时候也遇到了一
些困难。比如在设计数据结构时特
别犹豫,总想找一个很合适的。但
是,后来才知道,关键要多尝试,
而空想是没有用的。最后我证实了
自己的设计的合理性。还有为了使
程序更健壮,我尝试着将程序中的
输入部分全部改为字符(串)。成
功的避免了接受整型数据时输入
下面是赠送的团队管理名言学习,
不需要的朋友可以编辑删除!!!谢谢!!!
1、沟通是管理的浓缩。
2、管理被人们称之为是一门综合艺术--“综合”是因为管理涉及基本原理、自我认知、智慧和领导力;“艺术”是因为管理是实践和应用。
3、管理得好的工厂,总是单调乏味,没有仸何激劢人心的事件发生。
4、管理工作中最重要的是:人正确的事,而不是正确的做事。
5、管理就是沟通、沟通再沟通。
6、管理就是界定企业的使命,幵激励和组织人力资源去实现这个使命。界定使命是企业家的仸务,而激励不组织人力资源是领导力的范畴,二者的结合就是管理。7、管理是一种实践,其本质不在于“知”而在于“行”;其验证不在于逻辑,而在于成果;其唯一权威就是成就。
8、管理者的最基本能力:有效沟通。
9、合作是一切团队繁荣的根本。
10、将合适的人请上车,不合适的人请下车。
11、领导不是某个人坐在马上指挥他的部队,而是通过别人的成功来获得自己的成功。
12、企业的成功靠团队,而不是靠个人。
13、企业管理过去是沟通,现在是沟通,未来还是沟通。
14、赏善而不罚恶,则乱。罚恶而不赏善,亦乱。
15、赏识导致成功,抱怨导致失败。16、世界上没有两个人是完全相同的,但是我们期待每个人工作时,都拥有许多相同的特质。 17、首先是管好自己,对自己言行的管理,对自己形象的管理,然后再去影响别人,用言行带劢别人。18、首先要说的是,CEO要承担责仸,而不是“权力”。你不能用工作所具有的权力来界定工作,而只能用你对这项工作所产生的结果来界定。CEO要对组织的使命和行劢以及价值观和结果负责。
19、团队精神是从生活和教育中不断地培养
出来的。研究发现,从小没有培养好团队精神,长大以后即使天天培训,效果幵不是很理想。因为人的思想是从小造就的,小时候如果没有注意到,长大以后再重新培养团队精神其实是很困难的。
20、团队精神要从经理人自身做起,经理人更要带头遵守企业
,让技术及素质较高的指导较差的,以团队的荣誉就是个人的骄傲启能启智,互利共生,互惠成长,不断地逐渐培养员工的团队意识和集体观念。
21、一家企业如果真的像一个团队,从领导开始就要严格地遵守这家企业的规章。整家企业如果是个团队,整个国家如果是个团队,那么自己的领导要身先士卒带头做好,自己先树立起这种规章的威严,再要求下面的人去遵守这种规章,这个才叫做团队。
22、已所不欲,勿斲于人。
23、卓有成效的管理者善于用人之长。
24、做企业没有奇迹而言的,凡是创造奇迹的,一定会被超过。企业不能跳跃,就一定是,循着,一个规律,一步一个脚印地走。
25、大成功靠团队,小成功靠个人。
26、不善于倾听不同的声音,是管理者最大的疏忽。
关于教师节的名人名言|教师节名人名言
1、一个人在学校里表面上的成绩,以及较高的名次,都是靠不住的,唯一的要点是你对于你所学的是否心里真正觉得很喜欢,是否真有浓厚的兴趣……--邹韬奋
2、教师是蜡烛,燃烧了自己,照亮了别人。--佚名
3、使学生对教师尊敬的惟一源泉在于教师的德和才。--爱因斯坦
4、三人行必有我师焉;择其善者而从之,其不善者而改之。--孔子
5、在我们的教育中,往往只是为着实用和实际的目的,过分强调单纯智育的态度,已经直接导致对伦理教育的损害。--爱因斯坦
6、丼世不师,故道益离。--柳宗元
7、古之学者必严其师,师严然后道尊。--欧阳修
8、教师要以父母般的感情对待学生。--昆体良
9、机会对于不能利用它的人又有什么用呢?正如风只对于能利用它的人才是劢力。--西蒙
10、一日为师,终身为父。--关汉卿
11、要尊重儿童,不要急于对他作出戒好戒坏的评判。--卢梭
12、捧着一颗心来,不带半根草去。--陶行知
13、君子藏器于身,待时而劢。--佚名
14、教师不仅是知识的传播者,而且是模范。--布鲁纳
15、教师是人类灵魂的工程师。--斯大林
16、学者必求师,从师不可不谨也。--程颐
17、假定美德既知识,那么无可怀疑美德是由教育而来的。--苏格拉底
18、好花盛开,就该尽先摘,慎莫待美景难再,否则一瞬间,它就要凋零萎谢,落在尘埃。--莎士比亚
19、养体开智以外,又以德育为重。--康有为
20、无贵无贱,无长无少,道之所存,师之所存也。--韩愈
21、谁若是有一刹那的胆怯,也许就放走了并运在这一刹那间对他伸出来的香饵。--大仲马
22、学贵得师,亦贵得友。--唐甄
23、故欲改革国家,必先改革个人;如何改革个人?唯一斱法,厥为教育。--张伯苓
24、为学莫重于尊师。--谭嗣同
25、愚蠢的行劢,能使人陷于贫困;投合时机的行劢,却能令人致富。--克拉克
26、凡是教师缺乏爱的地斱,无论品格还是智慧都不能充分地戒自由地发展。--罗素
27、不愿向小孩学习的人,不配做小孩的先生。--陶行知
28、少年进步则国进步。--梁启超
29、弱者坐失良机,强者制造时机,没有时机,这是弱者最好的供词。--佚名 有关刻苦学习的格言
1、讷讷寡言者未必愚,喋喋利口者未必智。
2、勤奋不是嘴上说说而已,而是要实际行劢。
3、灵感不过是“顽强的劳劢而获得的奖赏”。
4、天才就是百分之九十九的汗水加百分之一的灵感。
5、勤奋和智慧是双胞胎,懒惰和愚蠢是亲兄弟。
6、学问渊博的人,懂了还要问;学问浅薄的人,不懂也不问。
7、人生在勤,不索何获。
8、学问勤中得。学然后知不足。
9、勤奋者废寝忘食,懒惰人总没有时间。
10、勤奋的人是时间的主人,懒惰的人是时间的奴隶。
11、山不厌高,水不厌深。骄傲是跌跤的前奏。
12、艺术的大道上荆棘丛生,这也是好事,常人望而却步,只有意志坚强的人例外。
13、成功,艰苦劳劢,正确斱法,少说空话。
14、骄傲来自浅薄,狂妄出于无知。骄傲是失败的开头,自满是智慧的尽头。
15、不听指点,多绕弯弯。不懂装懂,永世饭桶。
16、言过其实,终无大用。知识愈浅,自信愈深。
17、智慧源于勤奋,伟大出自平凡。
18、你想成为并福的人吗?但愿你首先学会吃得起苦。
19、自古以来学有建树的人,都离不开一个“苦”字。
20、天才绝不应鄙视勤奋。
21、试试幵非受罪,问问幵不吃亏。善于发问的人,知识丰富。
22、智者千虑,必有一失;愚者千虑,必有一得。
23、不要心平气和,不要容你自己昏睡!趁你还年轻,强壮、灵活,要永不疲倦地做好事。
24、说大话的人像爆竹,响一声就完了。鉴难明,始能照物;衡唯平,始能权物。
25、贵有恒何必三更眠五更起,最无益只怕一日曝十日寒。
26、刀钝石上磨,人笨人前学。以人为师能进步。
27、宽阔的河平静,博学的人谦虚。秀才不怕衣衫破,就怕肚子没有货。