• 第八章 异常控制流


    第八章 异常控制流

    简介

    • 控制流:控制转移序列。

    • 控制转移:从一条指令到下一条指令。

    • 异常控制流:现代操作系统通过使控制流发生突变来对系统状态做出反应,这些突变称为异常控制流

    8.1异常

    异常是异常控制流的一种形式,由硬件和操作系统实现。简单来说,就是控制流中的突变。

    8.1.1异常处理

    • 异常表:当处理器检测到有事件发生时,它会通过跳转表,进行一个间接过程调用(异常),到异常处理程序。

    • 异常号:系统中可能的某种类型的异常都分配了一个唯一的非负整数的异常号。异常号是到异常表中的索引。

    异常类似于过程调用,但有一些重要的不同之处。

    8.1.22异常的类别

    • 中断
    • 陷阱
    • 故障
    • 终止

    简介

    a)中断处理:异步是指硬件中断不是由任何一条指令造成的,而是由外部I/O设备的事件造成的。

    b)陷阱和系统调用:系统调用是一些封装好的函数,内部通过指令int n实现。
    陷阱最重要的用途是提供系统调用。系统调用运行在内核模式中,并且可以访问内核中的栈。

    8.2进程

    逻辑控制流,私有地址空间,多任务,并发,并行,上下文,上下文切换,调度。

      进程就是一个执行中的程序实例。系统中的每个程序都是运行在某个进程的上下文中的。
    
      进程提供给应用程序的关键抽象:a)一个独立的逻辑控制流 ;b)一个私有的地址空间
    

    8.2.1逻辑控制流

     `程序计数器(PC)值的序列叫做逻辑控制流,简称逻辑流。如下图所示,处理器的一个物理控制流分成了三个逻辑流,每个进程一个。`
     并发流:并发流一个逻辑流的执行在时间上与另一个流重叠,叫做~
    
    • 并发:多个流并发执行的一般现象称为并发。

    • 多任务:多个进程并发叫做多任务。

    • 并行:并发流在不同的cpu或计算机上,叫并行

    8.2.3私有地址空间

    • 一个进程为每个程序提供它自己的私有地址空间。

    • 运行应用程序代码的进程初始时是在用户模式中的。进程从用户模式变为内核模式的唯一方法是通过异常。

    • linux提供了/proc文件系统,它允许用户模式进程访问内核数据结构的内容。

    8.2.5上下文切换

    上下文切换:操作系统内核使用叫上下文切换的异常控制流来实现多任务。

       上下文切换:a)保存当前进程的上下文;b)恢复某个先前被抢占的进程被保存的上下文; c)将控制传递给这个新恢复的进程
       
       ##8.3系统调用错误处理
    

    在Linux中,可以使用 man syscalls 查看全部系统调用的列表。系统级函数遇到错误时,通常返回-1,并设置全局变量 errno

    strace 命令可以打印程序和它的子进程调用的每个系统调用的轨迹。

    8.4进程控制

    8.4.1获取进程ID:

    8.4.2创建和终止进程:

    进程的三种状态——运行、停止和终止。

    8.4.3回收子进程

    回收子进程:

    回收:当一个进程终止时,内核并不立即把它从系统中清除。相反,进程被保持在一种已终止的状态中,直到被它的父进程回收。
    
    僵死进程:一个终止了但是还未被回收的进程称为僵死进程。
    
    回收子进程的两种方法:1,内核的init进程 2,父进程waitpid函数
      1)如果父进程没有回收它的僵死子进程就终止了,那么内核就会安排init进城来回收它们。init进程的PID为1,并且是在系统初始化时创建的。
    
      2)一个进程可以通过调用waitpid函数来等待它的子进程终止或停止。
    

    8.5信号

    `一种更高层次的软件形式的异常,称为unix信号,它允许进程中断其他进程。

     低层的硬件异常是由内核异常处理程序处理的,正常情况下,对用户进程而言是不可见的。信号提供了一种机制,通知用户进程发生了这些异常。`
    

    8.5.2发送信号

    进程组:每个进程都只属于一个进程组,进程组是由一个进程组ID来标识的。默认的,一个子进程和它的父进程同属于一个进程组。
    在任何时刻,至多只有一个前台作业和0个或多个后台作业。外壳为每个作业创建一个独立的进程组,一个作业对应一个进程组。

    用kill函数发送信号:发送SIGKILL信号

    用alarm函数发送信号:发送SOGALARM信号

    8.5.3接收信号

       进程可以通过使用signal函数来修改和信号相关的默认行为。唯一的例外是SIGSTOP和SIGKILL,它们的默认行为不能被修改。
    

    8.5.4信号处理问题

      当一个程序捕获多个信号时,容易有一些细问问题:
    

    8.6 非本地跳转

    c语言中,用户级的异常控制流形式,通过setjmp和longjmp函数提供。

    setjump函数在env缓冲区中保存当前调用环境,以供后面longjmp使用,并返回0.

    调用环境:程序计数器,栈指针,通用目的寄存器

    longjmp函数从env缓冲区中恢复调用环境,然后触发一个从最近一次初始化env的setjmp调用的返回。然后setjmp返回,并带有非零的返回值retval。

    注:

    setjmp函数只被调用一次,但返回多次;

    longjmp函数被调用一次,但从不返回。

    8.7 操作进程的工具

    • STRACE:打印一个正在运行的程序和他的子程序调用的每个系统调用的痕迹
    • PS:列出当前系统中的进程,包括僵死进程
    • TOP:打印出关于当前进程资源使用的信息
    • PMAP:显示进程的存储器映射

    心得体会

    本周学习的是异常控制流,这一张的内容较多,较杂乱,要从中梳理出头绪并不简单。但是信息看书就可以发现这一张主要先从,发生的事情,发生的原因,解决的方式,几个角度,叙述了关于系统异常的问题。而且结合了第十章的内容
    是比较重要和复杂的一章。

    参考文献

  • 相关阅读:
    快排
    SQL实例
    14_可变字符串类和日期相关类
    13_String类的概述和使用
    c# json object Dictionary互转
    SQL Server 数据表给现有字段添加默认值或修改默认值
    SQL Server2008R2 死锁进程杀掉处理
    Sql Server 2008R2 查看SQL语句运行时间
    fatal: unable to access 'https://github.com/xxx': OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443
    idea出现了不能复制的问题
  • 原文地址:https://www.cnblogs.com/5320zhq/p/4986783.html
Copyright © 2020-2023  润新知