计算机专业操作系统课程设计 存储管理地址换算演示.docx
- 文档编号:9340997
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:33
- 大小:361.74KB
计算机专业操作系统课程设计 存储管理地址换算演示.docx
《计算机专业操作系统课程设计 存储管理地址换算演示.docx》由会员分享,可在线阅读,更多相关《计算机专业操作系统课程设计 存储管理地址换算演示.docx(33页珍藏版)》请在冰点文库上搜索。
计算机专业操作系统课程设计存储管理地址换算演示
《操作系统》课程设计报告
课题:
存储管理地址换算演示
学院(系):
计算机科学与工程学院
班级:
学号:
学生姓名:
指导教师:
时间:
2009年12月24日到2009年12月30日
目录
封面1
目录2
一、设计任务3
二、任务目的3
三、存储器管理地址换算思想3
2.1分页方式的地址换算3
2.2分段方式的地址换算4
2.3段页式的地址换算5
四、设计方案6
4.1设计功能流程图6
4.2功能流程图说明7
4.3代码实现核心部分7
4.3.1打开演示窗体7
4.3.2分页方式的地址换算参数处理及模拟分配页表映射10
4.3.3分页方式的地址换算过程演示10
4.3.4分段方式的地址换算参数处理及模拟分配段表映射11
4.3.5分段方式的地址换算过程演示13
4.3.6段页式的地址换算参数处理及模拟分配页、段表映射14
4.3.7段页式的地址换算过程演示17
五、程序运行实例20
5.1主窗体界面20
5.2分页方式的地址换算演示界面20
5.3分段方式的地址换算演示界面21
5.4段页式的址换算演示界面22
5.5关于对话框界面23
六、心得体会23
七、参考文献24
一、设计任务
编程演示三种存储管理方式的地址换算过程:
1)分页方式的地址换算
2)分段方式的地址换算
3)段页式的地址换算
要求演示正确、清晰,编程所用工具不限。
二、任务目的
3.1通过演示实现三种存储管理方式的地址换算过程,了解存储器管理内存分配方式的特点。
3.2通过对页表及段表映射关系、三种地址变换机构的模拟,加深对存储器管理内存离散分配方式的原理和实现过程的理解。
3.3掌握三种存储管理方式的地址换算的基本思想和实现过程,并区分它们之间的不同。
三、存储器管理地址换算思想
2.1分页方式的地址换算
在系统中设置一个页表寄存器PTR,在其中存放页表在内存的始址和页表的长度,进程未执行时,页表的始址和页表的长度存放在本进程的PCB中。
当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将有效地址分为页号和页内地址两部分,再以页号为索引去检索页表。
查找操作由硬件执行。
在执行检索之前,先将页号与页表长度进行比较,如果页号大于或等于页表长度,则表示本次所访问的地址已超越进程的地址空间。
于是这一错误将被系统发现并产生一地址越界中断。
若未出现越界错误,则将页表始址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置,于是可从中得到该页的物理块号,将之装入物理地址寄存器中。
与此同时,再将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中。
这样便完成了从逻辑地址到物理地址的变换。
页表作用
优点:
没有外碎片,每个内碎片不超过页大小。
一个程序不必连续存放。
便于改变程序占用空间的大小。
即随着程序运行而动态生成的数据增多,地址空间可相应增长。
缺点:
程序全部装入内存。
2.2分段方式的地址换算
为了实现从进程的逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址和段表长度TL。
在进行地址变换时,系统讲逻辑地址中的段号S与段表长度TL进行比较。
若S>TL,表示段号太大,是访问越界,于是产生越界中断信号;若未越界,则根据段表的始址和该段的段号,计算出该段对应段表项的位置,接着检查该段对应的状态位,若状态位为1,表示该段在外存而非主存,于是产生缺页中断信号,若状态位为0,则从段表项中读出该段在内存的起始地址,然后,再检查段内地址d是否超过该段的段长SL。
若超过,即d>SL,同样发出越界中断信号;若未越界,则将该段的基址与段内地址d相加,即可达到要访问的内存物理地址。
利用段表实现地址映射
优点:
便于动态申请内存;管理和使用统一化;便于共享;便于动态链接。
缺点:
产生碎片。
2.3段页式的地址换算
在段页式系统中,为了便于实现地址变换,须配置一个段表寄存器,其中存放段表始址和段表长度TL。
进行地址变换时,首先利用段号S,将它与段表长TL进行比较。
若S 利用段表和页表实现地址映射 特点;结合页式、段式优点,克服二者的缺点。 四、设计方案 4.1设计功能流程图 4.2功能流程图说明 设计C#程序Windows应用程序来分别实现上述三种存储管理方式的地址换算。 主窗口用来进行地址换算方式的选择以及相对应方式的参数设置(分页方式的地址换算参数设置,页表长度、页面大小、逻辑地址、主存大小;分段方式的地址换算参数设置,段表长度、逻辑地址段号、段内地址;段页式的地址换算参数设置,段表长度、逻辑地址段号、页内地址、页面大小、逻辑地址页号)。 在相应存储管理方式地址换算的参数设置中设置好参数后点击“演示”按钮,程序将会根据地址换算方式的选择的不同而打开不同地址换算方式的演示窗体,演示开始前将会以对话框的方式提交换算结果,演示窗体展示各个地址换算方式的换算过程。 4.3代码实现核心部分 4.3.1打开演示窗体 /// ///根据所选地址换算方式打开不同演示窗体演示不同方式的存储管理地址换算 /// /// /// privatevoidbuttonShow_Click(objectsender,EventArgse) { //根据不同选择的地址换算方式打开不同演示窗体 if(radioPageMode.Checked) //分页方式的地址换算传递参数且打开相应演示窗体 { Program.LogicalAddressA=(int)numericLogicalAddressA.Value; //如果页面大小未设置则弹出警告对话框 if(comboBlockSizeA.SelectedIndex==-1) { MessageBox.Show("请设置页面大小! ","存储管理地址换算演示",MessageBoxButtons.OK,MessageBoxIcon.Warning); return; } stringPageSizeA=comboBlockSizeA.SelectedItem.ToString(); if(PageSizeA=="512B") Program.PageSizeA=512; elseif(PageSizeA=="1KB") Program.PageSizeA=1024; elseif(PageSizeA=="2KB") Program.PageSizeA=1024*2; elseif(PageSizeA=="4KB") Program.PageSizeA=1024*4; Program.PageLengthA=(int)numericPageLengthA.Value; //如果主存大小未设置则弹出警告对话框 if(comboMemorySizeA.SelectedIndex==-1) { MessageBox.Show("请设置主存大小! ","存储管理地址换算演示",MessageBoxButtons.OK,MessageBoxIcon.Warning); return; } stringMemorySizeA=comboMemorySizeA.SelectedItem.ToString(); if(MemorySizeA=="512KB") Program.MemorySizeA=1024*512; elseif(MemorySizeA=="1M") Program.MemorySizeA=1024*1024; elseif(MemorySizeA=="2M") Program.MemorySizeA=1024*1024*2; elseif(MemorySizeA=="4M") Program.MemorySizeA=1024*1024*4; newFormPageMode().Show(this); } elseif(radioSegmentMode.Checked) //分段方式的地址换算传递参数且打开相应演示窗体 { Program.SegmentInAddressB=(int)numericSegmentInAddressB.Value; Program.SegmentLengthB=(int)numericSegmentLengthB.Value; Program.SegmentNumberB=(int)numericSegmentNumberB.Value; newFormSegmentMode().Show(this); } elseif(radioSPMode.Checked) //段页式的地址换算传递参数且打开相应演示窗体 { //如果页面大小未设置则弹出警告对话框 if(comboPageSizeC.SelectedIndex==-1) { MessageBox.Show("请设置页面大小! ","存储管理地址换算演示",MessageBoxButtons.OK,MessageBoxIcon.Warning); return; } stringPageSizeC=comboPageSizeC.SelectedItem.ToString(); if(PageSizeC=="512B") Program.PageSizeC=512; elseif(PageSizeC=="1KB") Program.PageSizeC=1024; elseif(PageSizeC=="2KB") Program.PageSizeC=2048; elseif(PageSizeC=="4KB") Program.PageSizeC=4096; Program.SegmentLengthC=(int)numericSegmentLengthC.Value; Program.SegmentNumberC=(int)numericSegmentNumberC.Value; Program.PageNumberC=(int)numericPageNumberC.Value; //确保页内地址对应于相应页面大小均有效 if(PageSizeC=="512B") numericPageInAddressC.Maximum=511; elseif(PageSizeC=="1KB") numericPageInAddressC.Maximum=1023; elseif(PageSizeC=="2KB") numericPageInAddressC.Maximum=1024*2-1; elseif(PageSizeC=="4KB") numericPageInAddressC.Maximum=1024*4-1; Program.PageInAddressC=(int)numericPageInAddressC.Value; newFormSPMode().Show(this); } } 4.3.2分页方式的地址换算参数处理及模拟分配页表映射 /// ///构造函数初始各参数 /// publicFormPageMode() { InitializeComponent(); //定义随机数用于生成页表映射关系 Randomrn=newRandom(); //物理块总数=内存大小/页面大小 intBT=MS/PS; //实例化用来表示页表的映射关系的结构体数组 PT=newPageTableEntries[PL]; //分配页表项页号 for(inti=0;i { PT[i].pagenumber=i; } //分配页表项块号 PT[0].blocknumber=rn.Next(BT); for(inti=1;i { PT[i].blocknumber=rn.Next(BT); for(intj=0;j { if(PT[j].blocknumber==PT[i].blocknumber) //确保页表中一个物理块只对应于一个页号 { i--; break; } } } StartShow(); } 4.3.3分页方式的地址换算过程演示 /// ///地址换算演示方法 /// publicvoidStartShow() { //向演示窗体listView中添加页表各表项信息 for(inti=0;i { listView1.Items.Add(Convert.ToString(PT[i].pagenumber));//添加页号信息 listView1.Items[i].SubItems.Add(Convert.ToString(PT[i].blocknumber));//添加物理块号信息 } //逻辑地址对应页号=逻辑地址/页面大小 intPN=LA/PS; //逻辑地址对应页内地址=逻辑地址%页面大小 intPIA=LA%PS; label1.Text="初始信息: 页表长度: "+PL+"页面大小: "+PS+"逻辑地址: "+LA+"主存大小: "+MS+"(B)\n\n"; label1.Text+="①【逻辑地址分为页号和页内地址】\n页号: "+PN+"页内地址: "+PIA+"\n"; if(PN>=PL) //页号大于页表长度,越界中断 { label1.Text+="②【页号与页表长度比较】\n"+PN+">"+PL+"地址越界中断(注: 页表页号从开始)\n"; MessageBox.Show(PN+"(页号)>"+PL+"(页表长度)地址越界中断! ","分页方式的地址换算演示",MessageBoxButtons.OK,MessageBoxIcon.Warning); } else { label1.Text+="②【页号与页表长度比较】\n"+PN+"<"+PL+"页表中页号: "+PN+"物理块号: "+PT[PN].blocknumber+"\n"; label1.Text+="③【计算页起始地址】\n页表中页号: "+PN+"物理块号: "+PT[PN].blocknumber+"页起始地址: "+PT[PN].blocknumber+"*"+PS+"="+PT[PN].blocknumber*PS+"(B)\n"; //转换所得的物理地址 intPA=PT[PN].blocknumber*PS+PIA; label1.Text+="④【换算物理地址】\n物理地址="+PT[PN].blocknumber+"*"+PS+"+"+PIA+"="+PA+"(B)\n"; label1.Text+="(物理地址=物理块号*块大小+页内地址注: 块大小=页面大小)\n"; MessageBox.Show("物理地址="+PA+"(B)","分页方式的地址换算演示",MessageBoxButtons.OK,MessageBoxIcon.Information); } } 4.3.4分段方式的地址换算参数处理及模拟分配段表映射 /// ///构造函数初始各参数 /// publicFormSegmentMode() { InitializeComponent(); //定义随机数用于生成段表映射关系 Randomrn=newRandom(); //定义常量K,用于生成符合要求的段长 intK_5=1024*5; //定义常量K,用于生成符合要求的基址 intK_30=1024*30; //实例化用来表示段表的映射关系的结构体数组 ST=newSegmentTableEntries[SL]; //分配段表项段号 for(inti=0;i { ST[i].segmentnumber=i; } //分配段表项状态位 for(inti=0;i { ST[i].state=rn.Next(110)/100; } //分配段表项段长 for(inti=0;i { //随机数rn.Next(1,7)相当于区间[1,),可以取到取不到 ST[i].segmentlength=rn.Next(1,7)*K_5;//随机指定段长在K、K、K、K、K、K之间 } //分配段表项主存起始地址 ST[0].startaddress=rn.Next(SL)*K_30; for(inti=1;i { //保证两基址之间容得下所有段长 ST[i].startaddress=rn.Next(SL)*K_30; for(intj=0;j { if(ST[j].startaddress==ST[i].startaddress) //确保段表中主存起始地址唯一 { i--; break; } } } StartShow(); } 4.3.5分段方式的地址换算过程演示 /// ///地址换算演示方法 /// publicvoidStartShow() { //向演示窗体listView中添加段表各表项信息 for(inti=0;i { listView1.Items.Add(Convert.ToString(ST[i].segmentnumber));//添加段号信息 listView1.Items[i].SubItems.Add(Convert.ToString(ST[i].state));//添加状态位信息 listView1.Items[i].SubItems.Add(Convert.ToString(ST[i].segmentlength));//添加段表长度信息 if(ST[i].state==0) //状态位为表示该段在主存,添加主存起始地址信息 { listView1.Items[i].SubItems.Add(Convert.ToString(ST[i].startaddress)); } else //状态位为表示该段在外存,不添加相关信息 listView1.Items[i].SubItems.Add("—"); } label1.Text="初始信息: 段表长度: "+SL+"段号: "+SN+"段内地址: "+SIA+"\n\n"; if(SN>=SL) { label1.Text+="①【段号与段表长度比较】\n"+SN+">"+SL+"地址越界中断(注: 段表段号从开始)\n"; MessageBox.Show(SN+"(页号)>"+SL+"(页表长度)地址越界中断","分段方式的地址换算演示",MessageBoxButtons.OK,MessageBoxIcon.Warning); } else { //段表中段号及段号对应段长 label1.Text+="①【段号与段表长度比较】\n"+SN+"<"+SL+"段表中段号: "+SN+"状态位: "+ST[SN].state+"\n"; if(ST[SN].state==1) { label1.Text+="②【段状态位检查】\n段表中段号: "+SN+"状态位: "+ST[SN].state+"(不在主存)缺页中断(注: 状态位0—主存,1—外存)\n"; MessageBox.Show("段表中段号: "+SN+"状态位: "+ST[SN].state+"缺页中断","分段方式的地址换算演示",MessageBoxButtons.OK,MessageBoxIcon.Warning); } else { label1.Text+="②【段状态位检查】\n段表中段号: "+SN+"状态位: "+ST[SN].state+"(在主存)段长"+ST[SN].segmentlength+"\n"; if(SIA>ST[SN].segmentlength) { label1.Text+="③【段内地址与段长比较】\n"+SIA+">"+ST[SN].segmentlength+"地址越界中断\n"; MessageBox.Show(SIA+"(段内地址)>"+ST[SN].segmentlength+"(段长)地址越界中断","分段方式的地址换算演示",MessageBoxButtons.OK,MessageBoxI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机专业操作系统课程设计 存储管理地址换算演示 计算机专业 操作系统 课程设计 存储 管理 地址 换算 演示