异常控制流

之前学习微机原理的时候,总感觉没什么东西。除了中断和寻址有点意思。但是概念还是没有理清楚,感觉什么都是中断。。。最近看了《深入理解计算机系统》,引入异常控制流(Exceptional control flow)的概念, 从而对计算机中各种“中断”有了层次上的理解。总结如下。

定义:异常控制流通过改变程序的执行序列来对系统和应用的行为做出反应。

  • 异常控制流发生在计算机系统的各个层次。

    1. 在硬件层,硬件检测到的事件会触发控制突然转移到异常处理程序。
      这里面,主要是异步中断(IO引起),陷阱(系统调用),故障(如缺页),终止。涉及系统的异常号用于调用异常处理程序,汇编代码:int k。

    2. 在操作系统层,内核通过上下文切换将控制从一个用户进程转移到另一个用户进程。进程上下文包括通用目的寄存器/浮点寄存器/程序计数器/用户栈/状态寄存器/内核栈/各种内核数据结构(页表,进程表,文件表)。同样的通过线程上下文切换也能够转移控制流,线程上下文包括线程ID/栈/栈指针/程序计数器/条件码/通用目的寄存器值。每个线程和其它线程一起共享进程上下文的剩余部分。

    3. 在应用层,一个进程可以发送信号到另一个进程。当一个子进程终止后会发送SIGCHID信号给父进程。当一个程序要捕获多个信号时会产生一些问题,待处理信号被阻塞,待处理信号不排队,系统调用中断后可能不会返回需要手动重启。因此不能在信号处理程序中对信号进行计数,一定要利用waitpid函数在回收了所有子进程之后设置error的特点来计数。

    4. 非本地跳转。允许从一个深层嵌套的函数中立即返回。使一个信号处理程序分支到一个特殊的代码位置,而不是返回到信号到达中断了的位置。setjmp调用一次但返回多次,一次是初次调用,另一次是为相应的longjmp调用;longjmp调用一次但不返回。

后记:

  1. 父进程通过调用fork函数创建一个新的子进程,子进程和父进程最大的区别是有不同的PID。fork函数一次调用两次返回来实现不同进程运行不同的代码。

  2. 已终止的进程需要通过调用waitpid来回收,否则会成为僵尸进程,尤其对于外壳或web服务器这种长期运行的程序来说。外壳使用作业(job)这个抽象的概念来表示为对一个命令求值而创建的进程。外壳为每个作业创建一个独立的进程组。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值