20155303 2017-2018-1 《信息安全系统设计基础》课程总结
目录
- 一、每周作业及实验报告链接汇总
- 二、关于博客
- 自认为写得最好一篇博客是?为什么?
- 作业中阅读量最高的一篇博客是?谈谈经验。
- 作业中与师生交互最多的一篇博客是?谈谈收获。
- 三、代码托管
- 给出statistic.sh的运行结果,说明本学期的代码量目标达到没有?
- 代码驱动的学习做到没有?
- 加点代码,改点代码是理解的最好方式,参考编程的智慧,谈谈你的心得。
- 实践上有什么经验教训
- 四、开学初问题的回顾
- 整体评价一下第1周作业中自己提出的问题是不是抓住了学习重点
- 回答一下第1周作业中自己提出的问题
- 五、课堂项目实践
- 课堂实践链接
- 课堂实践对提高应用能力有帮助吗?
- 你有什么项目被加分,谈谈你的经验。
- 六、课程收获与不足
- 自己的收获(投入,效率,效果等)。
- 自己需要改进的地方。
- 如果有结对,写一下你提供的帮助或接受了什么帮助,并对老师提供参考建议。
- 七、给自己和学弟学妹的建议
- 如果重新学习这门课,怎么做才可以学的更好?
- 八、问卷调查
- 你平均每周投入到本课程学习时间有多少?
- 每周的学习效率有提高吗?
- 学习效果自己满意吗?
- 课程结束后会继续一周至少一篇博客吗?
- 你觉得这门课老师应该继续做哪一件事情?
- 你觉得这门课老师应该停止做哪一件事情?
- 你觉得这门课老师应该开始做什么新的事情?
- 九、写在最后
- 附:二维码
一、每周作业及实验报告链接汇总
- 《信息安全系统设计基础》——预备作业:实验楼教程学习:假期对实验楼相关课程的学习,具体包括:正则表达式基础、Vim编辑器、TCP/IP网络协议基础、Linux系统编程、高级Bash脚本编程指南。
- 2017-2018-1 20155303 《信息安全系统设计基础》第一周学习总结:熟悉Linux系统下的开发环境掌握静态库和动态库的生成与调用方法。
- 2017-2018-1 20155303 《信息安全系统设计基础》第三周学习总结:深入学习计算机算术运算的特性,进一步理解“信息=位+上下文”。
- 2017-2018-1 20155303 《信息安全系统设计基础》第四周学习总结:掌握系统编程错误处理的方式;掌握Unix/Linux系统级I/O;掌握I/O重定向的方法
- 2017-2018-1 20155303 《信息安全系统设计基础》第五周学习总结:掌握X86汇编基础,学会阅读(反)汇编代码。
- 2017-2018-1 20155303 《信息安全系统设计基础》第七周学习总结:了解处理器的体系结构,学习多线程的概念。
- 2017-2018-1 20155303 《信息安全系统设计基础》第九周学习总结:了解常见的存储技术(RAM、ROM、磁盘、固态硬盘等);理解缓存思想、高速缓存的原理和应用等。
- 2017-2018-1 20155303 《信息安全系统设计基础》第十一周学习总结:理解虚拟存储器的概念和作用;掌握动态存储器分配的方法;了解C语言中与存储器有关的错误。
- 2017-2018-1 《信息安全系统设计基础》实验一报告:交叉编译;目标机宿主机连通;目标机运行程序;目标机模块分解。
- 2017-2018-1 《信息安全系统设计基础》实验三报告:实现(多线程)传送文本文件的客户端和服务器。
- 2017-2018-1 《信息安全系统设计基础》实验四报告:学习Linux设备驱动编程。
- 2017-2018-1 《信息安全系统设计基础》实验五 通信协议设计:Linux下OpenSSL的简单使用;混合密码系统的编写。
- 课后练习:C语言实现Linux命令——od:由一个课堂实践引发的思考与尝试,使用C语言完成od命令的功能。
- 进程与fork()、wait()、exec函数组:着重学习exec函数组、fork()、wait()的用法;编写Linux shell进行练习。
- Linux进程间通信:详细介绍不同的进程间进行通信的方法。
二、关于博客
自认为写得最好一篇博客是?为什么?
- 自认为写得最好的是2017-2018-1 20155303 《信息安全系统设计基础》第三周学习总结,因为这篇文章耗时最长,写得也最用心。学习这一章内容时正值十一假期,如果说平时每周拿出24小时学习本周内容的话,这一章至少花费了三四个24小时。因为我觉得这一章最基础,也很重要。尤其是对信息=位+上下文的理解,在深入探究学习的过程中更加透彻了。
作业中阅读量最高的一篇博客是?谈谈经验。
- 阅读量最高的是课后练习:C语言实现Linux命令——od这篇博客。起初这是一项课下作业,要求实现
od -tc -tx1 *.txt
的功能,目的在于让我们区分文本文件和二进制文件的概念,较易实现。后来想到od命令还有其他选项,顺便做了拓展,最后再进行“润色”,严格模仿Linux下的输出格式。在拓展的过程中,考虑到需要封装函数,用到了windows下光标移动的方法。但移植到Linux下又出了新的问题,因为Ubuntu下没有windows内核dll的支持,所以windows.h中的方法在Linux下均无法使用。在老师的指点下,了解到curses.h库函数的功能类似于windows.h,因此进行了后续的学习。经验就是,“问题驱动学习”,要有钻研的精神,知识都是在深挖的过程中慢慢掌握的;同时应该在博客中详细记录自己的思考过程,这些对其他同学不失为重要的参考。
作业中与师生交互最多的一篇博客是?谈谈收获。
- 交互最多的是进程与fork()、wait()、exec函数组,这也是我写博客以来
修改次数最多的一篇博客。在与老师讨论的过程中,一点一点学会如何以更加明晰的思路向初学者展示知识的框架和内涵。在修改的过程中更加体会到老师的不易,都说给学生一碗水,老师至少需要一桶水的储备,教会他人,往往比教会自己更困难。虽然目前的版本仍不令人满意,但在迭代的过程中收获满满。
三、代码托管
给出statistic.sh的运行结果,说明本学期的代码量目标达到没有?
- 本学期的代码量目标已完成。代码集中为课后习题、遇到问题时的验证过程以及五次实验。
代码驱动的学习做到没有?
“代码驱动”与“问题驱动”是本学期学习的主要方式。尤其对于许多精细知识的学习,比如教材第二章,遇到不懂的问题敲代码验证就能对“信息=位+上下文”有更加深刻的理解。
加点代码,改点代码是理解的最好方式,参考编程的智慧,谈谈你的心得。
- 照搬代码往往不能得到实质性的提高,而针对不同的需求对代码稍作修改却可以帮助我们深刻理解代码。比如C语言模拟od命令,对已有的-tx代码稍作修改就能实现-td/-to等选项,也加深了对代码的理解。
教材实践上有什么经验教训?
- 学习新的知识时,可以先看书,熟悉书上的知识点;如果时间紧张,先敲代码做练习不失为一种不错的选择。在调试代码、运行代码、修改代码的过程中,对知识点也就理解透彻了。
四、开学初问题的回顾
整体评价一下第1周作业中自己提出的问题是不是抓住了学习重点?
- 大多数问题缺乏对一章内容的整体把握,在没有通读整章的情况下,提出的问题总是不着重点。
回答一下第1周作业中自己提出的问题
- 『第1章 计算机系统漫游』:一个可执行程序是如何一步步产生的?
- 预处理->编译->汇编->链接,由此生成可执行文件。
- 『第2章 信息的表示和处理』:如何利用计算机的算术运算特性保证运算结果的精度?
- 例如通过规格化,可以保证运算数据的精度。浮点的规格化是为了使浮点数尾数的最高数值位为有效数位。当尾数用补码表示时,若符号位与小数点后的第一位不相等,则被定义为已规格化的数,否则便是非规格化数。通常,采用向左规格化(简称左规),即尾数每左移一位,阶码减1,直至规格化完成
- 『第3章 程序的机器级表示』:不同的数据结构,分配和访问方式有何异同?
- 许多实际的计算机系统对基本类型数据在内存中存放的位置有限制,它们会要求这些数据的首地址的值是某个数k(通常它为4或8)的倍数,这就是所谓的内存对齐。
- 『第4章 处理器体系结构』:五阶段处理器流水线具体指什么?
- 取指阶段->译码和写回阶段->执行阶段->访存阶段->更新PC阶段
- 『第5章 优化程序性能』:如何在理解现代处理器的原理上,提高代码性能?
- ①选择一组适当的算法和数据结构;②编写出编译器能够有效优化以转换成高效可执行代码的源代码,如充分理解优化编译器的能力和局限性。
- 『第6章 存储器层次结构』:如何通过改善程序的时间局部性和空间局部性来提高应用程序的性能?
- ①通过按照数据对象存储在内存中的顺序,以步长为1的来读数据,从而使得程序的空间局部性最大;②一旦从存储器中读入了一个数据对象,就尽可能多地使用,从而使程序中的时间局部性最大。
- 『第7章 链接』:链接的具体过程是怎样的?在生成可执行目标文件的过程中起什么作用?
- 为了构造可执行文件,链接器需要完成以下两个任务:符号解析和重定位。驱动程序运行链接器。将各种.o文件以及一些必要的系统目标文件组合起来,创建一个可执行文件。
- 『第8章 异常控制流』:进程是如何工作的?如何在应用中创建和操纵进程?
- 进程是一个执行中程序的实例,每次用户通过向shell输入一个可执行目标文件的名字,运行程序时,shell就会创建一个新的进程,然后在这个新的进程的上下文中运行这个可执行目标文件。
- 与进程相关的有一些函数,如fork()、getpid()、exit()、wait()等,
- 『第9章 虚拟内存』:虚拟内存是如何体现计算机系统软硬件结合的优点的?
- 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,高效的使用了主存。
- 它为每个进程提供了一致的地址空间,从而简化了存储器管理。
- 它保护了每个进程的地址空间不被其他进程破坏。
- 『第10章 系统级I/O』:C的标准I/O库与Linux I/O有什么关系?
- 标准I/O默认采用了缓冲机制,比如调用fopen函数,不仅打开一个文件,而且建立了一个缓冲区(读写模式下将建立两个缓冲区),还创建了一个包含文件和缓冲区相关数据的数据结构。
- 低级I/O(Linux系统的I/O)一般没有采用缓冲,需要自己创建缓冲区,不过在Linux系统中,都是有使用称为内核缓冲的技术用于提高效率,读写调用是在内核缓冲区和进程缓冲区之间进行的数据复制。
- 『第11章 网络编程』:如何开发简单的迭代式Web服务器?
- 迭代服务器:服务器在同一时刻只能响应一个客户端的请求
- 并发服务器:服务器在同一时刻可以响应多个客户端的请求
- 在实验三中,实现了迭代服务器和并发服务器。具体可以参考相关实现。
- 『第12章 并发编程』:如何利用线程级并行性使得程序在多核机器上更快运行?
- 可以通过编写并行程序,具体包括任务并行和数据并行两种方式。
- 任务并行:是指将有待解决的问题需要执行的任务分配到各个核上完成。
- 数据并行:是指将有待解决的问题所需要处理的数据分配到各个核上完成,每个核在所分配的大致相当的数据集上执行相同操作。
五、课堂项目实践
课堂实践链接
课堂实践对提高应用能力有帮助吗?
- 本学期隔周即进行一次课堂实践,我认为这是对学习内容的很好的检测方式,也对同学们的学习起到了很好的督促作用。不过课堂实践毕竟时间有限,不可能对两周所学内容面面俱到,所以还需课下多下功夫。
你有什么项目被加分,谈谈你的经验。
- 截至上次公布成绩,有以下几个方面被加分:
- 博客。包括暑假期间自学写的博客,以及一些优秀作业;
- 微课。这学期利用课余时间跟几位同学一起做一些辅助教学的工作,虽然微不足道,但让我们真切体会到了老师的不易;
- 密码技术竞赛。从暑假中期开始准备初赛,到学期初进入复赛修改完善作品,再到11月下旬参加决赛,虽说结果并不尽如人意,只拿了三等奖,但准备的过程对团队的每个成员来说都是一种历练;这次比赛每一位队员都各尽所长,也让团队的凝聚力大大增强,可以说意义远远超过了比赛本身;
- 还有一些是课堂实践的加分;
- ......
六、课程收获与不足
自己的收获(投入,效率,效果等)。
- 本学期所学内容较上学期而言,更多且更杂,任何一个模块都能拿来细细探讨分析;在课程难度增大的情况下,投入的时间和理解程度却不尽人意,有很多课后练习都没有完成,还有一些章节也没来得及仔细研究。还需要多读很多遍才能真正把这本书理解掌握...
自己需要改进的地方。
- 合理安排时间,分清缓急轻重,知识总是学不完的,所以应该学会抓住重点。
如果有结对,写一下你提供的帮助或接受了什么帮助,并对老师提供参考建议。
- 从这两个学期的结对情况来看,我认为这种方式是非常有必要的。尤其是实验,一个人的知识储备也许不足以解决遇到的所有问题,往往在探讨的过程中才能摸索到正确的解决方案。
- 而且结对也是一个互补的过程,队员能够在这个小团体内发挥自己的长处,两个或三个人协作可以得到更好的效果。
- 在平时的学习中,很多同学并没有切实贯彻结对的政策,可能是因为日常的学习较为简单,并不需要另一个人跟自己的思维来碰撞。参考其他课程的结对情况,也许可以定期布置一些大型作业,难度不一定很大,但最好要求多样化一些,为同学们创造发挥长处的机会,与他人合作完成。
七、给自己和学弟学妹的建议
如果重新学习这门课,怎么做才可以学的更好?
- 多阅读课本内容涉及到的相关书籍,比如《Understanding.Unix-Linux.Programming》、《The Art of Debugging with GDB, DDD and Eclipse》、《UNIX.Linux下curses库开发指南》等,一方面改善单一的思维方式,另一方面也算“广”与“专”并重。
- 合理安排时间,“今日事今日毕”,抓住平时零碎的时间,遇到问题随时记录在书上相关的位置,随时查询求解。
八、问卷调查
你平均每周投入到本课程学习时间有多少?
- 单周大概20多小时,双周较为轻松,一般用来补充上一周没有完全掌握的知识,5、6小时即可。
每周的学习效率有提高吗?
- 有提高,尤其是在单周学习任务比较重的情况下,逐渐学会了如何抓住知识的重点。
学习效果自己满意吗?
- 基本满意,但也只局限于针对这门课程现有的考核而言。作为一本IT行业招聘必然会参考的书籍(据说),其重要性不言而喻,因此以我现在对这本书浅薄的理解程度,只能说掌握了一点皮毛,想真正掌握还是远远不够的。
课程结束后会继续一周至少一篇博客吗?
- 写博客的过程也是整理思路的过程,如果是专业方面的知识,我还是比较倾向于在博客中分享的。也算作日后的学习参考。
你觉得这门课老师应该继续做哪一件事情?
- 使用蓝墨云辅助教学,这可以让教学的过程更加多元化。其中的很多功能也非常贴合这门课程学习的需要,值得保持下去。
你觉得这门课老师应该停止做哪一件事情?
- 无。
你觉得这门课老师应该开始做什么新的事情?
①课堂笔记除了让他人回答自己的问题之外,建议要求自己对自己的问题进行回答,以加深对课堂内容的理解。毕竟别人仔细回答了,知识是别人的;若是自己提完问题就丢,其实并没有完全发挥这个问题的价值。
②后面的实验难度比较大,尤其是用到实验箱的部分。因此,建议老师在实验前先大致讲解此次实验的思路,让同学们在实验时有的放矢。
③不定时抽取一些同学当面检查程序,问一些代码中的问题,以考察理解程度。
九、写在最后
首先,想对娄老师一直以来的悉心指导与严格要求道一声感谢:谢谢您对教育事业的奉献精神,多少个周末节假日仍留在学校工作,为同学们讲课;谢谢您一年以来不厌其烦的指导,带我们一步一步走上正确的学习道路;谢谢您在专业经验、学习方法、甚至是生活态度等各个方面的分享,不管是为师还是为人,您都为我们树立了榜样。
转眼博客园的园龄已经一年多了,回想第一篇博客《路行至远,砥砺前行————浅谈对师生关系的看法以及对未来学习生活的展望》仍记忆犹新。值得欣喜的是,在一年来的学习过程中,我的收获早已超过预期;这段师生关系带给我的,也绝不仅仅是两本书中的知识而已。我很荣幸能遇到娄老师,能接触到这样一种学习模式,拓宽了视野,增长了知识。从一开始对一周一篇博客这种新模式的抵触,到逐渐接受适应并习惯;从有时课堂实践发挥不佳心情低落,到实践前更深入的学习,更充分的准备,我想很难有哪一门课要求自己从外到内做出如此大的改变,需要克服懒惰,需要调整心态,甚至需要在不断的摸索中找到属于自己的学习方法。蜕变成功就能倍感轻松,拒绝改变只能持续痛苦。
直到我进入16级博客园班级,才意识到一年的时间就要过去了。这虽然是结束,同时也是新的开始。老师已经为我们指明了一条专业学习的道路,能走多远就取决于自己了。接下来我会带着对专业的热情继续拓展自己的视野,时常以更高的标准审视自己,严格要求,不断前进;同时会尽力协助娄老师做一些力所能及的事,以求能有更多的同学从这种学习模式中受益。
最后,想起娄老师曾分享过一篇资深技术专家陈皓对IT从业者的建议,其中几点我深有感触,与大家共勉:
- 客观地审视自己。找到自己的长处,不断地在自己的长外上发展自我。知道自己几斤几两才能清楚自己适合干什么。不然,目标设置得过高自己达不到,反而让自己难受。在职场上,审视自己的最佳方式,就是隔三差五就出去面试一把,看看自己在市场上能够到什么样的级别。如果你超过了身边的大多数人,你不妨选择得激进一些冒险一些,否则,还是按部就班地来吧。
- 确定自己想要什么。如果不确定这个事,你就会纠结,不知道自己要什么,也就不知道自己要去哪里。注意,你不可能什么都要,你需要极端地知道自己要什么。所谓“极端”,就是自己不会受到其它东西或其它人的影响,不会因为这条路上有人退出你会产生怀疑,也不会因为别的路上有人成功了,你会羡慕。
- 注重长期的可能性,而不是短期的功利。20-30 岁应该多去经历一些有挑战的事,多去选择能给自己带来更多可能性的事。多去选择能让自己成长的事,尤其是能让自己开阔眼界的事情。人最害怕的不是自己什么都不会,而是自己不知道自己不会。
- 尽量关注自己会得到的东西,而不是自己会失去的东西。因为无论你怎么选,你都会有得有失的。(绝大多数人都会考虑自己会失去的,而不是考虑自己会得到的。)
- 很多事情能做到什么程度,其实在思想的源头就被决定了,因为它会绝大程度地受到思考问题的出发点、思维方式、格局观、价值观等因素影响。这些才是最本源的东西,甚至可以定义成思维的“基因”。就程序员而言,编码能力很重要,但是技术视野、技术洞察力,以及如何用技术解决问题的能力更为重要。