1「耀内存2土0收丙^^
船錢郛己H*S由
愴输人您的龍作;3
+-t-t-l+-tl-t-t-t-i-t-|--H-If-t*t*+*-tt+-t1-t-■->■♦■■■+♦■-■-■■-
-*王存分配情加…
+Tt+T-r**■-■-+■*t*■-!
-+■■■■■-+-T*-»+-r-t-T-T-r+++-t*1-*-1-T*■+■-■-"冷区号:
E'ret
醴北如0
分凶大小1100hit
衣…d空阳
号,z址.iW
仆12aKE
盍r已分配
BnH
K瞬
0n
:
.
龍
一n一
丁杓M已一
4血尘5号址尘区_^-叵碇li沂绘F技小力灶.灯長
3)最佳适应算法
测试数据:
为作业申请空闲区800KB。
作业1申请资源105kb,作业2申请资源115kb,作业3申请资源125kb,作业4申请资源135kb,释放作业2和作业4,作业5申请资源145kb,这时,在每次的分配存中,总是找到既满足要求又是最小空闲分区,然后分配资源,这样,就避免了“大材小用”的问题。
运行结果如下图所示:
总慕斎如竝追应算凄适应亘法
1:
堂取内讦
3=杳趟配
憲霜翌■好匡的主存夫小洋站叫1囱I功!
:
存
1i1__亘打竈韩尹认叭朮
H尘e-lu-rR
叩心.
卄剃
K
Mil
押S0
K
H
搭
«1—E
沖:
号处
卄■花出理內P收
(Z--
4±
.存
-.•尸泮
攀!
*L*n^±c^^-
i)In-j单一yxj小一t-bw一丄>耳】I号n一二好配匚畐一除的巻!
-二人人入遊育青八2
■A
刖退
琴配F“曇-二I*13/*
6W
卄+
e
1U5KU
2lUS115KB已分忻
y5力一
X1I
4
fX-Xfe
i:
片
富费骸鶴虫晶些2
KVHH-K-fe^-H-KVH-lTM-H-MnCKWCtr-M-anChEHK-K-M-ltKMirMMMirHM-ICK1:
箜龜[勺干2:
g炊內
3:
HVn'ff.«:
B出
歳A綢亂岸EM4
khHpcmHhkH-h7iH-H"rtHK址址衬nHhmkJrri-M-kK-HkhHf*rfM-H>i;E里応■琴2;凰臓內芦曲鏑邑3岀
♦■■■++♦+*-■--■->++t++*f-+-t■+-+++->■■■■■--■-■■-h-*-l-+-t*+*l-++
…干存分塑情呪十
巒;
Rp&e
les
JJ5KE
Mce底5135KB空闲
B11
KS
\—-
U55
5佣;;己
§3,闲«s5一丹?
^灯主_
4)最坏适应算法
测试数据:
为作业申请空闲区800KB。
作业1申请资源80kb,作业2申请资源100kb,作业3申请资源120kb,作业4申请资源140kb,释放作业1和作业3,作业5申请资源160kb,这时,在扫描整个空闲分区链表时,总是找到既满足要求又是最大空闲分区,然后把它分割给作业。
运
行结果如下图所示:
最坏适应算注
N;査看方配辭踌备;2诗WA芾垂务丽刖圭存大小t单位:
冋〉;1HB
晡M*JttchH-hJtKnHWTthmHhHHri”HHtttntKHH-taXX
"£墾玄伊2:
B收內
舌威噩欄鼠*"c
龄ir迪要分配曲主存丸忖年t问八12«分曹城巾
4大
■存壽的业慕请请專
1=kgnV子2=B收內仔
3:
«>&也也
谙抄燿日4fF=i胃』j勇/爲羸昱it芬卜弹位呃A讪
町■W.■MX.MJHJW屋鼻江具川■■,W耳H
.asL旳
…i存分配情况-1
ia
F区丈小=RRHH驳Ai已分鉅
片三
删弐;慣1=180
F、[7衣丿\:
laahb收.-=已吩'配
耙点:
30Uq'E才丿1*14nMB缺■妄*已弁配
p区号:
5血电地£t=44(1r区大小IIfiflKB'fr恙己*配
2:
Hl
1=好鼻力存
3:
鱼<7即列人扌酣議i佶塢A祝憂耶累眈-区叫;m
耳HhKXMK^mmkmhhM-h4KKTChMXnMKkAh斗Hn-rf-M
"外区吕:
free上给也汕B吩区犬小ISOK’:
K态I亨|tl
Fmo1R»12BKE空l+J
4
J(M»
14MKH
己为配
;5
:
44U
:
iceKD-EjT配
IFw«
IAna
5zeaKE
:
主闱
5课程设计总结
为期五周的课程设计,对于我个人来说是相当有难度的。
在设计的过程中,有很多问题不是很清楚,所以做起来就就很困难,刚开始的时候都有点无从下手的感觉。
很多时候在遇到问题时,基本知识都了解,但是就不知道怎么才能把它们都整合到一块,也就是说知识都是很零散的,没有一个完整的系统。
而且,又由于基础知识不牢固,使得我在这次的课程设计中感到更加力不从心。
在设计的过程中,每走一步就会发现,思路想出来很容易,但涉及到实现的时候,总是有点手无足措。
对于本次的课程设计,里面还有很多需要改进的地方。
一个程序的顺利出炉,少不了反复地调试和修改。
在调试的过程中,总是会发生很多错误,但在解决这些错误的时候,开始很模糊的概念就会变得越来越清晰。
其实很多错误都是很类似的,只要解决了一个,其余的就会迎刃而解了。
千里之行,始于足下”,通过这次课程设计,我深深体会到这句千古名言的真正含义,我今天认真的进行课程设计,学会脚踏实地迈开这一步,就是为明天能稳健地在社会大潮中奔跑打下坚实的基础。
这次的课程设计,使我树立了正确的设计思想,培养实事、严肃认真、高度负责的学习作风,加强操作能力的训练和培养严谨的科学作风更尤为重要。
在这次设计过程中,充分体现出自己单独设计课程的能力以及综合运用知识的能力,体会了学以致用、突出自己劳动成果的喜悦心情,从中发现自己平时学习的不足和薄弱环节,从而加以弥补。
选择作业进
通过本次实验,我掌握了实现多道程序并发执行,操作系统是如何通过作业调入存以及系统是如何为进入存的作业分配存空间,实现多道作业同时驻留存,就绪进程队列中的
多个进程是如何以分式方式共享CPU,作业运行完成离开系统时,系统如何进行存回收。
最后,感谢我们的荆立夏老师,老师严谨细致、一丝不苟的作风将会一直是我工作、学习中的榜样;老师循循善诱的教导和不拘一格的教学思路给予我无尽的启迪;这次课程设计的每个实验细节和每个数据,都离不开老师您的细心指导。
而您开朗的个性和宽容的态度,帮助我能够很顺利的完成了这次课程设计。
祝愿老师您在以后的工作和生活中继续保持健康的身体和愉快的心情,再次感谢!
同时,也很感谢对我帮助过的同学们,谢谢你们对我的帮助和支持,让我感受到同学的友谊和温暖。
参考文献
[1]
玲玲.C语言程序设计[M].大学出版社,2010.1
[2]
谭浩强.程序设计基础与C语言.:
大学出版社,2010.1
[3]
严蔚敏、吴伟民等.数据结构(C语言版).北京:
清华大学出版社,2008.
[4]
汤子瀛、梁红兵等.《计算机操作系统第三版》.北京:
电子科技大学出版社,2009.
附录
源代码
#include#include#defineFree0//空闲状态
#defineBusy1//已用状态
#defineOK1
//完成
#defineERROR0//出错
#defineMAX_length800//最大存空间为800KBtypedefintStatus;
typedefstructfreearea//定义一个空闲区说明表结构{
intID;//分区号
longsize;//分区大小longaddress;//分区地址
intstate;//状态
}ElemType;
//
线性表的双向链表存储结构
typedefstructDuLNode//doublelinkedlist
{
ElemTypedata;
structDuLNode*prior;//前趋指针
structDuLNode*next;//后继指针
}DuLNode,*DuLinkList;
DuLinkListblock_first;//头结点
DuLinkListblock_last;//尾结点
Statusalloc(int);//存分配
Statusfree(int);//存回收
StatusFirst_fit(int,int);//首次适应算法
StatusBest_fit(int,int);//最佳适应算法
StatusWorst_fit(int,int);//最坏适应算法voidshow();//查看分配
StatusInitblock();//开创空间表
//开创带头结点的存空间链表
StatusInitblock()
block_first=(DuLinkList)malloc(sizeof(DuLNode));block_last=(DuLinkList)malloc(sizeof(DuLNode));
block_first->prior=NULL;
block_first->next=block_last;block_last->prior=block_first;
block_last->next=NULL;
block_last->data.address=0;
block_last->data.size=MAX_length;
block_last->data.ID=0;
block_last->data.state=Free;
returnOK;
//
存分配
Statusalloc(intch)
intID,request;cout<<"请输入作业(分区号):
";
cin>>ID;
cout<<"请输入需要分配的主存大小(单位:
KB):
";
cin>>request;
if(request<0||request==0)
"<cout<<"分配大小不合适,请重试!
returnERROR;
if(ch==2)//选择最佳适应算法{
if(Best_fit(ID,request)==OK)
cout<<"分配成功!
"<else
returnOK;
}
else//默认首次适应算法
if(First_fit(ID,request)==OK)
cout<<"分配成功!
"<else
"<cout<<"存不足,分配失败!
returnOK;
if(ch==3)//选择最坏适应算法
if(Worst_fit(ID,request)==OK)
cout<<"分配成功!
"<else
cout<<"存不足,分配失败!
"<
returnOK;
}
else//默认首次适应算法
if(First_fit(ID,request)==OK)
cout<<"分配成功!
"<else
cout<<"存不足,分配失败!
"<returnOK;
//
首次适应算法
StatusFirst_fit(intID,intrequest)//传入作业名及申请量
{
//为申请作业开辟新空间且初始化
DuLinkListtemp=(DuLinkList)malloc(sizeof(DuLNode));
temp->data.ID=ID;
temp->data.size=request;
temp->data.state=Busy;
DuLNode*p=block_first->next;
while(p)
{
if(p->data.state==Free&&p->data.size==request)
//有大小恰好合适的空闲块
p->data.state=Busy;
p->data.ID=ID;
returnOK;
break;
if(p->data.state==Free&&p->data.size>request){
//有空闲块能满足需求且有剩余"
temp->prior=p->prior;
temp->next=p;
temp->data.address=p->data.address;
p->prior->next=temp;
p->prior=temp;
p->data.address=temp->data.address+temp->data.size;
p->data.size-=request;
returnOK;
break;
p=p->next;
}
returnERROR;
//
最佳适应算法
StatusBest_fit(intID,intrequest){
intch;//记录最小剩余空间
DuLinkListtemp=(DuLinkList)malloc(sizeof(DuLNode));
temp->data.ID=ID;
temp->data.size=request;temp->data.state=Busy;
DuLNode*p=block_first->next;
DuLNode*q=NULL;//记录最佳插入位置while(p)//初始化最小空间和最佳位置
if(p->data.state==Free&&
(p->data.size>request||p->data.size==request))q=p;
ch=p->data.size-request;
break;
p=p->next;
while(p)
if(p->data.state==Free&&p->data.size==request){
//空闲块大小恰好合适
p->data.ID=ID;
p->data.state=Busy;
returnOK;
break;
if(p->data.state==Free&&p->data.size>request)
//空闲块大于分配需求
if(p->data.size-requestch=p->data.size-request;//更新剩余最小值
q=p;//更新最佳位置指向
p=p->next;
}
if(q==NULL)returnERROR;//没有找到空闲块
else
//找到了最佳位置并实现分配
temp->prior=q->prior;
temp->next=q;
temp->data.address=q->data.address;
q->prior->next=temp;
q->prior=temp;
q->data.address+=request;
q->data.size=ch;
returnOK;
//
最坏适应算法
StatusWorst_fit(intID,intrequest){
intch;//记录最大剩余空间
DuLinkListtemp=(DuLinkList)malloc(sizeof(DuLNode));
temp->data.ID=ID;
temp->data.size=request;temp->data.state=Busy;
DuLNode*p=block_first->next;
DuLNode*q