20145215《信息安全系统设计基础》课程总结

20145215《信息安全系统设计基础》课程总结

每周作业链接汇总

  • 第0周作业

    • 简要内容:安装虚拟机,阅读老师推荐文章后的一些感想以及粗略阅读教材后所提出的一些问题。
    • 二维码:
  • 第一周作业

    • 简要内容:Linux常见的一些命令及实践过程记录
    • 二维码:
  • 第二周作业

    • 简要内容:vim编辑器的使用,gcc编译,gdb调试及makefile的使用
    • 二维码:
  • 第三周作业

    • 简要内容:信息的表示及处理,重要概念:信息=位+上下文
    • 二维码:
  • 第五周作业

    • 简要内容:汇编相关知识,指令集体系结构,函数调用栈帧过程
    • 二维码:
  • 第六周作业

    • 简要内容:Y86模拟器的安装,Y86指令集体系结构
    • 二维码:
  • 第七周作业

    • 简要内容:存储技术,存储器层次机构,缓存,重要概念:局部性原理
    • 二维码:
  • 第八周作业

    • 简要内容:对之前Linux学习内容的回顾,自己的收获和不足以及对课程的一些建议
    • 二维码:
  • 第九周作业

    • 简要内容:Unix系统级I/O,RIO,I/O重定向
    • 二维码:
  • 第十周作业

    • 简要内容:对用C语言实现Linux命令的代码进行分析,掌握系统调用的方法
    • 二维码:
  • 第十一周作业

    • 简要内容:异常及其种类,进程,信号,对进程及信号的相关代码进行分析
    • 二维码:
  • 第十二周作业

    • 简要内容:前三周代码总结,指针,信号,结合signal实现sleep()函数功能
    • 二维码:
  • 第十三周作业

    • 简要内容:网络编程,并发,线程控制以及同步互斥,对线程相关代码进行分析
    • 二维码:
  • 第十四周作业

    • 简要内容:虚拟存储器,C程序中常见的与存储器有关的错误,实现一个简单的分配器
    • 二维码:

实验报告链接汇总

代码托管

  • 链接:http://git.oschina.net/20145215/IS-Design-20145215

  • 二维码:

  • git log查看git提交历史:

  • 代码量汇总:

  • 代码驱动的学习做到没有?

    • 个人感觉只能说做到了一部分,对于本学期的前几周而言,还没有真正体会到代码驱动的学习所带来的好处,那个时候缺乏对代码的分析及思考,很多时候只是简单的把它运行出来就草草了事。之后在老师的引导下慢慢开始对代码进行分析,不懂的地方就通过man -kgrep -nr xxx /usr/include指令进行相关搜索,虽然是英文的,但是那些英语单词一般都能看懂,实在不懂的查一下也就知道了,这也是老师这学期所倡导的扇贝打卡所带来的好处之一。事实也证明,在大量的代码分析面前,不管是对我们读代码的能力还是理解代码所实现的功能都有着巨大的帮助。所以,如果能真正做到代码驱动的学习,或者叫做问题驱动,我觉得不仅仅是学习这门课程,学习任何东西最终的收获都将是巨大的。
  • 加点代码,改点代码是理解的最好方式,谈谈你的心得

    • 老实说,这学期所运行的代码量较上一学期有显著的提升,虽然这当中有很大一部分代码是老师所提供的,但是我感觉收获到的东西也比上学期的要多得多,这也许就是代码驱动的学习所带来的好处。
    • 当然,我觉得所谓的代码驱动不仅仅是指将代码运行出来就可以了,更加重要的是要去对代码进行分析,真正的读懂代码。一开始我觉得读懂代码应该就是能把代码每一句看懂,然后知道这个代码在做什么,后来我发现做到这个依然是远远不够的,因为就算你看懂了每一句代码,让你重新编一个类似的程序你依然是不会。这个时候我们要做的就是对代码进行修改,尝试着去想一些问题,如果代码经过我这样的修改之后,运行结果又会变成什么样,再看看实际情况和你预想的是否一致。如果不一致,再去想哪些地方可能出现问题,实在不会还有我们的答疑小组让大家来一起讨论。显然,这中间需要花费的时间是巨大的,但是当你真正花了时间去这样做,得到的也远比你想象的要多。
  • 实践上有什么经验教训?

    • 我觉得关于实践最重要的一点就是不要怕出错,很多人可能运行代码时一看到错误就会有些慌,不知道应该怎么办。我感觉最有效的办法其实是自己在阅读完代码之后,先想一下可能导致错误的原因是什么,再根据你的想法去进行相应的修改,如果真的和你想的一样,修改完之后能够成功运行,那么你可能也会对自己解决问题的能力有了自信。当然,没解决也没有关系,我相信答疑小组或者百度上也同样会有人遇到过类似的问题,看看其他人是怎么解决的,我们也能学到一些方法。其实我觉得出错是件好事,因为它可以发现很多你自己之前没有注意到的问题,在解决问题的同时既锻炼了自己又能为在下一次遇到同样问题时不至于手足无措,何乐而不为。
    • 其实只有动手实践才能真正学习到编程的精髓,不要光说不做,这样会养成眼高手低的毛病,这一点在上个学期学习Java的时候便深有感触。不管什么样的程序都要亲手做过才能说会了,整天说我不会学不会的人,我感觉其实只是你不想学,只要下决心敲一个月的代码,我相信都会有大的进步,其实当你敲到一周到两周的时候你就会特想敲,因为你会发现程序你能看懂了,能帮别人调程序了,这会有一种强烈的成就感,它会促进你更加努力的去学习。

关于第0周作业

整体评价一下第0周作业中自己提出的问题是不是抓住了学习重点

  • 现在回过头来看自己当时提出的问题,有一些提的比较基础,但是也有一些能够抓住一些重点,现在对于这些问题心中也基本上有了答案。

回答一下第0周作业中自己提出的问题

1. 一个可执行程序的诞生过程中每一步具体操作是什么?什么是链接错误?

  • 一个程序从代码变成可执行文件,一般经过预处理,编译,汇编,链接这四个阶段,在预处理阶段,编译器将C源代码中的包含的头文件如stdio.h编译进来,用户可以使用gcc的选项-E进行查看;在编译阶段中,Gcc首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc再把代码翻译成汇编语言,用户可以使用-S选项来进行查看;汇编阶段是把编译阶段生成的.s文件转成二进制目标代码,用户可以使用gcc的选项-c进行查看;在成功编译之后,就进入了链接阶段,将".o"文件最终链接成可执行文件。
  • 链接器的两个主要任务是符号解析和重定位,符号解析将目标文件中的每个全局符号都绑定到一个唯一的定义,而重定位确定每个符号的最终存储器地址,并修改对那些目标的引用。与链接器操作有关的错误就叫链接错误,许多链接器通过从左到右的顺序扫描来解析符号引用就是一个链接时错误的来源。

2. Perl语言的代码到底是如何编译运行的?相同字长的有符号数和无符号数转换的一般规则是什么?

  • Perl是一种脚本语言,只需要运行你的Perl程序,Perl的解释器将编译和运行你的程序。当运行程序时,Perl的内部编译器首先遍历整个源程序,把它转变为内部的字节码,它是程序的一种内部数据结构,Perl 的字节码引擎将运行这些字节码。
  • 处理同样字长的有符号数和无符号数之间相互转换的一般规则是:数值可能会改变,但是位模式不变。

3. 如何对计算机中的信息进行表示,它的处理方法又是什么?

  • 计算机系统中的所有信息都是以二进制形式存储的,计算机系统规定了三种重要的编码方式:无符号编码、补码编码、浮点数编码。无符号编码是基于传统的二进制表示法,表示大于或等于0的数字;补码编码是表述有符号整数的常见方式,正或负的数字;浮点数编码是表示实数的科学记数法的以2为基数的版本。

4. 处理器的流水线原理是什么?

  • CPU将操作分成一个一个的阶段,每个阶段都是由一个组合逻辑电路和一个流水线寄存器构成的;CPU通过时钟周期来控制信号,如果遇到了时钟的上升沿,那么就会转移到下一个阶段;在CPU内部,形成了一套取指令-译码-执行-访存-写回的硬件设计;当有数据完成了取指令的操作的时候,就可以发下一个取指令的信号了,这样可以保证取指令的硬件逻辑不会闲着。

5. 如何进行性能优化?有什么基本原则?

  • 消除循环的低效率:固定不变的东西提出循环,减少每次循环都计算相同的内容,这一点对性能的提升时很明显的;减少过程的调用:消除循环中的过程调用,可通过函数提前得到需要操作的对象,这样会提高速度,但是模块性降低;消除不必要的存储器引用:函数参数为指针时,如果循环中用到指针,需要对指针的地址进行访问,则每一次访问都会进行取指,执行,存储等操作,这时最好在函数中声明临时变量,在循环中用临时变量,这样直接就可以对变量进行赋值,循环结束之后,再将结果赋给指针地址。

6. 存储器的层次结构是怎样的?高速缓存的友好代码什么意思?

  • 第k层是第k+1层的缓存,因为第k层的存储速度更块,当然空间也更小,第k+1层的存储器分成不同的块,每个块有唯一的地址,通常块的大小固定,第k层的存储里缓存着k+1层里的部分块,在k和k+1之间传输数据时,都是以块为大小来传输。

  • 让常见的情况运行得快;在每个循环内部缓存不命中数量最小。

7. 链接器是干什么的?

  • 链接器是将一个或多个由编译器或汇编器生成的目标文件外加库链接为一个可执行文件的程序,它的两个主要任务是:符号解析及重定位。

8. 异常触发的机制是怎样的?有哪几种类型的异常?

  • 当处理器监测到有事件发生时,通过一张叫做异常表的跳转表,进行一个间接过程调用,到一个专门设计用来处理这类事件的操作系统子程序(异常处理程序)。
  • 异常分为:中断、陷阱、故障和终止。

9. 不同的进程是如何区分的?操作系统是如何实现多任务的?

  • 系统启动每一个进程后,给每个进程分配一个编号,即PID,使用PID就能唯一确定一个进程。
  • 通过上下文切换机制来调度进程,先保存当前进程上下文,再恢复某个先前被抢占进程被保存的上下文,最后将控制传递给这个新恢复的进程。

10. 标准I/O库与Unix I/O有什么区别?

  • 标准I/O操作的对象与Unix I/O的不太相同,标准I/O接口的操作对象是围绕流进行的,当使用标准I/O接口打开或创建一个文件时,我们令一个流和一个文件相关联。对于大多数应用程序而言,标准I/O更简单,是优于Unix I/O的选择。然而在网络套接字的编程中,要使用健壮的RIO函数。因为RIO函数提供了带缓冲的读操作,与无缓冲的写操作(对于套接字来说不需要),且是线程安全的。

11. 服务器和客户端之间如何进行通信?

  • 有TCP和UDP两种协议实现通信,TCP是一种提供可靠数据传输的通用协议,UDP协议不提供差错恢复,不能提供数据重传,因此该协议传输数据安全性比TCP差。

12. 并发是什么?并发编程又是什么?

  • 逻辑控制流在时间上重叠就叫并发。
  • 并发编程分为基于进程的并发编程,基于I/O多路复用的并发编程,基于线程的并发编程。

关于加分项目

优秀作业

教程

经验

  • 我觉得最重要的还是态度,毕竟态度决定一切,只要态度端正了,我觉得学习并不是一件非常难的事情,很多时候不是说我们学不会,而是不想学。当然,学习是需要动力的,这种动力或许不是一开始就有,而是在学习的过程中慢慢去寻找的,例如当我解决问题的时候我会找到动力,当我帮助过别人之后我会找到动力,当我被老师表扬之后也会找到动力,只要肯学,我觉得就一定能找到学习的动力。
  • 之前考四六级的时候主要是做了一些往年的试卷,背单词这一块倒没有花太多时间,直到大二下学习java才开始接触到扇贝单词,所以要说扇贝背单词对四六级的影响,我觉得影响肯定是有的,起码不会出现阅读理解大段大段看不懂的情况,但是对我而言没有太直观的印象。但是在我看来,利用扇贝背单词最大的好处就是在你看帮助文档的时候非常轻松,不需要说老是去翻字典,而且在用一个英文软件的时候(比如:IDEA),比较容易上手,另外,我感觉计算机当中有很多需要用到英语的地方,所以一般来说程序员的英语应该也都比较好。

课程收获与不足

自己的收获

  • 我觉得这两个学期下来,我慢慢体会了写博客的意义所在。我曾经看过的一篇帖子中有一个硅谷的软件工程师这样说道,最高效的学习方式,是把知识当成一种技能来学习,写博客给了自己一个极好的机会去将自己的知识和思考外化,强迫自己以具有逻辑的方式将其表达出来。简而言之就是写博客除了检验我们的学习效果之外,还在锻炼我们的思考能力,逻辑思维能力以及表达能力。写博客其实也就相当于是在写作,通过这种写作,在表达和实践的过程中将对应的知识重构并深入理解,从而练成可以反复使用的一种技能。

  • 一个学期下来,老师不断的在强调让我们使用man -kgrep指令去检索系统调用以及查询宏定义,不得不说现在我感觉自己的搜索能力得到了很大的提高。之前,我们用百度等类似的搜索引擎去搜索东西,很多时候得到的结果往往不是我们想要的,其实主要还是因为没有抓住关键字,往往总是把一整句话直接放到文本框里搜索,没有突出关键所在,例如:我们在利用man -k搜索和时间相关函数时,应该是搜索man -k time而不是man -k time function,这就体现了关键字的重要性,在利用百度时也是一样,抓对了关键字往往会事半功倍。

  • 站在全局的角度,重新理解了计算机系统。这个学期深入理解计算机系统的学习更像是把之前两年所学的知识重新串联了一遍,重新复习了计算机导论、汇编、c语言的相关知识,在复习旧的知识同时,又掌握了许多新的知识和技巧,感觉自己对知识的理解有了更深的认识。

  • 用了git已经两个学期了,其实git只是我们去学习和理解版本控制的一个工具,版本控制的目的是实现开发团队并行开发、提高开发效率,这一点在上学期学习java的时候感触比较深,大家通过git互相对代码进行修改,方便又省时。我觉得最重要的一点还是当程序被改的体无完肤不能运行了,你可以方便的回到上一个可用的版本,或者当你发现自己想找回上周被你删除的一个函数的时候,你可以很容易的做到这一点。这就有点像我们平常将一些资料备份到云盘上,只不过版本控制是在对程序进行备份。学习了版本控制之后,我现在也非常注意及时将一些资料备份,避免出现资料丢失的情况。

自己需要改进的地方

  • 时间的分配上还存在着一些问题,在学期开始的前几周,工作和学习的时间没有平衡好,导致学习显得有些应付。幸好后面在老师的提醒下及时纠正了过来,但是每周主要的学习时间还是集中在周末,最好还是应该平衡一下,这样周末的压力也不会太大。
  • 对于学习的很多内容复习的还不够,只是学一遍,印象并不深刻,可能放下书之后就忘了所学的内容,没有做到反复阅读教材,所以理解还只是很浅层,虽然很多有之前课程的基础,还不至于看不懂,但是至于更深入的部分,也不能熟练掌握。
  • 在做实验的过程中,很多的时候只是在照着步骤做,没有真正弄懂每一步操作的含义,对一些代码分析的还不够透彻。

给学弟学妹的建议

  • 端正自己的学习态度,每周不要只是为了写一篇博客而应付,这样一个学期下来得不到任何东西。只有你自己真正意识到了学习的重要性,最后才能有所收获,并且你收获的可能不仅仅是课本上的知识,或许更多,完全取决于你自己。
  • 一定要动手实践,要想真正学到知识,光靠看和记是远远不够的,只有真正动手做了才能理解,才会有提高。
  • 分配好学习时间,尽量把学习任务平铺开,每天学一部分,周末时间多的话可以多学一点,但是不要把所有的任务都留在最后一天,这样会给自己造成很大压力。
  • 万事开头难,或许一开始换了一种学习方式很不适应,但是只要你坚持下来,认真按老师说的去做,一个学期下来,你可能会渐渐习惯甚至喜欢上这种方式,而且你能学到很多东西。千万不要想方设法偷懒,不仅什么都没得到,最后你还会发现欠下的债,都是要还的!

问卷调查

你平均每周投入到本课程多长时间?

  • 平均下来大概是25小时左右,周末学习时间会长一些。

每周的学习效率有提高吗?

  • 后面的学习效率要比之前高一些,因为做期中总结的时候把之前学习过程中出现的问题总结了一下,反思了自己的不足,所以后面及时进行了调整。

学习效果自己满意吗?

  • 总体来说比较满意,因为不单单学到了知识,还掌握了自学的方法以及有了很多感触。

课程结束后会继续一周至少一篇博客吗?

  • 会继续写博客的这个习惯,可以锻炼自己的写作能力。

你觉得这门课老师应该继续做哪一件事情?

  • 期中总结还是很有必要的,可以对之前的学习做一个反思,还能复习一下之前的学习内容。
  • 继续每周的小测,取消期末考试,这样让大家把功夫花在平时,不仅能学到东西,还能减轻期末的压力。
  • 提供一些加分项目,例如扇贝打卡,实践项目这些,给一些成绩不太好的同学机会。
  • 课上讲解每周学习的重点及难点,这样可以加深大家对课本知识的理解。

你觉得这门课老师应该停止做哪一件事情?

  • 家庭作业最后的考试感觉意义不大,大家最后都在抄答案,感觉并没有真正的理解,可以把家庭作业放在平时每周测试的考卷中。

你觉得这门课老师应该开始做什么新的事情?

  • 感觉Linux的学习可以提前一点,前两周学习的内容太多,大家可能突然之间学习Linux,很多东西还不是很适应。

本学期你与老师和同学交互最多的一篇博客是哪篇?

  • 交互最多的博客是GDB调试汇编堆栈过程分析
  • 一开始写这篇博客也是在老师的指引下,为了对堆栈的产生与销毁有个更直观的理解而写的,写完之后发现确实对堆栈的使用过程有了进一步的认识,帮助还是很大的!

本学期被阅读最多的博客是哪一篇?有何经验?

  • 阅读最多的博客是Ubuntu下git的安装与使用
  • 这其实只是一篇关于git安装学习过程中的学习记录,一开始并没有想到会有这么多的阅读量,当时写这篇博客的目的一个是为了给对git安装配置不熟悉的同学提供一个参考,另外一个是为了做个记录,防止以后在进行git安装配置时步骤出现错误。
  • 这篇博客的阅读量也给我带来了很大的鼓励,让我感受到了分享的乐趣,或许有不少人最终参照我的这篇博客成功安装并使用了git,在学习的过程中如果能够帮助到别人也会增强自信心。与此同时,我也觉得做好一些记录还是非常重要的,当你需要这些东西的时候,一下就能找出来,能够节省很多时间。

关于本文

posted @ 2016-12-24 18:04  L.X.M  阅读(821)  评论(3编辑  收藏  举报