目录
作业二-第十四章
第1题
题目要求
首先,编写一个名为 null.c 的简单程序,它创建一个指向整数的指针,将其设置为NULL,然后尝试对其进行释放内存操作。把它编译成一个名为 null 的可执行文件。当你运 行这个程序时会发生什么?
解答
代码样例:
gcc 版本:
gcc version 11.2.0 (Debian 11.2.0-13)
编译运行:
gcc 1.c -o null
./null
什么都不会发生,程序正常执行;
第2题
题目要求
接下来,编译该程序,其中包含符号信息(使用-g 标志)。这样做可以将本多信息放入可执行文件中,使调试器可以但问有关变量名称等的本多有用信息。通过输入 gdb null,在调试器下运行该程序,然后,一旦 gdb 运行,输入 run。gdb 显示什么信息?
解答
gcc -g 1.c -o null
gdb null
输出信息
第3题
题目要求
编写一个使用 malloc()来分配内存的简单程序,但在退出之前忘记释放它。这个程序运行时会发生什么?你可以用 gdb 来查找它的任何问题吗?用 valgrind 呢(再次使用--leak-check=yes 标志)?
解答
代码样例:
编译运行;
gcc -g 4.c -o 4
gdb 4
valgrind 结果
valgrind -s --leak-check=yes ./4
检测到内存泄漏;
只有编译时添加了-g 参数才会有这个信息
第4题
题目要求
编写一个程序,使用 malloc 创建一个名为 data、大小为 100 的整数数组。然后,将data[100]设置为 0。当你运行这个程序时会发生什么?当你使用 valgrind 运行这个程序时会 发生什么?程序是否正确?
解答
代码样例:
运行后什么都没发生;
valgrind 结果:
valgrind -s --leak-check=yes ./5
提示两个错误:
1.没有释放指针内存泄漏.
2.无效写入,数组越界
第5题
题目要求
创建一个分配整数数组的程序(如上所述),释放它们,然后尝试打印数组中某个元素的值。程序会运行吗?当你使用 valgrind 时会发生什么?
解答
代码样例:
程序会正常运行
valgrind结果:
valgrind -s --leak-check=full ./6
1 个错误:无效读取,
作业三-第十九章
教材P152页,测算一下 TLB 的容量和访问 TLB 的开销。
其实每个章节的问题都是辅助完成章节作业的,所以我直接通过几个问题来完成章节作业;
第2题
题目要求
写一个程序,命名为 tlb.c,大体测算一下每个页的平均访问时间。程序的输入参数有:页的数目和尝试的次数。
解答
gcc tlb.c && ./a.out -l 15 -p 15
第3题
题目要求
用你喜欢的脚本语言(csh、 Python 等写一段脚本来运行这个程序,当访问页面从 1 增长到几千,也许每次迭代都乘 2。在不同的机器上运行这段脚本,同时收集相应数据。需要试多少次才能获得可信的测量结果?
解答
python run.py
第4题
题目要求
接下来,将结果绘图,类似于上图。可以用 ploticus 这样的好工具画图。可视化使数据更容易理解,你认为是什么原因?
解答
bash run.sh
第5题
题目要求
要注意编译器优化带来的影响。编译器做各种聪明的事情,包括优化掉循环,如果循环中增加的变量后续没有使用。如何确保编译器不优化掉你写的 TLB 大小测算程序的主循环?
解答
gcc 选项-O 启用不同级别的优化。使用-O0(默认)禁用它们。-O3 是最高级别的优化。