《深入理解计算机系统》家庭作业

第二章、第七章

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

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

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

家庭作业2.63

题目:

744787-20151020140148317-1373766671.png

解答思路及代码:

744787-20151020140408974-80893726.png

运行:

744787-20151020140555520-1652355174.png

家庭作业2.75

题目:

744787-20151020140824036-1041345804.png

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

744787-20151020141115489-1148368343.png

- 补码乘法和无符号乘法的低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

题目

744787-20151020143840645-442229165.png

744787-20151020144237520-1407495.png

解答:
- 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

题目:

744787-20151104221923274-97656048.png

解题使用公式
- C = B * E * S
- S = 2 ^ s
- B = 2 ^ b
- m = s + t + b
解答:

744787-20151104223940414-282783053.png

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

题目:

744787-20151104221927383-1847346107.png

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

744787-20151104224400867-195134387.png

解答:
所有八个组的命中地址:
组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

题目:

744787-20151110140914494-2041409997.png

解答:

744787-20151110141041353-1445704797.png

分析:
  • 每一步输出。
    • 1.打开文件一;2.打开文件二;3.关闭文件二;4.打开文件二

    744787-20151110141816837-1971608506.png

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

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

家庭作业10.7

题目:

744787-20151110142053322-484769524.png
744787-20151110142057994-227728314.png

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

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

    744787-20151110144822587-179355459.png

  • 我们需要做的是不使用每次拷贝一行的做法,而是每次拷贝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);
} 
  • 运行:

    744787-20151110144828619-1497676142.png

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

    744787-20151110145315759-334813370.png

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

    744787-20151110145610665-786371658.png

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

家庭作业10.10

题目:

744787-20151110145930619-899496844.png

解答:
  • 这里可以添加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);
}  
运行:
  • 回显和输出文件内容

744787-20151114210529119-367354288.png

  • 注:1.txt

    744787-20151114210523244-367745057.png

转载于:https://www.cnblogs.com/hyq20135317/p/4937739.html

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值