Skip to content

Commit

Permalink
将缓存调度算法LRU独立出来,下一步使BufferManager类,只提供缓存管理的接口
Browse files Browse the repository at this point in the history
  • Loading branch information
yangtengfei committed Jan 14, 2016
1 parent c7accc6 commit f1134e7
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 20 deletions.
36 changes: 16 additions & 20 deletions src/main/com/tengfeiyang/manager/BufferManager.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import com.tengfeiyang.entities.BCB;
import com.tengfeiyang.entities.Page;
import com.tengfeiyang.supply.SchduleAlgorithm;

public class BufferManager {
private static final int pageNum = 500000;
Expand All @@ -15,42 +16,41 @@ public class BufferManager {
static int hitTimes = 0;

static int pageSize = 4;
static int initBufferSize = 1024;
static int currentBufferSize = 1024;
static int initBufferSize = 4096;
static int currentBufferSize = 4096;

static List<Integer> bufferList = new ArrayList<Integer>(); // pageId代表page
static Map<Integer, BCB> bCBMap = new HashMap<Integer, BCB>();
static List<Integer> bufferList = new ArrayList<Integer>(); // pageId代表page LRU算法维护
static Map<Integer, BCB> bCBMap = new HashMap<Integer, BCB>(); // BCB管理
static List<Page> pageList = new ArrayList<Page>(); // 缓冲区存储数据

public static void main(String[] args) {
for (int i = 0; i < (initBufferSize/pageSize); i++) { // bufferList >= 缓冲区中页面数
for (int i = 0; i < (initBufferSize/pageSize); i++) { // bufferList >= 缓冲区中页面数 不用除
bufferList.add(0);
Page page = new Page();
pageList.add(page);
}

Page page = null;
// 读取页面
try {
FileManager.openFile();
for (int i = 0; i < pageNum; i++) {
// System.out.println("=====" + i + "=====");

page = FileManager.readPage(i);
// 判断页面是否存在于缓存中(命中)
if (bufferList.contains(page.getPageId())) {
// System.out.println("----------------------------------");
hitTimes++;
updateBCB(page);
updateLRUManager(page.getPageId());

} else if (0 < currentBufferSize) { // 缓冲区未满
// System.out.println("----------------------------------");
ioNum++;
System.out.println("currentBufferSize: " + currentBufferSize);
insertIntoLRUManager(page.getPageId());
insertIntoLRUManager(page.getPageId()); // 缓冲区管理
currentBufferSize = currentBufferSize - pageSize;
insertBCB(page);

} else {
// System.out.println("----------------------------------");
ioNum++;
insertBCB(page);
BCB removedBCB = getLatestPage(page.getPageId());
Expand All @@ -77,9 +77,9 @@ public static void main(String[] args) {
* @param pageId
*/
private static void insertIntoLRUManager(int pageId) {

int point = (initBufferSize-currentBufferSize)/4; // 已存放数据的位置
// System.out.println(point + "==insertIntoLRUManager==");
LRUManager(point, pageId);
bufferList = SchduleAlgorithm.LRUManager(bufferList, point, pageId);
}

/**
Expand All @@ -89,8 +89,7 @@ private static void insertIntoLRUManager(int pageId) {
*/
private static void updateLRUManager(int pageId) {
int point = bufferList.indexOf(pageId);
// System.out.println(point + "==updateLRUManager==");
LRUManager(point, pageId);
bufferList = SchduleAlgorithm.LRUManager(bufferList, point, pageId);
}

/**
Expand All @@ -102,9 +101,7 @@ private static void updateLRUManager(int pageId) {
private static BCB getLatestPage(int pageId) {
int latestPageId = bufferList.get(bufferList.size() - 1);
BCB bcb = bCBMap.get(latestPageId);

// System.out.println(bufferList.size() - 1 + "==getLatestPage==");
LRUManager(bufferList.size() - 1, pageId);
bufferList = SchduleAlgorithm.LRUManager(bufferList, bufferList.size() - 1, pageId);

return bcb;
}
Expand All @@ -115,13 +112,12 @@ private static BCB getLatestPage(int pageId) {
* @param point
* @param pageId
*/
private static void LRUManager(int point, int pageId) {
/* private static void LRUManager(int point, int pageId) {
for (int i = point; i > 0; i--) {
bufferList.set(i, bufferList.get(i - 1));
}
bufferList.set(0, pageId);
// System.out.println(bufferList.toString());
}
}*/

/**
* 在bCBMap中插入新的BCB
Expand Down
20 changes: 20 additions & 0 deletions src/main/com/tengfeiyang/supply/SchduleAlgorithm.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package com.tengfeiyang.supply;

import java.util.List;

public class SchduleAlgorithm {
/**
* LRU管理器,管理缓存,通过控制point指针,在各种情况下插入数据
*
* @param point
* @param pageId
* @return
*/
public static List<Integer> LRUManager(List<Integer> bufferList, int point, int pageId) {
for (int i = point; i > 0; i--) {
bufferList.set(i, bufferList.get(i - 1));
}
bufferList.set(0, pageId);
return bufferList;
}
}

0 comments on commit f1134e7

Please sign in to comment.