编程求出Cache映射方式下各类地址位数(简洁版)

这篇具有很好参考价值的文章主要介绍了编程求出Cache映射方式下各类地址位数(简洁版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

计算机组成原理老师给小明出了一道Cache映射方式相关的计算题目:
某系统的存储器为4MB,每字块为32个字,每字8位,若Cache为2MB,采用字节编址方式。问:

(1)存储器块内地址共有_____位
(2)Cache行号地址共有_____位
(3)采用全相联映射,块表中的主存标记位共有_____位
(4)采用直接映射,块表中的主存标记位共有_____位
(5)采用16路组相联映射,块表中的主存标记位共有_____位

小明想借助计算机帮忙自己算出答案,今后无论老师出何种组合,他都能一键运行答案,于是他开始了求Cache映射方式下各类地址位数的代码编写。现在他已经写出了y= l o g 2 x log_2 x log2x 的函数,编程时可以直接使用。

int log2(int x)
{
    float fx;
    unsigned long ix, exp;
    fx = (float)x;
    ix = *(unsigned long*)&fx;
    exp = (ix >> 23) & 0xFF;
    return exp - 127;
}

输入格式:
直接输入5个十进制正整数,中间用空格隔开,且保证这5个数的值都等于2的幂次,并符合存储器的一般约束性,如存储器容量会大于Cache容量。
这5个正整数分别代表
(1)存储器容量有多少MB(如题目中数字4);
(2)每字块多少个字(如题目中数字32);
(3)每字多少位(如题目中数字8);
(4)cache容量有多少MB(如题目中数字2);
(5)采用几路组相联(如题目中数字16)

输出格式:
见输出样例(注意输出的符号都是半角)。

输入样例:
在这里给出一组输入。例如:

4 32 8 2 16
4096 512 32 16 32

输出样例:
在这里给出相应的输出。例如:

1.存储器块内地址共有5位
2.Cache行号地址共有16位
3.采用全相联映射|块表中的主存标记位共有17位
4.采用直接映射|块表中的主存标记位共有1位
5.采用16路组相联映射|块表中的主存标记位共有5位
1.存储器块内地址共有11位
2.Cache行号地址共有13位
3.采用全相联映射|块表中的主存标记位共有21位
4.采用直接映射|块表中的主存标记位共有8位
5.采用32路组相联映射|块表中的主存标记位共有13位
代码长度限制 16 KB
时间限制 400 ms
内存限制 64 MB

参考代码一:

#include <stdio.h>

int log2(int x);

int main(void)
{
    int memorySize, blockwordSize, wordSize, cacheSize, wayNum;
    scanf("%d %d %d %d %d", &memorySize, &blockwordSize, &wordSize, &cacheSize, &wayNum);
    
    int blockSize = blockwordSize * wordSize >> 3;
    int memoryNum = log2(memorySize) + 20;
    
    int blockAddress = log2(blockSize);
    printf("1.存储器块内地址共有%d位\n", blockAddress);
    
    int cacheAddress = log2(cacheSize * (1 << 20) / blockSize);
    printf("2.Cache行号地址共有%d位\n", cacheAddress);
    
    int FAMicon = memoryNum - blockAddress;
    printf("3.采用全相联映射|块表中的主存标记位共有%d位\n", FAMicon);
    
    int DMicon = memoryNum - blockAddress - cacheAddress;
    printf("4.采用直接映射|块表中的主存标记位共有%d位\n", DMicon);
    
    int GAMicon = memoryNum - log2((1 << cacheAddress) / wayNum) - blockAddress;
    printf("5.采用%d路组相联映射|块表中的主存标记位共有%d位", wayNum, GAMicon);
}

int log2(int x)
{
    float fx;
    unsigned long ix, exp;
    fx = (float) x;
    ix = *(unsigned long *) & fx;
    exp = (ix >> 23) & 0xFF;
    return exp - 127;
}

参考代码二:文章来源地址https://www.toymoban.com/news/detail-492306.html

#include<stdio.h>
int log2(int x)
{
    float fx;
    unsigned long ix, exp;
    fx = (float)x;
    ix = *(unsigned long*)&fx;
    exp = (ix >> 23) & 0xFF;
    return exp - 127;
}
int main()
{
    int a,b,c,d,e;
    scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);
    int num1=log2(b*c)-3;
    int num2=log2(d)+20-num1;
    int num3=log2(a)+20-num1;
    int num4=log2(a)+20-num1-num2;
    int num5=(log2(d)+3+20)-log2(e*b*c);
    num5=num3-num5;
    printf("1.存储器块内地址共有%d位\n",num1);
    printf("2.Cache行号地址共有%d位\n",num2);
    printf("3.采用全相联映射|块表中的主存标记位共有%d位\n",num3);
    printf("4.采用直接映射|块表中的主存标记位共有%d位\n",num4);
    printf("5.采用%d路组相联映射|块表中的主存标记位共有%d位\n",e,num5);
    return 0;
}

到了这里,关于编程求出Cache映射方式下各类地址位数(简洁版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 有一个3行4列的矩阵,编程求出其中最大

    任务描述 相关知识 二维数组的定义 二维数组的引用 二维数组的初始化 编程要求 测试说明 任务描述 本关任务:有一个3行4列的矩阵,编程求出其中最大的那个元素的值,以及它所在的行号与列号。 相关知识 二维数组的定义 在实际问题中有很多变量是二维的或多维的,因此

    2024年02月07日
    浏览(54)
  • 有一个4x5矩阵,编程求出其最大值及其所处的位置

    代码示例: 运行结果:由于随机生成矩阵,结果随机 代码分析: 随机生成4*5矩阵并输出 使用Matlab的max函数来找到矩阵的最大值,并使用`find`函数来找到最大值所在的位置。

    2024年02月04日
    浏览(40)
  • 【嵌入式软件C编程】主函数free子函数malloc地址的两种方式以及注意事项

    本文档主要记录嵌入式C语言在子函数中应用malloc函数的方式,在实际项目中内存管理特别重要 一般在主函数中(main)使用malloc函数,然后在通过free函数进行释放内存,但有时候如果必须在子函数长调用malloc函数该怎样进行内存释放呢? 📋 个人简介 💖 作者简介:大家好,

    2024年02月09日
    浏览(47)
  • UE 各类疑难杂症/快捷键/细节/优化方式

    链接: link 链接: [link](https://blog.csdn.net/aoxuestudy/article/details/124902503?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522166358838316800184178729%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257Drequest_id=166358838316800184178729biz_id=0utm_medium=distribute.pc_search_result.none-task-blog-2 all sobaiduend~default-1-124

    2024年02月04日
    浏览(68)
  • UE4逆向篇-2_各类数据的查找方式

    1.通过前面的文章,相信各位已经能够自己找到GNames并使用DUMP工具导出GNames了。 2.本篇文章将介绍各种所需数据的查找方法。 1.CheatEngine,本篇以及后续篇幅的重要工具。 2.一个记事本,保证你能记录下关键信息。 1.首先,打开CE并附加游戏。 2.点击浏览内存/查看内存,或随

    2024年02月05日
    浏览(64)
  • 有一个m行n列的矩阵,编程求出其中值最大的那个元素,以及其所在的行号和列号。

    【题目描述】 有一个m行n列的矩阵,编程求出其中值最大的那个元素,以及其所在的行号和列号。(如果最大数有多个,则显示第一个出现的数据的信息)。 【输入】 有多行。第1行是两个整数,m(m≤10)和n(n≤10),分别表示矩阵有m行n列。接下来是m行整数,每行n个整数

    2024年02月12日
    浏览(61)
  • Ioctl()方式实现与驱动交互简洁框架

    ioctl是linux中一种除read和write之外的数据传递机制 驱动层IOCTL: 以上函数参数的含义如下 。 inode和fp用来确定被操作的设备。 request就是用户程序下发的命令。 args就是用户程序在必要时传递的参数。 在2.6.36以后ioctl函数已经不存在了,用unlocked_ioctl和compat_ioctl两个函数代替。

    2024年02月09日
    浏览(56)
  • GO编程语言:简洁、高效、强大的开源编程语言

    在现代软件开发领域,随着应用复杂度的不断提升,开发人员对编程语言的需求也日益增长。GO编程语言,作为一种简洁、高效且具备强大并发能力的新型开源编程语言,逐渐成为了许多开发者的首选。本文将详细介绍GO语言在哪些项目开发中表现出色,以及为什么许多开发者

    2024年02月02日
    浏览(107)
  • 各种硬件对应”位数“,各种字长,编址方式的区分。

    ①存储元 :能够完成一个二进制读写的叫做存储元。 ②存储单元 :每行/列(具体这行/列有多少个存储元要看编制方式)存储元叫做一个存储单元,也叫存储字/存储字长。 ③存储体/存储矩阵 :所有的存储单元组成的叫做存储体或存储矩阵。 ④存储器 :由存储体、地址译码器

    2024年02月14日
    浏览(33)
  • 【51单片机】:定时器的详解(包括对单片机定时解释、各类定时方式,以及中断方式)

              51定时/计数器的详解。                   码字不易,如有帮助请收藏,点赞哦。         前提:首先我们知道51单片机内部有21~26个特殊功能寄存器: P.x口寄存器:P0、P1、P2、P3 数据指针寄存器:DP0H、DP0L、DP1H、DP1L 定时器: TH1、TL1、TH0、TL0、TMOD、TCON 串口:

    2024年02月07日
    浏览(98)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包