【分页模拟】简单模拟操作系统分页管理
简单模拟一下内存分页,分配和回收。这里我就用最最最简化的方式没有技术含量。
每个进程维护一张页表,然后操作系统用位示图模拟内存分配情况(0: 未分配,1已经分配)
import java.util.*; public class Main { public static int PAGE_COUNT = 1024; public static int reminder;//空闲 public static int[][] nums; public static void main(String[] args) { nums = new int[3][4];//方便测试,模拟页数 for (int i = 0; i < nums.length; i++) { for (int j = 0; j < nums[0].length; j++) { nums[i][j] = (int) (Math.random() * 2); if (nums[i][j] == 0) { reminder++; } } } System.out.println("\n------------------------分配前--------------------------"); print(); //分配 PCB p1 = new PCB("p1", 4); allocate(p1, 4); System.out.println("\n------------------------分配后--------------------------"); print(); setFree(p1); System.out.println("\n------------------------回收后--------------------------"); print(); } //打印内存分配情况 private static void print() { for (int i = 0; i < nums.length; i++) { for (int j = 0; j < nums[0].length; j++) { System.out.print(nums[i][j] + " "); } System.out.println(); } } /** * @param pcb 进程名 * @param size 需要的页数 */ private static void allocate(PCB pcb, int size) { if (reminder < size) { System.out.println("可分配空间不足!"); } int[] pageTable = pcb.pageTable; int index = 0; for (int i = 0; i < nums.length; i++) { for (int j = 0; j < nums[0].length; j++) { if (nums[i][j] == 0) { nums[i][j] = 1; //将其分配出去 pageTable[index] = i * nums[0].length + j; reminder--; if (++index == size) { System.out.println("分配完成"); return; } } } } } /** * 将为该进程分配的内存回收掉 * * @param pcb 进程 */ private static void setFree(PCB pcb) { int[] pageTable = pcb.pageTable; for (int i = 0; i < pageTable.length; i++) { //定位位示图位置 int row = pageTable[i] / nums[0].length; int col = pageTable[i] % nums[0].length; //将空间回收 nums[row][col] = 0; reminder++; } System.out.println("进程空间已释放!"); } } class PCB { String name; int[] pageTable; public PCB() { } public PCB(String name, int size) {//size为占用的内存页数 this.name = name; this.pageTable = new int[size]; Arrays.fill(this.pageTable, -1); } }
运行截图:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程