Opération de programmation du système d'exploitation Conversion à 5 adresses du système de pagination analogique (méthode de formule et méthode d'orthographe dure) (implémentation C ++)

Le titre

Dans un système de pagination, l'espace du programme et l'espace physique sont tous les deux de 2 Go et la taille de la page est de 4 Ko .
Il est connu que le tableau des pages d'un processus est le suivant, veuillez écrire un programme pour simuler le processus de conversion d'adresse du système de pagination.
Les exigences sont divisées en deux méthodes : la méthode de la formule et la méthode de la correction orthographique , et comparent et éprouvent la différence entre les deux méthodes.

Exigences:
(1) L'utilisateur entre l'adresse logique et le programme sort l'adresse physique correspondante
(2) L'utilisateur entre l'adresse logique peut être décimale ou hexadécimale
(3) L'adresse physique de sortie peut être décimale ou hexadécimale
(4) Comparez les résultats des calculs des deux méthodes pour voir s'ils sont cohérents.

Code

//
// 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;
}


Résultat de l'opération

Résultat de l'opération

Même série

2. Ordonnancement à 2 processus du travail de programmation du système d'exploitation (implémenté par C ++)
https://blog.csdn.net/qq_40939814/article/details/103548436

3. Synchronisation à 3 processus du travail de programmation du système d'exploitation (mécanisme de sémaphore) (implémentation du pseudocode C ++)
https://blog.csdn.net/qq_40939814/article/details/103548527

5. Opération de programmation du système d'exploitation Conversion à 5 adresses du système de pagination analogique (méthode de formule et méthode d'orthographe dure) (implémentation C ++)
https://blog.csdn.net/qq_40939814/article/details/103548645

Publié 9 articles originaux · Likes2 · Visites 559

Je suppose que tu aimes

Origine blog.csdn.net/qq_40939814/article/details/103548645
conseillé
Classement