热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

第八章:异常控制流的重要性和应用

不同指令的地址在程序计数器中的过渡称为控制转移,这样的控制转移序列称为控制流现代系统通过使控制流发生突变来对系统状态的变化做出反应,把这些突变称为异常控




  • 不同指令的地址在程序计数器中的过渡称为控制转移,这样的控制转移序列称为控制流
  • 现代系统通过使控制流发生突变来对系统状态的变化做出反应,把这些突变称为异常控制流

异常


  • 异常是控制流中的突变,用来响应处理器状态中的某些变化
  • 在处理器中,状态被编码为不同的位和信号,状态变化称为事件
  • 系统中可能的每种类型的异常都分配了一个唯一的非负整数的异常号
  • 异常表是操作系统在系统启动时分配和初始化的跳转表,使得表目k包含异常k的处理程序的地址
  • 触发异常时,处理器执行间接过程调用,通过异常表的表目k转到相应的处理程序。异常号是到异常表中的索引,异常表的起始地址放在异常表基址寄存器里
  • 异常的类别

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

  • 异步和同步异常的区别在于异常产生的原因来自CPU外部还是内部

进程


  • 进程是一个执行中程序的实例,系统中的每个程序都运行在某个进程的上下文中
  • 执行程序时一系列的程序计数器值的序列叫做逻辑控制流
  • 一个逻辑流的执行在时间上与另一个流重叠,称为并发流
  • 多个流并发地执行的一般现象称为并发,一个进程和其他进程轮流运行的概念称为多任务,一个进程执行它的控制流的一部分的每一时间段叫做时间片
  • 进程为每个程序提供它自己的私有地址空间,该部分不能被其他进程读或写
  • 设置了模式位时,进程就运行在内核模式中,否则运行在用户模式中
  • 进程从用户模式变为内核模式的唯一方法是通过诸如中断、故障或者陷入系统调用这样的异常,当异常发生时,控制传递到异常处理程序,处理器将模式从用户模式变为内核模式
  • 当内核选择一个新的进程运行时,称为内核调度了这个进程,它会抢占当前进程,并使用一种称为上下文切换的机制来将控制转移到新的进程
  • 调用read会进行磁盘读取,此时磁盘中断处理器,内核执行上下文切换,而不是在间歇时间内等待

系统调用错误处理


  • 使用错误处理包装函数可以更进一步地简化代码

进程控制


  • 每个进程都有一个唯一的正数进程ID,使用getpid函数可以返回
  • 进程总是处于下面三种状态之一:
    • 运行:在CPU上执行或在等待被执行且最终会被内核调度
    • 停止:被挂起,且不会被调度
    • 终止:进程永远停止
  • 父进程通过调用fork函数创建一个新的运行的子进程
  • fork函数被调用一次,会返回两次,一次是返回到父进程,一次是返回到新创建的子进程
  • 当一个进程由于某种原因终止时,保持在一种已终止的状态中,直到被它的父进程回收
  • 一个终止了但未被回收的进程称为僵死进程,即使没有运行,仍然消耗系统的内存资源
  • 如果一个父进程终止了,内核会安排init进程成为它的孤儿进程的养父去回收它们
  • 一个进程可以通过调用waitpid函数来等待它的子进程终止或者停止
  • wait(&status)函数等价于waitpid(-1, &status, 0)
  • sleep函数将一个进程挂起一段指定的时间
  • pause函数让调用函数休眠,直到该进程收到一个信号
  • execve函数加载并执行目标文件filename,且带参数列表argv和环境变量列表envp
  • 程序是一堆代码和数据,可以作为目标文件存在于磁盘上,或者作为段存在于地址空间中;进程是执行中程序的一个具体实例;程序总是运行在某个进程的上下文中
  • fork函数在新的子进程中运行相同的程序,新的子进程是父进程的一个复制品;execve函数在当前进程的上下文中加载并运行一个新的程序,它会覆盖当前进程的地址空间,但并没有创建一个新的进程

信号


  • 信号就是一个小消息,它通知进程系统中发生了一个某种类型的事件
  • 发送信号:内核通过更新目的进程上下文中的某个状态,发送一个信号给目的进程
  • 接受信号:当目的进程被内核强迫以某种方式对信号的发送做出反应时,它就接收了信号
  • 一个发出而没有被接收的信号叫做待处理信号
  • 每个进程都只属于一个进程组,进程组是由一个正整数进程组ID来标识的
  • /bin/kill程序可以向另外的进程发送任意的信号,比如/bin/kill -9 pid发送信号9(SIGKILL)信号给进程pid,负的pid会导致信号被发送到进程组pid中的每个进程
  • signal函数可以改变和信号signum相关联的行为,忽略、恢复默认和信号处理程序,唯一的例外是SIGSTOPSIGKILL的默认行为不能被修改
  • 当一个进程捕获了一个类型为k的信号时,会调用为信号k设置的处理程序,一个整数参数被设置为k,这个参数允许同一个处理函数捕获不同类型的信号
  • 隐式阻塞机制:内核默认阻塞任何当前处理程序正在处理信号类型的待处理的信号
  • 显式阻塞机制:应用程序可以使用sigprocmask函数和它的辅助函数,明确地阻塞和解除阻塞选定的信号
  • volatile限定符定义的变量,编译器不会缓存这个变量,每次都会从内存中读取

非本地跳转


  • 非本地跳转:将控制直接从一个函数转移到另一个当前正在执行的函数,而不需要经过正常的调用-返回序列






推荐阅读
  • 本文详细介绍了优化DB2数据库性能的多种方法,涵盖统计信息更新、缓冲池调整、日志缓冲区配置、应用程序堆大小设置、排序堆参数调整、代理程序管理、锁机制优化、活动应用程序限制、页清除程序配置、I/O服务器数量设定以及编入组提交数调整等方面。通过这些技术手段,可以显著提升数据库的运行效率和响应速度。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 深入探讨CPU虚拟化与KVM内存管理
    本文详细介绍了现代服务器架构中的CPU虚拟化技术,包括SMP、NUMA和MPP三种多处理器结构,并深入探讨了KVM的内存虚拟化机制。通过对比不同架构的特点和应用场景,帮助读者理解如何选择最适合的架构以优化性能。 ... [详细]
  • 本文探讨了 Spring Boot 应用程序在不同配置下支持的最大并发连接数,重点分析了内置服务器(如 Tomcat、Jetty 和 Undertow)的默认设置及其对性能的影响。 ... [详细]
  • 本文详细介绍了Linux系统中init进程的作用及其启动过程,解释了运行级别的概念,并提供了调整服务启动顺序的具体步骤和实例。通过了解这些内容,用户可以更好地管理系统的启动流程和服务配置。 ... [详细]
  • 微软Exchange服务器遭遇2022年版“千年虫”漏洞
    微软Exchange服务器在新年伊始遭遇了一个类似于‘千年虫’的日期处理漏洞,导致邮件传输受阻。该问题主要影响配置了FIP-FS恶意软件引擎的Exchange 2016和2019版本。 ... [详细]
  • 深入解析TCP/IP五层协议
    本文详细介绍了TCP/IP五层协议模型,包括物理层、数据链路层、网络层、传输层和应用层。每层的功能及其相互关系将被逐一解释,帮助读者理解互联网通信的原理。此外,还特别讨论了UDP和TCP协议的特点以及三次握手、四次挥手的过程。 ... [详细]
  • 在Java中,this是一个引用当前对象的关键字。如何通过this获取并显示其所指向的对象的属性和方法?本文详细解释了this的用法及其背后的原理。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • MySQL 高性能实战教程
    本课程深入探讨 MySQL 的架构、性能调优、索引优化、查询优化及高可用性等关键领域。通过实际案例和详细讲解,帮助学员掌握提升 MySQL 数据库性能的方法与技巧。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 在创建新的Android项目时,您可能会遇到aapt错误,提示无法打开libstdc++.so.6共享对象文件。本文将探讨该问题的原因及解决方案。 ... [详细]
  • 本文作者分享了在阿里巴巴获得实习offer的经历,包括五轮面试的详细内容和经验总结。其中四轮为技术面试,一轮为HR面试,涵盖了大量的Java技术和项目实践经验。 ... [详细]
  • Netflix利用Druid实现高效实时数据分析
    本文探讨了全球领先的在线娱乐公司Netflix如何通过采用Apache Druid,实现了高效的数据采集、处理和实时分析,从而显著提升了用户体验和业务决策的准确性。文章详细介绍了Netflix在系统架构、数据摄取、管理和查询方面的实践,并展示了Druid在大规模数据处理中的卓越性能。 ... [详细]
author-avatar
wayne251312
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有