Estoy tratando de escribir una función que simula la LRU de reemplazo de páginas. Entiendo LRU bastante bien, pero estoy teniendo problemas de codificación de la misma. Las siguientes cosas son pasados en la LRU de la función. El usuario especifica el 20 de caracteres cadena de referencia de #’s 1-9 que se almacena en una matriz llamada refString de tamaño 20. El número de fotogramas que el usuario entra (1-7) se almacena en una variable numFrames. Por último, una matriz de tamaño 7 llamado marco es que se ha pasado.

Este es el código que tengo, y me estoy haciendo un cierre de número, pero no del todo. Tal vez alguien pueda ayudar!

private static void LRU(int numFrames, int[] refString, int[] frame)
{
int i, j = 0, k, m, flag = 0, count = 0, top = 0;
for (i = 0; i < 20; i++)
{
for (k = 0; k < numFrames; k++)
{
if (frame[k] == refString[i])
{
flag = 1;
break;
}
}
if (j != numFrames && flag != 1)
{
frame[top] = refString[i];
j++;
if (j != numFrames)
{
top++;
}
}
else
{
if (flag != 1)
{
for (k = 0; k < top; k++)
{
frame[k] = frame[k + 1];
}
frame[top] = refString[i];
}
if (flag == 1)
{
for (m = k; m < top; m++)
{
frame[m] = frame[m + 1];
}
frame[top] = refString[i];
}
}
if (flag == 0)
{
count++;
}
else
{
flag = 0;
}
}
Console.WriteLine("\nThe number of page faults with LRU is: " + count);
}
  • Lo imaginé y lo marcó como respondido!
  • Gracias y bienvenidos a Stackoverflow!
InformationsquelleAutor user3015999 | 2013-11-22

1 Comentario

  1. 2

    Hay algunos errores en su código : –

    if (top < numFrames)
    {
    frame[top++] = refString[i];
    fault++;
    }

    Aquí nunca se compruebe si el actual refString[i] ya está en el marco de [], porque en ese caso nose obtener la culpa y no debe agregar que en el marco.

    Aquí es un pseudo código que podría ayudar a aclarar sus dudas:-

    void LRU(int numframes,int refString[],int frames[]) {
    int top = 0,fault=0;
    int* count = new int[numframes];
    for(int i=0;i<refString.length;i++) {
    int k = findmax(refString[i],frames,count,top,numframes);
    if(k<0) {
    count[top] = 0;
    frames[top++] = refString[i];
    fault++;   
    }
    else if(frames[k]!=refString[i]) {
    count[k] = 0;
    frames[k] = refString[i];
    fault++;
    }
    else count[k] = 0;
    for(int j=0;j<top;j++) {
    count[j]++;  
    }
    }
    return(fault);
    }
    int findmax(int keyframe,int frames[],int count,int top,int numframes) {
    int max = 0;
    for(int i=0;i<top;i++) {
    if(frames[i]==keyframe) {
    return(i);
    }
    if(count[max]<count[i])
    max = i;
    }
    if(top<numframes)
    return(-1);
    return(max);
    }

    Edición:

    Explicación de seudo código:-

    1. check if current requested frame is in cache and if yes then get its index
    2. if frame is present then set its count to zero so as to indicate it is used very recently, higher the count the more least recently frame is used.
    3. if frame is not present in cache then
    a. check if cache is full if not add new frame to end of cache and increment the fault and top of cache
    b. else if chace is full then get frame with maximum count(LRU frame) and replace it with new frame and reset count to zero and increment fault.
    4. increment all the counts
    5. do 1 to 4 till end of all requests
    6. output the no of faults 
    • Gracias por su respuesta! Usted menciona un par de errores, pero sólo aparece uno. ¿Qué otra cosa que me estoy perdiendo? También donde debo añadir en la función de la comprobación de si el actual refString[i] ya está en el marco de[]? Yo soy una especie de comprensión de la pseudo código que has publicado pero es un poco diferente del algoritmo estoy usando y estoy teniendo problemas para entender cómo solucionarlo.
    • Por favor dar alguna explicación de lo algoritmo que se está utilizando.Es difícil decir desde el código.
    • Creo que usted no mantener un recuento para comprobar que el marco es menos usado recientemente
    • Gracias por la explicación de la pseudo código. Creo que puedo entender el algoritmo. Voy a ver si me puede solucionar mi algoritmo mediante la adición de un recuento. Si no, debería ser capaz de utilizar el pseudo-código para el modelo de un algoritmo similar

Dejar respuesta

Please enter your comment!
Please enter your name here