首页 > 其他分享 >CSAPP-异常

CSAPP-异常

时间:2024-12-09 20:24:44浏览次数:4  
标签:CSAPP 函数 程序 内核 跳转 进程 异常

今天csapp学习了异常的相关概念。

程序内的执行流切换无非两种,一种是分支和跳转;另一种是调用和返回。但是为了响应某些的事件,例如键盘输入和ctrl+c终止程序;以及程序的缺页错误或者段错误,就需要另一种执行流切换的方式。这种特殊处理叫做异常。

异常是将事件交给内核处理的过程,实现的层级从低到高包含异常、进程切换、信号和非本地跳转。

首先异常的分类。异常事件按照是否出现于当前执行的程序内来区分同步异常和异步异常。同步异常是程序内的操作导致的,包括内陷、故障和错误。内陷是程序故意操作的,例如系统调用以及中断。而故障和错误则是无意的。故障出现后,内核可能恢复程序的故障状态,再次执行程序。但是错误出现了,程序会被终止。

另一个则是异常的处理过程。每一个异常都有一个异常号,内核的异常处理函数,会根据出现的异常号来做相应的操作。

进程是一种抽象,在运行的程序看来,自己拥有CPU和内存的使用权。进程切换的时候,需要保存当前程序的上下文,以便未来恢复程序的状态。这里介绍了几个函数:

  • 获取进程信息:getpid()getppid()
  • 创建子进程:fork()
  • 终止进程:exit()
  • 在此进程上直接执行另一个进程execve

这里也介绍了进程图,但是需要配合fork()函数的行为来理解。

两个部分介绍完了,下一个异常就是信号了。信号是后台程序执行完毕后,内核给当前进程的一种通知。信号可以被进程忽略。进程收到信号后,有三种操作:

  • 忽略
  • 终止
  • 交给信号处理函数处理信号

另一个异常就是非本地跳转。本地跳转就是程序在一个函数内的goto语句。非本地跳转实现了两个函数之间的跳转。这里讲了两个函数以及行为。

  • setjmp():执行后,会保存当前函数的状态
  • longjmp():执行后,会恢复由setjmp保存的状态,实现栈的切换。

还讲了伪并行-并发和真正的并行区别,就是同时运行的进程,如果只有一个CPU来处理,那就是并发;如果多个核心分别运行多个进程,则为并行。

标签:CSAPP,函数,程序,内核,跳转,进程,异常
From: https://www.cnblogs.com/shangshankandashu/p/18595953

相关文章

  • 接口超时日志排查分析-BeanUtils对象复制6秒及类型不一致复制异常,复制null属性被覆盖
    接口超时日志排查分析-BeanUtils对象复制6秒及类型不一致复制异常,复制null属性被覆盖解决,常见Bean拷贝框架的性能对比1.接口超时日志排查分析-BeanUtils对象复制6秒1.查询日志命令,分析接口的请求及响应的时长catproJectDock.log|grep-E"请求开始时间|请求正常消耗时间">>......
  • 排查 Pod 状态异常
    TerminatingPendingContainerCreating/WaitingCrashLoopBackOffImagePullBackOffTerminating有时候删除Pod一直卡在Terminating状态,一直删不掉,可以从以下方面进行排查。分析思路一、首先我们先了解下pod的删除流程:APIServer收到删除Pod的请求,Pod被标记删除,......
  • wtsapi32.dll文件运行异常:Windows平台上的处理指南
    在使用Windows操作系统时,有时你可能会遇到一些与系统文件相关的错误,其中wtsapi32.dll文件运行异常就是一个较为常见的问题。wtsapi32.dll是Windows操作系统中的一个关键动态链接库(DLL)文件,它主要用于支持远程桌面协议(RDP)和其他终端服务相关的功能。当这个文件出现问题时,可能会导......
  • Linux 关于df 后目录异常大,却找不到实际大文件的解决办法
    一、通常情况下,有些进程仍在执行已删除文件会导致目录异常大,可以通过以下命令处理。#查看哪些进程占用磁盘空间lsof|grepdeleted或者lsof+L1#杀死占用已删除文件的进程kill-9<pid>二、由于根目录底下有个test子目录中有大文件未删除,就在test目录挂载另一块磁盘;此时......
  • 使用try catch哪些异常是捕获不到的?哪些能捕获到?捕获不到的要怎样才能捕获到?
    在前端开发中,使用JavaScript的try...catch语句可以捕获到大多数运行时错误(runtimeerrors),也称为异常(exceptions)。然而,它无法捕获以下几种情况:语法错误(SyntaxErrors):这些错误发生在代码解析阶段,在代码执行之前。try...catch无法处理它们,因为代码本身就无法被正确解析......
  • 【深度学习|地学应用-地震气溶胶异常解析5】气溶胶异常是地震的前兆现象之一!如何结合
    【深度学习|地学应用-地震气溶胶异常解析5】气溶胶异常是地震的前兆现象之一!如何结合地震前后其它的异常信号,如气体异常、热异常和电离层异常来分析地震气溶胶异常的机理?【深度学习|地学应用-地震气溶胶异常解析5】气溶胶异常是地震的前兆现象之一!如何结合地震前后其它的异......
  • Day42--异常向上抛出
    Day42--异常向上抛出方法调用栈的概念在Java程序执行过程中,方法之间会相互调用,当一个方法调用另一个方法时,就会形成一个方法调用栈。栈底是main方法(程序的入口),随着方法的调用,新的方法被压入栈顶。例如,main方法调用methodA,methodA又调用methodB,那么此时栈顶是methodB,中间是met......
  • 异常_演练
    参考:韩顺平JavaJava程序设计教程(洪)Java核心技术卷1廖雪峰的官方网站异常(Exception)异常对应的英文单词是Exception(一般情况以外的人(或事物);例外的事物)内容异常的概念异常的层次结构(★)非检查型异常与检查型异常(★)捕获异常(★)自定义异常与抛出异常引入课本P205例7.......
  • 异常--C++
    文章目录一、异常的概念及使用1、异常的概念2、异常的抛出和捕获3、栈展开4、查找匹配的处理代码5、异常重新抛出6、异常安全问题7、异常规范二、标准库的异常一、异常的概念及使用1、异常的概念异常处理机制允许程序中独立开发的部分能够在运行时就出现的问题进行......
  • 代码中如果遇到未定义的变量,会抛出异常吗?程序还会不会继续往下走?
    在前端开发中,如果遇到未定义的变量,JavaScript会抛出ReferenceError异常。程序在遇到这个异常后,默认情况下会停止在当前代码块的执行,并且不会继续往下执行。更具体地说:未声明变量的引用:如果你尝试使用一个从未使用var、let或const声明过的变量,JavaScript引擎会抛出Re......