2017-2018-1 20155216 《信息安全系统设计基础》第六周学习总结
教材学习内容总结
了解异常及其种类
1、中断
中断时异步发生的,是来自处理器外部的I/O设备的信号结果。在当前指令完成之后,处理器注意到中断引脚的电压变高了,就从系统总线读取异常号,然后调用适当的中断处理程序。当处理程序返回时,它就将控制返回给下一条指令。
2、陷阱
陷阱是有意的异常,是执行一条指令的结果。陷阱最重要的用途是在用户程序和内核之间提供一个像过程一样的接口,叫做系统调用。
3、故障
故障由错误情况引起,它可能能够被故障处理程序修正。当故障发生时,处理器将控制转移给故障处理程序。如果处理程序能够修正这个错误情况,它就将控制返回到引起故障的指令,从而重新执行它。否则,终止引起故障的程序。
4、终止
终止时不可恢复的致命错误造成的结果,通常是一些硬件错误。终止处理程序从不将控制返回给应用程序。
理解进程和并发的概念
进程:
多道程序在执行时,需要共享系统资源,从而导致各程序在执行过程中出现相互制约的关系,程序的执行表现出间断性的特征。这些特征都是在程序的执行过程中发生的,是动态的过程,而传统的程序本身是一组指令的集合,是一个静态的概念,无法描述程序在内存中的执行情况,即我们无法从程序的字面上看出它何时执行,何时停顿,也无法看出它与其它执行程序的关系,因此,程序这个静态概念已不能如实反映程序并发执行过程的特征。为了深刻描述程序动态执行过程的性质,人们引入“进程”概念。
进程提供给应用程序的关键抽象:
一个独立的逻辑控制流,它提供一个假象,好想我们的程序独占地使用处理器。
一个私有的地址空间,它提供一个假象,好像我们的程序独占地使用内存系统。
并发:
在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。
一个逻辑流的执行在时间上与另一个流重叠,称为并发流。
理解函数调用栈帧的概念,并能用GDB进行测试
单个函数调用操作所使用的栈部分称为栈帧结果(stack frame)。栈帧结构的两端由两个指针来指定。寄存器ebp通常用作栈帧的指针、esp用作栈的指针。esp随着数据的入栈和出栈。因此对于函数中大部分数据的访问都是通过基于帧帧指针ebp来实现。
掌握进程创建和控制的系统调用及函数使用
进程创建:
系统调用1:fork
#include<types.h>
#include<stdio.h>
pid_tfork()
返回值:子进程返回0,父进程返回子进程ID,出错返回-1。
控制的系统调用:
系统调用是操作系统提供的接口,用以与系统通信,取得系统服务。应用程序需要通过系统调用才能访问操作系统的关键资源。
系统调用是通过中断机制实现的,并且是同一个中断入口来实现。具体操作就是系统调用的时候,CPU转换为系统态,请求系统服务,处理完毕后继续执行应用程序。
并且CPU执行完每条指令时,都会去检查一个中断标志位
理解数组指针、指针数组、函数指针、指针函数的区别
数组指针:
数组名的指针,即数组首元素地址的指针。即是指向数组的指针。
指针数组:
数组元素全为指针的数组。
函数指针:
指向函数的指针变量。 因而"函数指针"本身首先应是指针变量,只不过该指针变量指向函数。
指针函数
指针函数是一个函数。函数都有返回类型(如果不返回值,则为无值型),只不过指针函数返回类型是某一类型的指针。
理解信号机制
信号用来通知进程发生了异步事件。在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的。信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。进程之间可以互相通过系统调用kill发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。信号机制除了基本通知功能外,还可以传递附加信息。
收到信号的进程对各种信号有不同的处理方法。处理方法可以分为三类:
第一种是类似中断的处理程序,对于需要处理的信号,进程可以指定处理函数,由该函数来处理。
第二种方法是,忽略某个信号,对该信号不做任何处理,就象未发生过一样。
第三种方法是,对该信号的处理保留系统的默认值,这种缺省操作,对大部分的信号的缺省操作是使得进程终止。进程通过系统调用signal来指定进程对某个信号的处理行为。
掌握管道和I/O重定向
在Unix系统中,每个进程都有STDIN、STDOUT和STDERR这3种标准I/O,它们是程序最通用的输入输出方式。几乎所有语言都有相应的标准I/O函数,比如,C语言可以通过scanf从终端输入字符,通过printf向终端输出字符。
Linux 管理的一个最重要并且有趣的话题是 I/O 重定向。此功能在命令行中使你能够将命令的输入输出取自或送到文件中,或者可以使用管道将多个命令连接在一起以形成所谓的“命令管道”。
教材学习中的问题和解决过程
-
问题1:进程创建的时机
-
问题1解决方案:
进程创建,是指操作系统创建一个新的进程。UNIX系统用fork()系统调用,而windows系统用CreatProcess()。进程创建的时机有:
(1)系统初始化。系统的调度进程创建init进程。
(2)执行中的进程调用了fork()系统函数。程序中有fork()函数。
(3)用户登录,用户命令请求创建进程。例如:用户双击一个图标。
(4)一个批处理作业初始化。大型机、高性能计算机用户提交一个课题,则系统建立作业控制块,在作业调度后在系统内存中创建进程。
-
问题2:管道与重定向的区别
-
问题2解决方案:
管道只处理正确的输出,将正确的作为下一个的输入,并且确定下一个是可以接受输入的命令,否则放弃命令
管道是有stdout(标准输出)的命令,重定向是能够接受stdin(标准输入)的命令
管道是有输出的命令,重定向只能是文件
管道是能接受输入的命令,重定向只能是文件
管道执行时,触发了两个进程,分别执行左右两边的命令
重定向是在一个进程中完成的
代码调试中的问题和解决过程
- 问题1:
#include<stdio.h>
#include<stdlib.h>
#include<types.h>
intmain(intargc,char*argv[])
{
intvalue=5;
pid_tpid;
pid=fork();//fork一个子进程
if(pid<0){//返回值小于0
printf("forkfailed
");
exit(-1);
}
elseif(pid==0){//子进程
value+=15;
printf("
childprocesspid=%d",getpid());
printf("
value=%d",value);
exit(0);
}
elseif(pid>0){//EP进程(parentprocess)
value+=5;
pirntf("
value=%d",value);
printf("EPprocesspid=%d",getpid());
printf("
value=%d",value);
exit(0);
}
}
- 问题1解决方案:
尚未找到<types.h>
代码托管
结对及互评
本周结对学习情况
- [结对同学学号1](博客链接)
- 结对照片
- 结对学习内容
- XXXX
- XXXX
- ...
其他(感悟、思考等,可选)
1、Linux系统下程序的异常处理更为复杂。
2、关于Linux下的重定向和进程以及异常处理仍需要加深理解。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第三周 | 114/114 | 3/3 | 20/20 | |
第四周 | 136/250 | 2/5 | 18/38 | |
第五周 | 87/337 | 2/7 | 22/60 | |
第六周 | 271/608 | 2/9 | 30/90 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:25小时
-
实际学习时间:20小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)