nick1992
15-05-2013, 10:31
Ciao a tutti!!:) sono nuovo nel forum....io dovrei fare un software java che simula il raid 4..io ho gia fatto quello per il raid 3 che è questo riportato sotto..il fatto che raid 3 e 4 sono uguali solo che il 3 lavora a il livello di byte e il 4 con blocchi di dati..il fatto è che quando li devi simulare alla fine sono identici o no?
dovrei fare anche il raid 2 ma non so proprio da dove iniziare.. mi potreste dare qualche spunto?
Grazie.
import java.io.IOException;
import java.io.RandomAccessFile;
class Raid3 implements Raid {
String inFileName;
String outFileName;
RandomAccessFile in;
RandomAccessFile out[];
int checkdisk;//Numero disco usato per la parità
int n;
int length;
int capacita_disco;
public int[] capacita_rimanente;
int[] scarto;
byte[] buffer;
int leggibile;
RandomAccessFile rec;
public boolean leggibile()
{
return(leggibile!=-1);
}
public boolean memorizzabile()
{
boolean a=true;
for(int i=0;i<n;i++)
{
if(capacita_rimanente[i]-scarto[i]<length)
{
a=false;
}
if(a==false)System.out.println ("Disco " +i+ " Lo spazio non è sufficente,Non è più possibile scrivere..");
}
return a;
}
public int Cap_disco()
{
return capacita_disco;
}
public void cap_Rimanente(int[]a)
{
for(int i=0;i<n;i++)
{
a[i]=capacita_rimanente[i];
}
}
public int Cap_disponibile()
{
int a=0;
for(int i=0;i<n;i++)
{
a+=capacita_rimanente[i]-scarto[i];
}
return a*(n-1)/n;
}
public void ReadBlock() throws IOException
{
leggibile=in.read(buffer,0,(n-1)*length);
for(int i=0;i<((n-1)*length);i++){
System.out.println("Buffer "+i+" "+(char)buffer[i]);}
if(leggibile==-1){System.out.println("Fine del file...");}
}
public void StoreBlock()throws IOException{
int begin=0;
Cal ca=new Cal();
byte[] xor_check = new byte[length];
ca.Init(xor_check, length);
for (int i=0;i<n;i++)
{
if (i == checkdisk) {
out[i].write(xor_check);
capacita_rimanente[i] -= length;
System.out.println("Disco " + i + " scrivere il controllo..");
ca.Init(xor_check, length);// A tutti zeri
break;
}
out[i].write(buffer,begin,length);
System.out.println("Disco "+i+" Scrive dati...");
capacita_rimanente[i] -= length;
System.out.println("Disco "+i+" Capacità Residua "+capacita_rimanente[i]);
begin += length;
xor_check = ca.Xor(buffer,length,n-1);
}
}
public void Recover(int downID) throws IOException
{
int key=0;
Cal cacu=new Cal();
RandomAccessFile[] bac=new RandomAccessFile[n];
byte[] temp=new byte[1];
byte[] result =new byte[1];
cacu.Init(result, 1);
for(int i=0;i<n;i++)
{
if(i!=downID)//downID numero disco da recuperare
bac[i]= new RandomAccessFile("" +i+ "_"+outFileName,"r");
}
rec = new RandomAccessFile("" +downID+ "_"+"RECOVER_"+outFileName,"rw");
while(key!=-1)
{
for(int i=0;i<n;i++)
{
if(i!=downID)
{
key= bac[i].read(temp);
if(key!=-1)
result=cacu.Xor(result, temp, 1);
}
}
if(key!=-1)
{
rec.write(result);/*Scrive i byte recuperati
a mano a mano sul file rec*/
cacu.Init(result, 1);/*Rinizializza gli elementi dell'array result con 0*/
}
}
}
public Raid3(String inf,String outf,int n,int l,int[]cap) throws IOException
{
Cal c=new Cal();
int min=c.Min(cap, n);
buffer=new byte[(n-1)*l];
inFileName=inf;
outFileName=outf;
checkdisk=n-1;
this.n=n;
capacita_rimanente=new int[n];
for(int i=0;i<n;i++)
{
capacita_rimanente[i]=cap[i];
System.out.println("Disco n "+i+" Capacità residua effettiva "+capacita_rimanente[i]);
}
length=l;
in= new RandomAccessFile(inf,"r");
out = new RandomAccessFile[n];
for(int i=0;i<n;i++)
out[i] = new RandomAccessFile ("" + i + "_" +outFileName,"rw");
capacita_disco=min/length*length*(n-1);
scarto=new int[n];
for(int i=0;i<n;i++)
{
scarto[i]=cap[i]-min/length*length;
}
}
}
dovrei fare anche il raid 2 ma non so proprio da dove iniziare.. mi potreste dare qualche spunto?
Grazie.
import java.io.IOException;
import java.io.RandomAccessFile;
class Raid3 implements Raid {
String inFileName;
String outFileName;
RandomAccessFile in;
RandomAccessFile out[];
int checkdisk;//Numero disco usato per la parità
int n;
int length;
int capacita_disco;
public int[] capacita_rimanente;
int[] scarto;
byte[] buffer;
int leggibile;
RandomAccessFile rec;
public boolean leggibile()
{
return(leggibile!=-1);
}
public boolean memorizzabile()
{
boolean a=true;
for(int i=0;i<n;i++)
{
if(capacita_rimanente[i]-scarto[i]<length)
{
a=false;
}
if(a==false)System.out.println ("Disco " +i+ " Lo spazio non è sufficente,Non è più possibile scrivere..");
}
return a;
}
public int Cap_disco()
{
return capacita_disco;
}
public void cap_Rimanente(int[]a)
{
for(int i=0;i<n;i++)
{
a[i]=capacita_rimanente[i];
}
}
public int Cap_disponibile()
{
int a=0;
for(int i=0;i<n;i++)
{
a+=capacita_rimanente[i]-scarto[i];
}
return a*(n-1)/n;
}
public void ReadBlock() throws IOException
{
leggibile=in.read(buffer,0,(n-1)*length);
for(int i=0;i<((n-1)*length);i++){
System.out.println("Buffer "+i+" "+(char)buffer[i]);}
if(leggibile==-1){System.out.println("Fine del file...");}
}
public void StoreBlock()throws IOException{
int begin=0;
Cal ca=new Cal();
byte[] xor_check = new byte[length];
ca.Init(xor_check, length);
for (int i=0;i<n;i++)
{
if (i == checkdisk) {
out[i].write(xor_check);
capacita_rimanente[i] -= length;
System.out.println("Disco " + i + " scrivere il controllo..");
ca.Init(xor_check, length);// A tutti zeri
break;
}
out[i].write(buffer,begin,length);
System.out.println("Disco "+i+" Scrive dati...");
capacita_rimanente[i] -= length;
System.out.println("Disco "+i+" Capacità Residua "+capacita_rimanente[i]);
begin += length;
xor_check = ca.Xor(buffer,length,n-1);
}
}
public void Recover(int downID) throws IOException
{
int key=0;
Cal cacu=new Cal();
RandomAccessFile[] bac=new RandomAccessFile[n];
byte[] temp=new byte[1];
byte[] result =new byte[1];
cacu.Init(result, 1);
for(int i=0;i<n;i++)
{
if(i!=downID)//downID numero disco da recuperare
bac[i]= new RandomAccessFile("" +i+ "_"+outFileName,"r");
}
rec = new RandomAccessFile("" +downID+ "_"+"RECOVER_"+outFileName,"rw");
while(key!=-1)
{
for(int i=0;i<n;i++)
{
if(i!=downID)
{
key= bac[i].read(temp);
if(key!=-1)
result=cacu.Xor(result, temp, 1);
}
}
if(key!=-1)
{
rec.write(result);/*Scrive i byte recuperati
a mano a mano sul file rec*/
cacu.Init(result, 1);/*Rinizializza gli elementi dell'array result con 0*/
}
}
}
public Raid3(String inf,String outf,int n,int l,int[]cap) throws IOException
{
Cal c=new Cal();
int min=c.Min(cap, n);
buffer=new byte[(n-1)*l];
inFileName=inf;
outFileName=outf;
checkdisk=n-1;
this.n=n;
capacita_rimanente=new int[n];
for(int i=0;i<n;i++)
{
capacita_rimanente[i]=cap[i];
System.out.println("Disco n "+i+" Capacità residua effettiva "+capacita_rimanente[i]);
}
length=l;
in= new RandomAccessFile(inf,"r");
out = new RandomAccessFile[n];
for(int i=0;i<n;i++)
out[i] = new RandomAccessFile ("" + i + "_" +outFileName,"rw");
capacita_disco=min/length*length*(n-1);
scarto=new int[n];
for(int i=0;i<n;i++)
{
scarto[i]=cap[i]-min/length*length;
}
}
}