public static void readPage(int spn, int ppn) { if (allocatedPages.contains(spn)) { swapLock.acquire(); swapFile.read(spn * PAGESIZE, memory, ppn * PAGESIZE, PAGESIZE); swapLock.release(); } else { } }
/* we will try to allocate a free page from the freepages*/ public static int insertPage(int ppn) { int numBits = 0; int spn = swapFile.length() / PAGESIZE; if (freePages.size() > 0) { spn = freePages.remove(0); } return insertPage(spn, ppn); }
public static int insertPage(int spn, int ppn) { swapLock.acquire(); int numBits = swapFile.write(spn * PAGESIZE, memory, ppn * PAGESIZE, PAGESIZE); // assert that numBits == PAGESIZE allocatedPages.add(spn); swapLock.release(); return spn; }
/** * Sets the properties of a new task, passed as an argument. * * <p>Creates a new thread list, sets TaskLive status and creation time, creates and opens the * task's swap file of the size equal to the size (in bytes) of the addressable virtual memory. * * @return task or null @OSPProject Tasks */ public static TaskCB do_create() { TaskCB new_task = new TaskCB(); // criação da nova task HClock new_clock = new HClock(); // instância do relógio do sistema String path = SwapDeviceMountPoint + String.valueOf(new_task.getID()); // path do swap file new_task.new_thread = new ArrayList<ThreadCB>(); new_task.new_port = new ArrayList<PortCB>(); new_task.new_file = new ArrayList<OpenFile>(); new_task.setPageTable(new PageTable(new_task)); new_task.setCreationTime( new_clock.get()); // usa a instância do relógio, para setar o horário de criação da task new_task.setStatus(TaskLive); // seta o estado atual da task (TaskLive) new_task.setPriority(1); // como não foi especificado nenhuma prioridade na descrição, usamos 1 new_task.new_swap.create( path, (int) Math.pow( 2.0D, MMU.getVirtualAddressBits())); // tamanho da página deve ser 2^(número de bits do // ambiente) OpenFile save_swap = OpenFile.open(path, new_task); // abrimos o swap file new_task.setSwapFile( save_swap); // dizemos que o swap criado acima deve ser alocado a nossa task ThreadCB.create(new_task); // criamos a thread inicial if (save_swap == null) { // verificamos se o swap foi criado com sucesso new_task .new_thread .get(0) .dispatch(); // caso não tenha, dispachamos a thread criada acima (posição 0 do vetor) return null; // e retornamos uma task nula } return new_task; // se tudo ocorreu como esperado, retornamos a task criada inicialmente }
public static void close() { swapFile.close(); ThreadedKernel.fileSystem.remove(swapName); }