zoukankan      html  css  js  c++  java
  • 《深入理解计算机系统》家庭作业

    第二章、第七章

    选题:2.63、2.75、3.54、3.58、3.59、7.11

    合作伙伴:
    20135317韩玉琪:第二章、第七章习题
    20135337朱荟潼:第三章习题

    合作方式:分别研究题目,互相讲解,分工发博客。

    家庭作业2.63

    题目:

    解答思路及代码:

    运行:

    家庭作业2.75

    题目:

    解答思路:

    - 根据补码乘法公式与无符号乘法模2^w比较:
    

    - 补码乘法和无符号乘法的低w位相同
    - 获得无符号乘法高位
    
    		(x'*y')高位 = (x*y)高位 + x(w-1)*y + y(w-1)*x
    

    代码(借助补码乘法高位表示函数实现):

    	unsigned unsigned_high_prod(unsigned x,unsigned y)
    	{
    		int w = sizeof(int)<<3;
    		return signed_high_prod(x,y) + (x>>(w-1))*y + x*(y>>(w-1));
    	}
    

    家庭作业7.11

    题目

    解答:

    - 3、4行是数据段,开始于存储器地址0x08049448的位置,总的存储器大小是0x194字节,从文件偏移的0x448处开始的0xe8个字节初始化。
    - 在加载之前,未初始化的全局变量不会在目标文件中分配存储空间,但是在加载之后,像.bss中的符号等数据需要占用空间,所以剩下的字节对应运行时将被初始化为0的.bss数据。
    

    第六章

    选题:6.27、6.28、6.29
    6.27(20135317(1))
    6.28(20135317(1))
    6.29(20135317(2))

    家庭作业6.27

    题目:

    解题使用公式

    - C = B * E * S
    - S = 2 ^ s
    - B = 2 ^ b
    - m = s + t + b
    

    解答:

    家庭作业6.28 && 家庭作业6.29

    题目:

    解答思路:

    注意题6.13中的三个假设:
    - 存储器是字节寻址的
    - 存储器访问的是1字节的字(不是4字节的)
    - 地址的宽度为13位
    - 高速缓存是两路相连的(E=2),块大小为4字节(B=4),有8个组(s=8)
    

    解答:

    所有八个组的命中地址:
    组0	行1:0x0120、0x0121、0x0122、0x0123		行2:---
    组1	行1:0x08A4、0x08A5、0x08A6、0x08A7		行2:0x0704、0x0705、0x0706、0x0707
    组2	行1:--- 							行2:---
    组3	行1:---								行2:0x064C、0x064D、0x064e、0x064F
    组4	行1:0x18F0、0x18F1、0x18F2、0x18F3		行2:0x00B0、0x00b1、0x00b2、0x00B3
    组5	行1:0x0E34、0x0E35、0x0E36、0x0E37		行2:---
    组6	行1:0x1238、0x1239、0x123A、0x123B		行2:---
    组7	行1:---								行2:0x1BDC、0x1BDD、0x1BDE、0x1BDF
    

    第十章

    选题:10.6、10.7、10.10
    10.6(20135317(1))
    10.7(20135317(1))
    10.10(20135317(2))

    家庭作业10.6

    题目:

    解答:

    分析:

    • 每一步输出。

      • 1.打开文件一;2.打开文件二;3.关闭文件二;4.打开文件二

    • Unix外壳创建每个进程开始时都有三个打开的文件:

        - 0:标准输入
        - 1:标准输出
        - 2:标准错误
      
    • 打开fd1时描述符为3,打开fd2时描述符为4,关闭fd2之后再打开还是4。

    家庭作业10.7

    题目:


    解答思路:

    • 从10-4的cpfile.c中我们可以看到,它使用的是一个包装函数rio_readlineb从一个内部读缓冲区拷贝一个文本行。当缓冲区变空时,会自动的调用read重新填满缓冲区。因为它的最后一个参数是行的最大长度Maxline。

    • 运行10-4:输入的每一行都会回显

    • 我们需要做的是不使用每次拷贝一行的做法,而是每次拷贝Maxbuf个字节,书上提供了rio_readnb来帮助我们实现。

    修改后代码:

    int main(int argc, char **argv)
    {
    	int n;
    	rio_t rio;
    	char buf[MAXBUF];
    	Rio_readinitb(&rio, STDIN_FILENO);
    	while((n = Rio_readnb(&rio, buf, MAXBUF)) != 0)
    		Rio_writen(STDOUT_FILENO, buf, n);
    } 
    
    • 运行:

    • 此时,要当长度达到MAXBUF后才会回显,我们在csapp.h中可以找到MAXBUF的定义:

    • 为了方便观察我修改的结果,我把这里的MAXBUF更改成了12重新编译连接(在头文件中更改define之后需要重新制作静态库再去编译连接):

    • 可以看到它会回显12个字符。(上图中只显示了11个字符是因为在第一行有一个回车)

    家庭作业10.10

    题目:

    解答:

    • 这里可以添加dup2重定向代码完成这个任务。
    • 先进行判断
      • 如果参数个数为1,即只有运行代码的命令,不进入重定向的代码,执行原有代码。
      • 如果参数个数为2,那么就执行重定向代码,将标准输入重定向到文件。

    代码:

    int main(int argc, char **argv)
    {
        int n;
        rio_t rio;
        char buf[MAXLINE];
        
        if(argc == 2){
            int fd = open(argv[1], O_RDONLY, 0);
            dup2(fd, STDIN_FILENO);
            close(fd);
        }
        Rio_readinitb(&rio, STDIN_FILENO);
        while((n = Rio_readlineb(&rio, buf, MAXLINE)) != 0)
            Rio_writen(STDOUT_FILENO, buf, n);
    }  
    

    运行:

    • 回显和输出文件内容

    • 注:1.txt

  • 相关阅读:
    Allegro PCB Design GXL (legacy) 使用slide无法将走线推挤到焊盘的原因
    OrCAD Capture CIS 16.6 导出BOM
    Altium Designer (17.0) 打印输出指定的层
    Allegro PCB Design GXL (legacy) 将指定的层导出为DXF
    Allegro PCB Design GXL (legacy) 设置十字大光标
    Allegro PCB Design GXL (legacy) 手动更改元器件引脚的网络
    magento产品导入时需要注意的事项
    magento url rewrite
    验证台湾同胞身份证信息
    IE8对css文件的限制
  • 原文地址:https://www.cnblogs.com/hyq20135317/p/4937739.html
Copyright © 2011-2022 走看看