分页内存管理Word格式.docx
- 文档编号:21146470
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:16
- 大小:165.77KB
分页内存管理Word格式.docx
《分页内存管理Word格式.docx》由会员分享,可在线阅读,更多相关《分页内存管理Word格式.docx(16页珍藏版)》请在冰豆网上搜索。
//进程名
intlength;
//进程所占的字节数
intnumblock;
//进程占有的页框数
intframe[N];
//存放进程占用的页框
intflag;
//进程是否占用内存
}pages[N];
2.3模块说明
2.3.1分配内存模块
voidassignmembery()
intpid,num;
printf("
pleaseinputpidandnum:
"
);
scanf("
%d%d"
&
pid,&
num);
intn,m=0,i=0,j=0;
n=num/1001+1;
//所需的页框数
pages[pid].length=num;
if(n>
restblock)
{printf("
Thememberyisnotenough,sorry!
\n"
return;
}
//当所需页框数多于剩余的页框数时,显示内存不足
else
{
restblock=restblock-n;
pnum++;
pages[pid].flag=1;
//为进程分配页框
for(i=0;
i<
n;
i++)
while(block[j]!
=-1&
&
j<
N)//从头开始依次查找还未分配的页框
j++;
process[pid][i]=j;
pages[pid].frame[m]=j;
m++;
block[j]=pid;
}
pages[pid].numblock=n;
Process%daddsucessfully,having%dpages!
pid,n);
2.3.2分配内存模块
voidbackmembery()
pleaseinputpidthatneedtobegivenback:
%d"
pid);
intk,f=0;
//f来标识是否回收了进程
for(k=0;
k<
100;
k++)
if(block[k]==pid)
block[k]=-1;
//回收了一个进程,释放页框
restblock=restblock+1;
f=1;
if(f==1)//f=1表示有进程被回收。
回收了一个进程,对页表重新设置
pnum=pnum-1;
pages[pid].length=0;
pages[pid].numblock;
pages[pid].frame[k]=-1;
pages[pid].numblock=0;
pages[pid].flag=0;
printf("
Givebackprocess%dsucessfully!
pid);
else
Process%disnotexsit!
}
2.3.3显示内存模块
voidshowmembery()
inti=0;
Thememberyhave%dprocessnowthenumberoftherestblocksis%d\n"
pnum,restblock);
//显示剩余页框与当前占用的进程数
while(i<
N)
if(pages[i].flag==1)
output(i);
i++;
if(pages[i].flag==0)
//输出进程号位outp的占用内存的情况
voidoutput(intoutp)
{
inti;
hnamepidlengthnumblockframe\n"
%c%d%d%d"
pages[outp].hname,pages[outp].pid,pages[outp].length,pages[outp].numblock);
pages[outp].numblock;
i++)
%d,"
pages[outp].frame[i]);
2.3.4访问内存模块
voidvisit()
intadress;
pleaseinputvisitedpidandadress:
adress);
intnframe,n,n1;
if(pages[pid].flag==0)
TheProcess%disnotexsit!
}//输入的进程号内存里面不存在
if(adress>
pages[pid].length)printf("
crosstheboder;
/n"
//当偏移地址大于进程长度时显示越界
else
occupyframe:
n=adress/1000;
n1=adress%1000;
nframe=pages[pid].frame[n];
%d"
nframe);
firstadress:
%doffset:
nframe*1000,n1);
2.3.5初始化页表,页框模块
intblock[N];
//内存块状态标志数组,数组显示占用页框的进程号
//初始化内存块状态标志数组为-1
voidinitblock()
for(inti=0;
N;
block[i]=-1;
//初始化页表进程号依次为0,1,2……….,进程名a,b,c,d…………,长度为0,占用的页框数为0
voidinitpage()
inti,j;
pages[i].pid=i;
if(i==0)
{pages[i].hname='
a'
;
{pages[i].hname=pages[i-1].hname+1;
pages[i].length=0;
pages[i].numblock=0;
for(j=1;
j++)
{pages[i].frame[j]=-1;
pages[i].flag=0;
2.3.6主模块
//菜单显示
voidmenu()
Menu\n"
0:
exit\n1:
assignmembery\n2:
givebackmembery\n3:
showmembery\n4:
visitmembery\n"
intmain()
initblock();
//初始化页框
initpage();
//初始化页表
menu();
//显示菜单
intpid1,pid2,pid4,num,adress;
intr;
intf=1;
while(f==1)
pleasechoosethefunctionnumber:
r);
switch(r)
case0:
Exit();
break;
case1:
assignmembery();
case2:
backmembery();
break;
case3:
showmembery();
case4:
visit();
\n\ncontinue?
pleaseinput0or1,0isexit,1iscontinue:
f);
return0;
3.源代码
4.#include<
iostream>
5.usingnamespacestd;
6.#include<
stdio.h>
7.
8.#defineN100
9.intprocess[N][N];
intblock[N];
10.intrestblock=100;
11.intpnum=0;
12.struct
13.{
14.intpid;
15.charhname;
16.intlength;
17.intnumblock;
18.intframe[N];
19.intflag;
20.
21.}pages[N];
22.
23.voidinitblock()
24.{
25.for(inti=0;
26.block[i]=-1;
27.
28.}
29.voidinitpage()
30.{
31.
32.inti,j;
33.for(i=0;
34.{
35.pages[i].pid=i;
36.if(i==0)
37.{pages[i].hname='
38.else
39.{pages[i].hname=pages[i-1].hname+1;
40.pages[i].length=0;
41.pages[i].numblock=0;
42.for(j=1;
43.{pages[i].frame[j]=-1;
44.pages[i].flag=0;
45.}
46.
47.}
48.
49.
50.intExit()
51.{
52.return0;
53.}
54.voidassignmembery()
55.{
56.intpid,num;
57.printf("
58.scanf("
59.intn,m=0,i=0,j=0;
60.n=num/1001+1;
61.pages[pid].length=num;
62.if(n>
63.{printf("
64.else
65.{
66.restblock=restblock-n;
67.pnum++;
68.pages[pid].flag=1;
69.
70.for(i=0;
71.{
72.while(block[j]!
N)
73.j++;
74.process[pid][i]=j;
75.pages[pid].frame[m]=j;
76.m++;
77.block[j]=pid;
78.j++;
79.}
80.pages[pid].numblock=n;
81.printf("
82.}
83.}
84.voidbackmembery()
85.{
86.intpid;
87.printf("
88.scanf("
89.intk,f=0;
90.for(k=0;
91.if(block[k]==pid)
92.{
93.block[k]=-1;
94.restblock=restblock+1;
95.f=1;
96.}
97.
98.if(f==1)
99.{
100.pnum=pnum-1;
101.pages[pid].length=0;
102.for(k=0;
103.pages[pid].frame[k]=-1;
104.pages[pid].numblock=0;
105.pages[pid].flag=0;
106.
107.printf("
108.
109.}
110.else
111.{printf("
112.
113.
114.}
115.voidoutput(intoutp)
116.{
117.inti;
118.printf("
119.printf("
120.for(i=0;
121.{
122.printf("
123.}
124.printf("
125.}
126.voidshowmembery()
127.{
128.inti=0;
129.while(i<
130.{
131.if(pages[i].flag==1)
132.{
133.output(i);
134.i++;
135.}
136.if(pages[i].flag==0)
137.{
138.i++;
139.}
140.
141.}
142.}
143.voidvisit()
144.{
145.intpid;
146.intadress;
147.printf("
148.scanf("
149.intnframe,n,n1;
150.if(pages[pid].flag==0)
151.{printf("
152.else
153.{
154.if(adress>
155.else
156.{
157.printf("
158.n=adress/1000;
159.n1=adress%1000;
160.nframe=pages[pid].frame[n];
161.printf("
162.printf("
163.printf("
164.}
165.}
166.}
167.
168.voidmenu()
169.{
170.printf("
171.printf("
172.}
173.intmain()
174.{
175.initblock();
176.initpage();
177.menu();
178.intpid1,pid2,pid4,num,adress;
179.intr;
180.intf=1;
181.while(f==1)
182.{
183.printf("
184.scanf("
185.switch(r)
186.{
187.case0:
188.case1:
189.case2:
190.case3:
191.case4:
192.}
193.printf("
194.scanf("
195.}
196.return0;
197.}
4.运行结果和运行情况
程序运行结果如下:
(1)为作业成功分配内存空间
(2)回收进程
(3)显示分配情况
(4)根据作业名访问内存,给出页框号与偏移地址
5.总结
掌握知识的基础上写代码。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 分页 内存 管理