2018-2019-1 20165330 《信息安全系统设计基础》第七周学习总结

2018-2019-1 20165330 《信息安全系统设计基础》第七周学习总结

学习目标

  • 了解异常及其种类
  • 理解进程和并发的概念
  • 掌握进程创建和控制的系统调用及函数使用:fork,exec,wait,waitpid,exit,getpid,getppid,sleep,pause,setenv,unsetenv
  • 理解数组指针、指针数组、函数指针、指针函数的区别
  • 理解信号机制:kill,alarm,signal,sigaction
  • 掌握管道和I/O重定向:pipe, dup,dup2

学习内容

异常
  1. 是控制流中的突变,一部分由硬件实现,一部分由操作系统实现,用来响应处理器状态中的某些变化。

  2. 异常处理

    • 异常表:在系统启动时(当计算机重启或者加电时),操作系统分配和初始化一张称为异常表的跳转表
      2018-2019-1 20165330 《信息安全系统设计基础》第七周学习总结
    • 异常表基址寄存器:存放异常表的起始地址
      2018-2019-1 20165330 《信息安全系统设计基础》第七周学习总结
    • 非本地跳转
        #include <setjmp.h>
        
        int setjmp(jmp_buf env);
        int sigsetjmp(sigjmp_buf env,int savesigs);
      
  3. 类别

类别 原因 异步/同步 返回行为
中断 来自I/O设备的信号 异步 总是返回到下一条指令
陷阱 有意的异常 同步 总是返回到下一条指令
故障 潜在可恢复的错误 同步 可能返回到当前指令
终止 不可恢复的错误 同步 不会返回
进程
  1. 系统中的每个程序都运行在某个进程的上下文中。
  2. 上下文:是由程序正确运行所需的状态组成的,包括内存中的代码和数据、它的栈、通用寄存器的内容、程序计数器、环境变量以及打开文件描述符的集合。
  3. 关键抽象
    • 逻辑控制流:提供一个假象,好像我们的程序独占地使用处理器
      2018-2019-1 20165330 《信息安全系统设计基础》第七周学习总结
    • 私有的地址空间:提供一个假象,好像我们的程序独占地使用内存系统
      2018-2019-1 20165330 《信息安全系统设计基础》第七周学习总结
  4. 并发流
    • 一个逻辑流的执行在时间上与另一个流重叠
    • 并发:多个流并发的执行的一般现象
    • 多任务(时间片):一个进程和其他进程轮流运行
  5. 上下文切换控制多任务
    • 2018-2019-1 20165330 《信息安全系统设计基础》第七周学习总结
    • 发生时机:
      • 内核调度新的进程时
      • 内核代表用户执行系统调用时
      • 中断也可引发上下文切换
进程控制
  1. 获取进程ID
       #include <sys/types.h>
       #include <unistd.h>
    
       pid_t getpid(void);
       pid_t getppid(void);
    
  2. 进程状态
    • 运行
    • 停止:进程的执行被挂起,且不会被调度。
    • 终止
      • 收到一个信号,该信号的默认行为是终止进程
      • 从主程序返回
      • 调用exit函数
           #include <stdlib.h>
        
           void exit(int status);
        
  3. 回收子进程
    • 当一个进程由于某种原因终止时,进程被保持在一种已终止的状态中,直到被它的父进程回收。
    • 一个进程调用waitpid函数等待它的子进程终止或停止
      #include <sys/types.h>
      #include <wait.h>
      
      pid_t waitpid(pid_t pid,int *statusp,int options);
    
  4. 加载并运行程序
    • execve函数在当前进程的上下文中加载并运行一个新程序
      #include <unistd.h>
      
      int execve(const char *filename,const char *argv[],const char *envp[]);
    
信号
  1. 一个信号就是一条小消息,它通知进程系统中发生了一个某种类型的事件
  2. Linux信号
    2018-2019-1 20165330 《信息安全系统设计基础》第七周学习总结
  3. 发送信号
    • 用/bin/kill程序发送:/bin/kill -9 -15213
    • 从键盘发送:ls / sort
    • kill函数发送
        #include <sys/types.h>
        #include <signal.h>
        
        int kill(pid_t pid,int sig);
      
    • alarm函数发送
        #include <unistd.h>
        
        unsigned int alarm(unsigned int secs);
      
  4. 接收信号
    • 当目的进程被内核强迫以某种方式对信号的发送做出反应时,它就接收了信号。
    • 进程可以忽略这个信号,终止或者执行下一个称为信号处理程序的用户层函数捕获这个信号。
      2018-2019-1 20165330 《信息安全系统设计基础》第七周学习总结
  5. 待处理信号
    • 一个发出而没有被接收的信号
    • 在任何时刻,一种类型至多只有一个待处理信号