2017-2018-1 20155320《信息安全系统设计基础》第一周学习总结
教材问题
- 第一章 计算机各个组件如何相互影响?系统硬件如何组成的?
- 第二章 IEEE是什么?
- 第三章 机器机是什么?学会看懂反汇编码
- 第四章 Y86指令集的理解与使用
- 第五章 优化程序性能要注意哪些方面?
- 第六章 如何写好一个从高速缓存存取数据的程序?
- 第七章 静态链接是什么?静态链接需要注意哪些?
- 第八章 如何对进程进行控制?
- 第九章 为何要动态存储器分配?什么是虚拟存储器?
- 第十章 c语言中使用I/O函数要注意的问题?
- 第十一章 套接字借口是什么?web服务器如何编写?
- 第十二章 并发编程对服务有什么影响?
教材学习内容总结
第一章
- 信息就是位+上下文。源程序以字节序列的方式存储在文件中,系统中所有信息——包括磁盘文件、存储器中的程序、存储器中存放的用户数据以及网上传送的数据,都是由一串位表示的,区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。只由ASCII字符构成的文件称为文本文件,所有其他文件都是二进制文件。
- 程序的生命周期由一个高级C语言程序开始,若要运行该程序需要将每条C语句转化成一系列的低级机器语言指令并按可执行目标程序的格式打包,并以二进制磁盘文件的形式存放。目标程序称为可执行目标文件。
- hello.c——>预处理器(cpp)——hello.i——>编译器(ccl)——hello.s——>汇编器(as)——hello.o——>链接器(ld)——hello(可执行目标文件——>
- 系统的硬件组成:总线、I/O设备、主存、处理器。
1.通常总线被设计成传送定长的字节块即字。
2.主存是一个临时存储设备,用来存放程序和程序处理的数据。
3.加载:从主存复制到寄存器;
存储:从寄存器复制到主存。
-
一个系统上可以同时运行多个进程。
-
文件就是字节序列。
-
并发:指一个同时具有多个活动的系统
并行:指的是用并发使一个系统运行的更快
本周课堂学习内容
-
Linux下编程:
1.vi hello.c
2.编译gcc hello.c
3.运行./a.out
4.查看运行完程序的返回值echo $?
-
od -tc -tx1 hello.c
用文本查看ASCII码 -
gcc -E hello.c -o hello.i
hello.c——>hello.i预处理gcc -S hello.i -o hello.s
hello.i——>hello.s编译gcc -c hello.s -o hello.o
汇编码——>机器码
第七章
- 链接是将各种代码和数据部分收集起来并组合成为一个单一文件的过程,这个文件可被加载(或拷贝)到存储器并执行。
- 连接静态库
ar rcs libhello.a hello.o
gcc main.c -L -lhello
教材学习中的问题和解决过程
- 问题1:在学习第七章的过程中,我将重点放在了静态链接和动态链接的学习上,但是对其区别并不十分了解。
- 问题1解决方案:通过查找,在博客静态链接与动态链接的区别中了解到
动态链接:
特点:在生成可执行文件的时候(链接阶段),把所有需要的函数的二进制代码都包含到可执行文件中去。因此,链接器需要知道参与链接的目标文件需要哪些函数,同时也要知道每个目标文件都能提供什么函数,这样链接器才能知道是不是每个目标文件所需要的函数都能正确地链接。如果某个目标文件需要的函数在参与链接的目标文件中找不到的话,链接器就报错了。目标文件中有两个重要的接口来提供这些信息:一个是符号表,另外一个是重定位表。
优点:在程序发布的时候就不需要的依赖库,也就是不再需要带着库一块发布,程序可以独立执行
缺点:
程序体积会相对大一些。
如果静态库有更新的话,所有可执行文件都得重新链接才能用上新的静态库。
动态链接:
特点: 在编译的时候不直接拷贝可执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运行到指定的代码时,去共享执行内存中已经加载的动态库可执行代码,最终达到运行时连接的目的。
优点: 多个程序可以共享同一段代码,而不需要在磁盘上存储多个拷贝。
缺点: 由于是运行时加载,可能会影响程序的前期执行性能
代码调试中的问题和解决过程
- 问题1:在linux系统中实践设断点时,四种断点的设法和应用不十分清楚。
- 问题1解决方案:,通过复习上课笔记和上网查资料,我大致明白了四种断点的设法。
1.条件断点:b fxx(函数名)
2.条件断点:b 12 if i=5000
- 行断点:b 行号
4.临时断点:tb 行号
还可以通过p 变量
在调试过程中来查看变量的值
p k=4
,来假设正确调试后面的代码
PS🅱️设断点
r:运行
stop(s):进入函数的下一步
next(n);不进入函数的下一步
- 问题2:XXXXXX
- 问题2解决方案:XXXXXX
- ...
代码托管
上周考试错题总结
无
结对及互评
暂无
本周结对学习情况
- 20155326
- 结对照片
- 结对学习内容
- 学习了课本第一章、第七章的内容
- 在Linux下代码的编译和调试
其他(感悟、思考等,可选)
本周主要学习了一下linux下的代码编译和调试以及静态链接和动态链接的相关内容。上学期学java时虽然初步学习了一些linux下的命令,但是由于当时主要是在Windows环境下写代码,很多命令几乎都得重新熟悉,最初是感觉很不方便也不习惯,但是由于虚拟机出现了些问题,我在实验楼里学习过后感觉手感好了很多。确实命令这些东西还是需要实践与理论相结合着来学,不然总感觉记不住,以后要多多实践。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 200小时 | |
第一周 | 5/5 | 1/1 | 15 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:22小时
-
实际学习时间:15小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)