操作系统可变分区存储管理模拟.docx
《操作系统可变分区存储管理模拟.docx》由会员分享,可在线阅读,更多相关《操作系统可变分区存储管理模拟.docx(20页珍藏版)》请在冰豆网上搜索。
操作系统可变分区存储管理模拟
操作系统实验(三)可变分区存储管理模拟实验
作者:
顾熙杰
准考证号:
022*********
报到号:
177
实验地点:
浙工大计算机中心
1)实验目的
理解操作系统中可变分区管理的算法,
掌握分配和回收算法
掌握空闲分区的合并方法
掌握不同的适应算法
2)实验内容
建立数据结构
建立空闲分区队列
根据不同的适应算法建立队列
编写分配算法
编写回收算法
3)数据结构
PrivateTypeMEM_tp
fenqu_shouzhiAsInteger'分区首地址
fenqu_changduAsInteger'分区长度
fenqu_zhuangtaiAsInteger'分区状态-1表示不存在,0表示空闲分区,1表示已经分配的分区
fenqu_huodongjinchengAsInteger'该分区正在活动的进程代号
EndType
4)程序流程图
面向对象程序设计由事件驱动,画流程图比较困难。
(1)分配新的分区
最先适应按地址找
最优适应,找最小可以满足的
最坏适应,找最大可以满足的
(2)分区回收
既无上邻又无下邻
既有上邻又有下邻
只有上邻
只有下邻
5)实验中需要改进的地方
由于没有使用链表,程序结构比较混乱,需要大大改进,提高可阅读性。
6)程序代码(VB)
OptionExplicit
PrivateDeclareFunctionShellExecuteLib"Shell32.dll"Alias"ShellExecuteA"(ByValhwndAsLong,ByVallpOperationAsString,ByVallpFileAsString,ByVallpParametersAsString,ByVallpDirectoryAsString,ByValnShowCmdAsLong)AsLong
'表示内存分区的结构信息类型的变量类型
PrivateTypeMEM_tp
fenqu_shouzhiAsInteger'分区首地址
fenqu_changduAsInteger'分区长度
fenqu_zhuangtaiAsInteger'分区状态-1表示不存在,0表示空闲分区,1表示已经分配的分区
fenqu_huodongjinchengAsInteger'该分区正在活动的进程代号
EndType
'定义最多640个,总共640K内存数组
DimMEM(1To640)AsMEM_tp
'表示可以使用的进程代号
Dimjincheng(1To640)AsInteger
'0表示该进程号可以使用
'.>=1表示该进程号不可以使用
'表示分配方法
DimfenPEI_fangfaAsInteger
'0=最先分配
'1=最优分配
'2=最坏分配
Functionget_jincheng()AsInteger
'取可以使用的进程号
DimiAsInteger
Fori=1To640
Ifjincheng(i)=0Then
jincheng(i)=1
get_jincheng=i
ExitFunction
EndIf
Next
get_jincheng=0
EndFunction
Functionget_FENQU()AsInteger
'取可以使用的为了表示分区的存储空间,模拟c语言的指针
DimiAsInteger
Fori=1To640
IfMEM(i).fenqu_zhuangtai=-1Then
get_FENQU=i
ExitFunction
EndIf
Next
get_FENQU=0
EndFunction
Functionget_kong_FENQU(ByValkjAsInteger)AsInteger
DimiAsInteger
DimMIN_LAsInteger
DimMAX_LAsInteger
DimMIN_P,MAX_PAsInteger
'分配新的分区
SelectCasefenPEI_fangfa
Case0'最先适应按地址找
Fori=1To640
IfMEM(i).fenqu_zhuangtai=0Then
IfMEM(i).fenqu_changdu>=kjThen
get_kong_FENQU=i
ExitFunction
EndIf
EndIf
Nexti
Case1'最优适应,找最小可以满足的
MIN_L=10000
Fori=1To640
IfMEM(i).fenqu_zhuangtai=0Then
IfMEM(i).fenqu_changdu>=kjThen
IfMEM(i).fenqu_changduMIN_L=MEM(i).fenqu_changdu
MIN_P=i
EndIf
EndIf
EndIf
Nexti
IfMIN_P=0Then
CallMsgBox("内存不足!
",vbCritical)
Else
get_kong_FENQU=MIN_P
EndIf
ExitFunction
Case2'最坏适应,找最大可以满足的
MIN_L=10000
Fori=1To640
IfMEM(i).fenqu_zhuangtai=0Then
IfMEM(i).fenqu_changdu>=kjThen
IfMEM(i).fenqu_changdu>MAX_LThen
MAX_L=MEM(i).fenqu_changdu
MAX_P=i
EndIf
EndIf
EndIf
Nexti
IfMAX_P=0Then
CallMsgBox("内存不足!
",vbCritical)
Else
get_kong_FENQU=MAX_P
EndIf
ExitFunction
EndSelect
CallMsgBox("内存不足!
",vbCritical)
EndFunction
PrivateSubCMD_fenPEI_Click()
OnErrorGoToerr_handel
DimkjAsInteger
DimiAsInteger
DimJCAsInteger
DimjAsInteger
DimLAsInteger
DimFQAsInteger
'新的进程进入
kj=CInt(Text_FENPEI.Text)
JC=get_jincheng()
i=get_kong_FENQU(kj)
MEM(i).fenqu_zhuangtai=1
L=MEM(i).fenqu_changdu-kj
MEM(i).fenqu_changdu=kj
MEM(i).fenqu_huodongjincheng=JC
IfL>0Then
FQ=get_FENQU()
MEM(FQ).fenqu_zhuangtai=0
MEM(FQ).fenqu_changdu=L
MEM(FQ).fenqu_shouzhi=MEM(i).fenqu_shouzhi+kj
EndIf
Callrefrensh_form
Randomize(Timer)
i=Int(Rnd
(1)*6+1)
Text_FENPEI.Text=Str(i)
ExitSub
err_handel:
MsgBox"请在文本框内输入正确的数字"
EndSub
Subrefrensh_form()
'刷新显示
DimiAsInteger
DimclAsLong
DimkjAsInteger
DimJCAsInteger
DimszAsInteger
Dimj,kAsInteger
Fori=1To640
IfMEM(i).fenqu_zhuangtai<>-1Then
IfMEM(i).fenqu_zhuangtai=1Then
If(iMod2)=1Then
cl=Label4.BackColor
Else
cl=Label5.BackColor
EndIf
Else
cl=Label6.BackColor
EndIf
JC=MEM(i).fenqu_huodongjincheng
sz=MEM(i).fenqu_shouzhi
kj=MEM(i).fenqu_changdu
j=sz+1
IfMEM(i).fenqu_zhuangtai=1Then
FG.TextMatrix(j,1)=Str(i)
FG.TextMatrix(j,2)=Str(MEM(i).fenqu_shouzhi)+"K"
FG.TextMatrix(j,3)=Str(MEM(i).fenqu_changdu)+"K"
FG.TextMatrix(j,4)=Str(MEM(i).fenqu_zhuangtai)+"已分配"
FG.TextMatrix(j,5)=Str(JC)+"号进程"
ElseIfMEM(i).fenqu_zhuangtai=0Then
FG.TextMatrix(j,1)=Str(i)
FG.TextMatrix(j,2)=Str(MEM(i).fenqu_shouzhi)+"K"
FG.TextMatrix(j,3)=Str(MEM(i).fenqu_changdu)+"K"
FG.TextMatrix(j,4)=Str(MEM(i).fenqu_zhuangtai)+"未分配"
FG.TextMatrix(j,5)=""
EndIf
Fork=1To5
FG.Col=k
Forj=sz+1Tosz+kj
FG.Row=j
FG.CellBackColor=cl
Ifj<>sz+1Then
FG.TextMatrix(FG.Row,FG.Col)=""
EndIf
Nextj
Nextk
EndIf
Next
EndSub
PrivateSubCMD_HUISHOU_Click()