20145231《信息安全系统设计基础》 课程总结
每周作业链接汇总
●第0周作业:虚拟机安装、学习导引
●第1周作业:Linux桌面环境、命令行快捷键、git链接配置、Linux的重要命令
●第2周作业:VIM的学习、gcc编译器及gdb调试技术
●第3周作业:计算机中各种数的表示和运算
●第5周作业:程序的机器级表示、汇编语言逆向思维的学习
●第6周作业:Y86指令集体系结构(及安装)、了解ISA抽象
●第7周作业:存储器系统的了解、局部性原理和缓存思想的应用
●期中总结:总结前七周知识点、查漏补缺
●第9周作业:了解Unix I/O
●第10周作业:实践常用指令的代码,加深对指令的理解
●第11周作业:控制流、异常、进程控制的学习
●第12周作业:第9-11周学习汇总、实验汇总、第11周学习的补充
●第13周作业:网络编程
●第14周作业:虚拟存储器的概念及其作用
实验报告链接汇总
代码托管链接
●托管链接
代码实践心得
●本学期对于代码的要求更多的是运行和理解,在理解代码的过程中能够更加深入的掌握每一章的重点内容,对于知识点的认识更加透彻,而不仅仅是停留在书本表面,实践出真知,这是我在期中前就形成的深刻认识,通过《代码驱动的程序设计》这篇博客的学习更是get到了自己学习代码的方法,可以通过帮助文档来深入分析和理解某个函数或是学习一个新的指令,层层分析,把每一步不懂的函数理解清楚,最后串到一起,就获得对代码的整体印象,比如:who命令究竟是怎么实现的,实现了哪些功能等。
●但是对于后面两周的代码实践的不够,学习的还比较浅,光是书本上的内容理解起来就比较费力,尤其是线程部分的代码比较抽象难懂。总之代码实践这个环节真的需要付出时间并认真思考,你一定会有所收获。
实践教训
●其实最大的教训还是开始学习《信息安全系统设计基础》这门课的前几周吧,当时对它不够重视,而且没有摸索出合适的学习方法,倒不是说没有实践,当时虚拟机安装出了问题,因为自身电脑的问题,安装虚拟机时总是卡,所以一直用的实验楼学习,跟着步骤一步步做完之后却很难在脑海中留下印象,包括前几周考试成绩也不理想,自己很快被落下了,就开始反思自己学习的过程,学习中一定要有自己的思考和理解,而不是盲目的敲代码、敲指令,否则不仅一无所获更是浪费时间和生命;以及,一定要看书,完成书上习题:这在后面知识的学习中显得尤为重要,不看书再去实践太过盲目,缺乏理论指导,不知道代码之间的关系、不清楚相关的知识。所以在初学阶段,实践必不可少,但是理论重于实践,个人看法。还有,不要欠债!该做的一定要做!前几周落下之后我就下定决心一定要装好虚拟机弄好git托管,不管花多久。好在,在补了自己欠下的环节后,学习终于步入正轨,比较顺利。
第0周作业中提出的问题
1. 第一章 编译系统是如何工作的?
●从源文件到目标文件的转化是由编译器驱动程序完成gcc -o hello hello.c
编译系统:预处理器、编译器、汇编器和链接器
预处理阶段:.c->.i
,根据以字符#开头的命令,修改原始的C程序
编译阶段:.i->.s
,汇编语言程序
汇编阶段:.s->
机器语言指令,打包成可重定位目标程序
链接阶段:可重定位目标程序->可执行目标程序
2. 第二章 浮点数的表示在计算机当中是如何实现的?
●在计算机中,表示浮点数由两种常用的格式:单精度浮点数和双精度浮点数,IEEE 754 用科学记数法以底数为 2 的小数来表示浮点数。
3. 第三章 所有程序的机器级表示都是通过汇编指令实现的吗?
●程序的机器级表示指的就是汇编代码。相比二进制格式的机器级代码,汇编代码可读性更好,它是机器代码的文本表示,给出了程序中的每条指令。理解汇编代码和原始C代码的联系,是理解计算机如何执行程序的关键一步。
4. 第四章 如何解决Y86异常?
●Y86是一个指令体系结构(ISA),它是计算机系统这本书的作者简化出的指令集。目的是为了让我们更加清晰的了解ISA,就像你读编译原理,作者会教你做个编译器,是一样的道理。对于Y86来说,程序员可见的状态中就有stat状态码,它标识了程序执行的状态。Y86需要有能力根据stat去做一些处理。不过为了简单起见,这里除了正常执行之外,都将停止指令的执行。真实当中,会有专门的异常处理程序。 Y86有四种不同的状态码,AOK(正常)、HLT(执行halt指令)、ADR(非法地址)和INS(非法指令)。
5. 第五章 如何消除循环程序的低效率?
●充分利用空间局部性和时间局部性原理。
6. 第六章 存储器层次结构是怎样的?
7. 第七章 怎样从应用程序中加载和链接共享库?
●加载时链接的基本思路是在创建可执行文件时,即传统的链接阶段,静态执行一些链接,得到一个部分链接的可执行文件,然后在程序加载时动态完成链接过程。实际上链接时并未拷贝共享库的任何代码和数据节,而是拷贝了一些重定位和符号表信息,它们使得在运行时可以解析对共享库中的代码和数据的引用。
●而在程序加载时,加载器拷贝可执行文件之后,不再像通常那样将控制传递给应用,而是加载和运行动态链接器。动态链接器先重定位共享库的代码和数据到某个存储器段,然后重定位程序中所有对共享库的符号的引用,最后动态链接器将控制传递给应用程序。
8. 第八章 用户模式和内核模式有什么区别?
●在内核模式下用户可以访问所有的内存和硬件资源。
●在用户模式下访问受到限制,例如用户访问了禁区,则用户进程将被杀死。用户模式必须通过系统调用或库函数切换至内核模式后,才允许访问硬件资源。
9. 第九章 虚拟存储器如何提供一种机制?
●虚拟存储技术的实现思想:根据程序执行的局部性原理,在作业信息不全部装入内存的情况下,作业是可以运行的。例如对于一个4页大小的作业,当前只有3个空闲内存块,运行改作业的可行的办法就是将作业的3页装入内存的3个空闲块,先运行这3页,而将剩余的页暂时存放在外存上,待需要使用在第4页上的信息时,再选中在内存中的一页交换出内存,从而让出一个内存块以便装入第4页。作业的页面在内存与外存上的交换这一过程对用户是透明的,它是由操作系统自动完成的,这也相当于利用外存的空间扩充了内存空间。这就是虚拟存储技术的实现思想。
10. 第十章 文件元数据有哪些,表示什么含义?
●数据(Metadata),又称中介数据、中继数据,为描述数据的数据(data about data),主要是描述数据属性(property)的信息,用来支持如指示存储位置、历史数据、资源查找、文件记录等功能。元数据算是一种电子式目录,为了达到编制目录的目的,必须在描述并收藏数据的内容或特色,进而达成协助数据检索的目的 元数据就是数据的数据。
●任何文件系统中的数据分为数据和元数据。数据是指普通文件中的实际数据,而元数据指用来描述一个文件的特征的系统数据,诸如访问权限、文件拥有者以及文件数据块的分布信息(inode...)等等。在集群文件系统中,分布信息包括文件在磁盘上的位置以及磁盘在集群中的位置。用户需要操作一个文件必须首先得到它的元数据,才能定位到文件的位置并且得到文件的内容或相关属性。
●文件系统元数据(metadata)的更改都被保存在一份单独的日志里,当发生系统崩溃时可以根据日志正确地恢复数据。除此之外,日志使系统重新启动时不必进行文件系统的检查,从而缩短了恢复时间。
11. 第十一章 如何能够让某台源主机跨过所有不兼容网络发送数据到另一台目的主机?
●解决方法是一层运行在每台主机和路由器上的协议软件,它提供两种基本能力:(1)命名机制(2)传送机制
●下图展示了一个主机和路由器如何使用互联网络协议在不兼容的局域网间传送数据的事例:
12. 第十二章 基于I/O多路复用的并发程序和基于线程的并发程序有何异同?
●I/O多路复用的基本思想
比如我的程序需要从多个I/O上等待数据到来并读取
pipe fd1
tcp socket1 fd2
tcp socket2 fd3
udp socket fd4
那么定义一个数组{fd1,fd2,fd3,fd4}存储好,并通知内核,我对这几个fd的输入事件感兴趣,此时内核会说你等着吧,等他们谁有数据了我会通知你,然后你就睡眠了。 当某个fd有数据到达可读时,内核会立即通知你,嘿,有数据来了,快醒了。于是你赶快醒来,找到哪个fd有数据,然后接收处理,处理完了,一轮结束继续告知内核感兴趣的事件,然后睡眠。
linux支持I/O多路复用的系统调用有select、poll、epoll。
●基本多线程模型
整个模型类似与基于多进程的设计,主线程不断的等待连接请求,然后创建一个线程处理该请求。 这个模型中有个微妙的问题,主线程建立某一新连接的fd,如果直接传递给子线程,那么很有可能在子线程处理前,主线程建立了另一个连接,并更新了fd,那么不幸的结果就是,现在两个线程在同一个描述符上执行输入输出。以下是示例代码:
1 connfd = accept(listenfd, &clientaddr, &clientlen);
2 pthread_create(&tid, NULL, thread, &connfd);
另一个问题是在线程例程中避免存储器泄露,要么显示回收内存,要么必须分离线程。
加扣分项
——我是通过优秀作业、以及加分项目来实现的。
●优秀作业
●加分项目
课程的收获与不足
●自己的收获
▶收获了知识与技能:首先是掌握了虚拟机的基本使用和一些Linux的重要命令,其次学会了使用git托管代码,对文档、代码进行分类管理,学会了vim的基本使用(通过做vim深入研究这个项目我深知要想真正掌握vim还需要花大量的时间精力去学习)、了解了计算机系统的基本知识:计算机中的信息表示、程序的机器级表示及运行(对汇编语言的理解更加深入)、处理器如何运行(程序和硬件两方面)、存储器如何工作、虚拟存储器如何工作、进程线程异常的概念等等。
▶收获了自我学习的方法:知道了怎样的学习方法适合自己,初步总结为:阅读课本(了解新知识)、习题训练(加深对知识的理解,走出思维的误区)、(代码)实践(加深认知,运用知识)、总结反思(自我提升)。
▶加强了对于很多事物的认知,刷新了看法:多实践、多动手、不能拖延。积极主动的学习比被动学习要高效且容易。
●自己需要改进的地方
▶git commit次数不够,确实,基本上每次的注释都不会给的太多,这样造成的后果就是再回过头看这些代码的时候只知道是第几章的、大概是干什么的,但是具体的功能就不得而知,对于以后的学习或者使用造成了不便,这个问题我以后会注意。
▶代码实践的不够深入,对于其功能及实现理解的不够透彻。
▶有畏难心理,阅读课本时,看到大段的概念就会看不下去,觉得自己无法理解,但有时静下心来阅读其实是可以理解的,要注意克服这种情绪。
●给学弟学妹们的建议
▶按照老师的要求做,每周的任务当周完成,不要拖延;
▶多多实践,只有动手你才能真正掌握知识并且体会到学习的乐趣:“纸上得来终觉浅,绝知此事要躬行”;
▶坚持,遇到困难不要轻易放弃,积极请教老师、同学,到最后你一定会有所收获。
●问卷调查
●你平均每周投入到本课程多长时间?
▶10~18小时。
●每周的学习效率有提高吗?
▶不一定,这要看当周的状态。
●学习效果自己满意吗?
▶还行,但还可以做得更好。
●课程结束后会继续一周至少一篇博客吗?(如果能做到,毕业时我把你的博客给你集结成一本书)
▶会啊,因为还有一门课叫做《网络攻防》。或者用博客记录生活、记录时光、记录学习收获与可以。
●你觉得这门课老师应该继续做哪一件事情?
▶每周一次课堂测验、加分项目。这都是鼓励同学们学习的好方法。且比期末只考一次更能让大家学到知识,提高学习效率,不荒废一学期的时光。
●你觉得这门课老师应该停止做哪一件事情?
▶停止扇贝打卡加分。提升英语水平是自己的事情,考四六级也是自己的事情,只要想过,自然会努力。用加分的方式的确能起到鼓励背单词的效果,但更多的是为了加分而打卡,只打卡并没有真正记忆单词,这样不仅违背了老师的初衷,对于其他同学也不公平。
●你觉得这门课老师应该开始做什么新的事情?
▶希望老师在以后给出的代码中增加一些比较关键的注释,这样可以便于大家理解,学得更好。
●本文链接
▶感谢娄老师一年以来的指导与付出,您辛苦了。愿您的付出得到回报,大家一起继续努力,继续进步。