20145317《信息安全系统设计基础》第10周学习总结1

20145317《信息安全系统设计基础》第10周学习总结1

第八章 异常控制流

异常

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

  • 异常处理

    1. 异常号:一些是有处理器的设计者分配(包括被零除、缺页、存储器访问违例、断电及算数溢出)其他由操作系统内核的设计者分配(包括系统调用和来自外部I/O设备的信号)。
    2. 异常号是到异常表中的索引。
    3. 异常与过程调用的区别(P482)
  • 异常分为四类:中断、陷阱、故障和终止。
    1. 只有中断是异步发生的,其余三个是同步发生的
    2. 陷阱最重要的用途是在用户程序和内核之间提供一个像过程一样的接口--系统调用。系统调用运行在内核模式中

    各种异常类型术语根据系统不同会有所不同,但对于每个系统,基本概念是相同的。

进程

进程是计算机科学中最深刻最成功的概念之一。系统中的每个程序都是运行在某个进程的上下文中的。(上下文是由程序正确运行所需的状态组成的)

  • 一个独立的逻辑控制流

    1. 一个逻辑流的执行在时间上与另一个流重叠,称为并发流。
    2. 多个流并发地执行的一般现象称为冰法。
    3. 多任务也叫作时间分片:一个进程和其他进程轮流运行的概念称为多任务。
    4. 并行流是并发流的一个真子集。
  • 私有地址空间
  • 上下文切换
    1. 上下文切换是较高层形式的异常控制流。
    2. 内核使用上下文切换来实现多任务。
    3. 调度:在进程执行的某些时刻,内核可以决定抢占当前进程,并重新开始一个先前被抢占的进程。
    4. 当内核代表用户执行系统调用时,可能会发生上下文切换。一般,即使系统调用没有阻塞,内核也可以决定执行上下文切换,而非将控制返回给调用进程。
    5. 中断也可能引发上下文切换。

进程控制

  • 获取进程ID
  • 创建和终止进程
  • 回收子进程
  • 等待回收子进程
    1. 引入:一个进程可以通过调用waitpid函数来等待它的子进程终止或者停止

      #include<sys/types.h>

      #incldue<sys/wait.h>

      pidt waitpid(pidt pid,int *status,int options);//如果成功,返回子进程的PID,如果为WNOHANG,则为0,其他错误则为-1

    2. 说明:默认地,即当options=0的时候,waitpid挂起调用进程的执行,直到它的等待集合中的一个子进程终止。如果等待集合中的一个进程在刚调用的时候就已经终止了,那么waitpid就立即返回。以上两种情况都会使得waitpid函数返回已经终止的子进程的PID,并且去除该进程。
    3. 判断等待集合的成员

      如果pid>0,那么等待的集合就是一个单独的子进程,它的进程ID等于pid; 如果pid<-1,那么等待集合就是由父进程的所有子进程组成的

    4. 修改默认行为 可以通过将options设置为常量WNOHANG和WUNTRACED的各种组合,修改默认行为: WNOHANG:如果等待集合中的任何子进程都还没有都还没有终止,那么就立即返回0; WUNTRACED:挂起调用进程的执行,直到等待集合中的一个变成已经终止的或者被停止,然后返回导致返回的子进程的PID; WNOHANG|WUNTRACED:立即返回。
    5. 检查已回收子进程的退出状态 非空的status参数会被放上status参数的关于返回的子进程的状态信息(wait.h定义了status参数的几个宏) WIFEXITED:如果子进程通过调用exit函数或者一个返回即return政策终止,就返回真; WEXITSTATUS:返回一个正常终止的子进程的退出状态(在WIFEXITED返回为真的时候才定义这个状态) WIFSINGALED:如果子进程是因为一个未被捕获的信号终止的,那么就返回真; WTERMSIG:返回导致子进程终止的信号的编号。只有在WIFSINGALED为真的时候,才定义这个状态。
    6. 错误条件 如果调用进程没有子进程,那么waitpid函数返回-1,并且设置errno为ECHLD; 如果waitpid函数被一个信号中断,那么它返回-1,并设置errno为EINTR
    7. 应用举例

      #include "csapp.h"
      #define N 2
      int main() {
          int status,i;
           pidt pid;
           for(i =0;i<N;i++)
              if((pid = fork())==0)
                  exit(100+i);
          while((pid = waitpid(-1,&status,0))>0) {
               if(WIFEXITED(status))
                  printf("child %d terminated normally with exit status = %d\n",pid,WEXITSTATUS(status));
              else
                  printf("child %d terminated abnormally\n",pid);
           }
           if(errno != ECHILD) unixerror("waitpid error");
               exit(0);
      }        
(1). 父进程创建N个子进程,然后子进程以一个唯一的退出状态退出;
(2).waitpid函数被阻塞直到某个子进程终止,然后进入while循环测试是否是正常终止的;是正常的话就输出;
(3).当回收了所有的子进程之后,再调用waitpid就返回-1,并且设置errno为ECHILD;如果不是正常终止的,就输出一个错误消息
  • 函数使用

    1. sleep函数将一个进程挂起一段指定的时间

      #include <unistd.h>
      unsigned int sleep(unsigned int secs);
    2. pause函数让调用函数休眠,直到该进程收到一个信号

      #include <unistd.h>
      int pause(void);
    3. execve函数在当前进程的上下文中加载并运行一个新程序

      #include <unistd.h>
      int execve(const char *filename,const char *argv[],const char *envp[]);
    4. getenv、setenv、unsetenv函数(P501)
    5. 关于fork和execve的区别: fork函数在新的子进程中运行相同的程序,新的子进程是父进程的一个复制品; 而execve函数在当前进程的上下文中加载并运行一个新的程序,会覆盖当前进程的地址空间,但并没有创建一个新进程。

信号

Unix信号是一种更高层的软件形式的异常

  • 信号术语

    1. 发送信号

      (1). 用/bin/kill程序发送信号

      unix> /bin/kill -9 15213

      (2).从键盘发送信号

      (3).用kill函数发送信号

      #include "csapp.h"
      int main(){
          pid_t pid;
      
          if ((pid = Fork()) == 0){
              Pause();
              printf("control should never reach here!\n");
              exit(0);
          }
      
          Kill(pid,SIGKILL);
          exit(0);
      }

      (4).用alarm函数发送信号

      #include "csapp.h"
      
      void handler(int sig)
      {
          static int beeps = 0;
          printf("BEEP\n");
          if (++beeps<5)
              Alarm(1);
          else{
              printf("BOOM!\n");
              exit(0);
          }
      }
      
      int main()
      {
          Signal(SIGALRM,handler);
          Alarm(1);
          while(1){
              ;
          }
          exit(0);
      }
    2. 接收信号

      (1)signal函数可以改变和信号signum相关联的行为

    3. 处理信号
    4. 可移植的信号处理问题

      (1)sigaction函数

  • 非本地跳转 将控制直接从一个函数转移到另一个当前正在执行的函数
    1. 通过setjmp和longjmp提供
  • 操作进程的工具
    1. STRACE:打印一个正在运行的程序和它的子进程调用的每个系统调用的轨迹
    2. PS:列出当前系统中的进程(包括僵死进程)
    3. TOP:打印出关于当前进程资源使用的信息
    4. PMAP:显示进程的存储器映射

      第八章 异常控制流

      异常

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

      • 异常处理

        1. 异常号:一些是有处理器的设计者分配(包括被零除、缺页、存储器访问违例、断电及算数溢出)其他由操作系统内核的设计者分配(包括系统调用和来自外部I/O设备的信号)。
        2. 异常号是到异常表中的索引。
        3. 异常与过程调用的区别(P482)
      • 异常分为四类:中断、陷阱、故障和终止。
        1. 只有中断是异步发生的,其余三个是同步发生的
        2. 陷阱最重要的用途是在用户程序和内核之间提供一个像过程一样的接口--系统调用。系统调用运行在内核模式中

        各种异常类型术语根据系统不同会有所不同,但对于每个系统,基本概念是相同的。

      进程

      进程是计算机科学中最深刻最成功的概念之一。系统中的每个程序都是运行在某个进程的上下文中的。(上下文是由程序正确运行所需的状态组成的)

      • 一个独立的逻辑控制流

        1. 一个逻辑流的执行在时间上与另一个流重叠,称为并发流。
        2. 多个流并发地执行的一般现象称为冰法。
        3. 多任务也叫作时间分片:一个进程和其他进程轮流运行的概念称为多任务。
        4. 并行流是并发流的一个真子集。
      • 私有地址空间
      • 上下文切换
        1. 上下文切换是较高层形式的异常控制流。
        2. 内核使用上下文切换来实现多任务。
        3. 调度:在进程执行的某些时刻,内核可以决定抢占当前进程,并重新开始一个先前被抢占的进程。
        4. 当内核代表用户执行系统调用时,可能会发生上下文切换。一般,即使系统调用没有阻塞,内核也可以决定执行上下文切换,而非将控制返回给调用进程。
        5. 中断也可能引发上下文切换。

      进程控制

      • 获取进程ID
      • 创建和终止进程
      • 回收子进程
      • 等待回收子进程
        1. 引入:一个进程可以通过调用waitpid函数来等待它的子进程终止或者停止

          #include<sys/types.h>

          #incldue<sys/wait.h>

          pidt waitpid(pidt pid,int *status,int options);//如果成功,返回子进程的PID,如果为WNOHANG,则为0,其他错误则为-1

        2. 说明:默认地,即当options=0的时候,waitpid挂起调用进程的执行,直到它的等待集合中的一个子进程终止。如果等待集合中的一个进程在刚调用的时候就已经终止了,那么waitpid就立即返回。以上两种情况都会使得waitpid函数返回已经终止的子进程的PID,并且去除该进程。
        3. 判断等待集合的成员

          如果pid>0,那么等待的集合就是一个单独的子进程,它的进程ID等于pid; 如果pid<-1,那么等待集合就是由父进程的所有子进程组成的

        4. 修改默认行为 可以通过将options设置为常量WNOHANG和WUNTRACED的各种组合,修改默认行为: WNOHANG:如果等待集合中的任何子进程都还没有都还没有终止,那么就立即返回0; WUNTRACED:挂起调用进程的执行,直到等待集合中的一个变成已经终止的或者被停止,然后返回导致返回的子进程的PID; WNOHANG|WUNTRACED:立即返回。
        5. 检查已回收子进程的退出状态 非空的status参数会被放上status参数的关于返回的子进程的状态信息(wait.h定义了status参数的几个宏) WIFEXITED:如果子进程通过调用exit函数或者一个返回即return政策终止,就返回真; WEXITSTATUS:返回一个正常终止的子进程的退出状态(在WIFEXITED返回为真的时候才定义这个状态) WIFSINGALED:如果子进程是因为一个未被捕获的信号终止的,那么就返回真; WTERMSIG:返回导致子进程终止的信号的编号。只有在WIFSINGALED为真的时候,才定义这个状态。
        6. 错误条件 如果调用进程没有子进程,那么waitpid函数返回-1,并且设置errno为ECHLD; 如果waitpid函数被一个信号中断,那么它返回-1,并设置errno为EINTR
        7. 应用举例

          #include "csapp.h"
          #define N 2
          int main() {
              int status,i;
               pidt pid;
               for(i =0;i<N;i++)
                  if((pid = fork())==0)
                      exit(100+i);
              while((pid = waitpid(-1,&status,0))>0) {
                   if(WIFEXITED(status))
                      printf("child %d terminated normally with exit status = %d\n",pid,WEXITSTATUS(status));
                  else
                      printf("child %d terminated abnormally\n",pid);
               }
               if(errno != ECHILD) unixerror("waitpid error");
                   exit(0);
          }        
      (1). 父进程创建N个子进程,然后子进程以一个唯一的退出状态退出;
      (2).waitpid函数被阻塞直到某个子进程终止,然后进入while循环测试是否是正常终止的;是正常的话就输出;
      (3).当回收了所有的子进程之后,再调用waitpid就返回-1,并且设置errno为ECHILD;如果不是正常终止的,就输出一个错误消息
      • 函数使用

        1. sleep函数将一个进程挂起一段指定的时间

          #include <unistd.h>
          unsigned int sleep(unsigned int secs);
        2. pause函数让调用函数休眠,直到该进程收到一个信号

          #include <unistd.h>
          int pause(void);
        3. execve函数在当前进程的上下文中加载并运行一个新程序

          #include <unistd.h>
          int execve(const char *filename,const char *argv[],const char *envp[]);
        4. getenv、setenv、unsetenv函数(P501)
        5. 关于fork和execve的区别: fork函数在新的子进程中运行相同的程序,新的子进程是父进程的一个复制品; 而execve函数在当前进程的上下文中加载并运行一个新的程序,会覆盖当前进程的地址空间,但并没有创建一个新进程。

      信号

      Unix信号是一种更高层的软件形式的异常

      • 信号术语

        1. 发送信号

          (1). 用/bin/kill程序发送信号

          unix> /bin/kill -9 15213

          (2).从键盘发送信号

          (3).用kill函数发送信号

          #include "csapp.h"
          int main(){
              pid_t pid;
          
              if ((pid = Fork()) == 0){
                  Pause();
                  printf("control should never reach here!\n");
                  exit(0);
              }
          
              Kill(pid,SIGKILL);
              exit(0);
          }

          (4).用alarm函数发送信号

          #include "csapp.h"
          
          void handler(int sig)
          {
              static int beeps = 0;
              printf("BEEP\n");
              if (++beeps<5)
                  Alarm(1);
              else{
                  printf("BOOM!\n");
                  exit(0);
              }
          }
          
          int main()
          {
              Signal(SIGALRM,handler);
              Alarm(1);
              while(1){
                  ;
              }
              exit(0);
          }
        2. 接收信号

          (1)signal函数可以改变和信号signum相关联的行为

        3. 处理信号
        4. 可移植的信号处理问题

          (1)sigaction函数

      • 非本地跳转 将控制直接从一个函数转移到另一个当前正在执行的函数
        1. 通过setjmp和longjmp提供
      • 操作进程的工具
        1. STRACE:打印一个正在运行的程序和它的子进程调用的每个系统调用的轨迹
        2. PS:列出当前系统中的进程(包括僵死进程)
        3. TOP:打印出关于当前进程资源使用的信息
        4. PMAP:显示进程的存储器映射
时间: 2024-10-06 13:35:53

20145317《信息安全系统设计基础》第10周学习总结1的相关文章

20145309信息安全系统设计基础第10周学习总结前篇

教材学习内容总结 附录A--错误处理 (1).Unix风格的错误处理:函数返回值包括错误代码,也包括有用的结果 (2).Posix风格的错误处理:返回0表示成功,返回非0表示失败:任何有用的结果都返回在通过引用传递进来的函数参数中. (3).DNS风格的错误处理:函数失败时返回NULL指针,并设置全局变量h_errno 标准I/O(高级输入输出函数) fopen/fclose:打开和关闭文件 fread/fwrite:读和写字节 fgets/fputs:读和写字符串 scanf/printf:复

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

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

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

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

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 20155227 《信息安全系统设计基础》第九周学习总结

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

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

2017-2018-1 20155218 <信息安全系统设计基础>第九周学习总结 教材学习内容总结 局部性 ROM和RAM指的都是半导体存储器,ROM是Read Only Memory的缩写,RAM是Random Access Memory的缩写. ROM在系统停止供电的时候仍然可以保持数据,而RAM通常都是在掉电之后就丢失数据,典型的RAM就是计算机的内存. 一种称为静态RAM(StaticRAM/SRAM),SRAM速度非常快,是目前读写最快的存储设备了,但是它也非常昂贵,所以只在要求很苛

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

2017-2018-1 20155201 <信息安全系统设计基础>第九周学习总结 教材学习内容总结 一.存储技术 DRAM和SRAM的特性: 静态RAM(SRAM) SRAM将每个位存储在一个双稳态的存储器单元里, 动态RAM(DRAM) DRAM将每个位存储为一个电容的充电.每个DRAM芯片被连接到某个成为存储控制器的电路,电路可以一次传送w位到每个DRAM芯片或一次从每个DRAM芯片传出w位. 存储器模块 磁盘存储 磁盘是由一个或多个叠放在一起的盘片组成的,被封装在一个密封的包装里,整个装

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

2018-2019-1 20165225<信息安全系统设计基础>第九周学习总结 教材学习内容总结 1.理解虚拟存储器的概念和作用; 2.理解地址翻译的概念; 3.理解存储器映射; 4.掌握动态存储器分配的方法; 5.理解垃圾收集的概念; 6.了解C语言中与存储器有关的错误; 虚拟存储器 物理和虚拟寻址 计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组,每字节都有一个唯一的物理地址.CPU根据物理地址访问存储器的方式是物理寻址. 虚拟存储器被组织为一个由存放在磁盘上的N个连续的字

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

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

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的用法比较多,只学习了其中简单的一部分