2017-2018-1 20155210 《信息安全系统设计基础》第13周学习总结

2017-2018-1 20155210 《信息安全系统设计基础》第13周学习总结

找出全书你认为最重要的一章,深入重新学习一下

  • 完成这一章所有习题
  • 详细总结本章要点
  • 给你的结对学习搭档讲解你的总结并获取反馈

教材学习内容总结

8.1 异常

  • 异常就是控制流中的突变,用来响应处理器状态中的某些变化

8.1.1 异常处理

  • 系统中可能的每种类型的异常都分配了一个唯一的非负整数的异常号。
  • 处理器:被零除、缺页、存储器访问违例、断点以及算术溢出
  • 操作系统:系统调用和来自外部I/O设备的信号

8.1.2异常的类别

  • 中断 :来自I/O设备的信号,异步,总是返回到下一条指令
  • 陷阱 :有意的异常,同步,总是返回到下一条指令
  • 故障 :潜在可恢复的错误,同步,可能返回到当前指令
  • 终止 :不可恢复的错误,同步,不会返回

8.1.3 Linux系统中的异常

Linux故障和终止 :

  • 除法错误:异常号:0,通常报告为“浮点异常”
  • 一般保护故障:异常号:13,Linux不会尝试回复这类故障,通常报告为“段故障”
  • 缺页:异常号:14,是会重新执行产生故障的指令的一个异常事例
  • 机器检查:异常号:18,从不返回控制给应用程序

Linux系统调用:

每个系统调用都有一个唯一的整数号,对应于一个到内核中跳转表的偏移量

  • 将系统调用和与他们相关的包装函数称为系统级函数

8.2 进程

异常是允许操作系统提供进程的概念所需要的基本构造块。

进程:一个执行中的程序的实例。上下文是由程序正确运行所需要的状态组成的,这个状态包括存放在存储器中的程序的代码和数据,它的栈、通用目的寄存器的内容、程序计数器、环境变量以及打开文件描述符的集合。

进程提供给应用程序的关键抽象:一个独立的逻辑控制流,独占地使用处理器;一个私有的地址空间,独占地使用存储器系统。

8.2.1 逻辑控制流

程序计数器:唯一的对应于包含在程序的可执行目标文件中的指令,或者是包含在运行时动态链接到程序的共享对象中的指令。这个PC值的序列叫做逻辑控制流,简称逻辑流。

8.2.2 并发流

  • 并发流:一个逻辑流的执行在时间上与另一个流重叠。
  • 并发:多个流并发地执行的一般现象。
  • 多任务:一个进程和其他进程轮流运行的概念。
  • 时间片:一个进程执行它的控制流的一部分的每一时间段。(多任务也叫时间分片)
  • 并行流:如果两个流并发的运行在不同的处理器核或者计算机上。

8.2.3 私有地址空间

这个空间中某个地址相关联的那个存储器字节是不能被其他进程读或者写的

8.2.4 用户模式和内核模式

  • 当设置了模式位时,进程就运行在内核模式中
  • 没有设置模式位时,进程就运行在用户模式中。用户模式中的进程不允许执行特权指令。
  • 进程从用户模式变位内核模式的唯一方法是通过诸如中断、故障或者陷入系统调用这样的异常。
  • /proc文件系统允许用户模式进程访问内核数据结构的内容

8.2.5 上下文切换

  • 上下文切换:是较高形式的异常控制流来实现多任务
  • 调度:在进程执行的某些时刻,内核可以决定抢占当前进程,并重新开始一个先前被抢占的进程。这种决定叫做调度
  • 当内核代表用户执行系统调用时,可能会发生上下文切换。如果系统调用因为等待某个事件发生阻塞,那么内核可以让当前进程休眠,切换到另一个进程
  • 中断也可能引发上下文切换

8.3 系统调用错误处理

  • 定义错误报告函数,简化代码
  • 错误处理包装函数

8.4 进程控制

8.4.1 获取进程ID

  • 每个进程都有一个唯一的正数的进程ID。
  • getpid函数返回调用进程的PID,getppid函数返回它的父进程的PID。上面两个函数返回一个同类型为pid_t的整数值,在linux系统中,它在types.h中被定义为int。

8.4.2 创建和终止进程

  • 进程总处于三种状态

(1)运行:进程要么在CPU上执行,要么在等待被执行且最终会被内核调度。

(2)停止:程序的执行被挂起,,且不会被调度。

(3)终止:进程用永远停止了。

  • 终止原因:

(1)收到一个信号,默认行为是终止进程

(2)从主进程返回

(3)调用exit函数

  • 父进程通过调用fork函数创建一个新的运行的子进程。
  • 子进程和父进程的异同:

(1)异:有不同的PID

(2)同:用户级虚拟地址空间,包括:文本、数据和bss段、堆以及用户栈。任何打开文件描述符,子进程可以读写父进程中打开的任何文件。

  • fork函数: 因为父进程的PID总是非零的,返回值就提供一个明确的方法来分辨程序是在父进程还是在子进程中执行。
  • fork函数的特点:

(1)调用一次,返回两次

(2)并发执行

(3)相同的但是独立的地址空间

(4)共享文件

8.4.3 回收子进程

当父进程回收已终止的子进程时,内核将子进程的退出状态传递给父进程,然后抛弃已终止的进程。一个终止了但还未被回收的进程称为僵死进程。

一个进程可以通过调用waitpid函数来等待它的子进程终止或者停止。

#include <sys/types.h>
#include <sys/wait.h>

pid_t waitpid(pid_t pid,int *status,int options);
//返回:若成功,返回子进程的PID;若WNOHANG,返回0;若其他错误,返回-1。

默认地,当option=0时,waitpid挂起调用进程的执行,直到它的等待集合中的一个子进程终止。

  • 判定等待集合的成员

有参数pid来确定的:

(1)pid>0:等待集合是一个单独的子进程,进程ID等于pid。

(2)pid=-1:等待结合就是由父进程所有的子进程组成的。

  • 修改默认行为

通过options设置:

(1)WNOHANG:默认行为是挂起调用进程。

(2)WUNTRACED:默认行为是只返回已终止的子进程。

(3)WNOHANG|WUNTRACED:立即返回,如果等待集合中没有任何子进程被停止或者已终止,那么返回值为0,或者返回值等于那个被停止或者已经终止的子进程的PID。

  • 检查已回收子进程的退出状态

wait.h头文件定义了解释status参数的几个宏:

(1)WIFEXITED:如果子进程通过调用exit或者一个返回正常终止,就返回真;

(2)WEXITSTATUS:返回一个正常终止的子进程的退出状态。只有在WIFEXITED返回真时,才会定义这个状态。

  • 错误条件

(1)若调用进程没有子进程,那么waitpid返回-1,并且设置errno为ECHILD;

(2)若waitpid函数被一个信号中断,那么返回-1,并设置errno为EINTR

wait函数:

#include <sys/types.h>
#include <sys/wait.h>

    pid_t wait(int *status);
    //返回:若成功,返回子进程的PID;若错误,返回-1。

调用wait(&status)等价于调用waitpid(-1.&status,0)

8.4.4 让进程休眠

  • sleep函数:将进程挂起一段指定的时间
#include

    unsigned int sleep(unsigned int secs);
    //返回:还要休眠的秒数

如果请求的时间量已经到了,返回0,否则返回还剩下的要休眠的秒数。

  • pause函数:让调用函数休眠,直到该进程收到一个信号。
#include

    int pause(void);
    //返回:总是-1

8.4.5 加载并运行程序

  • execve函数:在当前进程的上下文中加载并运行一个新程序。
#include

    int execve(const char *filename,const char *argv[],const char *envp[]);
    //返回:若成功,则不返回,若错误,返回-1

filename:可执行目标文件

argv:带参数列表

envp:环境变量列表

特点:execve调用一次从不返回

  • getenv函数:在环境数组中搜素字符串“name =VALUE”,若找到了,就返回一个指向value的指针,否则它就返回NULL。

注意:

execve函数在当前进程的上下文中加载并运行一个新的进程。它会覆盖当前进程的地址空间,并没有创建一个新的进程,新的进程仍然有相同的PID,并且继承了调用execve函数时已打开的所有文件描述符。

8.4.6 利用fork和execve运行程序

外壳是一个交互型的应用级程序,它代表用户运行其他程序。

外壳执行一系统的读/求值步骤,然后终止。读步骤读取来自用户的一个命令行,求值步骤解释命令行,并代表用户运行程序。

  • eval函数:对外壳命令行求值
  • parseline函数:解析外壳的一个输入

8.5 信号

  • Unix信号:更高层的软件形式的异常,允许进程中断其他进程

P505:30种不同类型的信号表

8.5.1 信号术语

  • 发送信号:

    (1)内核检测到一个系统事件

(2)一个进程调用了kill函数

  • 接收信号:当目的进程被内核强迫以某种方式对发送的信号作出反应时,目的进程就接收了信号
  • 待处理信号:一个只发出而没有被接收的信号

8.5.2 发送信号

  • 进程组

每个进程都只属于一个进程组

一个进程可以通过使用setpigd函数来改变自己或者其他进程的进程组

  • 用/bin/kill程序发送信号 一个为负的PID会导致信号被发送到进程组PID中的每个进程中

8.5.3 接收信号

  • 如果集合是非空的,那么内核选择集合中的某个信号k,并且强制p接收信号k
  • signal函数可以改变和信号signum相关联的行为

8.5.4 信号处理问题

  • 捕获多个信号时的问题:

(1)待处理信号被阻塞

(2)待处理信号不会排队等待

(3)系统调用可以被中断

8.5.5 可移植的信号处理

  • 不同系统之间,信号处理语义有差异
  • sigaction函数明确地指定它们想要的信号处理语义

8.5.6 显式地阻塞和取消阻塞

  • 应用程序可以使用sigprocmask函数显式地阻塞和取消阻塞选择的信号,sigprocmask函数改变当前已阻塞信号的集合

8.6非本地跳转

  • 通过setjmp和longjmp函数来提供

setjmp函数只被调用一次,但返回多次:一次是当第一次调用setjmp,而调用环境保存在缓冲区env中时,一次是为每个相应的longjmp调用

longjmp只调用一次,但从不返回

非本地跳转的一个重要应用就是允许从一个深层嵌套的函数调用中立即返回,通常是由检测到某个错误情况引起的

非本地跳转的另一个重要应用是使一个信号处理程序分支到一个特殊的代码位置,而不是返回到达中断了的指令位置

8.7 操作进程的工具

Linux系统提供监控和操作进程的工具:打印一个正在运行的程序和它的子进程调用的每个系统调用的轨迹(STRACE)、列出当前系统中包括僵死进程的进程(PS)、打印出关于当前进程资源使用的信息(TOP)、显示进程的存储器映射(PMAP)、虚拟文件系统(/proc)+

  • getpid函数:
#include <unistd.h>
#include <sys/types.h>
pid_t getpid (void);
pid_t getppid(void);
  • kill:

kill()函数不仅可以终止进程(实际上是通过发出SIGKILL信号终止),也可以向进程发送其他信号。

  • alarm:

也称为闹钟函数,它可以在进程中设置一个定时器,当定时器指定的时间到时,它就向进程发送SIGALARM信号。要注意的是,一个进程只能有一个闹钟时间,如果在调用alarm()之前已设置过闹钟时间,则任何以前的闹钟时间都被新值所代替。

  • signal()、sigaction()

linux主要有两个函数实现信号的安装:signal()、sigaction()。其中signal()只有两个参数,不支持信号传递信息,主要是用于前32种非实时信号的安装;而sigaction()是较新的函数(由两个系统调用实现:sys_signal以及sys_rt_sigaction),有三个参数,支持信号传递信息,主要用来与 sigqueue() 系统调用配合使用,当然,sigaction()同样支持非实时信号的安装。sigaction()优于signal()主要体现在支持信号带有参数。

  • eval函数:对外壳命令行求值
  • exit函数:
#include <stdlib.h>
void exit (int status);
  • parseline函数:解析外壳的一个输入
  • getenv函数:在环境数组中搜素字符串“name =VALUE”,若找到了,就返回一个指向value的指针,否则它就返回NULL。
        #include <stdlib.h>
        char *getenv(const char *name);
        //返回:存在,返回指向name的指针,若无匹配的,为NULL

注意:

execve函数在当前进程的上下文中加载并运行一个新的进程。它会覆盖当前进程的地址空间,并没有创建一个新的进程,新的进程仍然有相同的PID,并且继承了调用execve函数时已打开的所有文件描述符。

execve函数:在当前进程的上下文中加载并运行一个新程序。

        #include <unistd.h>
        int execve(const char *filename,const char *argv[],const char *envp[]);
        //返回:若成功,则不返回,若错误,返回-1

filename:可执行目标文件

argv:带参数列表

envp:环境变量列表

特点:execve调用一次从不返回

  • setenv函数
#include<stdlib.h>
int setenv(const char *name,const char *value,int overwrite);
  • pause函数:让调用函数休眠,直到该进程收到一个信号。
        #include <unistd.h>
        int pause(void);
        //返回:总是-1
  • sleep函数:将进程挂起一段指定的时间
        #include <unistd.h>
        unsigned int sleep(unsigned int secs);
        //返回:还要休眠的秒数

如果请求的时间量已经到了,返回0,否则返回还剩下的要休眠的秒数。

  • wait函数
        #include <sys/types.h>
        #include <sys/wait.h>

        pid_t wait(int *status);
        //返回:若成功,返回子进程的PID;若错误,返回-1。

调用wait(&status)等价于调用waitpid(-1.&status,0)

  • waitpid函数

教材学习中的习题和解决过程

(一个模板:我看了这一段文字 (引用文字),有这个问题 (提出问题)。 我查了资料,有这些说法(引用说法),根据我的实践,我得到这些经验(描述自己的经验)。 但是我还是不太懂,我的困惑是(说明困惑)。【或者】我反对作者的观点(提出作者的观点,自己的观点,以及理由)。 )

代码调试中的问题和解决过程

  • 问题1:XXXXXX
  • 问题1解决方案:XXXXXX
  • 问题2:XXXXXX
  • 问题2解决方案:XXXXXX
  • ...

代码托管

(statistics.sh脚本的运行结果截图)

结对及互评

点评模板:

  • 博客中值得学习的或问题:

    • xxx
    • xxx
    • ...
  • 代码中值得学习的或问题:
    • xxx
    • xxx
    • ...
  • 其他

本周结对学习情况

- [结对同学学号1](博客链接)
- 结对照片
- 结对学习内容
    - XXXX
    - XXXX
    - ...

其他(感悟、思考等,可选)

xxx

xxx

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 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就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

  • 计划学习时间:20小时
  • 实际学习时间:20小时
  • 改进情况:

(有空多看看现代软件工程 课件

软件工程师能力自我评价表)

参考资料

时间: 2024-08-10 15:11:54

2017-2018-1 20155210 《信息安全系统设计基础》第13周学习总结的相关文章

信息安全系统设计基础第13周学习总结

知识点总结 并发编程*序 并发:逻辑控制流在时间上重叠. 应用级并发的应用: 访问慢速I/O设备 与人交互 通过推迟工作以降低延迟 服务多个网络客户端 在多核机器上进行并行计算 进程 I/O多路复用 线程 基于进程的并发编程 最简单的构造并发程序的方法是进程. 下图是基于进程的并发echo服务器: 图 几点需要说明的内容: 因为服务器会运行很长时间,所以需要一个SIGCHLD处理程序来回收僵死子进程的资源. 父子进程必须关闭它们各自的connfd拷贝,以避免存储器泄露. 因为套接字的文件表表项的

20145216 史婧瑶《信息安全系统设计基础》第一周学习总结

20145216 <信息安全系统设计基础>第一周学习总结 教材学习内容总结 Linux基础 1.ls命令 ls或ls .显示是当前目录的内容,这里“.”就是参数,表示当前目录,是缺省的可以省略.我们可以用ls -a .显示当前目录中的所有内容,包括隐藏文件和目录.其中“-a” 就是选项,改变了显示的内容.如图所示: 2.man命令 man命令可以查看帮助文档,如 man man : 若在shell中输入 man+数字+命令/函数 即可以查到相关的命令和函数:若不加数字,那man命令默认从数字较

20145311 《信息安全系统设计基础》第一周学习总结

20145311 <信息安全系统设计基础>第一周学习总结 教材学习内容总结 常用的部分命令 CTRL+SHIFT+T:新建标签页,编程时有重要应用: ALT+数字N:终端中切换到第N个标签页,编程时有重要应用: Tab:终端中命令补全,当输入某个命令的开头的一部分后,按下Tab键就可以得到提示或者帮助完成: CTRL+C:中断程序运行 Ctrl+D:键盘输入结束或退出终端 Ctrl+S: 暂定当前程序,暂停后按下任意键恢复运行 Ctrl+A: 将光标移至输入行头,相当于Home键 Ctrl+E

20145216史婧瑶《信息安全系统设计基础》第九周学习总结

20145216史婧瑶<信息安全系统设计基础>第九周学习总结 教材内容总结 第十章 系统级I/O 输入/输出(I/O)是在主存和外部设备之间拷贝数据的过程. 第一节 Unix I/O 这一节涉及到操作系统的基本抽象之一--文件.也就是说,所有的I/O设备都被模型化为文件,而所有的输入输出都被当做对相应文件的读/写.相关的执行动作如下: 1.打开文件: 应用程序向内核发出请求→要求内核打开相应的文件→内核返回文件描述符 文件描述符:一个小的非负整数,用来在后续对此文件的所有操作中标识这个文件.有

20145311 《信息安全系统设计基础》第二周学习总结

20145311 <信息安全系统设计基础>第二周学习总结 教材学习内容总结 重新学习了一下上周的一部分命令:grep main wyx.c(grep的全文检索功能)ls > ls.txt :ls内容输出到文本find pathname -mtime -n/+nfind -size -n/+n (find的功能还是比较强大) 简单地学习了一下vim编辑器,跟着vimtutor简单地学了一些,在linux bash中使用vim能够极大地提高效率, vim的用法比较多,只学习了其中简单的一部分

20145339《信息安全系统设计基础》第一周学习总结

20145339顿珠达杰<信息安全系统设计基础>第一周学习总结 ◆ Linux是一个操作系统.如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 物理机系统上可以通过使用[Ctrl]+[Alt]+[F1]-[F6]进行终端和图形界面切换,在线实验环境中按下[Ctrl]+[Alt]+[F7]来完成切换.普通意义上的 Shell 就是可以接受用户输入命令的程序,Unix/Linux 操作系统下的 Shell 既是用户交互的界面,也是控制系统的

2017-2018-1 20155228 《信息安全系统设计基础》第九周学习总结

2017-2018-1 20155228 <信息安全系统设计基础>第九周学习总结 教材学习内容总结 常见的存储技术 RAM 随机访问存储器(Random-Access Memory, RAM)分为两类:静态的和动态的.静态 RAM(SRAM)比动态RAM(DRAM)更快,但也贵得多.SRAM用来作为高速缓存存储 器,既可以在CPU芯片上,也可以在片下.DRAM用来作为主存以及图形系统的帧缓冲 区.典型地,一个桌面系统的SRAM不会超过几兆字节,但是DRAM却有几百或几千兆 字节. SRAM将每

2017-2018-1 20155332 《信息安全系统设计基础》第九周学习总结

2017-2018-1 20155332 <信息安全系统设计基础>第九周学习总结 教材学习内容总结 简单模型中,存储器是一个线性的字节数组.真实模型中,是一个具有不同容量,成本,访问时间的存储层次结构(存储器山) 程序的局部性很重要,对程序性能有很重要的影响. 计算机系统一个基本而持久的思想,如果你理解了系统是如何将数据在存储器层级结构中上下移动,你就可以编写程序,让数据存储在层次结构中较高的地方,从而CPU可以更快的访问到他们. 编写程序实现功能是最简单的,如何让编写的程序拥有最高的性能,例

2017-2018-1 20155227 《信息安全系统设计基础》第九周学习总结

2017-2018-1 20155227 <信息安全系统设计基础>第九周学习总结 教材学习内容总结 第六章 随机访问存储器 随机访问存储器分为:静态RAM(SRAM)和动态RAM(DRAM),静态RAM(SRAM)比动态RAM(DRAM)更快,但也贵很多. (1)静态RAM SRAM将每个位存储在一个双稳态的存储器单元里,每个单元是用一个六晶体管电路来实现的. 属性:它可以无限制地保持在两个不同的电压配置或状态之一.其他任何状态都是不稳定的. 特点:由于SRAM的双稳态特性,只要有电,它就会永

2017-2018-1 20155334 《信息安全系统设计基础》第九周学习总结

2017-2018-1 20155334 <信息安全系统设计基础>第九周学习总结 学习目标: 了解常见的存储技术(RAM.ROM.磁盘.固态硬盘等) 理解局部性原理 理解缓存思想 理解局部性原理和缓存思想在存储层次结构中的应用 高速缓存的原理和应用 教材学习内容总结 一.常见的存储技术: 基本的存储技术包括随机存储器(RAM).非易失性存储器(ROM)和磁盘. 1. RAM分静态RAM(SRAM)和动态RAM(DRAM). 2. SRAM快些,主要用做CPU芯片上的高速缓存,也可以用作芯片下的