2012-03-23 6 views
0

私はダイレクトマップライトバックキャッシュシミュレータを作成しました。JavaでSystem.arraycopyを使用する

私のものをテストすると、0x14cに値 "99"を書き込むように書きましたが、元々は値 "4C"でした。 次に値0x348を読み込みます。同じスロット番号、ちょうど異なるタグ。

基本的には、「cache」オブジェクトからmain_memオブジェクトへのスロットのすべてのデータを書き込む必要があります。私はSystem.arrayコピーを使用します。

私は、値99が正常にメインメモリアレイに書き戻されていることがわかります。

しかし、アドレス14Cをもう一度読みたいときは、最初にそこにあったものを印刷します。変更を反映しません。

System.arraycopyのは、特定のインデックスで始まる配列からデータを取得しませんか?それはちょうど最初のインデックスの価値から数えていますか?ここで

は(私の読み取りである)と、()メソッドおよび出力

 public static void readAddress() { 
      System.out.println("What address? "); 

      address = keyboard.nextInt(16); 
      startAddress = address & 0x758; 
      tag = (address >> 6) & 0x1F; 
      slot = (address >> 3) & 0x7; 

      //Valid bit is 0, empty slot 
      if (cache[slot].getValidBit() == 0) {    

       cache[slot].setValidBit(1); 
       cache[slot].setTag(tag); 
       cache[slot].setStartAddress(startAddress); 

       System.arraycopy(main_Mem, main_Mem[startAddress], cache[slot].dataBlock, 0, cacheSize); 

       System.out.println("Cache Miss"); 
       System.out.print("The value at that address is: "); 
       System.out.printf("%X", 0xFF & address); 
       System.out.println(); 
       System.out.println(); 
      } 
      //Valid bit 1 but tags don't match 
      else if (cache[slot].getValidBit() == 1 && cache[slot].getTag() != tag) { 
       System.out.println("Cache Miss "); 

       if (cache[slot].getDirty() == 1) { 
        System.out.println("This is a dirty slot!"); 
        //copy contents of slot back into main memory before loading new block 
        System.out.println("Slot is dirty and will be written back, val for 14c is " +cache[slot].dataBlock[4]); 
        System.arraycopy(main_Mem, cache[slot].getStartAddress(), cache[slot].dataBlock, 0, cacheSize); 
        System.out.println("Everything should have been copied to main by now. The value for 332 is " + main_Mem[332]); 
       } 

       startAddress = address & 0x7F8; 
       cache[slot].setTag(tag); 
       cache[slot].setStartAddress(startAddress); 
       //set dirty back to 0, incase it was 1 
       cache[slot].setDirty(0); 

       for (int i = 0; i < cacheSize; i++) { 
        for (int j = cache[slot].getStartAddress(); j<cacheSize; j ++) { 
         cache[slot].dataBlock[i] = main_Mem[j]; 
        } 
       } 
       //System.arraycopy(main_Mem, main_Mem[startAddress], cache[slot].dataBlock, 0, cacheSize); 
       System.out.print("The value at that address is: "); 
       System.out.printf("%X", 0xFF & address); 
       System.out.println(); 
       System.out.println(); 
      } 
      //Valid bit 1 and tags match, hit 
      else if (cache[slot].getValidBit() == 1 && tag == cache[slot].getTag()) { 
       System.out.println("Cache Hit"); 
       System.out.print("The value at that address is: "); 
       System.out.printf("%X", 0xFF & address); 
       System.out.println(); 
       System.out.println(); 
      } 

      menu(); 
    } 

    public static void writeAddress() { 

     System.out.println("What address do you want to write to? "); 
     address = keyboard.nextInt(16); 
     System.out.println("And what value do you want to write to it? "); 
     int input = keyboard.nextInt(16); 

     startAddress = address & 0x758; 
     tag = (address >> 6) & 0x1F; 
     slot = (address >> 3) & 0x7; 
     //Valid bit 1, tag matches, hit, just modify value 
     if (cache[slot].getValidBit() != 0 && cache[slot].getTag() == tag) { 
      System.out.println("Cache Hit"); 
      System.out.printf("%X", 0xFF & address); 

      for (int i = 0; i <8; i++) { 
       if (cache[slot].dataBlock[i] == (0xFF & address)) { 
        cache[slot].dataBlock[i] = input; 
        cache[slot].setDirty(1); 
       } 
      } 
     } 
     //Valid bit 1, tags don't match-Check dirty bit and write back first if valid 
     else if (cache[slot].getValidBit() == 1 && cache[slot].getTag() != tag) { 

      if (cache[slot].getDirty() ==1) { 
       //copy contents of slot back into main memory before loading new block 
       for (int i = 0; i < cacheSize; i++) { 
        for (int j = startAddress; j<cacheSize; j++) { 
         cache[slot].dataBlock[i] = main_Mem[j]; 
        } 
       } 
       //System.arraycopy(cache[slot].dataBlock, 0, main_Mem, cache[slot].getStartAddress(), cacheSize); 
      } 

      System.out.println("Cache Miss"); 
      cache[slot].setValidBit(1); 
      cache[slot].setTag(tag); 
      cache[slot].setDirty(1); 
      cache[slot].setStartAddress(startAddress); 
      //copy new block into cache now 
      System.arraycopy(main_Mem, main_Mem[startAddress], cache[slot].dataBlock, 0, cacheSize); 

      for (int i = 0; i <8; i++) { 
       if (cache[slot].dataBlock[i] == (0xFF & address)) { 
        System.out.println("Writing over the value of that address now..."); 
        cache[slot].dataBlock[i] = input; 
       } 
      } 

     } 
     //Empty slot, no need to write back 
     else if (cache[slot].getValidBit() == 0) { 
      System.out.println("Cache Miss"); 
      System.out.println("Setting the dirty bit to 1"); 
      System.out.println("Dirty bit was " + cache[slot].getDirty()); 

      cache[slot].setValidBit(1); 
      cache[slot].setTag(tag); 
      cache[slot].setDirty(1); 
      System.out.println("And is now " +cache[slot].getDirty()); 
      cache[slot].setStartAddress(startAddress); 
      //copy from main mem to cache 
      System.arraycopy(main_Mem, main_Mem[startAddress], cache[slot].dataBlock, 0, cacheSize); 

      //writes to selected value in the cache 
      for (int i = 0; i <8; i++) { 
       if (cache[slot].dataBlock[i] == (0xFF & address)) { 
        System.out.println("Writing over the value of that address now..."); 
        cache[slot].dataBlock[i] = input; 
       } 
      } 
     } 
     menu(); 
    } 

出力書き込み:開始アドレスがmain_Mem内のアドレスであれば、私はあなたがしたいと思います

This is a cache simulator, type in what you want to do and press enter 

[r] to read [w] to write [d] to display 
w 
What address do you want to write to? 
14c 
And what value do you want to write to it? 
99 
Cache Miss 
Setting the dirty bit to 1 
Dirty bit was 0 
And is now 1 
Writing over the value of that address now... 
This is a cache simulator, type in what you want to do and press enter 

[r] to read [w] to write [d] to display 
r 
What address? 
348 
Cache Miss 
This is a dirty slot! 
Slot is dirty and will be written back, val for 14c is 153 
Everything should have been copied to main by now. The value for 332 is 76 
The value at that address is: 48 

This is a cache simulator, type in what you want to do and press enter 

[r] to read [w] to write [d] to display 
+1

あなたの質問は非常にはっきりしているわけではありませんが、問題を示す短くて完全なプログラムであれば、非常に簡単に答えることができます... –

+2

''これは汚れたスロットです!母音が聞こえないから! – mre

+0

申し訳ありません。あるアレイから別のアレイにデータをコピーしています。そのデータを元のアレイにリロードしようとすると、間違っています。 – jackie

答えて

1

を:

System.arraycopy(main_Mem, startAddress, ...) 

なし

System.arraycopy(main_Mem, main_Mem[startAddress], ...) 

実行の1つからの完全な出力は、何が間違っているのか、そしてなぜそれがより明確になるかを確かめるでしょう。

+0

私の質問を更新して、私の読み書きメソッドを完全に含めるようにしました。問題は、「332の値は76です」と表示されています。それは153(0x99)でなければなりません。私のコピーをメインメモリに保存する必要はありません。 – jackie

+0

問題は、2回目の14cアドレス(インデックス)の読み取りです。それはもはや99を運びません。出力は4cです(プログラムが初期化されたときのように) – jackie

+0

@JackieAldama:あなたはこの答えを読んだことさえありましたか? – ruakh

関連する問題