2018-2019-1 20165203 《信息安全系统设计基础》第七周学习总结
教材学习内容总结
异常
- 异常:异常就是控制流中的突变,用来响应处理器状态中的某些变化。
- 基本思想:如图所示
- 异常的类别:
-
- 中断
-
-
- 中断是异步发生的,是来自处理器外部的I/O设备的信号的结果。
-
-
-
- 处理方法:对于IO设备,通过向处理器芯片上的一个引脚发信号,并将异常号放到系统总线上,来触发中断,这个异常号标识了引起中断的设备。当前指令完成执行后,处理器从系统总线读取异常号,调用适当的中断处理程序,处理器返回时,它就将控制返回给下一条指令。如图所示
- 处理方法:对于IO设备,通过向处理器芯片上的一个引脚发信号,并将异常号放到系统总线上,来触发中断,这个异常号标识了引起中断的设备。当前指令完成执行后,处理器从系统总线读取异常号,调用适当的中断处理程序,处理器返回时,它就将控制返回给下一条指令。如图所示
-
-
- 陷阱和系统调用
-
-
- 陷阱是有意的异常,是执行一条指令的结果。
-
-
-
- 处理方法:执行
syscall
指令,但是会导致一个到异常处理程序的陷阱,这个处理程序解析参数,并调用适当的内核程序。如图所示
- 处理方法:执行
-
-
- 故障
-
-
- 故障由错误引起的,它可能能够被故障处理程序修正。
-
-
-
- 缺页异常:当指令引用一个虚拟地址,而与该地址相对应的物理页面不在内存中,因此必须从磁盘中取出时,就会发生故障。
-
-
-
- 处理方法:根据故障是否能够被修复,故障处理程序要么重新执行引起故障的指令,要么终止。如图所示,
- 处理方法:根据故障是否能够被修复,故障处理程序要么重新执行引起故障的指令,要么终止。如图所示,
-
-
- 终止
-
-
- 终止是不可恢复的致命错误造成的结果,通常是一些硬件错误。
-
-
-
- 例子:DARM或者SRAM位被损坏时发生的奇偶错误。
-
-
-
- 处理方法:处理程序将控制返回给一个
abort
例程,该例程会终止这个应用程序。如图所示
- 处理方法:处理程序将控制返回给一个
-
- 总结:如图所示
-
- Linux/x86-64故障和终止
-
-
- 触发错误
-
-
-
- 一般保护故障
-
-
-
- 缺页
-
-
-
- 机器检查
-
进程和并发
- 进程:一个执行中程序的实例。
- 上下文:由程序正确运行所需的状态组成。这个状态包括存放在内存中的代码和数据,它的栈、通用目的寄存器的内容、程序计数器、环境变量以及打开文件描述符的集合。
- 进程的逻辑抽象
- 一个独立的逻辑控制流:它提供一个假象,好像我们的程序独占地使用处理器。
- 一个私有的地址空间:它提供一个假象,好像我们的程序独占地使用内存系统,让我们更深入地看看这些抽象。
- 并发流:一个逻辑流的执行在时间上与另一个流重叠,称为并发流,这两个流被称为并发地运行。
- 并发:多个流并发地执行的一般现象被称为并发。
- 多任务:一个进程和其他进程轮流执行的概念称为多任务。
- 时间片:一个进程执行它的控制流的一部分的每一时间段叫做时间片。
- 并行流:如果两个流并发地运行在不同的处理器核或者计算机上,那么我们称他们为并行流,它们并行地运行,且并行地执行。
进程控制
-
获取进程ID:每个进程都有一个唯一的正数进程ID(PID),
getpid
函数返回调用进程的PID,getppid
函数返回它的父进程的PID(创建调用进程的进程)。
-
创建和终止进程:
-
- 进程所处的三种状态
-
-
- 运行
-
-
-
- 停止
-
-
-
- 终止:三种原因
-
-
-
-
- 收到一个信号,该信号的默认行为是终止进程。
-
-
-
-
-
- 从主程序返回。
-
-
-
-
-
- 调用
exit
函数。
- 调用
-
-
-
- 创建进程:
-
-
- 父进程通过调用
fork
函数创建一个新的运行的子进程。
- 父进程通过调用
-
-
-
fork
函数的使用格式:如图所示
-
-
-
-
- 注意:
fork
函数只被调用一次,却会返回两次:一次是在调用进程(父进程)(fork
函数返回子进程的PID)中,一次是在新创建的子进程(fork
函数返回0)中。
- 注意:
-
-
-
waitpid
函数:来等待它的子进程终止或者停止。 -
- 使用格式:
- 使用格式:
-
- 主要作用:
-
-
- 判定等待集合的成员。
-
-
-
- 修改默认行为。
-
-
-
- 检查已回收子进程的退出状态。
-
-
-
- 错误条件:如果调用进程没有子进程,那么
waitpid
返回-1,并且设置errno
为ECHILD
,如果waitpid
函数被一个信号中断,那么它返回-1,并设置errno
为EINTR
.
- 错误条件:如果调用进程没有子进程,那么
-
-
让进程休眠:
sleep函数
----将一个进程挂起一段指定的时间。
-
- 如果请求的时间量已经到了,sleep返回0,否则返回还剩下的要休眠的秒数。
-
pause
函数:让调用函数休眠,直到该进程收到一个信号。
-
execve
函数:在当前进程的上下文中加载并运行一个新程序。
-
- 调用一次并从不返回。
-
getenv
函数:在环境数组中搜索字符串name=value
.如果找到了,它就返回一个指向value
的指针,否则,它就返回NULL.
-
setenv
函数:如果环境数组包含一个形如name=oldvalue
的字符串,那么unsetenv
会删除它,而setenv
会用newvalue
代替oldvalue
,但是只有在overwirte
非零时才会这样。如果name不存在,那么setenv就把name=newvalue
添加到数组中。
信号机制
- 信号:一个信号就是一条小消息,它通知进程系统中发生了一个某种类型的事件。
- 发送信号和接收信号。
- 用
/bin/kill
程序发送信号: -
- 例:
/bin/kill -9 15213
:发送信号9给进程15213.
- 例:
-
/bin/kill -9 -15213
:发送一个SIGKILL信号给进程组15213中的每一个进程。
-
kill
函数发送信号:调用kill函数
发送信号给其他进程。
-
-
- 如果pid>0,那么kill函数发送信号号码sig给进程pid.
-
-
-
- 如果pid=0,那么kill发送信号sig给调用进程所在进程组中的每个进程,包括调用进程自己。
-
-
-
- 如果pid<0,kill发送信号sig给进程组|pid|中的每个进程。
-
-
alarm
函数发送信号:调用alarm
函数向它自己发送SIGALRM信号。
-
-
- 如果seg=0,那么不会调度安排新的闹钟。
-
-
signal
函数:修改和信号相关联的默认行为。
教材学习中的问题和解决过程
问题:根据本周上课讲解内容,提出疑问:ls
命令为查看,那么还有没有其他的命令也可以查找呢?
解答:
find -name "文件名"
:能够精确定位查找某个文件。
find -name "文件名" -ls
这个方法能够精确定位查找某个文件,并且列出文件详情。
locate “m”
查找当前目录所有的含有m字符的字串。
locate -i“test”
查找当前目录所有的含有test字符,并且不区分大小写。
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
相对内核而言,文件分为文本文件和二进制文件。其中文本文件只含有ASCII或Unicode字符。
A .正确
B .错误
C .不确定
答案:B
解析:文件分为普通文件、目录和套接字,其中文本文件是只含有ASCII或Unicode字符的普通文件。
其他(感悟、思考等,可选)
本周的教材内容主要学习了第8章,异常控制流,了解了流的概念,及计算机系统中异常的处理方法,了解了计算机操作系统中如何打开、关闭等对进程进行一系列操作,课上内容了解了ls
的用法,并尝试着自己变成实现ls
的用法,收获很大。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 18/38 | |
第三周 | 500/1000 | 3/7 | 22/60 | |
第四周 | 300/1300 | 2/9 | 30/90 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。