页式存储管理
来源:互联网 发布:工程网络计划技术讲义 编辑:程序博客网 时间:2024/06/05 11:27
一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号,从0开始,如第0页、第1页等。把内存空间分成与页面相同大小的若干个存储块,称为(物理)块或页框,同样进行编号。在为进程分配内存时,以块为单位将进程中的若干个页分别装入到多个可以不相邻接的物理块中。
为了标识中哪些块空闲,哪些块占用,可用一张位示图指示。位示图是由若干主存单元构成,如图4-1所示。其中每一位与一个主存块对应。分别用0和1表示对应块是空闲还是占用。
在装入一个作业时,根据作业对主存的需求量,先检查是否有足够的空闲块,如有,则查位示图,按作业需求量找出为0的一些位,且置上占用标记1。
按找到的位计算对应的块号。其计算公式为:
块号=J*8+I
其中,J表示找到的字节号,I表示找到的位号。
首先我们构造页面类,代码如下:
package 页式存储;public class Page { private int PageNumber; //页面号 private int BlockNumber; //即将存储它的块号 public Page(int pageNumber) { //构造方法 super(); PageNumber = pageNumber; } public int getBlockNumber() { return BlockNumber; } public void setBlockNumber(int blockNumber) { BlockNumber = blockNumber; } public int getPageNumber() { return PageNumber; } public void Print(){ System.out.print(this.PageNumber+" "+this.BlockNumber); }}
之后进行设计位示图算法,代码如下:
package 页式存储;import java.util.Random;import java.util.Scanner;public class Block{ private int[][] BitMap; //位示图数组 public Block(int n) { //构造方法 super(); BitMap = new int[n][16]; for ( int i = 0 ; i < n ; i++){ BitMap[i] = this.Random_MakeBitMap(); } } public int[] getBitMap(int index) { //按index寻找位示图 return BitMap[index]; } public int[] Random_MakeBitMap(){ //随机初始化位示图 Random r = new Random(); int[] bitmap = new int[16]; for ( int i = 0 ; i < 16 ; i++){ float flag = r.nextFloat(); if ( flag <= 0.3){ bitmap[i] = 1; }else{ bitmap[i] = 0; } } return bitmap; } public int FindNotBusy(int index){ //寻找空闲的块 int index_notbusy = 0; for ( int i = 0 ; i < 16 ; i++){ if ( this.BitMap[index][i] == 0){ index_notbusy = i; break; } } return index_notbusy; } public void StorePage(Page p){ //存储页面 int index = FindNotBusy(p.getBlockNumber()); this.BitMap[p.getPageNumber()][index] = 1; p.setBlockNumber(p.getPageNumber() * 8 + index); } public void ReleasePage(Page p){ //释放页面 int index = p.getBlockNumber() - p.getPageNumber() * 8; this.BitMap[p.getPageNumber()][index] = 0; p.setBlockNumber(0); } public void Print(Page p){ //打印信息 p.Print(); System.out.print(" "); for ( int i = 0 ; i < 16 ; i++){ System.out.print(this.BitMap[p.getPageNumber()][i]); } System.out.println(); } public void Print_BitMap(){ //打印位示图数组 for ( int i = 0 ; i < this.BitMap.length ; i++){ for ( int j = 0 ; j < 16 ; j++){ System.out.print(this.BitMap[i][j]); } System.out.println(); } } public static void main(String[] args0){ Scanner in = new Scanner(System.in); System.out.print("需要初始化的页面有:"); int num = in.nextInt(); Page[] page = new Page[num]; for ( int i = 0 ; i < num ; i++){ page[i] = new Page(i); } Block block = new Block(num); System.out.println("------------------------开始存储页面-------------------------"); System.out.println("存储前的位示图:"); for ( int i = 0 ; i < num ; i++){ block.Print(page[i]); } for ( int i = 0 ; i < num ; i++){ block.StorePage(page[i]); } System.out.println("页面号"+" "+"块号"+" "+"位示图"); for ( int i = 0 ; i < num ; i++){ block.Print(page[i]); } System.out.println("------------------------开始释放页面-------------------------"); System.out.println("释放前的位示图:"); block.Print_BitMap(); for ( int i = 0 ; i < num ; i++){ block.ReleasePage(page[i]); } System.out.println("释放后的位示图:"); block.Print_BitMap(); in.close(); }}
1 0
- 页式存储管理
- 页式存储管理
- 页式存储管理
- 页式存储管理
- 操作系统存储管理之页式存储管理深入浅出
- 存储管理2-页式与段式存储管理
- 页式虚拟存储管理
- 段式存储管理 Vs 页式存储管理 Vs 段页式存储管理
- 存储管理之页式、段式、段页式存储
- 存储管理之页式、段式、段页式存储
- 存储管理之页式、段式、段页式存储
- 存储管理之页式、段式、段页式存储 以及 优缺点
- 存储管理之页式、段式、段页式存储
- 模拟请求页式存储管理--LRU
- 操作系统原理:页式存储管理
- 《操作系统》—页式存储管理
- 请求页式存储管理实验
- 页式存储管理(FIFO算法)
- Java简介及配置环境
- 第二周行级标签补充,版本2.1
- Android 四大组件之Service
- 机器学习中常用的矩阵求导公式
- 解决锐捷客户端登陆时网卡网关配置有误的方法
- 页式存储管理
- 事务一致性与原子性的区别
- 1118. Birds in Forest (25)
- django实战(一)简单博客显示
- Session的创建和销毁
- Android-BLE低功耗蓝牙开发
- 300. Longest Increasing Subsequence/DP
- GYM 100694 J.Ticket Booking(贪心)
- getServletContext().getRealPath()问题