📄 form_os.frm
字号:
VERSION 5.00
Object = "{5E9E78A0-531B-11CF-91F6-C2863C385E30}#1.0#0"; "msflxgrd.ocx"
Begin VB.Form Form_OS
Caption = "操作系统(可变分区管理模拟实验)"
ClientHeight = 7650
ClientLeft = 165
ClientTop = 735
ClientWidth = 11115
Icon = "Form_OS.frx":0000
LinkTopic = "Form1"
ScaleHeight = 7650
ScaleWidth = 11115
StartUpPosition = 3 '窗口缺省
Begin VB.Frame Frame4
Caption = "图示"
Height = 1575
Left = 5640
TabIndex = 14
Top = 120
Width = 1695
Begin VB.Label Label6
BackColor = &H00FFFFFF&
Caption = "没有分配的分区"
Height = 255
Left = 120
TabIndex = 17
Top = 1080
Width = 1455
End
Begin VB.Label Label5
BackColor = &H00FF8080&
Caption = "已经分配的分区"
Height = 255
Left = 120
TabIndex = 16
Top = 720
Width = 1455
End
Begin VB.Label Label4
BackColor = &H008080FF&
Caption = "已经分配的分区"
Height = 255
Left = 120
TabIndex = 15
Top = 360
Width = 1455
End
End
Begin VB.Frame Frame3
Caption = "分配算法"
Height = 1575
Left = 3720
TabIndex = 3
Top = 120
Width = 1695
Begin VB.OptionButton Option3
Caption = "最坏适应"
Height = 180
Left = 240
TabIndex = 6
Top = 1200
Width = 1695
End
Begin VB.OptionButton Option2
Caption = "最优适应"
Height = 180
Left = 240
TabIndex = 5
Top = 840
Width = 1335
End
Begin VB.OptionButton Option1
Caption = "最先适应"
Height = 180
Left = 240
TabIndex = 4
Top = 360
Value = -1 'True
Width = 1095
End
End
Begin VB.Frame Frame2
Caption = "进程退出"
Height = 1575
Left = 7440
TabIndex = 2
Top = 120
Width = 3255
Begin VB.TextBox Text_HUISHOU
Height = 375
Left = 1920
TabIndex = 13
Text = "1"
Top = 360
Width = 855
End
Begin VB.CommandButton CMD_HUISHOU
Caption = "确定"
Height = 375
Left = 840
TabIndex = 11
Top = 1080
Width = 2055
End
Begin VB.Label Label3
Caption = "进程号"
Height = 375
Left = 840
TabIndex = 12
Top = 480
Width = 855
End
End
Begin VB.Frame Frame1
Caption = "进程进入"
Height = 1575
Left = 360
TabIndex = 1
Top = 120
Width = 3255
Begin VB.CommandButton CMD_FENPEI
Caption = "确定"
Height = 375
Left = 600
TabIndex = 10
Top = 960
Width = 2055
End
Begin VB.TextBox Text_FENPEI
Height = 270
Left = 1440
TabIndex = 7
Text = "5"
Top = 360
Width = 975
End
Begin VB.Label Label2
Caption = "所需空间"
Height = 255
Left = 480
TabIndex = 9
Top = 360
Width = 855
End
Begin VB.Label Label1
Caption = "K"
Height = 255
Left = 2640
TabIndex = 8
Top = 360
Width = 495
End
End
Begin MSFlexGridLib.MSFlexGrid FG
Height = 5775
Left = 360
TabIndex = 0
Top = 1800
Width = 10455
_ExtentX = 18441
_ExtentY = 10186
_Version = 393216
Rows = 641
Cols = 12
End
Begin VB.Menu menu_file
Caption = "文件(&F)"
Begin VB.Menu menu_exit
Caption = "退出(&E)"
End
End
Begin VB.Menu menu_help
Caption = "帮助(&H)"
Begin VB.Menu menu_about
Caption = "关于作者"
End
Begin VB.Menu men_home
Caption = "作者主页"
End
Begin VB.Menu menu_help_help
Caption = "帮助信息"
End
End
End
Attribute VB_Name = "Form_OS"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Private Declare Function ShellExecute Lib "Shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
'表示内存分区的结构信息类型的变量类型
Private Type MEM_tp
fenqu_shouzhi As Integer '分区首地址
fenqu_changdu As Integer '分区长度
fenqu_zhuangtai As Integer '分区状态 -1表示不存在,0表示空闲分区,1表示已经分配的分区
fenqu_huodongjincheng As Integer '该分区正在活动的进程代号
End Type
'定义最多640个,总共640K内存数组
Dim MEM(1 To 640) As MEM_tp
'表示可以使用的进程代号
Dim jincheng(1 To 640) As Integer
'0表示该进程号可以使用
'.>=1表示该进程号不可以使用
'表示分配方法
Dim fenPEI_fangfa As Integer
'0=最先分配
'1=最优分配
'2=最坏分配
Function get_jincheng() As Integer
'取可以使用的进程号
Dim i As Integer
For i = 1 To 640
If jincheng(i) = 0 Then
jincheng(i) = 1
get_jincheng = i
Exit Function
End If
Next
get_jincheng = 0
End Function
Function get_FENQU() As Integer
'取可以使用的为了表示分区的存储空间,模拟c语言的指针
Dim i As Integer
For i = 1 To 640
If MEM(i).fenqu_zhuangtai = -1 Then
get_FENQU = i
Exit Function
End If
Next
get_FENQU = 0
End Function
Function get_kong_FENQU(ByVal kj As Integer) As Integer
Dim i As Integer
Dim MIN_L As Integer
Dim MAX_L As Integer
Dim MIN_P, MAX_P As Integer
'分配新的分区
Select Case fenPEI_fangfa
Case 0 '最先适应 按地址找
For i = 1 To 640
If MEM(i).fenqu_zhuangtai = 0 Then
If MEM(i).fenqu_changdu >= kj Then
get_kong_FENQU = i
Exit Function
End If
End If
Next i
Case 1 '最优适应,找最小可以满足的
MIN_L = 10000
For i = 1 To 640
If MEM(i).fenqu_zhuangtai = 0 Then
If MEM(i).fenqu_changdu >= kj Then
If MEM(i).fenqu_changdu < MIN_L Then
MIN_L = MEM(i).fenqu_changdu
MIN_P = i
End If
End If
End If
Next i
If MIN_P = 0 Then
Call MsgBox("内存不足!", vbCritical)
Else
get_kong_FENQU = MIN_P
End If
Exit Function
Case 2 '最坏适应,找最大可以满足的
MIN_L = 10000
For i = 1 To 640
If MEM(i).fenqu_zhuangtai = 0 Then
If MEM(i).fenqu_changdu >= kj Then
If MEM(i).fenqu_changdu > MAX_L Then
MAX_L = MEM(i).fenqu_changdu
MAX_P = i
End If
End If
End If
Next i
If MAX_P = 0 Then
Call MsgBox("内存不足!", vbCritical)
Else
get_kong_FENQU = MAX_P
End If
Exit Function
End Select
Call MsgBox("内存不足!", vbCritical)
End Function
Private Sub CMD_fenPEI_Click()
On Error GoTo err_handel
Dim kj As Integer
Dim i As Integer
Dim JC As Integer
Dim j As Integer
Dim L As Integer
Dim FQ As Integer
'新的进程进入
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
If L > 0 Then
FQ = get_FENQU()
MEM(FQ).fenqu_zhuangtai = 0
MEM(FQ).fenqu_changdu = L
MEM(FQ).fenqu_shouzhi = MEM(i).fenqu_shouzhi + kj
End If
Call refrensh_form
Randomize (Timer)
i = Int(Rnd(1) * 6 + 1)
Text_FENPEI.Text = Str(i)
Exit Sub
err_handel:
MsgBox "请在文本框内输入正确的数字"
End Sub
Sub refrensh_form()
'刷新显示
Dim i As Integer
Dim cl As Long
Dim kj As Integer
Dim JC As Integer
Dim sz As Integer
Dim j, k As Integer
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -