Operación de programación del sistema operativo Conversión de 5 direcciones del sistema de paginación analógico (método de fórmula y método de deletreo duro) (implementación de C ++)

Titulo

En un sistema de paginación, el espacio del programa y el espacio físico son ambos de 2GB, y el tamaño de la página es de 4KB .
Se sabe que la tabla de páginas de un proceso es la siguiente, escriba un programa para simular el proceso de conversión de direcciones del sistema de paginación.
Los requisitos se dividen en dos métodos : el método de fórmula y el método de hechizo duro , y comparan y experimentan la diferencia entre los dos métodos.

Requisitos:
(1) El usuario ingresa la dirección lógica y el programa emite la dirección física correspondiente
(2) El usuario ingresa la dirección lógica puede ser decimal o hexadecimal
(3) La dirección física de salida puede ser decimal o hexadecimal
(4) Compare los resultados de cálculo de los dos métodos para ver si son consistentes.

Código

//
// Created by Jintao on 2019/12/14.
//

// 题目:
// 某分页系统中,程序空间与物理空间都是2GB,页面大小为4KB。
// 已知某进程的页表如下,请编写程序模拟分页系统的地址变换过程。
// 要求分为公式法和硬拼法两种方式实现,并对比体会两种方法的差别。
// [图片]
//
// 要求:
//(1)用户输入逻辑地址,程序输出对应物理地址
//(2)用户输入的逻辑地址可以是十进制也可以是十六进制
//(3)输出的物理地址可以是十进制也可以是十六进制
//(4)两种方法的计算结果进行对比,看看是否一致。


#include<cstdio>
#include<cstring>

int blocks[10] = {
        32102, 443217, 6723, 8985, 11238,
        29065, 234205, 45812, 240561, 300451
};

const int pageSize = 4096;  // 页面大小: B
const int pageNumLen = 20;  // 页号
const int pageOffsetLen = 12;  // 页内偏移量
const int physLength = pageNumLen + pageOffsetLen;

/// 公式法
int formulaMethod(int logicAddr);

/// 硬拼法
char *jointMethod(char *physAddrBin, int logicAddr);

// 进制转换,其中length 是指 字符串的长度,包含\0位
int __binToDec(const char *bin, int length);

char *__decToBin(char *destBin, int length, int dec);


int main() {
    int logicAddr;

    char physAddr[physLength + 1];
    printf("logicAddr:\n");
    scanf("%i", &logicAddr);

    // get PhysAddr; 物理地址
    printf("formulaMethod: %d\n", formulaMethod(logicAddr));
    jointMethod(physAddr, logicAddr);
    printf("jointMethod: 0b%s - %d\n", physAddr, \
            __binToDec(physAddr, physLength + 1));
}

// ------------------------------------------------------- 函数定义


int __powi(int x, int n) {
    int result = 1;
    for (int i = 0; i < n; i++) {
        result *= x;
    }
    return result;
}

int __binToDec(const char *bin, int length) {
    int dec = 0;
    // 1010 = 1*8+1*2;  1*2**3
    for (int i = 0; i < length - 1; i++) {
        dec += (bin[i] - '0') * __powi(2, length - 2 - i);
    }
    return dec;

}

char *__decToBin(char *destBin, int length, int dec) {
    // 10 -> 1010;  10 /2%2 (5-0, 2-1, 1-0, 0-1);   1010
    for (int i = length - 2; i > -1; i--) {
        if (dec == 0) {
            destBin[i] = '0';
            continue;
        }
        destBin[i] = static_cast<char>(dec % 2 + '0');
        dec /= 2;
    }
    destBin[length - 1] = '\0';
    return destBin;
}

int formulaMethod(int logicAddr) {
    int pageNum = logicAddr / pageSize;  // 页号
    int offset = logicAddr % pageSize;  // 偏移
    int blockNum = blocks[pageNum];  // 块号

    // 物理地址 = 块号 * 块大小 + 偏移
    return blockNum * pageSize + offset;
}


char *jointMethod(char *physAddrBin, int logicAddr) {
    int pageNum = logicAddr / pageSize;  // 页号
    int offset = logicAddr % pageSize;  // 偏移
    int blockNum = blocks[pageNum];  // 块号

    // 物理地址 = concat(bin(blockNum), bin(offset))
    char BlockNumBin[pageNumLen + 1];
    char offsetBin[pageOffsetLen + 1];
    __decToBin(BlockNumBin, pageNumLen + 1, blockNum);
    __decToBin(offsetBin, pageOffsetLen + 1, offset);
    memcpy(physAddrBin, BlockNumBin, pageNumLen);
    strcat(physAddrBin, offsetBin);
    return physAddrBin;
}


Resultado de la operación

Resultado de la operación

La misma serie

2. Programación de 2 procesos del trabajo de programación del sistema operativo (implementado por C ++)
https://blog.csdn.net/qq_40939814/article/details/103548436

3. Sincronización de 3 procesos del trabajo de programación del sistema operativo (mecanismo de semáforo) (implementación de pseudocódigo de C ++)
https://blog.csdn.net/qq_40939814/article/details/103548527

5. Operación de programación del sistema operativo Conversión de 5 direcciones del sistema de paginación analógico (método de fórmula y método de deletreo duro) (implementación de C ++)
https://blog.csdn.net/qq_40939814/article/details/103548645

9 artículos originales publicados · Me gusta2 · Visitas 559

Supongo que te gusta

Origin blog.csdn.net/qq_40939814/article/details/103548645
Recomendado
Clasificación