內存分派

 /*   
 * Copyright (c) 2010-2020 Founder Ltd. All Rights Reserved.   
 *   
 * This software is the confidential and proprietary information of   
 * Founder. You shall not disclose such Confidential Information   
 * and shall use it only in accordance with the terms of the agreements   
 * you entered into with Founder.   
 *   
 */
package BiShiMianShi;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;

public class Neicunfenpei {

    /**
     * 函數功能說明  內存分配
     * PQ  2014-9-7
     * 修改者名字修改日期
     * 修改內容
     * @參數: @param args    
     * @return void   
     * @throws
     */

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner s = new Scanner(System.in);
        String str1 = null;
        if(s.hasNext()){
            str1 = s.nextLine();
        }
        int[] pool = memInit(Integer.valueOf(str1));
        Map m = null;
        
        
        List<Integer> allcAddr = new ArrayList<Integer>();
        List<Integer> sizeAddr = new ArrayList<Integer>();
        
        m = getFreeMemSizeNum(pool);        
        if(s.hasNext()){
            str1 = s.nextLine();
        }
        allcAddr.add(memAlloc(pool, m, Integer.valueOf(str1)));//第一次分配
        sizeAddr.add(Integer.valueOf(str1));
        
        
        m = getFreeMemSizeNum(pool);    
        if(s.hasNext()){
            str1 = s.nextLine();
        }
        allcAddr.add(memAlloc(pool, m, Integer.valueOf(str1)));//第二次分配
        sizeAddr.add(Integer.valueOf(str1));

        m = getFreeMemSizeNum(pool);    
        if(s.hasNext()){
            str1 = s.nextLine();
        }
        allcAddr.add(memAlloc(pool, m, Integer.valueOf(str1)));//第三次分配
        sizeAddr.add(Integer.valueOf(str1));
            
        
        if(s.hasNext()){
            str1 = s.nextLine();
        }
        memFree(pool,sizeAddr.get(Integer.valueOf(str1)-1),allcAddr.get(Integer.valueOf(str1)-1));//釋放
        
        
        m = getFreeMemSizeNum(pool);    
        if(s.hasNext()){
            str1 = s.nextLine();
        }
        allcAddr.add(memAlloc(pool, m, Integer.valueOf(str1)));//第四次分配
        sizeAddr.add(Integer.valueOf(str1));
        
        //打印
        m = getFreeMemSizeNum(pool);    
        List<Integer> memSizeList = (List<Integer>) m.get("memSizeList");
        System.out.println(memSizeList.size());
        for(int i : memSizeList){
            System.out.println(i);
        }
    /*    List<Integer> memAddrList = (List<Integer>) m.get("memAddrList");
        for(int i : memAddrList){
            System.out.println(i);
        }*/
    }
    
    
    public static int[] memInit(int poolSize){
        return new int[poolSize];
    }
    
    public static int memAlloc(int[] pool,Map m,int memSize){
        List<Integer> memSizeList = (List<Integer>) m.get("memSizeList");
        List<Integer> memAddrList = (List<Integer>) m.get("memAddrList");
        int memAddr = 0;
        for(int i=0;i < memSizeList.size();i++){
            if(memSizeList.get(i).intValue() >= memSize) {
                memAddr = memAddrList.get(i).intValue();
                for(int j=memAddr;j < memAddr+memSize;j++){
                    pool[j] = 1;
                }
                break;
            }
        }
        return memAddr;
        
    }
    
    public static void memFree(int[] pool,int memSize,int memAddr){
        for(int j= memAddr;j < memAddr + memSize;j++){
            pool[j] = 0;
        }
    }
    
    public static Map getFreeMemSizeNum(int[] pool){
        int memCount = 0;
        int memSize = 1;
        int memAddr = -1;
        List<Integer> memSizeList = new ArrayList<Integer>();
        List<Integer> memAddrList = new ArrayList<Integer>();
        Map<String,List> m = new HashMap<String,List>();
        for(int i=1;i<pool.length;i++){
            if(pool[i-1] == 0 && pool[i] == 0){
                if(memAddr == -1) memAddr =i-1;    
                memSize++;
                if(i == pool.length-1) {
                    memSizeList.add(memSize);
                    memAddrList.add(memAddr);
                }
            }else if((pool[i-1] == 0 && pool[i] == 1)){
                memSizeList.add(memSize);
                memAddrList.add(memAddr);
                memSize = 1;
                memAddr = -1;
            }
            
        }
        m.put("memSizeList", memSizeList);
        m.put("memAddrList", memAddrList);
        return m;
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章